xfs
[Top] [All Lists]

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

To: xfs@xxxxxxxxxxx
Subject: Re: [PATCH 5/6] xfs: register the inode cache shrinker before quotachecks
From: Arkadiusz Miskiewicz <arekm@xxxxxxxx>
Date: Wed, 23 Mar 2011 22:24:03 +0100
Cc: Dave Chinner <david@xxxxxxxxxxxxx>, aelder@xxxxxxx
In-reply-to: <1300860870-15471-6-git-send-email-david@xxxxxxxxxxxxx>
References: <1300860870-15471-1-git-send-email-david@xxxxxxxxxxxxx> <1300860870-15471-6-git-send-email-david@xxxxxxxxxxxxx>
User-agent: KMail/1.13.6 (Linux/2.6.37; KDE/4.6.1; x86_64; ; )
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/

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