Skip to content

Commit

Permalink
GFS2: Fix bug trap and journaled data fsync
Browse files Browse the repository at this point in the history
Journaled data requires that a complete flush of all dirty data for
the file is done, in order that the ail flush which comes after
will succeed.

Also the recently enhanced bug trap can trigger falsely in case
an ail flush from fsync races with a page read. This updates the
bug trap such that it will ignore buffers which are locked and
only trigger on dirty and/or pinned buffers when the ail flush
is run from fsync. The original bug trap is retained when ail
flush is run from ->go_sync()

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Steven Whitehouse committed Oct 21, 2011
1 parent 40ac218 commit f181852
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 4 deletions.
2 changes: 2 additions & 0 deletions fs/gfs2/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,8 @@ static int gfs2_fsync(struct file *file, loff_t start, loff_t end,
mutex_unlock(&inode->i_mutex);
return ret;
}
if (gfs2_is_jdata(ip))
filemap_write_and_wait(mapping);
gfs2_ail_flush(ip->i_gl);
mutex_unlock(&inode->i_mutex);
}
Expand Down
8 changes: 4 additions & 4 deletions fs/gfs2/glops.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ static void gfs2_ail_error(struct gfs2_glock *gl, const struct buffer_head *bh)
* None of the buffers should be dirty, locked, or pinned.
*/

static void __gfs2_ail_flush(struct gfs2_glock *gl)
static void __gfs2_ail_flush(struct gfs2_glock *gl, unsigned long b_state)
{
struct gfs2_sbd *sdp = gl->gl_sbd;
struct list_head *head = &gl->gl_ail_list;
Expand All @@ -60,7 +60,7 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl)
bd_ail_gl_list);
bh = bd->bd_bh;
blocknr = bh->b_blocknr;
if (buffer_busy(bh))
if (bh->b_state & b_state)
gfs2_ail_error(gl, bh);
bh->b_private = NULL;
gfs2_remove_from_ail(bd); /* drops ref on bh */
Expand Down Expand Up @@ -99,7 +99,7 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl)
BUG_ON(current->journal_info);
current->journal_info = &tr;

__gfs2_ail_flush(gl);
__gfs2_ail_flush(gl, (1ul << BH_Dirty)|(1ul << BH_Pinned)|(1ul << BH_Lock));

gfs2_trans_end(sdp);
gfs2_log_flush(sdp, NULL);
Expand All @@ -117,7 +117,7 @@ void gfs2_ail_flush(struct gfs2_glock *gl)
ret = gfs2_trans_begin(sdp, 0, revokes);
if (ret)
return;
__gfs2_ail_flush(gl);
__gfs2_ail_flush(gl, (1ul << BH_Dirty)|(1ul << BH_Pinned));
gfs2_trans_end(sdp);
gfs2_log_flush(sdp, NULL);
}
Expand Down

0 comments on commit f181852

Please sign in to comment.