aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/glops.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/gfs2/glops.c')
-rw-r--r--fs/gfs2/glops.c42
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
183static void meta_go_sync(struct gfs2_glock *gl, int flags) 182static 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
271static void inode_go_sync(struct gfs2_glock *gl, int flags) 265static 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)
302static void inode_go_inval(struct gfs2_glock *gl, int flags) 284static 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)