diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2015-12-28 14:49:41 -0500 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2015-12-28 14:49:41 -0500 |
commit | 58baac0ac7cc13a690f6f7cea23accaf84e843a0 (patch) | |
tree | f73c2f68d4a43ad95b75de646ad7e39c90d42c64 /fs/nfs/direct.c | |
parent | 8d0ed0ca6381fea4a97f3b0f085cb1dfa0a50ec0 (diff) | |
parent | 4d0ac22109740c36174c5aac630876b2af0f6943 (diff) |
Merge branch 'flexfiles'
* flexfiles:
pNFS/flexfiles: Ensure we record layoutstats even if RPC is terminated early
pNFS: Add flag to track if we've called nfs4_ff_layout_stat_io_start_read/write
pNFS/flexfiles: Fix a statistics gathering imbalance
pNFS/flexfiles: Don't mark the entire layout as failed, when returning it
pNFS/flexfiles: Don't prevent flexfiles client from retrying LAYOUTGET
pnfs/flexfiles: count io stat in rpc_count_stats callback
pnfs/flexfiles: do not mark delay-like status as DS failure
NFS41: map NFS4ERR_LAYOUTUNAVAILABLE to ENODATA
nfs: only remove page from mapping if launder_page fails
nfs: handle request add failure properly
nfs: centralize pgio error cleanup
nfs: clean up rest of reqs when failing to add one
NFS41: pop some layoutget errors to application
pNFS/flexfiles: Support server-supplied layoutstats sampling period
Diffstat (limited to 'fs/nfs/direct.c')
-rw-r--r-- | fs/nfs/direct.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 4b1d08f56aba..2e7142bcb4c8 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
@@ -670,6 +670,10 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) | |||
670 | 670 | ||
671 | req = nfs_list_entry(reqs.next); | 671 | req = nfs_list_entry(reqs.next); |
672 | nfs_direct_setup_mirroring(dreq, &desc, req); | 672 | nfs_direct_setup_mirroring(dreq, &desc, req); |
673 | if (desc.pg_error < 0) { | ||
674 | list_splice_init(&reqs, &failed); | ||
675 | goto out_failed; | ||
676 | } | ||
673 | 677 | ||
674 | list_for_each_entry_safe(req, tmp, &reqs, wb_list) { | 678 | list_for_each_entry_safe(req, tmp, &reqs, wb_list) { |
675 | if (!nfs_pageio_add_request(&desc, req)) { | 679 | if (!nfs_pageio_add_request(&desc, req)) { |
@@ -677,13 +681,17 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq) | |||
677 | nfs_list_add_request(req, &failed); | 681 | nfs_list_add_request(req, &failed); |
678 | spin_lock(cinfo.lock); | 682 | spin_lock(cinfo.lock); |
679 | dreq->flags = 0; | 683 | dreq->flags = 0; |
680 | dreq->error = -EIO; | 684 | if (desc.pg_error < 0) |
685 | dreq->error = desc.pg_error; | ||
686 | else | ||
687 | dreq->error = -EIO; | ||
681 | spin_unlock(cinfo.lock); | 688 | spin_unlock(cinfo.lock); |
682 | } | 689 | } |
683 | nfs_release_request(req); | 690 | nfs_release_request(req); |
684 | } | 691 | } |
685 | nfs_pageio_complete(&desc); | 692 | nfs_pageio_complete(&desc); |
686 | 693 | ||
694 | out_failed: | ||
687 | while (!list_empty(&failed)) { | 695 | while (!list_empty(&failed)) { |
688 | req = nfs_list_entry(failed.next); | 696 | req = nfs_list_entry(failed.next); |
689 | nfs_list_remove_request(req); | 697 | nfs_list_remove_request(req); |
@@ -900,6 +908,11 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq, | |||
900 | } | 908 | } |
901 | 909 | ||
902 | nfs_direct_setup_mirroring(dreq, &desc, req); | 910 | nfs_direct_setup_mirroring(dreq, &desc, req); |
911 | if (desc.pg_error < 0) { | ||
912 | nfs_free_request(req); | ||
913 | result = desc.pg_error; | ||
914 | break; | ||
915 | } | ||
903 | 916 | ||
904 | nfs_lock_request(req); | 917 | nfs_lock_request(req); |
905 | req->wb_index = pos >> PAGE_SHIFT; | 918 | req->wb_index = pos >> PAGE_SHIFT; |