diff options
Diffstat (limited to 'fs/nfs/write.c')
-rw-r--r-- | fs/nfs/write.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 65869ca9c851..75a35a1afa79 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
@@ -1379,24 +1379,27 @@ static void nfs_writeback_check_extend(struct nfs_pgio_header *hdr, | |||
1379 | { | 1379 | { |
1380 | struct nfs_pgio_args *argp = &hdr->args; | 1380 | struct nfs_pgio_args *argp = &hdr->args; |
1381 | struct nfs_pgio_res *resp = &hdr->res; | 1381 | struct nfs_pgio_res *resp = &hdr->res; |
1382 | u64 size = argp->offset + resp->count; | ||
1382 | 1383 | ||
1383 | if (!(fattr->valid & NFS_ATTR_FATTR_SIZE)) | 1384 | if (!(fattr->valid & NFS_ATTR_FATTR_SIZE)) |
1385 | fattr->size = size; | ||
1386 | if (nfs_size_to_loff_t(fattr->size) < i_size_read(hdr->inode)) { | ||
1387 | fattr->valid &= ~NFS_ATTR_FATTR_SIZE; | ||
1384 | return; | 1388 | return; |
1385 | if (argp->offset + resp->count != fattr->size) | 1389 | } |
1386 | return; | 1390 | if (size != fattr->size) |
1387 | if (nfs_size_to_loff_t(fattr->size) < i_size_read(hdr->inode)) | ||
1388 | return; | 1391 | return; |
1389 | /* Set attribute barrier */ | 1392 | /* Set attribute barrier */ |
1390 | nfs_fattr_set_barrier(fattr); | 1393 | nfs_fattr_set_barrier(fattr); |
1394 | /* ...and update size */ | ||
1395 | fattr->valid |= NFS_ATTR_FATTR_SIZE; | ||
1391 | } | 1396 | } |
1392 | 1397 | ||
1393 | void nfs_writeback_update_inode(struct nfs_pgio_header *hdr) | 1398 | void nfs_writeback_update_inode(struct nfs_pgio_header *hdr) |
1394 | { | 1399 | { |
1395 | struct nfs_fattr *fattr = hdr->res.fattr; | 1400 | struct nfs_fattr *fattr = &hdr->fattr; |
1396 | struct inode *inode = hdr->inode; | 1401 | struct inode *inode = hdr->inode; |
1397 | 1402 | ||
1398 | if (fattr == NULL) | ||
1399 | return; | ||
1400 | spin_lock(&inode->i_lock); | 1403 | spin_lock(&inode->i_lock); |
1401 | nfs_writeback_check_extend(hdr, fattr); | 1404 | nfs_writeback_check_extend(hdr, fattr); |
1402 | nfs_post_op_update_inode_force_wcc_locked(inode, fattr); | 1405 | nfs_post_op_update_inode_force_wcc_locked(inode, fattr); |