diff options
| -rw-r--r-- | fs/nfs/direct.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 9d57a299824c..df86e526702f 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
| @@ -441,8 +441,10 @@ static void nfs_direct_write_result(struct rpc_task *task, void *calldata) | |||
| 441 | else | 441 | else |
| 442 | atomic_set(&dreq->error, status); | 442 | atomic_set(&dreq->error, status); |
| 443 | 443 | ||
| 444 | if (unlikely(atomic_dec_and_test(&dreq->complete))) | 444 | if (unlikely(atomic_dec_and_test(&dreq->complete))) { |
| 445 | nfs_end_data_update(data->inode); | ||
| 445 | nfs_direct_complete(dreq); | 446 | nfs_direct_complete(dreq); |
| 447 | } | ||
| 446 | } | 448 | } |
| 447 | 449 | ||
| 448 | static const struct rpc_call_ops nfs_write_direct_ops = { | 450 | static const struct rpc_call_ops nfs_write_direct_ops = { |
| @@ -548,8 +550,6 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, siz | |||
| 548 | result = nfs_direct_wait(dreq); | 550 | result = nfs_direct_wait(dreq); |
| 549 | rpc_clnt_sigunmask(clnt, &oldset); | 551 | rpc_clnt_sigunmask(clnt, &oldset); |
| 550 | 552 | ||
| 551 | nfs_end_data_update(inode); | ||
| 552 | |||
| 553 | return result; | 553 | return result; |
| 554 | } | 554 | } |
| 555 | 555 | ||
| @@ -655,10 +655,6 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const char __user *buf, size_t | |||
| 655 | file->f_dentry->d_name.name, | 655 | file->f_dentry->d_name.name, |
| 656 | (unsigned long) count, (long long) pos); | 656 | (unsigned long) count, (long long) pos); |
| 657 | 657 | ||
| 658 | retval = -EINVAL; | ||
| 659 | if (!is_sync_kiocb(iocb)) | ||
| 660 | goto out; | ||
| 661 | |||
| 662 | retval = generic_write_checks(file, &pos, &count, 0); | 658 | retval = generic_write_checks(file, &pos, &count, 0); |
| 663 | if (retval) | 659 | if (retval) |
| 664 | goto out; | 660 | goto out; |
| @@ -688,8 +684,18 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const char __user *buf, size_t | |||
| 688 | 684 | ||
| 689 | retval = nfs_direct_write(iocb, (unsigned long) buf, count, | 685 | retval = nfs_direct_write(iocb, (unsigned long) buf, count, |
| 690 | pos, pages, page_count); | 686 | pos, pages, page_count); |
| 687 | |||
| 688 | /* | ||
| 689 | * XXX: nfs_end_data_update() already ensures this file's | ||
| 690 | * cached data is subsequently invalidated. Do we really | ||
| 691 | * need to call invalidate_inode_pages2() again here? | ||
| 692 | * | ||
| 693 | * For aio writes, this invalidation will almost certainly | ||
| 694 | * occur before the writes complete. Kind of racey. | ||
| 695 | */ | ||
| 691 | if (mapping->nrpages) | 696 | if (mapping->nrpages) |
| 692 | invalidate_inode_pages2(mapping); | 697 | invalidate_inode_pages2(mapping); |
| 698 | |||
| 693 | if (retval > 0) | 699 | if (retval > 0) |
| 694 | iocb->ki_pos = pos + retval; | 700 | iocb->ki_pos = pos + retval; |
| 695 | 701 | ||
