|
@@ -911,7 +911,7 @@ pnfs_find_lseg(struct pnfs_layout_hdr *lo,
|
|
|
* Layout segment is retreived from the server if not cached.
|
|
|
* The appropriate layout segment is referenced and returned to the caller.
|
|
|
*/
|
|
|
-struct pnfs_layout_segment *
|
|
|
+static struct pnfs_layout_segment *
|
|
|
pnfs_update_layout(struct inode *ino,
|
|
|
struct nfs_open_context *ctx,
|
|
|
loff_t pos,
|
|
@@ -1055,6 +1055,34 @@ out_forget_reply:
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+void
|
|
|
+pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req)
|
|
|
+{
|
|
|
+ BUG_ON(pgio->pg_lseg != NULL);
|
|
|
+
|
|
|
+ pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
|
|
+ req->wb_context,
|
|
|
+ req_offset(req),
|
|
|
+ req->wb_bytes,
|
|
|
+ IOMODE_READ,
|
|
|
+ GFP_KERNEL);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_read);
|
|
|
+
|
|
|
+void
|
|
|
+pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *req)
|
|
|
+{
|
|
|
+ BUG_ON(pgio->pg_lseg != NULL);
|
|
|
+
|
|
|
+ pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
|
|
+ req->wb_context,
|
|
|
+ req_offset(req),
|
|
|
+ req->wb_bytes,
|
|
|
+ IOMODE_RW,
|
|
|
+ GFP_NOFS);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(pnfs_generic_pg_init_write);
|
|
|
+
|
|
|
bool
|
|
|
pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *inode)
|
|
|
{
|
|
@@ -1083,31 +1111,8 @@ bool
|
|
|
pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
|
|
|
struct nfs_page *req)
|
|
|
{
|
|
|
- enum pnfs_iomode access_type;
|
|
|
- gfp_t gfp_flags;
|
|
|
-
|
|
|
- /* We assume that pg_ioflags == 0 iff we're reading a page */
|
|
|
- if (pgio->pg_ioflags == 0) {
|
|
|
- access_type = IOMODE_READ;
|
|
|
- gfp_flags = GFP_KERNEL;
|
|
|
- } else {
|
|
|
- access_type = IOMODE_RW;
|
|
|
- gfp_flags = GFP_NOFS;
|
|
|
- }
|
|
|
-
|
|
|
- if (pgio->pg_lseg == NULL) {
|
|
|
- if (pgio->pg_count != prev->wb_bytes)
|
|
|
- return true;
|
|
|
- /* This is first coelesce call for a series of nfs_pages */
|
|
|
- pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
|
|
|
- prev->wb_context,
|
|
|
- req_offset(prev),
|
|
|
- pgio->pg_count,
|
|
|
- access_type,
|
|
|
- gfp_flags);
|
|
|
- if (pgio->pg_lseg == NULL)
|
|
|
- return true;
|
|
|
- }
|
|
|
+ if (pgio->pg_lseg == NULL)
|
|
|
+ return nfs_generic_pg_test(pgio, prev, req);
|
|
|
|
|
|
/*
|
|
|
* Test if a nfs_page is fully contained in the pnfs_layout_range.
|