diff options
author | Peng Tao <bergwolf@gmail.com> | 2012-08-23 12:27:50 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-10-01 18:38:16 -0400 |
commit | 5d0e3a004f02bffab51f542fa1d5b2e2854d8545 (patch) | |
tree | da2a97bb6593aa3393ef17ad3c97d9af5595a455 /fs | |
parent | dc182549d439f60c332bf74d7f220a1bccf37da6 (diff) |
Revert "pnfsblock: bail out partial page IO"
This reverts commit 159e0561e322dd8008fff59e36efff8d2bdd0b0e, in favor
of a more complete fix to the alignment issue.
Signed-off-by: Peng Tao <tao.peng@emc.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/blocklayout/blocklayout.c | 39 |
1 files changed, 3 insertions, 36 deletions
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index 329bfbfed37d..3c61514599a5 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c | |||
@@ -228,14 +228,6 @@ bl_end_par_io_read(void *data, int unused) | |||
228 | schedule_work(&rdata->task.u.tk_work); | 228 | schedule_work(&rdata->task.u.tk_work); |
229 | } | 229 | } |
230 | 230 | ||
231 | static bool | ||
232 | bl_check_alignment(u64 offset, u32 len, unsigned long blkmask) | ||
233 | { | ||
234 | if ((offset & blkmask) || (len & blkmask)) | ||
235 | return false; | ||
236 | return true; | ||
237 | } | ||
238 | |||
239 | static enum pnfs_try_status | 231 | static enum pnfs_try_status |
240 | bl_read_pagelist(struct nfs_read_data *rdata) | 232 | bl_read_pagelist(struct nfs_read_data *rdata) |
241 | { | 233 | { |
@@ -252,9 +244,6 @@ bl_read_pagelist(struct nfs_read_data *rdata) | |||
252 | dprintk("%s enter nr_pages %u offset %lld count %u\n", __func__, | 244 | dprintk("%s enter nr_pages %u offset %lld count %u\n", __func__, |
253 | rdata->pages.npages, f_offset, (unsigned int)rdata->args.count); | 245 | rdata->pages.npages, f_offset, (unsigned int)rdata->args.count); |
254 | 246 | ||
255 | if (!bl_check_alignment(f_offset, rdata->args.count, PAGE_CACHE_MASK)) | ||
256 | goto use_mds; | ||
257 | |||
258 | par = alloc_parallel(rdata); | 247 | par = alloc_parallel(rdata); |
259 | if (!par) | 248 | if (!par) |
260 | goto use_mds; | 249 | goto use_mds; |
@@ -563,7 +552,7 @@ bl_write_pagelist(struct nfs_write_data *wdata, int sync) | |||
563 | struct bio *bio = NULL; | 552 | struct bio *bio = NULL; |
564 | struct pnfs_block_extent *be = NULL, *cow_read = NULL; | 553 | struct pnfs_block_extent *be = NULL, *cow_read = NULL; |
565 | sector_t isect, last_isect = 0, extent_length = 0; | 554 | sector_t isect, last_isect = 0, extent_length = 0; |
566 | struct parallel_io *par = NULL; | 555 | struct parallel_io *par; |
567 | loff_t offset = wdata->args.offset; | 556 | loff_t offset = wdata->args.offset; |
568 | size_t count = wdata->args.count; | 557 | size_t count = wdata->args.count; |
569 | struct page **pages = wdata->args.pages; | 558 | struct page **pages = wdata->args.pages; |
@@ -574,10 +563,6 @@ bl_write_pagelist(struct nfs_write_data *wdata, int sync) | |||
574 | NFS_SERVER(header->inode)->pnfs_blksize >> PAGE_CACHE_SHIFT; | 563 | NFS_SERVER(header->inode)->pnfs_blksize >> PAGE_CACHE_SHIFT; |
575 | 564 | ||
576 | dprintk("%s enter, %Zu@%lld\n", __func__, count, offset); | 565 | dprintk("%s enter, %Zu@%lld\n", __func__, count, offset); |
577 | /* Check for alignment first */ | ||
578 | if (!bl_check_alignment(offset, count, PAGE_CACHE_MASK)) | ||
579 | goto out_mds; | ||
580 | |||
581 | /* At this point, wdata->pages is a (sequential) list of nfs_pages. | 566 | /* At this point, wdata->pages is a (sequential) list of nfs_pages. |
582 | * We want to write each, and if there is an error set pnfs_error | 567 | * We want to write each, and if there is an error set pnfs_error |
583 | * to have it redone using nfs. | 568 | * to have it redone using nfs. |
@@ -1011,32 +996,14 @@ bl_clear_layoutdriver(struct nfs_server *server) | |||
1011 | return 0; | 996 | return 0; |
1012 | } | 997 | } |
1013 | 998 | ||
1014 | static void | ||
1015 | bl_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req) | ||
1016 | { | ||
1017 | if (!bl_check_alignment(req->wb_offset, req->wb_bytes, PAGE_CACHE_MASK)) | ||
1018 | nfs_pageio_reset_read_mds(pgio); | ||
1019 | else | ||
1020 | pnfs_generic_pg_init_read(pgio, req); | ||
1021 | } | ||
1022 | |||
1023 | static void | ||
1024 | bl_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *req) | ||
1025 | { | ||
1026 | if (!bl_check_alignment(req->wb_offset, req->wb_bytes, PAGE_CACHE_MASK)) | ||
1027 | nfs_pageio_reset_write_mds(pgio); | ||
1028 | else | ||
1029 | pnfs_generic_pg_init_write(pgio, req); | ||
1030 | } | ||
1031 | |||
1032 | static const struct nfs_pageio_ops bl_pg_read_ops = { | 999 | static const struct nfs_pageio_ops bl_pg_read_ops = { |
1033 | .pg_init = bl_pg_init_read, | 1000 | .pg_init = pnfs_generic_pg_init_read, |
1034 | .pg_test = pnfs_generic_pg_test, | 1001 | .pg_test = pnfs_generic_pg_test, |
1035 | .pg_doio = pnfs_generic_pg_readpages, | 1002 | .pg_doio = pnfs_generic_pg_readpages, |
1036 | }; | 1003 | }; |
1037 | 1004 | ||
1038 | static const struct nfs_pageio_ops bl_pg_write_ops = { | 1005 | static const struct nfs_pageio_ops bl_pg_write_ops = { |
1039 | .pg_init = bl_pg_init_write, | 1006 | .pg_init = pnfs_generic_pg_init_write, |
1040 | .pg_test = pnfs_generic_pg_test, | 1007 | .pg_test = pnfs_generic_pg_test, |
1041 | .pg_doio = pnfs_generic_pg_writepages, | 1008 | .pg_doio = pnfs_generic_pg_writepages, |
1042 | }; | 1009 | }; |