diff options
author | Weston Andros Adamson <dros@primarydata.com> | 2014-05-15 11:56:43 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-05-29 11:11:43 -0400 |
commit | b4fdac1a5150174df0847a45dc6612ce5ce3daeb (patch) | |
tree | 477f3dc72760a8ff622934723c4a984cd4c9ce5d | |
parent | 8c8f1ac109726e4ed44a920f5c962c84610d4a17 (diff) |
nfs: modify pg_test interface to return size_t
This is a step toward allowing pg_test to inform the the
coalescing code to reduce the size of requests so they may fit in
whatever scheme the pg_test callback wants to define.
For now, just return the size of the request if there is space, or 0
if there is not. This shouldn't change any behavior as it acts
the same as when the pg_test functions returned bool.
Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r-- | fs/nfs/blocklayout/blocklayout.c | 16 | ||||
-rw-r--r-- | fs/nfs/nfs4filelayout.c | 12 | ||||
-rw-r--r-- | fs/nfs/objlayout/objio_osd.c | 15 | ||||
-rw-r--r-- | fs/nfs/pagelist.c | 22 | ||||
-rw-r--r-- | fs/nfs/pnfs.c | 12 | ||||
-rw-r--r-- | fs/nfs/pnfs.h | 3 | ||||
-rw-r--r-- | include/linux/nfs_page.h | 5 |
7 files changed, 62 insertions, 23 deletions
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index 206cc68c9694..9b431f44fad9 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c | |||
@@ -1189,13 +1189,17 @@ bl_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req) | |||
1189 | pnfs_generic_pg_init_read(pgio, req); | 1189 | pnfs_generic_pg_init_read(pgio, req); |
1190 | } | 1190 | } |
1191 | 1191 | ||
1192 | static bool | 1192 | /* |
1193 | * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number | ||
1194 | * of bytes (maximum @req->wb_bytes) that can be coalesced. | ||
1195 | */ | ||
1196 | static size_t | ||
1193 | bl_pg_test_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, | 1197 | bl_pg_test_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, |
1194 | struct nfs_page *req) | 1198 | struct nfs_page *req) |
1195 | { | 1199 | { |
1196 | if (pgio->pg_dreq != NULL && | 1200 | if (pgio->pg_dreq != NULL && |
1197 | !is_aligned_req(req, SECTOR_SIZE)) | 1201 | !is_aligned_req(req, SECTOR_SIZE)) |
1198 | return false; | 1202 | return 0; |
1199 | 1203 | ||
1200 | return pnfs_generic_pg_test(pgio, prev, req); | 1204 | return pnfs_generic_pg_test(pgio, prev, req); |
1201 | } | 1205 | } |
@@ -1241,13 +1245,17 @@ bl_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *req) | |||
1241 | } | 1245 | } |
1242 | } | 1246 | } |
1243 | 1247 | ||
1244 | static bool | 1248 | /* |
1249 | * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number | ||
1250 | * of bytes (maximum @req->wb_bytes) that can be coalesced. | ||
1251 | */ | ||
1252 | static size_t | ||
1245 | bl_pg_test_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, | 1253 | bl_pg_test_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, |
1246 | struct nfs_page *req) | 1254 | struct nfs_page *req) |
1247 | { | 1255 | { |
1248 | if (pgio->pg_dreq != NULL && | 1256 | if (pgio->pg_dreq != NULL && |
1249 | !is_aligned_req(req, PAGE_CACHE_SIZE)) | 1257 | !is_aligned_req(req, PAGE_CACHE_SIZE)) |
1250 | return false; | 1258 | return 0; |
1251 | 1259 | ||
1252 | return pnfs_generic_pg_test(pgio, prev, req); | 1260 | return pnfs_generic_pg_test(pgio, prev, req); |
1253 | } | 1261 | } |
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c index 9fd7cebbff04..ba9a9aadf6c8 100644 --- a/fs/nfs/nfs4filelayout.c +++ b/fs/nfs/nfs4filelayout.c | |||
@@ -915,10 +915,10 @@ filelayout_alloc_lseg(struct pnfs_layout_hdr *layoutid, | |||
915 | /* | 915 | /* |
916 | * filelayout_pg_test(). Called by nfs_can_coalesce_requests() | 916 | * filelayout_pg_test(). Called by nfs_can_coalesce_requests() |
917 | * | 917 | * |
918 | * return true : coalesce page | 918 | * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number |
919 | * return false : don't coalesce page | 919 | * of bytes (maximum @req->wb_bytes) that can be coalesced. |
920 | */ | 920 | */ |
921 | static bool | 921 | static size_t |
922 | filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, | 922 | filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, |
923 | struct nfs_page *req) | 923 | struct nfs_page *req) |
924 | { | 924 | { |
@@ -927,7 +927,7 @@ filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, | |||
927 | 927 | ||
928 | if (!pnfs_generic_pg_test(pgio, prev, req) || | 928 | if (!pnfs_generic_pg_test(pgio, prev, req) || |
929 | !nfs_generic_pg_test(pgio, prev, req)) | 929 | !nfs_generic_pg_test(pgio, prev, req)) |
930 | return false; | 930 | return 0; |
931 | 931 | ||
932 | p_stripe = (u64)req_offset(prev); | 932 | p_stripe = (u64)req_offset(prev); |
933 | r_stripe = (u64)req_offset(req); | 933 | r_stripe = (u64)req_offset(req); |
@@ -936,7 +936,9 @@ filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, | |||
936 | do_div(p_stripe, stripe_unit); | 936 | do_div(p_stripe, stripe_unit); |
937 | do_div(r_stripe, stripe_unit); | 937 | do_div(r_stripe, stripe_unit); |
938 | 938 | ||
939 | return (p_stripe == r_stripe); | 939 | if (p_stripe == r_stripe) |
940 | return req->wb_bytes; | ||
941 | return 0; | ||
940 | } | 942 | } |
941 | 943 | ||
942 | static void | 944 | static void |
diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c index 426b366b0b33..71b9c69dbe9c 100644 --- a/fs/nfs/objlayout/objio_osd.c +++ b/fs/nfs/objlayout/objio_osd.c | |||
@@ -564,14 +564,19 @@ int objio_write_pagelist(struct nfs_pgio_data *wdata, int how) | |||
564 | return 0; | 564 | return 0; |
565 | } | 565 | } |
566 | 566 | ||
567 | static bool objio_pg_test(struct nfs_pageio_descriptor *pgio, | 567 | /* |
568 | * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number | ||
569 | * of bytes (maximum @req->wb_bytes) that can be coalesced. | ||
570 | */ | ||
571 | static size_t objio_pg_test(struct nfs_pageio_descriptor *pgio, | ||
568 | struct nfs_page *prev, struct nfs_page *req) | 572 | struct nfs_page *prev, struct nfs_page *req) |
569 | { | 573 | { |
570 | if (!pnfs_generic_pg_test(pgio, prev, req)) | 574 | if (!pnfs_generic_pg_test(pgio, prev, req) || |
571 | return false; | 575 | pgio->pg_count + req->wb_bytes > |
576 | (unsigned long)pgio->pg_layout_private) | ||
577 | return 0; | ||
572 | 578 | ||
573 | return pgio->pg_count + req->wb_bytes <= | 579 | return req->wb_bytes; |
574 | (unsigned long)pgio->pg_layout_private; | ||
575 | } | 580 | } |
576 | 581 | ||
577 | static void objio_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req) | 582 | static void objio_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req) |
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c index 4b4b212ec6b2..82233431880d 100644 --- a/fs/nfs/pagelist.c +++ b/fs/nfs/pagelist.c | |||
@@ -280,7 +280,17 @@ nfs_wait_on_request(struct nfs_page *req) | |||
280 | TASK_UNINTERRUPTIBLE); | 280 | TASK_UNINTERRUPTIBLE); |
281 | } | 281 | } |
282 | 282 | ||
283 | bool nfs_generic_pg_test(struct nfs_pageio_descriptor *desc, struct nfs_page *prev, struct nfs_page *req) | 283 | /* |
284 | * nfs_generic_pg_test - determine if requests can be coalesced | ||
285 | * @desc: pointer to descriptor | ||
286 | * @prev: previous request in desc, or NULL | ||
287 | * @req: this request | ||
288 | * | ||
289 | * Returns zero if @req can be coalesced into @desc, otherwise it returns | ||
290 | * the size of the request. | ||
291 | */ | ||
292 | size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc, | ||
293 | struct nfs_page *prev, struct nfs_page *req) | ||
284 | { | 294 | { |
285 | /* | 295 | /* |
286 | * FIXME: ideally we should be able to coalesce all requests | 296 | * FIXME: ideally we should be able to coalesce all requests |
@@ -292,7 +302,9 @@ bool nfs_generic_pg_test(struct nfs_pageio_descriptor *desc, struct nfs_page *pr | |||
292 | if (desc->pg_bsize < PAGE_SIZE) | 302 | if (desc->pg_bsize < PAGE_SIZE) |
293 | return 0; | 303 | return 0; |
294 | 304 | ||
295 | return desc->pg_count + req->wb_bytes <= desc->pg_bsize; | 305 | if (desc->pg_count + req->wb_bytes <= desc->pg_bsize) |
306 | return req->wb_bytes; | ||
307 | return 0; | ||
296 | } | 308 | } |
297 | EXPORT_SYMBOL_GPL(nfs_generic_pg_test); | 309 | EXPORT_SYMBOL_GPL(nfs_generic_pg_test); |
298 | 310 | ||
@@ -747,6 +759,8 @@ static bool nfs_can_coalesce_requests(struct nfs_page *prev, | |||
747 | struct nfs_page *req, | 759 | struct nfs_page *req, |
748 | struct nfs_pageio_descriptor *pgio) | 760 | struct nfs_pageio_descriptor *pgio) |
749 | { | 761 | { |
762 | size_t size; | ||
763 | |||
750 | if (!nfs_match_open_context(req->wb_context, prev->wb_context)) | 764 | if (!nfs_match_open_context(req->wb_context, prev->wb_context)) |
751 | return false; | 765 | return false; |
752 | if (req->wb_context->dentry->d_inode->i_flock != NULL && | 766 | if (req->wb_context->dentry->d_inode->i_flock != NULL && |
@@ -758,7 +772,9 @@ static bool nfs_can_coalesce_requests(struct nfs_page *prev, | |||
758 | return false; | 772 | return false; |
759 | if (req_offset(req) != req_offset(prev) + prev->wb_bytes) | 773 | if (req_offset(req) != req_offset(prev) + prev->wb_bytes) |
760 | return false; | 774 | return false; |
761 | return pgio->pg_ops->pg_test(pgio, prev, req); | 775 | size = pgio->pg_ops->pg_test(pgio, prev, req); |
776 | WARN_ON_ONCE(size && size != req->wb_bytes); | ||
777 | return size > 0; | ||
762 | } | 778 | } |
763 | 779 | ||
764 | /** | 780 | /** |
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 0fe670189fd1..de6eb16f94d1 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c | |||
@@ -1434,7 +1434,11 @@ pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, | |||
1434 | } | 1434 | } |
1435 | EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_write); | 1435 | EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_write); |
1436 | 1436 | ||
1437 | bool | 1437 | /* |
1438 | * Return 0 if @req cannot be coalesced into @pgio, otherwise return the number | ||
1439 | * of bytes (maximum @req->wb_bytes) that can be coalesced. | ||
1440 | */ | ||
1441 | size_t | ||
1438 | pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, | 1442 | pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, |
1439 | struct nfs_page *req) | 1443 | struct nfs_page *req) |
1440 | { | 1444 | { |
@@ -1455,8 +1459,10 @@ pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, | |||
1455 | * first byte that lies outside the pnfs_layout_range. FIXME? | 1459 | * first byte that lies outside the pnfs_layout_range. FIXME? |
1456 | * | 1460 | * |
1457 | */ | 1461 | */ |
1458 | return req_offset(req) < end_offset(pgio->pg_lseg->pls_range.offset, | 1462 | if (req_offset(req) < end_offset(pgio->pg_lseg->pls_range.offset, |
1459 | pgio->pg_lseg->pls_range.length); | 1463 | pgio->pg_lseg->pls_range.length)) |
1464 | return req->wb_bytes; | ||
1465 | return 0; | ||
1460 | } | 1466 | } |
1461 | EXPORT_SYMBOL_GPL(pnfs_generic_pg_test); | 1467 | EXPORT_SYMBOL_GPL(pnfs_generic_pg_test); |
1462 | 1468 | ||
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 0031267d7492..dccf182ec4d8 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h | |||
@@ -187,7 +187,8 @@ int pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc); | |||
187 | void pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, | 187 | void pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, |
188 | struct nfs_page *req, u64 wb_size); | 188 | struct nfs_page *req, u64 wb_size); |
189 | int pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc); | 189 | int pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc); |
190 | bool pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, struct nfs_page *req); | 190 | size_t pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, |
191 | struct nfs_page *prev, struct nfs_page *req); | ||
191 | void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg); | 192 | void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg); |
192 | struct pnfs_layout_segment *pnfs_layout_process(struct nfs4_layoutget *lgp); | 193 | struct pnfs_layout_segment *pnfs_layout_process(struct nfs4_layoutget *lgp); |
193 | void pnfs_free_lseg_list(struct list_head *tmp_list); | 194 | void pnfs_free_lseg_list(struct list_head *tmp_list); |
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index be0b0981e7a0..13d59af561f6 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h | |||
@@ -46,7 +46,8 @@ struct nfs_page { | |||
46 | struct nfs_pageio_descriptor; | 46 | struct nfs_pageio_descriptor; |
47 | struct nfs_pageio_ops { | 47 | struct nfs_pageio_ops { |
48 | void (*pg_init)(struct nfs_pageio_descriptor *, struct nfs_page *); | 48 | void (*pg_init)(struct nfs_pageio_descriptor *, struct nfs_page *); |
49 | bool (*pg_test)(struct nfs_pageio_descriptor *, struct nfs_page *, struct nfs_page *); | 49 | size_t (*pg_test)(struct nfs_pageio_descriptor *, struct nfs_page *, |
50 | struct nfs_page *); | ||
50 | int (*pg_doio)(struct nfs_pageio_descriptor *); | 51 | int (*pg_doio)(struct nfs_pageio_descriptor *); |
51 | }; | 52 | }; |
52 | 53 | ||
@@ -102,7 +103,7 @@ extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *, | |||
102 | struct nfs_page *); | 103 | struct nfs_page *); |
103 | extern void nfs_pageio_complete(struct nfs_pageio_descriptor *desc); | 104 | extern void nfs_pageio_complete(struct nfs_pageio_descriptor *desc); |
104 | extern void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *, pgoff_t); | 105 | extern void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *, pgoff_t); |
105 | extern bool nfs_generic_pg_test(struct nfs_pageio_descriptor *desc, | 106 | extern size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc, |
106 | struct nfs_page *prev, | 107 | struct nfs_page *prev, |
107 | struct nfs_page *req); | 108 | struct nfs_page *req); |
108 | extern int nfs_wait_on_request(struct nfs_page *); | 109 | extern int nfs_wait_on_request(struct nfs_page *); |