aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/recovery.c
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-08-04 15:41:22 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2006-08-04 15:41:22 -0400
commit59a1cc6bdabf5ed148b48808ad1a418d87f5e6bf (patch)
tree6463071a09201040267702e895d63359e62c393d /fs/gfs2/recovery.c
parent899bb264507cfed83922bf14cd66a073494601ba (diff)
[GFS2] Fix lock ordering bug in page fault path
Mmapped files were able to trigger a lock ordering bug. Private maps do not need to take the glock so early on. Shared maps do unfortunately, however we can get around that by adding a flag into the flags for the struct gfs2_file. This only works because we are taking an exclusive lock at this point, so we know that nobody else can be racing with us. Fixes Red Hat bugzilla: #201196 Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/recovery.c')
-rw-r--r--fs/gfs2/recovery.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c
index 7aabc03e4abd..bbd44a4b1a1f 100644
--- a/fs/gfs2/recovery.c
+++ b/fs/gfs2/recovery.c
@@ -153,8 +153,7 @@ static int get_log_header(struct gfs2_jdesc *jd, unsigned int blk,
153 153
154 if (lh.lh_header.mh_magic != GFS2_MAGIC || 154 if (lh.lh_header.mh_magic != GFS2_MAGIC ||
155 lh.lh_header.mh_type != GFS2_METATYPE_LH || 155 lh.lh_header.mh_type != GFS2_METATYPE_LH ||
156 lh.lh_blkno != blk || 156 lh.lh_blkno != blk || lh.lh_hash != hash)
157 lh.lh_hash != hash)
158 return 1; 157 return 1;
159 158
160 *head = lh; 159 *head = lh;
@@ -482,11 +481,9 @@ int gfs2_recover_journal(struct gfs2_jdesc *jd)
482 481
483 /* Acquire a shared hold on the transaction lock */ 482 /* Acquire a shared hold on the transaction lock */
484 483
485 error = gfs2_glock_nq_init(sdp->sd_trans_gl, 484 error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED,
486 LM_ST_SHARED,
487 LM_FLAG_NOEXP | LM_FLAG_PRIORITY | 485 LM_FLAG_NOEXP | LM_FLAG_PRIORITY |
488 GL_NOCANCEL | GL_NOCACHE, 486 GL_NOCANCEL | GL_NOCACHE, &t_gh);
489 &t_gh);
490 if (error) 487 if (error)
491 goto fail_gunlock_ji; 488 goto fail_gunlock_ji;
492 489