|
@@ -208,21 +208,19 @@ EXPORT_SYMBOL_GPL(nfs_file_mmap);
|
|
|
* fall back to doing a synchronous write.
|
|
|
*/
|
|
|
static int
|
|
|
-nfs_file_fsync_commit(struct file *file, loff_t start, loff_t end, int datasync)
|
|
|
+nfs_file_fsync_commit(struct file *file, int datasync)
|
|
|
{
|
|
|
struct nfs_open_context *ctx = nfs_file_open_context(file);
|
|
|
struct inode *inode = file_inode(file);
|
|
|
- int have_error, do_resend, status;
|
|
|
+ int do_resend, status;
|
|
|
int ret = 0;
|
|
|
|
|
|
dprintk("NFS: fsync file(%pD2) datasync %d\n", file, datasync);
|
|
|
|
|
|
nfs_inc_stats(inode, NFSIOS_VFSFSYNC);
|
|
|
do_resend = test_and_clear_bit(NFS_CONTEXT_RESEND_WRITES, &ctx->flags);
|
|
|
- have_error = test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
|
|
|
status = nfs_commit_inode(inode, FLUSH_SYNC);
|
|
|
- have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
|
|
|
- if (have_error) {
|
|
|
+ if (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags)) {
|
|
|
ret = xchg(&ctx->error, 0);
|
|
|
if (ret)
|
|
|
goto out;
|
|
@@ -247,10 +245,16 @@ nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
|
|
|
trace_nfs_fsync_enter(inode);
|
|
|
|
|
|
do {
|
|
|
+ struct nfs_open_context *ctx = nfs_file_open_context(file);
|
|
|
ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
|
|
|
+ if (test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags)) {
|
|
|
+ int ret2 = xchg(&ctx->error, 0);
|
|
|
+ if (ret2)
|
|
|
+ ret = ret2;
|
|
|
+ }
|
|
|
if (ret != 0)
|
|
|
break;
|
|
|
- ret = nfs_file_fsync_commit(file, start, end, datasync);
|
|
|
+ ret = nfs_file_fsync_commit(file, datasync);
|
|
|
if (!ret)
|
|
|
ret = pnfs_sync_inode(inode, !!datasync);
|
|
|
/*
|