xfs
[Top] [All Lists]

[PATCH 1/5] xfs: start periodic workers later

To: stable@xxxxxxxxxx
Subject: [PATCH 1/5] xfs: start periodic workers later
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Fri, 14 Oct 2011 14:50:49 -0400
Cc: xfs@xxxxxxxxxxx
References: <20111014185048.893798829@xxxxxxxxxxxxxxxxxxxxxx>
User-agent: quilt/0.48-1
commit 2bcf6e970f5a88fa05dced5eeb0326e13d93c4a1 upstream

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@xxxxxx>
Reported-by: Arkadiusz Miskiewicz <arekm@xxxxxxxx>
Reviewed-by: Alex Elder <aelder@xxxxxxx>

diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c
index a1a881e..3ebb458 100644
--- a/fs/xfs/linux-2.6/xfs_super.c
+++ b/fs/xfs/linux-2.6/xfs_super.c
@@ -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.

<Prev in Thread] Current Thread [Next in Thread>