提交 e885de1a 编写于 作者: T Trond Myklebust

NFSv4.1: Fall back to ordinary i/o through the mds if we have no layout segment

Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 d8007d4d
...@@ -296,7 +296,13 @@ extern int nfs_initiate_read(struct nfs_read_data *data, struct rpc_clnt *clnt, ...@@ -296,7 +296,13 @@ extern int nfs_initiate_read(struct nfs_read_data *data, struct rpc_clnt *clnt,
const struct rpc_call_ops *call_ops); const struct rpc_call_ops *call_ops);
extern void nfs_read_prepare(struct rpc_task *task, void *calldata); extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
struct nfs_pageio_descriptor;
extern void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
struct inode *inode);
/* write.c */ /* write.c */
extern void nfs_pageio_init_write_mds(struct nfs_pageio_descriptor *pgio,
struct inode *inode, int ioflags);
extern void nfs_commit_free(struct nfs_write_data *p); extern void nfs_commit_free(struct nfs_write_data *p);
extern int nfs_initiate_write(struct nfs_write_data *data, extern int nfs_initiate_write(struct nfs_write_data *data,
struct rpc_clnt *clnt, struct rpc_clnt *clnt,
......
...@@ -669,8 +669,6 @@ filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, ...@@ -669,8 +669,6 @@ filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
!nfs_generic_pg_test(pgio, prev, req)) !nfs_generic_pg_test(pgio, prev, req))
return false; return false;
if (!pgio->pg_lseg)
return 1;
p_stripe = (u64)prev->wb_index << PAGE_CACHE_SHIFT; p_stripe = (u64)prev->wb_index << PAGE_CACHE_SHIFT;
r_stripe = (u64)req->wb_index << PAGE_CACHE_SHIFT; r_stripe = (u64)req->wb_index << PAGE_CACHE_SHIFT;
stripe_unit = FILELAYOUT_LSEG(pgio->pg_lseg)->stripe_unit; stripe_unit = FILELAYOUT_LSEG(pgio->pg_lseg)->stripe_unit;
......
...@@ -1000,9 +1000,6 @@ static bool objio_pg_test(struct nfs_pageio_descriptor *pgio, ...@@ -1000,9 +1000,6 @@ static bool objio_pg_test(struct nfs_pageio_descriptor *pgio,
if (!pnfs_generic_pg_test(pgio, prev, req)) if (!pnfs_generic_pg_test(pgio, prev, req))
return false; return false;
if (pgio->pg_lseg == NULL)
return true;
return pgio->pg_count + req->wb_bytes <= return pgio->pg_count + req->wb_bytes <=
OBJIO_LSEG(pgio->pg_lseg)->max_io_size; OBJIO_LSEG(pgio->pg_lseg)->max_io_size;
} }
......
...@@ -1066,6 +1066,10 @@ pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *r ...@@ -1066,6 +1066,10 @@ pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *r
req->wb_bytes, req->wb_bytes,
IOMODE_READ, IOMODE_READ,
GFP_KERNEL); GFP_KERNEL);
/* If no lseg, fall back to read through mds */
if (pgio->pg_lseg == NULL)
nfs_pageio_init_read_mds(pgio, pgio->pg_inode);
} }
EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_read); EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_read);
...@@ -1080,6 +1084,9 @@ pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page * ...@@ -1080,6 +1084,9 @@ pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *
req->wb_bytes, req->wb_bytes,
IOMODE_RW, IOMODE_RW,
GFP_NOFS); GFP_NOFS);
/* If no lseg, fall back to write through mds */
if (pgio->pg_lseg == NULL)
nfs_pageio_init_write_mds(pgio, pgio->pg_inode, pgio->pg_ioflags);
} }
EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_write); EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_write);
......
...@@ -114,7 +114,7 @@ static void nfs_readpage_truncate_uninitialised_page(struct nfs_read_data *data) ...@@ -114,7 +114,7 @@ static void nfs_readpage_truncate_uninitialised_page(struct nfs_read_data *data)
} }
} }
static void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio, void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
struct inode *inode) struct inode *inode)
{ {
nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops, nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops,
......
...@@ -1040,7 +1040,7 @@ static const struct nfs_pageio_ops nfs_pageio_write_ops = { ...@@ -1040,7 +1040,7 @@ static const struct nfs_pageio_ops nfs_pageio_write_ops = {
.pg_doio = nfs_generic_pg_writepages, .pg_doio = nfs_generic_pg_writepages,
}; };
static void nfs_pageio_init_write_mds(struct nfs_pageio_descriptor *pgio, void nfs_pageio_init_write_mds(struct nfs_pageio_descriptor *pgio,
struct inode *inode, int ioflags) struct inode *inode, int ioflags)
{ {
nfs_pageio_init(pgio, inode, &nfs_pageio_write_ops, nfs_pageio_init(pgio, inode, &nfs_pageio_write_ops,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册