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