| From hch@infradead.org Wed Oct 19 15:55:06 2011 |
| From: Christoph Hellwig <hch@infradead.org> |
| Date: Tue, 18 Oct 2011 10:23:15 -0400 |
| Subject: xfs: start periodic workers later |
| To: stable@vger.kernel.org |
| Cc: greg@kroah.com |
| Message-ID: <20111018142351.491359923@bombadil.infradead.org> |
| |
| From: Christoph Hellwig <hch@infradead.org> |
| |
| 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@lst.de> |
| Reported-by: Arkadiusz Miskiewicz <arekm@maven.pl> |
| Reviewed-by: Alex Elder <aelder@sgi.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/xfs/linux-2.6/xfs_super.c | 35 ++++++++++++++--------------------- |
| 1 file changed, 14 insertions(+), 21 deletions(-) |
| |
| --- 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. |