[linux-cifs-client] [PATCH] cifs: Detect errors in cifs_writepages
when called during background write-back
Peter Schwenke
peter at bluetoad.com.au
Tue May 12 08:18:08 GMT 2009
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 <peter at bluetoad.com.au>
> ---
> 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
More information about the linux-cifs-client
mailing list