xfs: register the inode cache shrinker before quotachecks
[pandora-kernel.git] / fs / xfs / linux-2.6 / xfs_super.c
index 8a70b2a..1ba5c45 100644 (file)
@@ -1539,10 +1539,14 @@ xfs_fs_fill_super(
        if (error)
                goto out_free_sb;
 
-       error = xfs_mountfs(mp);
-       if (error)
-               goto out_filestream_unmount;
-
+       /*
+        * we must configure the block size in the superblock before we run the
+        * full mount process as the mount process can lookup and cache inodes.
+        * For the same reason we must also initialise the syncd and register
+        * the inode cache shrinker so that inodes can be reclaimed during
+        * operations like a quotacheck that iterate all inodes in the
+        * filesystem.
+        */
        sb->s_magic = XFS_SB_MAGIC;
        sb->s_blocksize = mp->m_sb.sb_blocksize;
        sb->s_blocksize_bits = ffs(sb->s_blocksize) - 1;
@@ -1550,6 +1554,16 @@ 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;
+
        root = igrab(VFS_I(mp->m_rootip));
        if (!root) {
                error = ENOENT;
@@ -1565,14 +1579,11 @@ xfs_fs_fill_super(
                goto fail_vnrele;
        }
 
-       error = xfs_syncd_init(mp);
-       if (error)
-               goto fail_vnrele;
-
-       xfs_inode_shrinker_register(mp);
-
        return 0;
 
+ out_syncd_stop:
+       xfs_inode_shrinker_unregister(mp);
+       xfs_syncd_stop(mp);
  out_filestream_unmount:
        xfs_filestream_unmount(mp);
  out_free_sb:
@@ -1596,6 +1607,9 @@ xfs_fs_fill_super(
        }
 
  fail_unmount:
+       xfs_inode_shrinker_unregister(mp);
+       xfs_syncd_stop(mp);
+
        /*
         * Blow away any referenced inode in the filestreams cache.
         * This can and will cause log traffic as inodes go inactive