aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/blocklayout/blocklayout.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c
index 61e04fb7c4b..af3ef0e6849 100644
--- a/fs/nfs/blocklayout/blocklayout.c
+++ b/fs/nfs/blocklayout/blocklayout.c
@@ -685,7 +685,7 @@ bl_write_pagelist(struct nfs_write_data *wdata, int sync)
685 struct bio *bio = NULL; 685 struct bio *bio = NULL;
686 struct pnfs_block_extent *be = NULL, *cow_read = NULL; 686 struct pnfs_block_extent *be = NULL, *cow_read = NULL;
687 sector_t isect, last_isect = 0, extent_length = 0; 687 sector_t isect, last_isect = 0, extent_length = 0;
688 struct parallel_io *par; 688 struct parallel_io *par = NULL;
689 loff_t offset = wdata->args.offset; 689 loff_t offset = wdata->args.offset;
690 size_t count = wdata->args.count; 690 size_t count = wdata->args.count;
691 unsigned int pg_offset, pg_len, saved_len; 691 unsigned int pg_offset, pg_len, saved_len;
@@ -697,6 +697,13 @@ bl_write_pagelist(struct nfs_write_data *wdata, int sync)
697 NFS_SERVER(header->inode)->pnfs_blksize >> PAGE_CACHE_SHIFT; 697 NFS_SERVER(header->inode)->pnfs_blksize >> PAGE_CACHE_SHIFT;
698 698
699 dprintk("%s enter, %Zu@%lld\n", __func__, count, offset); 699 dprintk("%s enter, %Zu@%lld\n", __func__, count, offset);
700
701 if (header->dreq != NULL &&
702 (!IS_ALIGNED(offset, NFS_SERVER(header->inode)->pnfs_blksize) ||
703 !IS_ALIGNED(count, NFS_SERVER(header->inode)->pnfs_blksize))) {
704 dprintk("pnfsblock nonblock aligned DIO writes. Resend MDS\n");
705 goto out_mds;
706 }
700 /* At this point, wdata->pages is a (sequential) list of nfs_pages. 707 /* At this point, wdata->pages is a (sequential) list of nfs_pages.
701 * We want to write each, and if there is an error set pnfs_error 708 * We want to write each, and if there is an error set pnfs_error
702 * to have it redone using nfs. 709 * to have it redone using nfs.
@@ -1197,6 +1204,27 @@ bl_pg_test_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
1197 return pnfs_generic_pg_test(pgio, prev, req); 1204 return pnfs_generic_pg_test(pgio, prev, req);
1198} 1205}
1199 1206
1207void
1208bl_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *req)
1209{
1210 if (pgio->pg_dreq != NULL &&
1211 !is_aligned_req(req, PAGE_CACHE_SIZE))
1212 nfs_pageio_reset_write_mds(pgio);
1213 else
1214 pnfs_generic_pg_init_write(pgio, req);
1215}
1216
1217static bool
1218bl_pg_test_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
1219 struct nfs_page *req)
1220{
1221 if (pgio->pg_dreq != NULL &&
1222 !is_aligned_req(req, PAGE_CACHE_SIZE))
1223 return false;
1224
1225 return pnfs_generic_pg_test(pgio, prev, req);
1226}
1227
1200static const struct nfs_pageio_ops bl_pg_read_ops = { 1228static const struct nfs_pageio_ops bl_pg_read_ops = {
1201 .pg_init = bl_pg_init_read, 1229 .pg_init = bl_pg_init_read,
1202 .pg_test = bl_pg_test_read, 1230 .pg_test = bl_pg_test_read,
@@ -1204,8 +1232,8 @@ static const struct nfs_pageio_ops bl_pg_read_ops = {
1204}; 1232};
1205 1233
1206static const struct nfs_pageio_ops bl_pg_write_ops = { 1234static const struct nfs_pageio_ops bl_pg_write_ops = {
1207 .pg_init = pnfs_generic_pg_init_write, 1235 .pg_init = bl_pg_init_write,
1208 .pg_test = pnfs_generic_pg_test, 1236 .pg_test = bl_pg_test_write,
1209 .pg_doio = pnfs_generic_pg_writepages, 1237 .pg_doio = pnfs_generic_pg_writepages,
1210}; 1238};
1211 1239