[pnfs] [PATCH 16/37] pnfs: allocate layout driver data in one piece with pnfs_layout_type

Benny Halevy bhalevy at panasas.com
Tue Jan 1 05:50:33 EST 2008


layout driver data comes right after the pnfs_layout_type fields
and can be accessed with the PNFS_LD_DATA accessor function.

Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/nfs4filelayout.c   |   35 +++++++----------------------------
 include/linux/nfs4_pnfs.h |   10 ++++++++--
 2 files changed, 15 insertions(+), 30 deletions(-)

diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index 30a853c..8bbad08 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -276,7 +276,7 @@ ssize_t filelayout_read_pagelist(
 	int status;
 
 	if (layoutid) {
-		nfslay = (struct nfs4_filelayout *)layoutid->layoutid;
+		nfslay = PNFS_LD_DATA(layoutid);
 		/* Retrieve the correct rpc_client for the byte range */
 		status = nfs4_pnfs_dserver_get(inode,
 						nfslay,
@@ -349,7 +349,7 @@ ssize_t filelayout_write_pagelist(
 	struct nfs_write_data *data)
 {
 	struct inode *inode = PNFS_INODE(layoutid);
-	struct nfs4_filelayout *nfslay = (struct nfs4_filelayout *)layoutid->layoutid;
+	struct nfs4_filelayout *nfslay = PNFS_LD_DATA(layoutid);
 	struct nfs4_pnfs_dserver dserver;
 	struct nfs4_pnfs_ds *ds;
 	struct nfs_page *req;
@@ -407,20 +407,9 @@ ssize_t filelayout_write_pagelist(
 struct pnfs_layout_type*
 filelayout_alloc_layout(struct pnfs_mount_type *mountid, struct inode *inode)
 {
-	struct pnfs_layout_type *pnfslay = NULL;
-	struct nfs4_filelayout *nfslay = NULL;
-
 	dprintk("NFS_FILELAYOUT: allocating layout\n");
-
-	pnfslay = kzalloc(sizeof(struct pnfs_layout_type), GFP_KERNEL);
-	if (!pnfslay)
-		return NULL;
-	nfslay = kzalloc(sizeof(struct nfs4_filelayout), GFP_KERNEL);
-	if (!nfslay)
-		return NULL;
-
-	pnfslay->layoutid = (void *)nfslay;
-	return pnfslay;
+	return kzalloc(sizeof(struct pnfs_layout_type) +
+		       sizeof(struct nfs4_filelayout), GFP_KERNEL);
 }
 
 /* Free a filelayout layout structure
@@ -429,17 +418,11 @@ void
 filelayout_free_layout(struct pnfs_layout_type **layoutidp,
 		       struct nfs4_pnfs_layout_segment *range)
 {
-	struct nfs4_filelayout *nfslay = NULL;
 	struct pnfs_layout_type *layoutid;
 
 	dprintk("NFS_FILELAYOUT: freeing layout\n");
 
 	layoutid = *layoutidp;
-	if (layoutid)
-		nfslay = (struct nfs4_filelayout *)layoutid->layoutid;
-	if (nfslay != NULL)
-		kfree(nfslay);
-	kfree(layoutid);
 	*layoutidp = NULL;
 }
 
@@ -459,9 +442,7 @@ filelayout_set_layout(struct pnfs_layout_type *layoutid,
 
 	if (!layoutid)
 		goto nfserr;
-	fl = (struct nfs4_filelayout *)layoutid->layoutid;
-	if (!fl)
-		goto nfserr;
+	fl = PNFS_LD_DATA(layoutid);
 
 	READ32(fl->dev_id);
 	READ32(nfl_util);
@@ -503,7 +484,6 @@ filelayout_commit(struct pnfs_layout_type *layoutid, struct list_head *pages,
 {
 	struct inode *ino = PNFS_INODE(layoutid);
 	struct nfs_write_data   *dsdata = NULL;
-	struct pnfs_layout_type *laytype;
 	struct nfs4_filelayout *nfslay;
 	struct nfs4_pnfs_dev_item *dev;
 	struct nfs4_pnfs_dev *fdev;
@@ -514,8 +494,7 @@ filelayout_commit(struct pnfs_layout_type *layoutid, struct list_head *pages,
 	struct list_head *pos, *tmp;
 	int i;
 
-	laytype = NFS_I(ino)->current_layout;
-	nfslay = (struct nfs4_filelayout *)layoutid->layoutid;
+	nfslay = PNFS_LD_DATA(layoutid);
 
 	dprintk("%s data %p pnfs_client %p nfslay %p\n",
 			__FUNCTION__, data, data->pnfs_client, nfslay);
@@ -599,7 +578,7 @@ out_bad:
 ssize_t
 filelayout_get_stripesize(struct pnfs_layout_type *layoutid)
 {
-	struct nfs4_filelayout *fl = (struct nfs4_filelayout *)layoutid->layoutid;
+	struct nfs4_filelayout *fl = PNFS_LD_DATA(layoutid);
 	ssize_t stripesize = fl->stripe_unit;
 	return stripesize;
 }
diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h
index 6a98f59..d862aac 100644
--- a/include/linux/nfs4_pnfs.h
+++ b/include/linux/nfs4_pnfs.h
@@ -37,9 +37,9 @@ struct pnfs_mount_type {
  * A reference is stored in the nfs_inode structure.
  */
 struct pnfs_layout_type {
-	void *layoutid;
-	int roc_iomode;	/* iomode to return on close, 0=none */
+	int roc_iomode;			/* iomode to return on close, 0=none */
 	struct inode *inode;
+	u8 ld_data[];			/* layout driver private data */
 };
 
 static inline struct inode *
@@ -66,6 +66,12 @@ PNFS_MOUNTID(struct pnfs_layout_type *lo)
 	return NFS_SERVER(PNFS_INODE(lo))->pnfs_mountid;
 }
 
+static inline void *
+PNFS_LD_DATA(struct pnfs_layout_type *lo)
+{
+	return lo->ld_data;
+}
+
 static inline struct pnfs_layoutdriver_type *
 PNFS_LD(struct pnfs_layout_type *lo)
 {
-- 
1.5.3.3



More information about the pNFS mailing list