]> git.pld-linux.org Git - packages/kernel.git/commitdiff
- xfs: don't eat ram on quotacheck auto/th/kernel-4.9.6-1 auto/th/kernel-nopae-4.9.6-1 auto/th/kernel-rt-4.9.6-1
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Fri, 27 Jan 2017 10:55:23 +0000 (11:55 +0100)
committerArkadiusz Miśkiewicz <arekm@maven.pl>
Fri, 27 Jan 2017 10:55:23 +0000 (11:55 +0100)
kernel-small_fixes.patch

index b615734d8a13f6283c4b505bd22528fe3aa31dfe..a5fbdf6aa5812fa569ba393b7583607bf182ae82 100644 (file)
@@ -64,3 +64,54 @@ index 7a30b8f..dbeddd9 100644
        if (next_id % mp->m_quotainfo->qi_dqperchunk) {
                *id = next_id;
 
+From:   Brian Foster <bfoster@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@vger.kernel.org # v4.9
+Reported-by: Martin Svec <martin.svec@zoner.cz>
+Signed-off-by: Brian Foster <bfoster@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
+
This page took 0.058687 seconds and 4 git commands to generate.