aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/inode.c
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2008-02-22 11:07:18 -0500
committerSteven Whitehouse <swhiteho@redhat.com>2008-03-31 05:41:12 -0400
commit7afd88d9166a752b52517648bcbe923e05d393fc (patch)
tree2fb945189e3cb1be7ad007088f8ec86e9f67ece6 /fs/gfs2/inode.c
parent60b779cfc1fa52034a996ee12a23b62d32e86000 (diff)
[GFS2] Fix a page lock / glock deadlock
We've previously been using a "try lock" in readpage on the basis that it would prevent deadlocks due to the inverted lock ordering (our normal lock ordering is glock first and then page lock). Unfortunately tests have shown that this isn't enough. If the glock has a demote request queued such that run_queue() in the glock code tries to do a demote when its called under readpage then it will try and write out all the dirty pages which requires locking them. This then deadlocks with the page locked by readpage. The solution is to always require two calls into readpage. The first unlocks the page, gets the glock and returns AOP_TRUNCATED_PAGE, the second does the actual readpage and unlocks the glock & page as required. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/inode.c')
-rw-r--r--fs/gfs2/inode.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 5f50dd53bf63..810ff023fb14 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -493,7 +493,7 @@ struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
493 return dir; 493 return dir;
494 } 494 }
495 495
496 if (gfs2_glock_is_locked_by_me(dip->i_gl) == 0) { 496 if (gfs2_glock_is_locked_by_me(dip->i_gl) == NULL) {
497 error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh); 497 error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh);
498 if (error) 498 if (error)
499 return ERR_PTR(error); 499 return ERR_PTR(error);