diff options
Diffstat (limited to 'fs/gfs2/glops.c')
-rw-r--r-- | fs/gfs2/glops.c | 42 |
1 files changed, 11 insertions, 31 deletions
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index b92de0af0bf3..60561ca070c2 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c | |||
@@ -173,23 +173,18 @@ static void gfs2_page_writeback(struct gfs2_glock *gl) | |||
173 | /** | 173 | /** |
174 | * meta_go_sync - sync out the metadata for this glock | 174 | * meta_go_sync - sync out the metadata for this glock |
175 | * @gl: the glock | 175 | * @gl: the glock |
176 | * @flags: DIO_* | ||
177 | * | 176 | * |
178 | * Called when demoting or unlocking an EX glock. We must flush | 177 | * Called when demoting or unlocking an EX glock. We must flush |
179 | * to disk all dirty buffers/pages relating to this glock, and must not | 178 | * to disk all dirty buffers/pages relating to this glock, and must not |
180 | * not return to caller to demote/unlock the glock until I/O is complete. | 179 | * not return to caller to demote/unlock the glock until I/O is complete. |
181 | */ | 180 | */ |
182 | 181 | ||
183 | static void meta_go_sync(struct gfs2_glock *gl, int flags) | 182 | static void meta_go_sync(struct gfs2_glock *gl) |
184 | { | 183 | { |
185 | if (!(flags & DIO_METADATA)) | ||
186 | return; | ||
187 | |||
188 | if (test_and_clear_bit(GLF_DIRTY, &gl->gl_flags)) { | 184 | if (test_and_clear_bit(GLF_DIRTY, &gl->gl_flags)) { |
189 | gfs2_log_flush(gl->gl_sbd, gl); | 185 | gfs2_log_flush(gl->gl_sbd, gl); |
190 | gfs2_meta_sync(gl); | 186 | gfs2_meta_sync(gl); |
191 | if (flags & DIO_RELEASE) | 187 | gfs2_ail_empty_gl(gl); |
192 | gfs2_ail_empty_gl(gl); | ||
193 | } | 188 | } |
194 | 189 | ||
195 | } | 190 | } |
@@ -264,31 +259,18 @@ static void inode_go_drop_th(struct gfs2_glock *gl) | |||
264 | /** | 259 | /** |
265 | * inode_go_sync - Sync the dirty data and/or metadata for an inode glock | 260 | * inode_go_sync - Sync the dirty data and/or metadata for an inode glock |
266 | * @gl: the glock protecting the inode | 261 | * @gl: the glock protecting the inode |
267 | * @flags: | ||
268 | * | 262 | * |
269 | */ | 263 | */ |
270 | 264 | ||
271 | static void inode_go_sync(struct gfs2_glock *gl, int flags) | 265 | static void inode_go_sync(struct gfs2_glock *gl) |
272 | { | 266 | { |
273 | int meta = (flags & DIO_METADATA); | ||
274 | int data = (flags & DIO_DATA); | ||
275 | |||
276 | if (test_bit(GLF_DIRTY, &gl->gl_flags)) { | 267 | if (test_bit(GLF_DIRTY, &gl->gl_flags)) { |
277 | if (meta && data) { | 268 | gfs2_page_writeback(gl); |
278 | gfs2_page_writeback(gl); | 269 | gfs2_log_flush(gl->gl_sbd, gl); |
279 | gfs2_log_flush(gl->gl_sbd, gl); | 270 | gfs2_meta_sync(gl); |
280 | gfs2_meta_sync(gl); | 271 | gfs2_page_wait(gl); |
281 | gfs2_page_wait(gl); | 272 | clear_bit(GLF_DIRTY, &gl->gl_flags); |
282 | clear_bit(GLF_DIRTY, &gl->gl_flags); | 273 | gfs2_ail_empty_gl(gl); |
283 | } else if (meta) { | ||
284 | gfs2_log_flush(gl->gl_sbd, gl); | ||
285 | gfs2_meta_sync(gl); | ||
286 | } else if (data) { | ||
287 | gfs2_page_writeback(gl); | ||
288 | gfs2_page_wait(gl); | ||
289 | } | ||
290 | if (flags & DIO_RELEASE) | ||
291 | gfs2_ail_empty_gl(gl); | ||
292 | } | 274 | } |
293 | } | 275 | } |
294 | 276 | ||
@@ -302,15 +284,13 @@ static void inode_go_sync(struct gfs2_glock *gl, int flags) | |||
302 | static void inode_go_inval(struct gfs2_glock *gl, int flags) | 284 | static void inode_go_inval(struct gfs2_glock *gl, int flags) |
303 | { | 285 | { |
304 | int meta = (flags & DIO_METADATA); | 286 | int meta = (flags & DIO_METADATA); |
305 | int data = (flags & DIO_DATA); | ||
306 | 287 | ||
307 | if (meta) { | 288 | if (meta) { |
308 | struct gfs2_inode *ip = gl->gl_object; | 289 | struct gfs2_inode *ip = gl->gl_object; |
309 | gfs2_meta_inval(gl); | 290 | gfs2_meta_inval(gl); |
310 | set_bit(GIF_INVALID, &ip->i_flags); | 291 | set_bit(GIF_INVALID, &ip->i_flags); |
311 | } | 292 | } |
312 | if (data) | 293 | gfs2_page_inval(gl); |
313 | gfs2_page_inval(gl); | ||
314 | } | 294 | } |
315 | 295 | ||
316 | /** | 296 | /** |
@@ -494,7 +474,7 @@ static void trans_go_xmote_bh(struct gfs2_glock *gl) | |||
494 | if (gl->gl_state != LM_ST_UNLOCKED && | 474 | if (gl->gl_state != LM_ST_UNLOCKED && |
495 | test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) { | 475 | test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) { |
496 | gfs2_meta_cache_flush(GFS2_I(sdp->sd_jdesc->jd_inode)); | 476 | gfs2_meta_cache_flush(GFS2_I(sdp->sd_jdesc->jd_inode)); |
497 | j_gl->gl_ops->go_inval(j_gl, DIO_METADATA | DIO_DATA); | 477 | j_gl->gl_ops->go_inval(j_gl, DIO_METADATA); |
498 | 478 | ||
499 | error = gfs2_find_jhead(sdp->sd_jdesc, &head); | 479 | error = gfs2_find_jhead(sdp->sd_jdesc, &head); |
500 | if (error) | 480 | if (error) |