diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2006-08-04 15:41:22 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-08-04 15:41:22 -0400 |
commit | 59a1cc6bdabf5ed148b48808ad1a418d87f5e6bf (patch) | |
tree | 6463071a09201040267702e895d63359e62c393d /fs/gfs2/recovery.c | |
parent | 899bb264507cfed83922bf14cd66a073494601ba (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.c | 9 |
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 | ||