diff options
Diffstat (limited to 'fs/nfs/direct.c')
| -rw-r--r-- | fs/nfs/direct.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index ad2775d3e219..48253372ab1d 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
| @@ -484,17 +484,22 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) | |||
| 484 | 484 | ||
| 485 | list_for_each_entry_safe(req, tmp, &reqs, wb_list) { | 485 | list_for_each_entry_safe(req, tmp, &reqs, wb_list) { |
| 486 | if (!nfs_pageio_add_request(&desc, req)) { | 486 | if (!nfs_pageio_add_request(&desc, req)) { |
| 487 | nfs_list_remove_request(req); | ||
| 487 | nfs_list_add_request(req, &failed); | 488 | nfs_list_add_request(req, &failed); |
| 488 | spin_lock(cinfo.lock); | 489 | spin_lock(cinfo.lock); |
| 489 | dreq->flags = 0; | 490 | dreq->flags = 0; |
| 490 | dreq->error = -EIO; | 491 | dreq->error = -EIO; |
| 491 | spin_unlock(cinfo.lock); | 492 | spin_unlock(cinfo.lock); |
| 492 | } | 493 | } |
| 494 | nfs_release_request(req); | ||
| 493 | } | 495 | } |
| 494 | nfs_pageio_complete(&desc); | 496 | nfs_pageio_complete(&desc); |
| 495 | 497 | ||
| 496 | while (!list_empty(&failed)) | 498 | while (!list_empty(&failed)) { |
| 499 | req = nfs_list_entry(failed.next); | ||
| 500 | nfs_list_remove_request(req); | ||
| 497 | nfs_unlock_and_release_request(req); | 501 | nfs_unlock_and_release_request(req); |
| 502 | } | ||
| 498 | 503 | ||
| 499 | if (put_dreq(dreq)) | 504 | if (put_dreq(dreq)) |
| 500 | nfs_direct_write_complete(dreq, dreq->inode); | 505 | nfs_direct_write_complete(dreq, dreq->inode); |
| @@ -523,9 +528,9 @@ static void nfs_direct_commit_complete(struct nfs_commit_data *data) | |||
| 523 | nfs_list_remove_request(req); | 528 | nfs_list_remove_request(req); |
| 524 | if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) { | 529 | if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) { |
| 525 | /* Note the rewrite will go through mds */ | 530 | /* Note the rewrite will go through mds */ |
| 526 | kref_get(&req->wb_kref); | ||
| 527 | nfs_mark_request_commit(req, NULL, &cinfo); | 531 | nfs_mark_request_commit(req, NULL, &cinfo); |
| 528 | } | 532 | } else |
| 533 | nfs_release_request(req); | ||
| 529 | nfs_unlock_and_release_request(req); | 534 | nfs_unlock_and_release_request(req); |
| 530 | } | 535 | } |
| 531 | 536 | ||
| @@ -716,12 +721,12 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr) | |||
| 716 | if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) | 721 | if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) |
| 717 | bit = NFS_IOHDR_NEED_RESCHED; | 722 | bit = NFS_IOHDR_NEED_RESCHED; |
| 718 | else if (dreq->flags == 0) { | 723 | else if (dreq->flags == 0) { |
| 719 | memcpy(&dreq->verf, &req->wb_verf, | 724 | memcpy(&dreq->verf, hdr->verf, |
| 720 | sizeof(dreq->verf)); | 725 | sizeof(dreq->verf)); |
| 721 | bit = NFS_IOHDR_NEED_COMMIT; | 726 | bit = NFS_IOHDR_NEED_COMMIT; |
| 722 | dreq->flags = NFS_ODIRECT_DO_COMMIT; | 727 | dreq->flags = NFS_ODIRECT_DO_COMMIT; |
| 723 | } else if (dreq->flags == NFS_ODIRECT_DO_COMMIT) { | 728 | } else if (dreq->flags == NFS_ODIRECT_DO_COMMIT) { |
| 724 | if (memcmp(&dreq->verf, &req->wb_verf, sizeof(dreq->verf))) { | 729 | if (memcmp(&dreq->verf, hdr->verf, sizeof(dreq->verf))) { |
| 725 | dreq->flags = NFS_ODIRECT_RESCHED_WRITES; | 730 | dreq->flags = NFS_ODIRECT_RESCHED_WRITES; |
| 726 | bit = NFS_IOHDR_NEED_RESCHED; | 731 | bit = NFS_IOHDR_NEED_RESCHED; |
| 727 | } else | 732 | } else |
