Re: [PATCH 5/6] xfs: register the inode cache shrinker before quotachecks

Arkadiusz Miskiewicz
2011-03-23T21:21:30Z

On Wednesday 23 of March 2011, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>

Thanks a lot for this patch. I was able to mount my two ~800GB filesystems
with quota enabled without out of memory/machine reboot suprises (which were
happening without this patch every time I tried mount with quota).

So

Tested-by: Arkadiusz Miśkiewicz <arekm@maven.pl>

and hope to see it in 2.6.39 . Test was done on patched 2.6.37.

>
> During mount, we can do a quotacheck that involves a bulkstat pass
> on all inodes. If there are more inodes in the filesystem than can
> be held in memory, we require the inode cache shrinker to run to
> ensure that we don't run out of memory.
>
> Unfortunately, the inode cache shrinker is not registered until we
> get to the end of the superblock setup process, which is after a
> quotacheck is run if it is needed. Hence we need to register the
> inode cache shrinker earlier in the mount process so that we don't
> OOM during mount. This requires that we also initialise the syncd
> work before we register the shrinker, so we nee dto juggle that
> around as well.
>
> While there, make sure that we have set up the block sizes in the
> VFS superblock correctly before the quotacheck is run so that any
> inodes that are cached as a result of the quotacheck have their
> block size fields set up correctly.
>
> Cc: stable@kernel.org
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> fs/xfs/linux-2.6/xfs_super.c | 34 ++++++++++++++++++++++++----------
> 1 files changed, 24 insertions(+), 10 deletions(-)
>
> diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c
> index 8a70b2a..1ba5c45 100644
> --- a/fs/xfs/linux-2.6/xfs_super.c
> +++ b/fs/xfs/linux-2.6/xfs_super.c
> @@ -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

--
Arkadiusz Miśkiewicz PLD/Linux Team
arekm / maven.pl http://ftp.pld-linux.org/