aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
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
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')
-rw-r--r--fs/nfs/nfs4filelayout.c27
-rw-r--r--fs/nfs/objlayout/objio_osd.c9
-rw-r--r--fs/nfs/pnfs.c15
3 files changed, 30 insertions, 21 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
diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c
index 71b9c69dbe9c..611320753db2 100644
--- a/fs/nfs/objlayout/objio_osd.c
+++ b/fs/nfs/objlayout/objio_osd.c
@@ -571,12 +571,15 @@ int objio_write_pagelist(struct nfs_pgio_data *wdata, int how)
571static size_t objio_pg_test(struct nfs_pageio_descriptor *pgio, 571static size_t objio_pg_test(struct nfs_pageio_descriptor *pgio,
572 struct nfs_page *prev, struct nfs_page *req) 572 struct nfs_page *prev, struct nfs_page *req)
573{ 573{
574 if (!pnfs_generic_pg_test(pgio, prev, req) || 574 unsigned int size;
575 pgio->pg_count + req->wb_bytes > 575
576 size = pnfs_generic_pg_test(pgio, prev, req);
577
578 if (!size || pgio->pg_count + req->wb_bytes >
576 (unsigned long)pgio->pg_layout_private) 579 (unsigned long)pgio->pg_layout_private)
577 return 0; 580 return 0;
578 581
579 return req->wb_bytes; 582 return min(size, req->wb_bytes);
580} 583}
581 584
582static void objio_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req) 585static void objio_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req)
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index de6eb16f94d1..354c53cd4095 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1442,8 +1442,12 @@ size_t
1442pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, 1442pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
1443 struct nfs_page *req) 1443 struct nfs_page *req)
1444{ 1444{
1445 if (pgio->pg_lseg == NULL) 1445 unsigned int size;
1446 return nfs_generic_pg_test(pgio, prev, req); 1446
1447 size = nfs_generic_pg_test(pgio, prev, req);
1448
1449 if (!size)
1450 return 0;
1447 1451
1448 /* 1452 /*
1449 * Test if a nfs_page is fully contained in the pnfs_layout_range. 1453 * Test if a nfs_page is fully contained in the pnfs_layout_range.
@@ -1459,10 +1463,11 @@ pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
1459 * first byte that lies outside the pnfs_layout_range. FIXME? 1463 * first byte that lies outside the pnfs_layout_range. FIXME?
1460 * 1464 *
1461 */ 1465 */
1462 if (req_offset(req) < end_offset(pgio->pg_lseg->pls_range.offset, 1466 if (req_offset(req) >= end_offset(pgio->pg_lseg->pls_range.offset,
1463 pgio->pg_lseg->pls_range.length)) 1467 pgio->pg_lseg->pls_range.length))
1464 return req->wb_bytes; 1468 return 0;
1465 return 0; 1469
1470 return min(size, req->wb_bytes);
1466} 1471}
1467EXPORT_SYMBOL_GPL(pnfs_generic_pg_test); 1472EXPORT_SYMBOL_GPL(pnfs_generic_pg_test);
1468 1473