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

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
...@@ -1688,21 +1688,14 @@ int cifs_flush(struct file *file, fl_owner_t id) ...@@ -1688,21 +1688,14 @@ int cifs_flush(struct file *file, fl_owner_t id)
struct inode *inode = file->f_path.dentry->d_inode; struct inode *inode = file->f_path.dentry->d_inode;
int rc = 0; int rc = 0;
/* Rather than do the steps manually: if (file->f_mode & FMODE_WRITE) {
lock the inode for writing rc = filemap_write_and_wait(inode->i_mapping);
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);
/* reset wb rc if we were able to write out dirty pages */ /* reset wb rc if we were able to write out dirty pages */
if (!rc) { if (!rc) {
rc = CIFS_I(inode)->write_behind_rc; rc = CIFS_I(inode)->write_behind_rc;
CIFS_I(inode)->write_behind_rc = 0; CIFS_I(inode)->write_behind_rc = 0;
} }
}
cFYI(1, "Flush inode %p file %p rc %d", inode, file, rc); cFYI(1, "Flush inode %p file %p rc %d", inode, file, rc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment