[pnfs] [PATCH 4/5] pNFS: Merge filelayout_flush_one into filelayout_write_pagelist.

Dean Hildebrand seattleplus at gmail.com
Tue May 6 19:45:41 EDT 2008


details: The flush_one layout driver interface function is a specialized
function only for the file layout.  It's purpose was to calculate
the correct data server for each write request so this calculation
can be avoided when the data is actually sent on the wire.  It
was decided that having such a specialized function (plus its
associated private state) was not worth
the effort.  In addition, O_DIRECT needs to redo this calculation
anyways.

Signed-off-by: Dean Hildebrand <dhildeb at us.ibm.com>
---
 fs/nfs/nfs4filelayout.c    |  356 +++++++++++++-------------------------------
 fs/nfs/nfs4filelayout.h    |    8 +-
 fs/nfs/nfs4filelayoutdev.c |   26 +++-
 fs/nfs/pagelist.c          |    3 -
 fs/nfs/pnfs.c              |   45 ------
 fs/nfs/pnfs.h              |    2 -
 fs/nfs/write.c             |    4 -
 include/linux/nfs4_pnfs.h  |    3 -
 include/linux/nfs_page.h   |    4 -
 9 files changed, 125 insertions(+), 326 deletions(-)

diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index 4f4748b..5d9b551 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -240,14 +240,7 @@ struct rpc_call_ops filelayout_write_call_ops = {
  * allows the original read/write data structs to be passed in the
  * last argument.
  *
-
- * This is called after the pNFS client has already created, so I pass it
- * in via the last argument (void*).  I think this is the only way as there
- * are just too many NFS specific arguments in the read/write data structs
- * to pass to the layout drivers.
- *
- * TODO:
- * 1. This is a lot of arguments, create special non-nfs-specific structure?
+ * TODO: join with write_pagelist?
  */
 static int filelayout_read_pagelist(
 	struct pnfs_layout_type *layoutid,
@@ -259,12 +252,11 @@ static int filelayout_read_pagelist(
 	struct nfs_read_data *data)
 {
 	struct inode *inode = PNFS_INODE(layoutid);
-	struct nfs4_filelayout *nfslay = NULL;
 	struct nfs4_filelayout_segment *flseg;
 	struct nfs4_pnfs_dserver dserver;
+	struct nfs4_pnfs_ds *ds;
 	int status;
 
-	nfslay = PNFS_LD_DATA(layoutid);
 	flseg = LSEG_LD_DATA(data->lseg);
 
 	/* Retrieve the correct rpc_client for the byte range */
@@ -280,7 +272,9 @@ static int filelayout_read_pagelist(
 		data->args.fh = NFS_FH(inode);
 		status = 0;
 	} else {
-		struct nfs4_pnfs_ds *ds = dserver.dev->ds_list[0];
+		ds = dserver.dev->ds_list[0];
+
+		dprintk("%s USE DS:ip %x\n", __func__, htonl(ds->ds_ip_addr));
 
 		/* just try the first data server for the index..*/
 		data->pnfs_client = ds->ds_clp->cl_rpcclient;
@@ -316,179 +310,7 @@ print_ds(struct nfs4_pnfs_ds *ds)
 	dprintk("        ds->ds_count %d\n", atomic_read(&ds->ds_count));
 }
 
-static struct nfs4_pnfs_dserver *
-filelayout_create_dserver(void)
-{
-	struct nfs4_pnfs_dserver *local;
-
-	local = kzalloc(sizeof(*local), GFP_KERNEL);
-	if (!local)
-		return NULL;
-	kref_init(&local->ref);
-	dprintk("<-- %s dserver %p\n", __func__, local);
-	return local;
-}
-
-static void filelayout_free_dserver(struct kref *kref)
-{
-	struct nfs4_pnfs_dserver *dserver;
-	dserver = container_of(kref, struct nfs4_pnfs_dserver, ref);
-
-	dprintk("--> %s dserver %p\n", __func__, dserver);
-	kfree(dserver);
-}
-
-static void filelayout_release_dserver(struct nfs4_pnfs_dserver *dserver)
-{
-	kref_put(&dserver->ref, filelayout_free_dserver);
-}
-
-static void filelayout_get_dserver(struct nfs4_pnfs_dserver *dserver)
-{
-	kref_get(&dserver->ref);
-}
-
-/*
- * Called by nfs_release_request()
- */
-void
-filelayout_free_request_data(struct nfs_page *req)
-{
-	struct nfs4_pnfs_dserver *dserver;
-
-	dserver = (struct nfs4_pnfs_dserver *)req->wb_private;
-	BUG_ON(!dserver);
-	filelayout_release_dserver(dserver);
-}
-
-static struct nfs4_pnfs_ds *
-filelayout_create_init_ds(struct pnfs_layout_segment *lseg,
-			loff_t file_offset, size_t wb_bytes,
-			struct nfs4_pnfs_dserver **dsp)
-{
-	struct nfs4_pnfs_dserver *dserver;
-	struct nfs4_pnfs_ds *ds;
-	int status = -ENOMEM;
-
-	*dsp = dserver = filelayout_create_dserver();
-	if (!dserver) {
-		dprintk("%s failed to get dserver. status %d\n",
-					__func__, status);
-		goto out_err;
-	}
-
-	/* get the data server that serves this page */
-	status = nfs4_pnfs_dserver_get(lseg, file_offset, wb_bytes, dserver);
-
-	if (status != 0) {
-		dprintk("%s failed to get dataserver. status %d\n",
-						__func__, status);
-		filelayout_release_dserver(dserver);
-		status =  -EIO;
-		goto out_err;
-	}
-	/* just try the first multipath data server */
-	ds = dserver->dev->ds_list[0];
-
-	return ds;
-out_err:
-	return ERR_PTR(status);
-}
-
-/*
-* feed nfs_flush_one with per data server pages.
-*
-* Assume stripesz >= PAGE_SIZE.
-* TODO: If stripesz < PAGE_SIZE, use i/o through MDS
-*
-*/
-int filelayout_flush_one(struct pnfs_layout_segment *lseg,
-			 struct list_head *head, unsigned int npages,
-			 size_t count, int how)
-{
-	struct nfs4_pnfs_dserver *dserver = NULL;
-	struct nfs4_pnfs_ds *ds = NULL;  /* current stripe data server */
-	struct nfs_page *req;
-	loff_t file_offset = 0, stripe_offset, temp;
-	size_t stripesz, dstotal = 0;
-	struct list_head dslist;
-	int status = -ENOMEM, use_ds = 0, ndspages = 0;
-
-	dprintk("--> %s npages %d, count %Zd, lseg %p\n", __func__,
-				npages, count, lseg);
-
-	INIT_LIST_HEAD(&dslist);
-	stripesz = filelayout_get_stripesize(lseg->layout);
-	dprintk("%s stripesize %Zd\n", __func__, stripesz);
-
-	/* split up the list according to DS */
-	while (!list_empty(head)) {
-next_ds:
-		req = nfs_list_entry(head->next);
-
-		file_offset = req->wb_index << PAGE_CACHE_SHIFT;
-
-		if (!use_ds) {
-			ds = filelayout_create_init_ds(lseg, file_offset,
-						       req->wb_bytes, &dserver);
-			if (IS_ERR(ds)) {
-				status = PTR_ERR(ds);
-				goto out;
-			}
-			/* reset for new data server */
-			dstotal = 0;
-			ndspages = 0;
-			use_ds = 1;
-		} else
-			filelayout_get_dserver(dserver);
-
-		req->wb_ops = &filelayout_io_operations;
-		req->wb_private = dserver;
-
-		/* move request to dslist */
-		nfs_list_remove_request(req);
-		nfs_list_add_request(req, &dslist);
-		ndspages++;
-		npages--;
-
-		count -= req->wb_bytes;
-		dstotal += req->wb_bytes;
-
-		/* Are we done with this DS? */
-		temp = file_offset + req->wb_bytes;
-		stripe_offset = do_div(temp, stripesz);
-
-		if (count == 0 || stripe_offset == 0) {
-			use_ds = 0;
-			goto send;
-		}
-	}
-send:
-	/* XXX should recover to send through MDS */
-	dprintk("%s Send: ndspages %d dstotal %Zd list_empty %d \n",
-				__func__, ndspages, dstotal, list_empty(head));
-	status = nfs_flush_one(PNFS_INODE(lseg->layout), &dslist, ndspages,
-			       dstotal, how);
-	if (status < 0)
-		goto out;
-
-	/* Is there more data to process? */
-	if (!list_empty(head)) {
-		/* count and npages better not be zero! */
-		dprintk("%s next_ds count %Zd npages %d\n",
-				__func__, count, npages);
-		goto next_ds;
-	}
-
-out:
-	dprintk("<-- %s npages %d (should be zero!)\n", __func__, npages);
-	return status;
-}
-
-/* Perform async writes.
- *
- * TODO: See filelayout_read_pagelist.
- */
+/* Perform async writes. */
 static int filelayout_write_pagelist(
 	struct pnfs_layout_type *layoutid,
 	struct page **pages,
@@ -499,48 +321,52 @@ static int filelayout_write_pagelist(
 	int sync,
 	struct nfs_write_data *data)
 {
+	struct inode *inode = PNFS_INODE(layoutid);
 	struct nfs4_filelayout_segment *flseg = LSEG_LD_DATA(data->lseg);
-	struct nfs4_pnfs_dserver *dserver = NULL;
+	struct nfs4_pnfs_dserver dserver;
 	struct nfs4_pnfs_ds *ds;
-	struct nfs_page *req = NULL;
-	struct list_head *h;
+	int status;
 
-	dprintk("--> %s nr_pages %d offset:count %Lu:%Zu\n", __func__,
-						nr_pages, offset, count);
+	dprintk("--> %s ino %lu nr_pages %d pgbase %u req %Zu@%Lu sync %d\n",
+		__func__, inode->i_ino, nr_pages, pgbase, count, offset, sync);
 
 	/* Retrieve the correct rpc_client for the byte range */
-	list_for_each(h, &data->pages) {
-		req = list_entry(h, struct nfs_page, wb_list);
-		break;
-	}
-	BUG_ON(!req);
-
-	dserver = (struct nfs4_pnfs_dserver *)req->wb_private;
-	BUG_ON(!dserver);
+	status = nfs4_pnfs_dserver_get(data->lseg,
+				       offset,
+				       count,
+				       &dserver);
 
-	/* use the first multipath data server */
-	ds = dserver->dev->ds_list[0];
-	dprintk("%s USE DS:\n", __func__);
-	print_ds(ds);
+	if (status) {
+		printk(KERN_ERR "%s: dserver get failed status %d use MDS\n",
+		       __func__, status);
+		data->pnfs_client = NFS_CLIENT(inode);
+		data->ds_nfs_client = NULL;
+		data->args.fh = NFS_FH(inode);
+		status = 0;
+	} else {
+		/* use the first multipath data server */
+		ds = dserver.dev->ds_list[0];
 
-	data->pnfs_client = ds->ds_clp->cl_rpcclient;
-	data->ds_nfs_client = ds->ds_clp;
-	data->args.fh = dserver->fh;
+		dprintk("%s ino %lu %Zu@%Lu DS:%x:%hu\n",
+			__func__, inode->i_ino, count, offset,
+			htonl(ds->ds_ip_addr), ntohs(ds->ds_port));
 
-	dprintk("%s using DS %x:%hu\n", __func__,
-		htonl(ds->ds_ip_addr), ntohs(ds->ds_port));
+		data->pnfs_client = ds->ds_clp->cl_rpcclient;
+		data->ds_nfs_client = ds->ds_clp;
+		data->args.fh = dserver.fh;
 
-	/* Get the file offset on the dserver. Set the write offset to
-	 * this offset and save the original offset.
-	 */
-	data->args.offset = filelayout_get_dserver_offset(offset, flseg);
-	data->orig_offset = offset;
+		/* Get the file offset on the dserver. Set the write offset to
+		 * this offset and save the original offset.
+		 */
+		data->args.offset = filelayout_get_dserver_offset(offset, flseg);
+		data->orig_offset = offset;
+	}
 
 	/* Perform an asynchronous write The offset will be reset in the
 	 * call_ops->rpc_call_done() routine
 	 */
 	nfs_initiate_write(data, data->pnfs_client,
-			&filelayout_write_call_ops, sync);
+			   &filelayout_write_call_ops, sync);
 
 	return 0;
 }
@@ -639,24 +465,6 @@ filelayout_free_lseg(struct pnfs_layout_segment *lseg)
 }
 
 /*
- * Do two nfs_pnfs_dserver pointers point to the same structure?
- * Just compare the first multipath servers.
- */
-static int
-filelayout_same_ds(struct nfs4_pnfs_dserver *one, struct nfs4_pnfs_dserver *two)
-{
-	struct nfs4_pnfs_dev *d_one = one->dev, *d_two = two->dev;
-	struct nfs4_pnfs_ds *ds_one, *ds_two;
-
-	ds_one = d_one->ds_list[0];
-	ds_two = d_two->ds_list[0];
-	return (d_one->stripe_index == d_two->stripe_index &&
-		d_one->num_ds == d_two->num_ds &&
-		ds_one->ds_ip_addr == ds_two->ds_ip_addr &&
-		ds_one->ds_port == ds_two->ds_port);
-}
-
-/*
  * Allocate a new nfs_write_data struct and initialize
  */
 static struct nfs_write_data *
@@ -693,66 +501,102 @@ filelayout_commit(struct pnfs_layout_type *layoutid, int sync,
 {
 	struct nfs4_filelayout_segment *nfslay;
 	struct nfs_write_data   *dsdata = NULL;
-	struct nfs4_pnfs_dserver *dserver = NULL;
+	struct nfs4_pnfs_dserver dserver;
 	struct nfs4_pnfs_ds *ds;
-	struct nfs_page *req;
+	struct nfs_page *req, *reqt;
 	struct list_head *pos, *tmp, *head = &data->pages;
+	loff_t file_offset, comp_offset;
+	size_t stripesz, cbytes;
+	int status;
+	struct nfs4_pnfs_dev_item *di;
+	u32 idx1, idx2;
 
 	nfslay = LSEG_LD_DATA(data->lseg);
 
-	dprintk("%s data %p pnfs_client %p nfslay %p\n",
-			__func__, data, data->pnfs_client, nfslay);
+	dprintk("%s data %p pnfs_client %p nfslay %p sync %d\n",
+		__func__, data, data->pnfs_client, nfslay, sync);
 
 	if (nfslay->commit_through_mds) {
 		dprintk("%s data %p commit through mds\n", __func__, data);
 		return 1;
 	}
 
+	stripesz = filelayout_get_stripesize(layoutid);
+	dprintk("%s stripesize %Zd\n", __func__, stripesz);
+
+	di = nfs4_pnfs_device_item_get(FILE_MT(data->inode), NFS_FH(data->inode),
+				       &nfslay->dev_id);
+	if (di == NULL) {
+		status = -EIO;
+		goto out_bad;
+	}
+
 	/* COMMIT to each Data Server */
 	while (!list_empty(head)) {
-
-		/* dserver and dsdata must be NULL */
 		req = nfs_list_entry(head->next);
 
-		dserver = (struct nfs4_pnfs_dserver *)req->wb_private;
-		/* XXX BUG_ON(!dserver) ?*/
-		if (!dserver)
+		file_offset = req->wb_index << PAGE_CACHE_SHIFT;
+
+		/* Get dserver for the current page */
+		status = nfs4_pnfs_dserver_get(data->lseg,
+					       file_offset,
+					       req->wb_bytes,
+					       &dserver);
+
+		/* Get its index */
+		idx1 = filelayout_dserver_get_index(file_offset, di, nfslay);
+
+		if (status) {
+			status = -EIO;
 			goto out_bad;
+		}
 
 		dsdata = filelayout_clone_write_data(data);
-		if (!dsdata)
+		if (!dsdata) {
+			status = -ENOMEM;
 			goto out_bad;
+		}
 
 		/* Just try the first multipath data server */
-		ds = dserver->dev->ds_list[0];
+		ds = dserver.dev->ds_list[0];
 		dsdata->pnfs_client = ds->ds_clp->cl_rpcclient;
 		dsdata->ds_nfs_client = ds->ds_clp;
-		dsdata->args.fh = dserver->fh;
-
-		/* Gather all pages going to the data server */
+		dsdata->args.fh = dserver.fh;
+		cbytes = req->wb_bytes;
+
+		/* Gather all pages going to the current data server by
+		 * comparing their indices.
+		 * XXX: This recalculates the indices unecessarily.
+		 *      One idea would be to calc the index for every page
+		 *      and then compare if they are the same. */
 		list_for_each_safe(pos, tmp, head) {
-			req = nfs_list_entry(pos);
-			if (filelayout_same_ds(dserver, req->wb_private)) {
-				nfs_list_remove_request(req);
-				nfs_list_add_request(req, &dsdata->pages);
+			reqt = nfs_list_entry(pos);
+			comp_offset = reqt->wb_index << PAGE_CACHE_SHIFT;
+			idx2 = filelayout_dserver_get_index(comp_offset, di, nfslay);
+			if (idx1 == idx2) {
+				nfs_list_remove_request(reqt);
+				nfs_list_add_request(reqt, &dsdata->pages);
+				cbytes += reqt->wb_bytes;
 			}
 		}
 
+		dprintk("%s: Initiating commit: %Zu@%llu USE DS:\n",
+			__func__, cbytes, file_offset);
+		print_ds(ds);
+
 		/* Send COMMIT to data server */
 		nfs_initiate_commit(dsdata, dsdata->pnfs_client, sync);
-
-		/* reset for next data server */
-		dsdata = NULL;
-		dserver = NULL;
 	}
 	/* Release original commit data since it is not used */
 	nfs_commit_free(data);
 	return 0;
 
 out_bad:
+	printk(KERN_ERR "%s: dserver get failed status %d\n", __func__, status);
+
 	/* XXX should we send COMMIT to MDS e.g. not free data and return 1 ? */
 	nfs_commit_free(data);
-	return -ENOMEM;
+	return status;
 }
 
 /* Return the stripesize for the specified file.
@@ -803,6 +647,10 @@ boundary:
 	r_stripe = req->wb_index << PAGE_CACHE_SHIFT;
 	do_div(r_stripe, pgio->pg_boundary);
 
+#if 0
+	dprintk("%s p %u r %u bnd %d bsize %Zu\n",__func__, p_stripe, r_stripe, pgio->pg_boundary, pgio->pg_bsize);
+#endif
+
 	return (p_stripe == r_stripe);
 }
 
@@ -831,8 +679,6 @@ struct layoutdriver_io_operations filelayout_io_operations = {
 	.commit                  = filelayout_commit,
 	.read_pagelist           = filelayout_read_pagelist,
 	.write_pagelist          = filelayout_write_pagelist,
-	.flush_one		 = filelayout_flush_one,
-	.free_request_data	 = filelayout_free_request_data,
 	.alloc_layout            = filelayout_alloc_layout,
 	.free_layout             = filelayout_free_layout,
 	.alloc_lseg              = filelayout_alloc_lseg,
diff --git a/fs/nfs/nfs4filelayout.h b/fs/nfs/nfs4filelayout.h
index d0aeb78..4ec98ab 100644
--- a/fs/nfs/nfs4filelayout.h
+++ b/fs/nfs/nfs4filelayout.h
@@ -74,7 +74,6 @@ struct nfs4_pnfs_devlist {
 struct nfs4_pnfs_dserver {
 	struct nfs_fh        *fh;
 	struct nfs4_pnfs_dev *dev;
-	struct kref           ref;
 };
 
 struct nfs4_filelayout_segment {
@@ -105,7 +104,6 @@ extern struct pnfs_client_operations *pnfs_callback_ops;
 char *deviceid_fmt(const struct pnfs_deviceid *dev_id);
 int  nfs4_pnfs_devlist_init(struct nfs4_pnfs_dev_hlist *hlist);
 void nfs4_pnfs_devlist_destroy(struct nfs4_pnfs_dev_hlist *hlist);
-
 int nfs4_pnfs_dserver_get(struct pnfs_layout_segment *lseg,
 			  loff_t offset,
 			  size_t count,
@@ -114,6 +112,12 @@ int decode_and_add_devicelist(struct filelayout_mount_type *mt, struct pnfs_devi
 int process_deviceid_list(struct filelayout_mount_type *mt,
 			  struct nfs_fh *fh,
 			  struct pnfs_devicelist *devlist);
+struct nfs4_pnfs_dev_item * nfs4_pnfs_device_item_get(struct filelayout_mount_type *mt,
+						      struct nfs_fh *fh,
+						      struct pnfs_deviceid *dev_id);
+u32 filelayout_dserver_get_index(loff_t offset,
+				 struct nfs4_pnfs_dev_item *di,
+				 struct nfs4_filelayout_segment *layout);
 
 #define READ32(x)         (x) = ntohl(*p++)
 #define READ64(x)         do {			\
diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
index dce1bd1..ead8a53 100644
--- a/fs/nfs/nfs4filelayoutdev.c
+++ b/fs/nfs/nfs4filelayoutdev.c
@@ -695,6 +695,22 @@ nfs4_pnfs_device_item_get(struct filelayout_mount_type *mt,
 	return dev;
 }
 
+/* Want res = ((offset / layout->stripe_unit) % di->stripe_count)
+ * Then: ((res + fsi) % di->stripe_count)
+ */
+u32
+filelayout_dserver_get_index(loff_t offset,
+			     struct nfs4_pnfs_dev_item *di,
+			     struct nfs4_filelayout_segment *layout)
+{
+	u64 tmp, tmp2;
+
+	tmp = offset;
+	do_div(tmp, layout->stripe_unit);
+	tmp2 = do_div(tmp, di->stripe_count) + layout->first_stripe_index;
+	return do_div(tmp2, di->stripe_count);
+}
+
 /* Retrieve the rpc client for a specified byte range
  * in 'inode' by filling in the contents of 'dserver'.
  */
@@ -718,15 +734,9 @@ nfs4_pnfs_dserver_get(struct pnfs_layout_segment *lseg,
 	if (di == NULL)
 		return 1;
 
-	/* Want res = ((offset / layout->stripe_unit) % di->stripe_count)
-	 * Then: ((res + fsi) % di->stripe_count)
-	 */
-
-	tmp = offset;
-	do_div(tmp, layout->stripe_unit);
-	tmp2 = do_div(tmp, di->stripe_count) + layout->first_stripe_index;
-	stripe_idx = do_div(tmp2, di->stripe_count);
+	stripe_idx = filelayout_dserver_get_index(offset, di, layout);
 
+	/* For debugging, ensure entire requested range is in this dserver */
 	tmp = offset + count - 1;
 	do_div(tmp, layout->stripe_unit);
 	tmp2 = do_div(tmp, di->stripe_count) + layout->first_stripe_index;
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index b99fa0a..2b4cb44 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -170,9 +170,6 @@ static void nfs_free_request(struct kref *kref)
 	/* Release struct file or cached credential */
 	nfs_clear_request(req);
 	put_nfs_open_context(req->wb_context);
-#ifdef CONFIG_PNFS
-	pnfs_free_request_data(req);
-#endif /* CONFIG_PNFS */
 	nfs_page_free(req);
 }
 
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 27e37be..9f504df 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1338,40 +1338,6 @@ pnfs_writeback_done(struct nfs_write_data *data)
 }
 
 /*
- * return 0 for success, 1 for legacy nfs fallback, negative for error
- */
-int
-pnfs_flush_one(struct inode *inode, struct list_head *head,
-		 unsigned int npages, size_t count, int how)
-{
-	struct nfs_server *nfss = NFS_SERVER(inode);
-	struct layoutdriver_io_operations *io_ops;
-	struct nfs_page *req;
-	struct pnfs_layout_segment *lseg;
-	int status;
-
-	if (!pnfs_enabled_sb(nfss) || !nfss->pnfs_curr_ld->ld_io_ops->flush_one)
-		goto fallback;
-
-	req = nfs_list_entry(head->next);
-	status = pnfs_update_layout(inode,
-				    req->wb_context,
-				    count,
-				    req->wb_offset,
-				    IOMODE_RW,
-				    &lseg);
-	if (status)
-		goto fallback;
-	io_ops = nfss->pnfs_curr_ld->ld_io_ops;
-	status = io_ops->flush_one(lseg, head, npages, count, how);
-	put_lseg(lseg);
-
-	return status;
-fallback:
-	return nfs_flush_one(inode, head, npages, count, how);
-}
-
-/*
  * Obtain a layout for the the write range, and call do_sync_write.
  *
  * Unlike the read path which can wait until page coalescing
@@ -1965,17 +1931,6 @@ void _pnfs_modify_new_write_request(struct nfs_page *req,
 	}
 }
 
-void pnfs_free_request_data(struct nfs_page *req)
-{
-	struct layoutdriver_io_operations *lo;
-
-	if (!req->wb_ops || !req->wb_private)
-		return;
-	lo = (struct layoutdriver_io_operations *)req->wb_ops;
-	if (lo->free_request_data)
-		lo->free_request_data(req);
-}
-
 void pnfs_free_fsdata(struct pnfs_fsdata *fsdata)
 {
 	kfree(fsdata);
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index acbce4b..95ffbd3 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -53,8 +53,6 @@ int _pnfs_try_to_commit(struct nfs_write_data *);
 void pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *, struct nfs_open_context *, struct list_head *, size_t *);
 void pnfs_pageio_init_write(struct nfs_pageio_descriptor *, struct inode *);
 void pnfs_update_layout_commit(struct inode *, struct list_head *, pgoff_t, unsigned int);
-int pnfs_flush_one(struct inode *, struct list_head *, unsigned int, size_t, int);
-void pnfs_free_request_data(struct nfs_page *req);
 void pnfs_free_fsdata(struct pnfs_fsdata *fsdata);
 ssize_t pnfs_file_write(struct file *, const char __user *, size_t, loff_t *);
 void pnfs_get_layout_done(struct pnfs_layout_type *,
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 0da5280..9410fad 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1008,11 +1008,7 @@ static void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
 	if (wsize < PAGE_CACHE_SIZE)
 		nfs_pageio_init(pgio, inode, nfs_flush_multi, wsize, ioflags);
 	else
-#ifdef CONFIG_PNFS
-		nfs_pageio_init(pgio, inode, pnfs_flush_one, wsize, ioflags);
-#else
 		nfs_pageio_init(pgio, inode, nfs_flush_one, wsize, ioflags);
-#endif /* CONFIG_PNFS */
 }
 
 /*
diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h
index c83aae6..290ffd6 100644
--- a/include/linux/nfs4_pnfs.h
+++ b/include/linux/nfs4_pnfs.h
@@ -137,7 +137,6 @@ struct layoutdriver_io_operations {
 			       struct page **pages, unsigned int pgbase,
 			       unsigned nr_pages, loff_t offset, size_t count,
 			       int sync, struct nfs_write_data *nfs_data);
-	int (*flush_one) (struct pnfs_layout_segment *, struct list_head *head, unsigned int npages, size_t count, int how);
 	int (*write_begin) (struct pnfs_layout_segment *lseg, struct page *page,
 			    loff_t pos, unsigned count,
 			    struct pnfs_fsdata *fsdata);
@@ -147,8 +146,6 @@ struct layoutdriver_io_operations {
 	void (*new_request)(struct pnfs_layout_segment *lseg,
 			    struct nfs_page *req, loff_t pos, unsigned count,
 			    struct pnfs_fsdata *fsdata);
-	void (*free_request_data) (struct nfs_page *);
-
 
 	/* Consistency ops */
 	/* 2 problems:
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
index 10329fb..1d6e830 100644
--- a/include/linux/nfs_page.h
+++ b/include/linux/nfs_page.h
@@ -45,10 +45,6 @@ struct nfs_page {
 	struct kref		wb_kref;	/* reference count */
 	unsigned long		wb_flags;
 	struct nfs_writeverf	wb_verf;	/* Commit cookie */
-#ifdef CONFIG_PNFS
-	void			*wb_ops;	/* pNFS io operations */
-	void			*wb_private;
-#endif
 };
 
 struct nfs_pageio_descriptor {
-- 
1.5.3.3



More information about the pNFS mailing list