[pnfs] [PATCH 16/23] 2.6-latest update nfs4_pnfs_dserver_get

andros at umich.edu andros at umich.edu
Thu Dec 13 15:51:42 EST 2007


From: Andy Adamson <andros at umich.edu>

Lookup the device id and use the stripe count to index the multipath data
server for a byte range.

destroy_ds can be called with a NULL struct nfs_client pointer from nfs4_pnfs_ds_add.

Clean up types.

Signed-off by: Andy Adamson<andros at umich.edu>
---
 fs/nfs/nfs4filelayout.h    |    4 +-
 fs/nfs/nfs4filelayoutdev.c |   54 ++++++++++++++++++++++++++------------------
 2 files changed, 34 insertions(+), 24 deletions(-)

diff --git a/fs/nfs/nfs4filelayout.h b/fs/nfs/nfs4filelayout.h
index b5e6c2f..82c9236 100644
--- a/fs/nfs/nfs4filelayout.h
+++ b/fs/nfs/nfs4filelayout.h
@@ -103,8 +103,8 @@ void nfs4_pnfs_devlist_destroy(struct nfs4_pnfs_dev_hlist *hlist);
 
 int nfs4_pnfs_dserver_get(struct inode *inode,
 			  struct nfs4_filelayout *layout,
-			  u64 offset,
-			  u32 count,
+			  loff_t offset,
+			  size_t count,
 			  struct nfs4_pnfs_dserver *dserver);
 int decode_and_add_devicelist(struct filelayout_mount_type *mt, struct pnfs_devicelist* devlist);
 
diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
index b175fb9..89a4e1e 100644
--- a/fs/nfs/nfs4filelayoutdev.c
+++ b/fs/nfs/nfs4filelayoutdev.c
@@ -264,10 +264,12 @@ unhash_ds(struct nfs4_pnfs_ds *ds)
 static void
 destroy_ds(struct nfs4_pnfs_ds *ds)
 {
-	nfs4_proc_destroy_session(ds->ds_clp->cl_ds_session,
+	if (ds->ds_clp) {
+		nfs4_proc_destroy_session(ds->ds_clp->cl_ds_session,
 					  ds->ds_clp->cl_rpcclient);
-	rpc_shutdown_client(ds->ds_clp->cl_rpcclient);
-	ds->ds_clp->cl_rpcclient = NULL;
+		rpc_shutdown_client(ds->ds_clp->cl_rpcclient);
+		ds->ds_clp->cl_rpcclient = NULL;
+	}
 	kfree(ds);
 }
 
@@ -645,45 +647,53 @@ nfs4_pnfs_device_item_get(struct inode *inode, u32 dev_id)
 int
 nfs4_pnfs_dserver_get(struct inode *inode,
 		      struct nfs4_filelayout *layout,
-		      u64 offset,
-		      u32 count,
+		      loff_t offset,
+		      size_t count,
 		      struct nfs4_pnfs_dserver *dserver)
 {
+	struct nfs4_pnfs_dev_item *di;
 	u64 tmp;
-	u32 stripe_idx, dbg_stripe_idx;
+	u32 stripe_idx, end_idx;
 
 	if(!layout)
 		return 1;
 
+	di = nfs4_pnfs_device_item_get(inode, layout->dev_id);
+	if (di == NULL)
+		return 1;
+
+	/* Want ((offset / layout->stripe_unit) % di->stripe_count)
+	* n_str = stripe for offset */
+
 	tmp = offset;
-	/* Want ((offset / layout->stripe_unit) % layout->num_devs) */
 	do_div(tmp, layout->stripe_unit);
-	stripe_idx = do_div(tmp, layout->num_fh) + layout->first_stripe_index;
+	stripe_idx = do_div(tmp, di->stripe_count) + layout->first_stripe_index;
 
-	/* For debugging */
 	tmp = offset + count - 1;
 	do_div(tmp, layout->stripe_unit);
-	dbg_stripe_idx = do_div(tmp, layout->num_fh) + layout->first_stripe_index;
+	end_idx = do_div(tmp, di->stripe_count) + layout->first_stripe_index;
 
-	dprintk("%s: offset=%Lu, count=%u, si=%u, dsi=%u, "
-		   "num_devs=%u, stripe_unit=%Lu\n",
-                   __FUNCTION__,
-		   offset, count, stripe_idx, dbg_stripe_idx, layout->num_fh,
-		   layout->stripe_unit);
+	dprintk("%s: offset=%Lu, count=%Zu, si=%u, dsi=%u, "
+		"stripe_count=%u, stripe_unit=%Lu first_stripe_index %d\n",
+		__FUNCTION__,
+		offset, count, stripe_idx, end_idx, di->stripe_count,
+		layout->stripe_unit, layout->first_stripe_index);
 
-	BUG_ON(dbg_stripe_idx != stripe_idx);
+	BUG_ON(end_idx != stripe_idx);
 
-	/* TODO: rewrite this function!
-	dserver->dev = nfs4_pnfs_device_get(inode, layout->dev_id, stripe_idx);
+	dserver->dev = &di->stripe_devs[stripe_idx];
 	if (dserver->dev == NULL)
 		return 1;
-	*/
-	dserver->fh = &layout->fh_array[stripe_idx];
+	if (layout->num_fh == 1)
+		dserver->fh = &layout->fh_array[0];
+	else
+		dserver->fh = &layout->fh_array[stripe_idx];
 
-	dprintk("%s: dev_id=%u, idx=%u, offset=%Lu, count=%u\n",
-		     __FUNCTION__, layout->dev_id, stripe_idx, offset, count);
+	dprintk("%s: dev_id=%u, idx=%u, offset=%Lu, count=%Zu\n",
+		__FUNCTION__, layout->dev_id, stripe_idx, offset, count);
 
 	return 0;
+
 }
 
 /* Currently not used.
-- 
1.5.0.2



More information about the pNFS mailing list