Re: [PATCH 13/19] ocfs2: check for a metadata write error with buffer_write_io_error()

Jan Kara <[email protected]>
Newsgroups dev.linux.lists.ocfs2-devel,dev.linux.lists.gfs2,org.kernel.vger.linux-ext4,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel
Message-ID <zr3we2xntqhn7ieev2khdkqvoi44vrkyd5hhgxjol2bggcllhr@g4wpvgfolwni>
On Sat 01-08-26 18:00:57, Chao Shi wrote:
> ocfs2_write_block() and ocfs2_write_super_or_backup() detect a failed write
> by looking at BH_Uptodate afterwards.  That relies on the write completion
> handler clearing BH_Uptodate on error, which this series removes: a buffer
> whose write failed still holds the data the filesystem asked to be written,
> so declaring it not up to date is wrong and makes callers re-read it.
> 
> Test BH_Write_EIO instead.  Note that ocfs2_write_block()'s test is the
> positive one, so the sense has to be inverted rather than the flag simply
> swapped.
> 
> The comment in ocfs2_write_block()'s error arm needs updating for the same
> reason.  It said the clustered uptodate information did not have to be
> removed because the buffer was not marked locally uptodate; after this
> series it is, so the reason no longer holds.  Not advertising the block to
> the cluster is still the right thing to do - the data is in memory but not
> on disk - so only the justification changes, not the behaviour.
> 
> No behaviour change today - a failed write sets BH_Write_EIO and clears
> BH_Uptodate together.  It stops being a no-op at the end of the series,
> where the new test is the one that still works.
> 
> Signed-off-by: Chao Shi <[email protected]>

This looks ok to me so feel free to add:

Reviewed-by: Jan Kara <[email protected]>

but it would be good to get a feedback from ocfs2 maintainers whether the
logic change in ocfs2_write_block() where we now keep the cluster cache
block uptodate after write IO error doesn't break some expectations of
ocfs2.

								Honza

> ---
>  fs/ocfs2/buffer_head_io.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c
> index 7bfe377af2df..733ceda79ca1 100644
> --- a/fs/ocfs2/buffer_head_io.c
> +++ b/fs/ocfs2/buffer_head_io.c
> @@ -66,12 +66,14 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh,
>  
>  	wait_on_buffer(bh);
>  
> -	if (buffer_uptodate(bh)) {
> +	if (!buffer_write_io_error(bh)) {
>  		ocfs2_set_buffer_uptodate(ci, bh);
>  	} else {
> -		/* We don't need to remove the clustered uptodate
> -		 * information for this bh as it's not marked locally
> -		 * uptodate. */
> +		/*
> +		 * The buffer still holds what we tried to write, but it did
> +		 * not reach the disk, so don't advertise it to the cluster
> +		 * as up to date.
> +		 */
>  		ret = -EIO;
>  		mlog_errno(ret);
>  	}
> @@ -446,7 +448,7 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb,
>  
>  	wait_on_buffer(bh);
>  
> -	if (!buffer_uptodate(bh)) {
> +	if (buffer_write_io_error(bh)) {
>  		ret = -EIO;
>  		mlog_errno(ret);
>  	}
> -- 
> 2.43.0
> 
-- 
Jan Kara <[email protected]>
SUSE Labs, CR
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.