aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4filelayout.c
diff options
context:
space:
mode:
authorWeston Andros Adamson <dros@primarydata.com>2014-05-15 11:56:51 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2014-05-29 11:11:47 -0400
commit0f9c429eca07aca2764ccd751e2b48ba5397b936 (patch)
tree47511b14902ff683a445e00cf4408b2054c8d547 /fs/nfs/nfs4filelayout.c
parent6094f83864c1d1296566a282cba05ba613f151ee (diff)
nfs: chain calls to pg_test
Now that pg_test can change the size of the request (by returning a non-zero size smaller than the request), pg_test functions that call other pg_test functions must return the minimum of the result - or 0 if any fail. Also clean up the logic of some pg_test functions so that all checks are for contitions where coalescing is not possible. Signed-off-by: Weston Andros Adamson <dros@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs/nfs4filelayout.c')
-rw-r--r--fs/nfs/nfs4filelayout.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index 9cea9358fe52..7a665e0f35b7 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -928,26 +928,27 @@ static size_t
928filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, 928filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
929 struct nfs_page *req) 929 struct nfs_page *req)
930{ 930{
931 unsigned int size;
931 u64 p_stripe, r_stripe; 932 u64 p_stripe, r_stripe;
932 u32 stripe_unit; 933 u32 stripe_unit;
933 934
934 if (!pnfs_generic_pg_test(pgio, prev, req) || 935 /* calls nfs_generic_pg_test */
935 !nfs_generic_pg_test(pgio, prev, req)) 936 size = pnfs_generic_pg_test(pgio, prev, req);
937 if (!size)
936 return 0; 938 return 0;
937 939
938 if (!prev) 940 if (prev) {
939 return req->wb_bytes; 941 p_stripe = (u64)req_offset(prev);
942 r_stripe = (u64)req_offset(req);
943 stripe_unit = FILELAYOUT_LSEG(pgio->pg_lseg)->stripe_unit;
940 944
941 p_stripe = (u64)req_offset(prev); 945 do_div(p_stripe, stripe_unit);
942 r_stripe = (u64)req_offset(req); 946 do_div(r_stripe, stripe_unit);
943 stripe_unit = FILELAYOUT_LSEG(pgio->pg_lseg)->stripe_unit;
944 947
945 do_div(p_stripe, stripe_unit); 948 if (p_stripe != r_stripe)
946 do_div(r_stripe, stripe_unit); 949 return 0;
947 950 }
948 if (p_stripe == r_stripe) 951 return min(size, req->wb_bytes);
949 return req->wb_bytes;
950 return 0;
951} 952}
952 953
953static void 954static void