Commit d3f1322a authored by Jeff Layton's avatar Jeff Layton Committed by Steve French
Browse files

cifs: wait for writeback to complete in cifs_flush



The f_op->flush operation is the last chance to return a writeback
related error when closing a file. Ensure that we don't miss reporting
any errors by waiting for writeback to complete in cifs_flush before
proceeding.

There's no reason to do this when the file isn't open for write
however.

Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Reviewed-by: default avatarSuresh Jayaraman <sjayaraman@suse.de>
Reviewed-by: default avatarDavid Kleikamp <shaggy@linux.vnet.ibm.com>
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 5f6dbc9e
Loading
Loading
Loading
Loading
+7 −14
Original line number Diff line number Diff line
@@ -1688,21 +1688,14 @@ int cifs_flush(struct file *file, fl_owner_t id)
	struct inode *inode = file->f_path.dentry->d_inode;
	int rc = 0;

	/* Rather than do the steps manually:
	   lock the inode for writing
	   loop through pages looking for write behind data (dirty pages)
	   coalesce into contiguous 16K (or smaller) chunks to write to server
	   send to server (prefer in parallel)
	   deal with writebehind errors
	   unlock inode for writing
	   filemapfdatawrite appears easier for the time being */

	rc = filemap_fdatawrite(inode->i_mapping);
	if (file->f_mode & FMODE_WRITE) {
		rc = filemap_write_and_wait(inode->i_mapping);
		/* reset wb rc if we were able to write out dirty pages */
		if (!rc) {
			rc = CIFS_I(inode)->write_behind_rc;
			CIFS_I(inode)->write_behind_rc = 0;
		}
	}

	cFYI(1, "Flush inode %p file %p rc %d", inode, file, rc);