[pnfs] [PATCH 02/10] pnfs: file layout module free_request_data

andros at umich.edu andros at umich.edu
Wed Jan 16 17:52:53 EST 2008


From: Andy Adamson <andros at umich.edu>

Use the free_request_data layoutdriver I/O operation to free the struct
nfs4_pnfs_dserver kalloc'ed in filelayout_flush_one().

Signed-off-by: Andy Adamson<andros at umich.edu>
---
 fs/nfs/nfs4filelayout.c |   31 ++++++++++++++++++++-----------
 1 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index adda7ea..c8e3be3 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -83,6 +83,7 @@ struct pnfs_client_operations *pnfs_callback_ops;
 
 /* Forward declaration */
 ssize_t filelayout_get_stripesize(struct pnfs_layout_type *);
+struct layoutdriver_io_operations filelayout_io_operations;
 
 /* Initialize a mountpoint by retrieving the list of
  * available devices for it.
@@ -360,11 +361,11 @@ filelayout_create_dserver(void)
 {
 	struct nfs4_pnfs_dserver *local;
 
-	dprintk("--> %s\n", __func__);
 	local = kzalloc(sizeof(*local), GFP_KERNEL);
 	if (!local)
 		return NULL;
 	kref_init(&local->ref);
+	dprintk("<-- %s dserver %p\n", __func__, local);
 	return local;
 }
 
@@ -379,13 +380,11 @@ static void filelayout_free_dserver(struct kref *kref)
 
 static void filelayout_release_dserver(struct nfs4_pnfs_dserver *dserver)
 {
-	dprintk("--> %s dserver %p\n", __func__, dserver);
 	kref_put(&dserver->ref, filelayout_free_dserver);
 }
 
 static void filelayout_get_dserver(struct nfs4_pnfs_dserver *dserver)
 {
-	dprintk("--> %s\n", __func__);
 	kref_get(&dserver->ref);
 }
 
@@ -445,6 +444,7 @@ next_ds:
 		if (status != 0) {
 			dprintk("%s failed to get dataserver. status %d\n",
 						__FUNCTION__, status);
+			filelayout_release_dserver(dserver);
 			status =  -EIO;
 			goto out;
 		}
@@ -452,15 +452,17 @@ next_ds:
 		ds = dserver->dev->ds_list[0];
 
 		use_ds = 1;
+		goto skip_get;
 use_ds:
 		filelayout_get_dserver(dserver);
-
+skip_get:
 		reqcount = count < PAGE_SIZE? count: PAGE_SIZE;
 		count -= reqcount;
 		dstotal += reqcount;
 
 		req->wb_devip = ds->ds_ip_addr;
 		req->wb_devport = ds->ds_port;
+		req->wb_ops = &filelayout_io_operations;
 		req->wb_private = dserver;
 
 		/* move request to dslist */
@@ -477,11 +479,6 @@ use_ds:
 			goto send;
 		}
 	}
-	if (!ds) {
-		status = -EIO;
-		goto out;
-	}
-
 send:
 	/* XXX should recover to send through MDS */
 	dprintk("%s Send: ndspages %d dstotal %Zd list_empty(head) %d \n",
@@ -507,6 +504,19 @@ out:
 	return status;
 }
 
+/*
+ * 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);
+}
+
 /* Perform async writes.
  *
  * TODO: See filelayout_read_pagelist.
@@ -565,8 +575,6 @@ ssize_t filelayout_write_pagelist(
 	nfs_initiate_write(data, data->pnfs_client,
 			&filelayout_write_call_ops, sync);
 
-	filelayout_release_dserver(dserver);
-
 	return 0;
 }
 
@@ -829,6 +837,7 @@ struct layoutdriver_io_operations filelayout_io_operations = {
 	.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,
-- 
1.5.0.2



More information about the pNFS mailing list