aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruenba@redhat.com>2017-08-01 12:49:42 -0400
committerBob Peterson <rpeterso@redhat.com>2017-08-10 11:49:13 -0400
commit6a1c8f6dcf815d96197a2723781cf700925d17ed (patch)
tree27df64a37b4101dd81605f35e387466ffb34071c
parent71c1b2136835c88c231f7a5e3dc618f7568f84f7 (diff)
gfs2: Defer deleting inodes under memory pressure
When under memory pressure and an inode's link count has dropped to zero, defer deleting the inode to the delete workqueue. This avoids calling into DLM under memory pressure, which can deadlock. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Bob Peterson <rpeterso@redhat.com>
-rw-r--r--fs/gfs2/super.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index 4089dbe617a6..a83fe8260d2e 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -1318,6 +1318,23 @@ static int gfs2_drop_inode(struct inode *inode)
1318 if (test_bit(GLF_DEMOTE, &gl->gl_flags)) 1318 if (test_bit(GLF_DEMOTE, &gl->gl_flags))
1319 clear_nlink(inode); 1319 clear_nlink(inode);
1320 } 1320 }
1321
1322 /*
1323 * When under memory pressure when an inode's link count has dropped to
1324 * zero, defer deleting the inode to the delete workqueue. This avoids
1325 * calling into DLM under memory pressure, which can deadlock.
1326 */
1327 if (!inode->i_nlink &&
1328 unlikely(current->flags & PF_MEMALLOC) &&
1329 gfs2_holder_initialized(&ip->i_iopen_gh)) {
1330 struct gfs2_glock *gl = ip->i_iopen_gh.gh_gl;
1331
1332 gfs2_glock_hold(gl);
1333 if (queue_work(gfs2_delete_workqueue, &gl->gl_delete) == 0)
1334 gfs2_glock_queue_put(gl);
1335 return false;
1336 }
1337
1321 return generic_drop_inode(inode); 1338 return generic_drop_inode(inode);
1322} 1339}
1323 1340
@@ -1561,6 +1578,10 @@ static void gfs2_evict_inode(struct inode *inode)
1561 goto alloc_failed; 1578 goto alloc_failed;
1562 } 1579 }
1563 1580
1581 /* Deletes should never happen under memory pressure anymore. */
1582 if (WARN_ON_ONCE(current->flags & PF_MEMALLOC))
1583 goto out;
1584
1564 /* Must not read inode block until block type has been verified */ 1585 /* Must not read inode block until block type has been verified */
1565 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, &gh); 1586 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, &gh);
1566 if (unlikely(error)) { 1587 if (unlikely(error)) {