diff options
Diffstat (limited to 'fs/gfs2/glops.c')
| -rw-r--r-- | fs/gfs2/glops.c | 21 | 
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index d5e4ab155ca..6985eef06c3 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c @@ -323,6 +323,7 @@ static void trans_go_sync(struct gfs2_glock *gl)  	if (gl->gl_state != LM_ST_UNLOCKED &&  	    test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) { +		flush_workqueue(gfs2_delete_workqueue);  		gfs2_meta_syncfs(sdp);  		gfs2_log_shutdown(sdp);  	} @@ -372,6 +373,25 @@ static int trans_go_demote_ok(const struct gfs2_glock *gl)  	return 0;  } +/** + * iopen_go_callback - schedule the dcache entry for the inode to be deleted + * @gl: the glock + * + * gl_spin lock is held while calling this + */ +static void iopen_go_callback(struct gfs2_glock *gl) +{ +	struct gfs2_inode *ip = (struct gfs2_inode *)gl->gl_object; + +	if (gl->gl_demote_state == LM_ST_UNLOCKED && +	    gl->gl_state == LM_ST_SHARED && +	    ip && test_bit(GIF_USER, &ip->i_flags)) { +		gfs2_glock_hold(gl); +		if (queue_work(gfs2_delete_workqueue, &gl->gl_delete) == 0) +			gfs2_glock_put_nolock(gl); +	} +} +  const struct gfs2_glock_operations gfs2_meta_glops = {  	.go_type = LM_TYPE_META,  }; @@ -406,6 +426,7 @@ const struct gfs2_glock_operations gfs2_trans_glops = {  const struct gfs2_glock_operations gfs2_iopen_glops = {  	.go_type = LM_TYPE_IOPEN, +	.go_callback = iopen_go_callback,  };  const struct gfs2_glock_operations gfs2_flock_glops = {  |