xfs: start periodic workers later
Start the periodic sync workers only after we have finished xfs_mountfs and thus fully set up the filesystem structures. Without this we can call into xfs_qm_sync before the quotainfo strucute is set up if the mount takes unusually long, and probably hit other incomplete states as well. Also clean up the xfs_fs_fill_super error path by using consistent label names, and removing an impossible to reach case. Signed-off-by: Christoph Hellwig <hch@lst.de> Reported-by: Arkadiusz Miskiewicz <arekm@maven.pl> Reviewed-by: Alex Elder <aelder@sgi.com>
This commit is contained in:
parent
b2ce397400
commit
2bcf6e970f
1 changed files with 14 additions and 21 deletions
|
@ -1412,37 +1412,35 @@ xfs_fs_fill_super(
|
|||
sb->s_time_gran = 1;
|
||||
set_posix_acl_flag(sb);
|
||||
|
||||
error = xfs_syncd_init(mp);
|
||||
if (error)
|
||||
goto out_filestream_unmount;
|
||||
|
||||
xfs_inode_shrinker_register(mp);
|
||||
|
||||
error = xfs_mountfs(mp);
|
||||
if (error)
|
||||
goto out_syncd_stop;
|
||||
goto out_filestream_unmount;
|
||||
|
||||
error = xfs_syncd_init(mp);
|
||||
if (error)
|
||||
goto out_unmount;
|
||||
|
||||
root = igrab(VFS_I(mp->m_rootip));
|
||||
if (!root) {
|
||||
error = ENOENT;
|
||||
goto fail_unmount;
|
||||
goto out_syncd_stop;
|
||||
}
|
||||
if (is_bad_inode(root)) {
|
||||
error = EINVAL;
|
||||
goto fail_vnrele;
|
||||
goto out_syncd_stop;
|
||||
}
|
||||
sb->s_root = d_alloc_root(root);
|
||||
if (!sb->s_root) {
|
||||
error = ENOMEM;
|
||||
goto fail_vnrele;
|
||||
goto out_iput;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
out_syncd_stop:
|
||||
xfs_inode_shrinker_unregister(mp);
|
||||
xfs_syncd_stop(mp);
|
||||
out_filestream_unmount:
|
||||
xfs_inode_shrinker_unregister(mp);
|
||||
xfs_filestream_unmount(mp);
|
||||
out_free_sb:
|
||||
xfs_freesb(mp);
|
||||
|
@ -1456,17 +1454,12 @@ xfs_fs_fill_super(
|
|||
out:
|
||||
return -error;
|
||||
|
||||
fail_vnrele:
|
||||
if (sb->s_root) {
|
||||
dput(sb->s_root);
|
||||
sb->s_root = NULL;
|
||||
} else {
|
||||
iput(root);
|
||||
}
|
||||
|
||||
fail_unmount:
|
||||
xfs_inode_shrinker_unregister(mp);
|
||||
out_iput:
|
||||
iput(root);
|
||||
out_syncd_stop:
|
||||
xfs_syncd_stop(mp);
|
||||
out_unmount:
|
||||
xfs_inode_shrinker_unregister(mp);
|
||||
|
||||
/*
|
||||
* Blow away any referenced inode in the filestreams cache.
|
||||
|
|
Loading…
Reference in a new issue