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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

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@xxxxxxxx>

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@xxxxxxxxxx
> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
> ---
>  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/

_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs



[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux