Re: [PATCH] cifs: Detect errors in cifs_writepages when called during background write-back

Peter Schwenke <[email protected]>
Newsgroups gmane.linux.file-systems.cifs
Message-ID <[email protected]>
Peter Schwenke wrote:
> The return code isn't checked in the case of cifs_writepages being
> invoked as a result of pdflush and potentially other background
> write-back. This results in data integrity problems when errors such as
> a network break occur when CIFSSMBWrite2 is called.  The resulting error
> isn't acted on.  This patch hangs on to the write-behind error so that it
> is available for detection later on.
> 
> Signed-off-by: Peter Schwenke <[email protected]>
> ---
>  fs/cifs/file.c |   15 ++++++++++++++-
>  1 files changed, 14 insertions(+), 1 deletions(-)
> 
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index 042b122..f1a5b1e 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -1200,6 +1200,7 @@ static int cifs_writepages(struct address_space *mapping,
>  	unsigned int bytes_to_write;
>  	unsigned int bytes_written;
>  	struct cifs_sb_info *cifs_sb;
> +	struct cifsInodeInfo *cifs_inode = CIFS_I(mapping->host);
>  	int done = 0;
>  	pgoff_t end;
>  	pgoff_t index;
> @@ -1354,7 +1355,7 @@ retry:
>  			 * CIFSSMBWrite2.  We can't rely on the last handle
>  			 * we used to still be valid
>  			 */
> -			open_file = find_writable_file(CIFS_I(mapping->host));
> +			open_file = find_writable_file(cifs_inode);
>  			if (!open_file) {
>  				cERROR(1, ("No writable handles for inode"));
>  				rc = -EBADF;
> @@ -1374,6 +1375,18 @@ retry:
>  						set_bit(AS_ENOSPC, &mapping->flags);
>  					else
>  						set_bit(AS_EIO, &mapping->flags);
> +					/*
> +					 * The return code isn't checked in the
> +					 * case of cifs_writepages being
> +					 * invoked from background write outs
> +					 * i.e. generic_sync_sb_inodes()
> +					 */
> +					if (wbc->sync_mode == WB_SYNC_NONE) {
> +						if (rc == -ENOSPC)
> +							cifs_inode->write_behind_rc =  rc;
> +						else
> +							cifs_inode->write_behind_rc =  -EIO;
> +					}
>  				} else {
>  					cifs_stats_bytes_written(cifs_sb->tcon,
>  								 bytes_written);

I was wondering if this patch was the correct way of fixing the problem.
   This was against 2.6.27

-- 
                                                              Regards
                                                              ...Peter
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.