|
@@ -411,6 +411,7 @@ static int nfs_write_end(struct file *file, struct address_space *mapping,
|
|
|
struct page *page, void *fsdata)
|
|
|
{
|
|
|
unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
|
|
|
+ struct nfs_open_context *ctx = nfs_file_open_context(file);
|
|
|
int status;
|
|
|
|
|
|
dfprintk(PAGECACHE, "NFS: write_end(%s/%s(%ld), %u@%lld)\n",
|
|
@@ -446,6 +447,13 @@ static int nfs_write_end(struct file *file, struct address_space *mapping,
|
|
|
if (status < 0)
|
|
|
return status;
|
|
|
NFS_I(mapping->host)->write_io += copied;
|
|
|
+
|
|
|
+ if (nfs_ctx_key_to_expire(ctx)) {
|
|
|
+ status = nfs_wb_all(mapping->host);
|
|
|
+ if (status < 0)
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
return copied;
|
|
|
}
|
|
|
|
|
@@ -642,7 +650,8 @@ static int nfs_need_sync_write(struct file *filp, struct inode *inode)
|
|
|
if (IS_SYNC(inode) || (filp->f_flags & O_DSYNC))
|
|
|
return 1;
|
|
|
ctx = nfs_file_open_context(filp);
|
|
|
- if (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags))
|
|
|
+ if (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags) ||
|
|
|
+ nfs_ctx_key_to_expire(ctx))
|
|
|
return 1;
|
|
|
return 0;
|
|
|
}
|
|
@@ -656,6 +665,10 @@ ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov,
|
|
|
ssize_t result;
|
|
|
size_t count = iov_length(iov, nr_segs);
|
|
|
|
|
|
+ result = nfs_key_timeout_notify(iocb->ki_filp, inode);
|
|
|
+ if (result)
|
|
|
+ return result;
|
|
|
+
|
|
|
if (iocb->ki_filp->f_flags & O_DIRECT)
|
|
|
return nfs_file_direct_write(iocb, iov, nr_segs, pos, true);
|
|
|
|