[packages/kernel] - xfs: don't eat ram on quotacheck

arekm arekm at pld-linux.org
Fri Jan 27 11:55:31 CET 2017


commit 53badc7f4955f109c2815063203b36e44c7918e2
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Fri Jan 27 11:55:23 2017 +0100

    - xfs: don't eat ram on quotacheck

 kernel-small_fixes.patch | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)
---
diff --git a/kernel-small_fixes.patch b/kernel-small_fixes.patch
index b615734..a5fbdf6 100644
--- a/kernel-small_fixes.patch
+++ b/kernel-small_fixes.patch
@@ -64,3 +64,54 @@ index 7a30b8f..dbeddd9 100644
  	if (next_id % mp->m_quotainfo->qi_dqperchunk) {
  		*id = next_id;
 
+From:   Brian Foster <bfoster at redhat.com>
+Subject: [PATCH] xfs: prevent quotacheck from overloading inode lru
+
+Quotacheck runs at mount time in situations where quota accounting must
+be recalculated. In doing so, it uses bulkstat to visit every inode in
+the filesystem. Historically, every inode processed during quotacheck
+was released and immediately tagged for reclaim because quotacheck runs
+before the superblock is marked active by the VFS. In other words,
+the final iput() lead to an immediate ->destroy_inode() call, which
+allowed the XFS background reclaim worker to start reclaiming inodes.
+
+Commit 17c12bcd3 ("xfs: when replaying bmap operations, don't let
+unlinked inodes get reaped") marks the XFS superblock active sooner as
+part of the mount process to support caching inodes processed during log
+recovery. This occurs before quotacheck and thus means all inodes
+processed by quotacheck are inserted to the LRU on release.  The
+s_umount lock is held until the mount has completed and thus prevents
+the shrinkers from operating on the sb. This means that quotacheck can
+excessively populate the inode LRU and lead to OOM conditions on systems
+without sufficient RAM.
+
+Update the quotacheck bulkstat handler to set XFS_IGET_DONTCACHE on
+inodes processed by quotacheck. This causes ->drop_inode() to return 1
+and in turn causes iput_final() to evict the inode. This preserves the
+original quotacheck behavior and prevents it from overloading the LRU
+and running out of memory.
+
+CC: stable at vger.kernel.org # v4.9
+Reported-by: Martin Svec <martin.svec at zoner.cz>
+Signed-off-by: Brian Foster <bfoster at redhat.com>
+---
+ fs/xfs/xfs_qm.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c
+index 45e50ea..b669b12 100644
+--- a/fs/xfs/xfs_qm.c
++++ b/fs/xfs/xfs_qm.c
+@@ -1177,7 +1177,8 @@ xfs_qm_dqusage_adjust(
+ 	 * the case in all other instances. It's OK that we do this because
+ 	 * quotacheck is done only at mount time.
+ 	 */
+-	error = xfs_iget(mp, NULL, ino, 0, XFS_ILOCK_EXCL, &ip);
++	error = xfs_iget(mp, NULL, ino, XFS_IGET_DONTCACHE, XFS_ILOCK_EXCL,
++			 &ip);
+ 	if (error) {
+ 		*res = BULKSTAT_RV_NOTHING;
+ 		return error;
+-- 
+2.7.4
+
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/kernel.git/commitdiff/53badc7f4955f109c2815063203b36e44c7918e2



More information about the pld-cvs-commit mailing list