fs: export __block_write_full_page
authorBenjamin Marzinski <bmarzins@redhat.com>
Mon, 27 Jun 2016 14:58:40 +0000 (09:58 -0500)
committerBob Peterson <rpeterso@redhat.com>
Mon, 27 Jun 2016 14:58:40 +0000 (09:58 -0500)
commitb4bba38909c21689de21355e84259cb7b38f25ac
tree3892b8d2e5b06b8db6e0d3ec7533b958c25bbdb9
parent6df9f9a253c7dc9f8ed18bf89d762de350a31813
fs: export __block_write_full_page

gfs2 needs to be able to skip the check to see if a page is outside of
the file size when writing it out. gfs2 can get into a situation where
it needs to flush its in-memory log to disk while a truncate is in
progress. If the file being trucated has data journaling enabled, it is
possible that there are data blocks in the log that are past the end of
the file. gfs can't finish the log flush without either writing these
blocks out or revoking them. Otherwise, if the node crashed, it could
overwrite subsequent changes made by other nodes in the cluster when
it's journal was replayed.

Unfortunately, there is no way to add log entries to the log during a
flush. So gfs2 simply writes out the page instead. This situation can
only occur when the truncate code still has the file locked exclusively,
and hasn't marked this block as free in the metadata (which happens
later in truc_dealloc).  After gfs2 writes this page out, the truncation
code will shortly invalidate it and write out any revokes if necessary.

In order to make this work, gfs2 needs to be able to skip the check for
writes outside the file size. Since the check exists in
block_write_full_page, this patch exports __block_write_full_page, which
doesn't have the check.

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
fs/buffer.c
include/linux/buffer_head.h