diff options
author | Russell Cattelan <cattelan@redhat.com> | 2006-09-19 01:26:48 +0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-09-19 01:26:48 +0400 |
commit | dc41aeedef6b776583064be8abe6813159b4901d (patch) | |
tree | 59a80e3c6ef693f24359b46a1e254854938b2e71 /fs/gfs2 | |
parent | 7a6bbacbb8dec6fbd1242c959250388f907d429e (diff) | |
download | linux-dc41aeedef6b776583064be8abe6813159b4901d.tar.xz |
[GFS2] Fix for mmap() bug in readpage
Fix for Red Hat bz 205307. Don't need to lock in readpage if
the higher level code has already grabbed the lock.
Signed-off-by: Russell Cattelan <cattelan@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2')
-rw-r--r-- | fs/gfs2/ops_address.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c index 6f9ac5e6e3f6..25d7025e43c2 100644 --- a/fs/gfs2/ops_address.c +++ b/fs/gfs2/ops_address.c @@ -218,14 +218,16 @@ static int gfs2_readpage(struct file *file, struct page *page) { struct gfs2_inode *ip = GFS2_I(page->mapping->host); struct gfs2_sbd *sdp = GFS2_SB(page->mapping->host); + struct gfs2_file *gf = NULL; struct gfs2_holder gh; int error; int do_unlock = 0; if (likely(file != &gfs2_internal_file_sentinel)) { if (file) { - struct gfs2_file *gf = file->private_data; + gf = file->private_data; if (test_bit(GFF_EXLOCK, &gf->f_flags)) + /* gfs2_sharewrite_nopage has grabbed the ip->i_gl already */ goto skip_lock; } gfs2_holder_init(ip->i_gl, LM_ST_SHARED, GL_ATIME|GL_AOP, &gh); @@ -245,7 +247,8 @@ skip_lock: if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) error = -EIO; - if (file != &gfs2_internal_file_sentinel) { + if (gf && !test_bit(GFF_EXLOCK, &gf->f_flags) && + file != &gfs2_internal_file_sentinel) { gfs2_glock_dq_m(1, &gh); gfs2_holder_uninit(&gh); } |