diff options
author | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-11-22 13:06:44 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-11-22 13:06:44 -0500 |
commit | 0bd2af46839ad6262d25714a6ec0365db9d6b98f (patch) | |
tree | dcced72d230d69fd0c5816ac6dd03ab84799a93e /fs/nfs/direct.c | |
parent | e138a5d2356729b8752e88520cc1525fae9794ac (diff) | |
parent | f26b90440cd74c78fe10c9bd5160809704a9627c (diff) |
Merge ../scsi-rc-fixes-2.6
Diffstat (limited to 'fs/nfs/direct.c')
-rw-r--r-- | fs/nfs/direct.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 9f7f8b9ea1e2..bdfabf854a51 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
@@ -497,6 +497,7 @@ static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode | |||
497 | if (dreq->commit_data != NULL) | 497 | if (dreq->commit_data != NULL) |
498 | nfs_commit_free(dreq->commit_data); | 498 | nfs_commit_free(dreq->commit_data); |
499 | nfs_direct_free_writedata(dreq); | 499 | nfs_direct_free_writedata(dreq); |
500 | nfs_zap_mapping(inode, inode->i_mapping); | ||
500 | nfs_direct_complete(dreq); | 501 | nfs_direct_complete(dreq); |
501 | } | 502 | } |
502 | } | 503 | } |
@@ -517,6 +518,7 @@ static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode | |||
517 | { | 518 | { |
518 | nfs_end_data_update(inode); | 519 | nfs_end_data_update(inode); |
519 | nfs_direct_free_writedata(dreq); | 520 | nfs_direct_free_writedata(dreq); |
521 | nfs_zap_mapping(inode, inode->i_mapping); | ||
520 | nfs_direct_complete(dreq); | 522 | nfs_direct_complete(dreq); |
521 | } | 523 | } |
522 | #endif | 524 | #endif |
@@ -532,10 +534,12 @@ static void nfs_direct_write_result(struct rpc_task *task, void *calldata) | |||
532 | 534 | ||
533 | spin_lock(&dreq->lock); | 535 | spin_lock(&dreq->lock); |
534 | 536 | ||
535 | if (likely(status >= 0)) | 537 | if (unlikely(status < 0)) { |
536 | dreq->count += data->res.count; | 538 | dreq->error = status; |
537 | else | 539 | goto out_unlock; |
538 | dreq->error = task->tk_status; | 540 | } |
541 | |||
542 | dreq->count += data->res.count; | ||
539 | 543 | ||
540 | if (data->res.verf->committed != NFS_FILE_SYNC) { | 544 | if (data->res.verf->committed != NFS_FILE_SYNC) { |
541 | switch (dreq->flags) { | 545 | switch (dreq->flags) { |
@@ -550,7 +554,7 @@ static void nfs_direct_write_result(struct rpc_task *task, void *calldata) | |||
550 | } | 554 | } |
551 | } | 555 | } |
552 | } | 556 | } |
553 | 557 | out_unlock: | |
554 | spin_unlock(&dreq->lock); | 558 | spin_unlock(&dreq->lock); |
555 | } | 559 | } |
556 | 560 | ||
@@ -828,17 +832,6 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov, | |||
828 | 832 | ||
829 | retval = nfs_direct_write(iocb, (unsigned long) buf, count, pos); | 833 | retval = nfs_direct_write(iocb, (unsigned long) buf, count, pos); |
830 | 834 | ||
831 | /* | ||
832 | * XXX: nfs_end_data_update() already ensures this file's | ||
833 | * cached data is subsequently invalidated. Do we really | ||
834 | * need to call invalidate_inode_pages2() again here? | ||
835 | * | ||
836 | * For aio writes, this invalidation will almost certainly | ||
837 | * occur before the writes complete. Kind of racey. | ||
838 | */ | ||
839 | if (mapping->nrpages) | ||
840 | invalidate_inode_pages2(mapping); | ||
841 | |||
842 | if (retval > 0) | 835 | if (retval > 0) |
843 | iocb->ki_pos = pos + retval; | 836 | iocb->ki_pos = pos + retval; |
844 | 837 | ||