[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