diff options
Diffstat (limited to 'fs/gfs2/ops_address.c')
-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) | |||
218 | { | 218 | { |
219 | struct gfs2_inode *ip = GFS2_I(page->mapping->host); | 219 | struct gfs2_inode *ip = GFS2_I(page->mapping->host); |
220 | struct gfs2_sbd *sdp = GFS2_SB(page->mapping->host); | 220 | struct gfs2_sbd *sdp = GFS2_SB(page->mapping->host); |
221 | struct gfs2_file *gf = NULL; | ||
221 | struct gfs2_holder gh; | 222 | struct gfs2_holder gh; |
222 | int error; | 223 | int error; |
223 | int do_unlock = 0; | 224 | int do_unlock = 0; |
224 | 225 | ||
225 | if (likely(file != &gfs2_internal_file_sentinel)) { | 226 | if (likely(file != &gfs2_internal_file_sentinel)) { |
226 | if (file) { | 227 | if (file) { |
227 | struct gfs2_file *gf = file->private_data; | 228 | gf = file->private_data; |
228 | if (test_bit(GFF_EXLOCK, &gf->f_flags)) | 229 | if (test_bit(GFF_EXLOCK, &gf->f_flags)) |
230 | /* gfs2_sharewrite_nopage has grabbed the ip->i_gl already */ | ||
229 | goto skip_lock; | 231 | goto skip_lock; |
230 | } | 232 | } |
231 | gfs2_holder_init(ip->i_gl, LM_ST_SHARED, GL_ATIME|GL_AOP, &gh); | 233 | gfs2_holder_init(ip->i_gl, LM_ST_SHARED, GL_ATIME|GL_AOP, &gh); |
@@ -245,7 +247,8 @@ skip_lock: | |||
245 | if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) | 247 | if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) |
246 | error = -EIO; | 248 | error = -EIO; |
247 | 249 | ||
248 | if (file != &gfs2_internal_file_sentinel) { | 250 | if (gf && !test_bit(GFF_EXLOCK, &gf->f_flags) && |
251 | file != &gfs2_internal_file_sentinel) { | ||
249 | gfs2_glock_dq_m(1, &gh); | 252 | gfs2_glock_dq_m(1, &gh); |
250 | gfs2_holder_uninit(&gh); | 253 | gfs2_holder_uninit(&gh); |
251 | } | 254 | } |