[pnfs] [PATCH 13/37] pnfs: add inode ptr and accessor functions for pnfs_layout_type

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


Also, remove mountid from pnfs_layout_type. Use accessor to
reach it instead.

remove the inode arg from functions already receiving a pnfs_layout_type
argument.

Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/nfs4filelayout.c   |   15 +++++----
 fs/nfs/pnfs.c             |   51 +++++++++++++++---------------
 include/linux/nfs4_pnfs.h |   76 +++++++++++++++++++++++++++++++++++----------
 3 files changed, 92 insertions(+), 50 deletions(-)

diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c
index 6bea89e..9edf175 100644
--- a/fs/nfs/nfs4filelayout.c
+++ b/fs/nfs/nfs4filelayout.c
@@ -265,7 +265,6 @@ struct rpc_call_ops filelayout_write_call_ops = {
  */
 ssize_t filelayout_read_pagelist(
 	struct pnfs_layout_type *layoutid,
-	struct inode *inode,
 	struct page **pages,
 	unsigned int pgbase,
 	unsigned nr_pages,
@@ -273,6 +272,7 @@ ssize_t filelayout_read_pagelist(
 	size_t count,
 	struct nfs_read_data *data)
 {
+	struct inode *inode = PNFS_INODE(layoutid);
 	struct nfs4_filelayout *nfslay = NULL;
 	struct nfs4_pnfs_dserver dserver;
 	int status;
@@ -342,7 +342,6 @@ ssize_t filelayout_read_pagelist(
  */
 ssize_t filelayout_write_pagelist(
 	struct pnfs_layout_type *layoutid,
-	struct inode *inode,
 	struct page **pages,
 	unsigned int pgbase,
 	unsigned nr_pages,
@@ -351,6 +350,7 @@ ssize_t filelayout_write_pagelist(
 	int sync,
 	struct nfs_write_data *data)
 {
+	struct inode *inode = PNFS_INODE(layoutid);
 	struct nfs4_filelayout *nfslay = (struct nfs4_filelayout *)layoutid->layoutid;
 	struct nfs4_pnfs_dserver dserver;
 	struct nfs4_pnfs_ds *ds;
@@ -422,7 +422,7 @@ filelayout_alloc_layout(struct pnfs_mount_type *mountid, struct inode *inode)
 		return NULL;
 
 	pnfslay->layoutid = (void *)nfslay;
-	pnfslay->mountid = mountid;
+	pnfslay->inode = inode;
 	return pnfslay;
 }
 
@@ -430,7 +430,6 @@ filelayout_alloc_layout(struct pnfs_mount_type *mountid, struct inode *inode)
  */
 void
 filelayout_free_layout(struct pnfs_layout_type **layoutidp,
-		       struct inode *inode,
 		       struct nfs4_pnfs_layout_segment *range)
 {
 	struct nfs4_filelayout *nfslay = NULL;
@@ -451,7 +450,7 @@ filelayout_free_layout(struct pnfs_layout_type **layoutidp,
  * information for this file.
  */
 struct pnfs_layout_type*
-filelayout_set_layout(struct pnfs_layout_type *layoutid, struct inode *inode,
+filelayout_set_layout(struct pnfs_layout_type *layoutid,
 			struct nfs4_pnfs_layoutget_res *lgr)
 {
 	struct nfs4_filelayout *fl = NULL;
@@ -502,8 +501,10 @@ nfserr:
  * Once we fix this, we will need to invoke the pnfs_commit_complete callback.
  */
 int
-filelayout_commit(struct pnfs_layout_type *layoutid, struct inode *ino, struct list_head *pages, int sync, struct nfs_write_data *data)
+filelayout_commit(struct pnfs_layout_type *layoutid, struct list_head *pages,
+		  int sync, struct nfs_write_data *data)
 {
+	struct inode *ino = PNFS_INODE(layoutid);
 	struct nfs_write_data   *dsdata = NULL;
 	struct pnfs_layout_type *laytype;
 	struct nfs4_filelayout *nfslay;
@@ -599,7 +600,7 @@ out_bad:
 /* Return the stripesize for the specified file.
  */
 ssize_t
-filelayout_get_stripesize(struct pnfs_layout_type *layoutid, struct inode *inode)
+filelayout_get_stripesize(struct pnfs_layout_type *layoutid)
 {
 	struct nfs4_filelayout *fl = (struct nfs4_filelayout *)layoutid->layoutid;
 	ssize_t stripesize = fl->stripe_unit;
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 9d0afbf..9abd263 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -367,7 +367,7 @@ pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range)
 			dprintk("%s: removing layout\n", __FUNCTION__);
 
 		server->pnfs_curr_ld->ld_io_ops->free_layout(
-			&nfsi->current_layout, ino, &arg.lseg);
+			&nfsi->current_layout, &arg.lseg);
 	}
 
 	dprintk("%s:Exit status %d\n", __FUNCTION__, status);
@@ -441,7 +441,7 @@ pnfs_inject_layout(struct nfs_inode *nfsi,
 		return NULL;
 	}
 	dprintk("%s Calling set layout\n", __FUNCTION__);
-	return io_ops->set_layout(layid, inode, lgr);
+	return io_ops->set_layout(layid, lgr);
 }
 
 /* Update the file's layout for the given range and iomode.
@@ -653,7 +653,7 @@ pnfs_getboundary(struct inode *inode)
 	nfsi = NFS_I(inode);
 	lo = nfsi->current_layout;
 	if (lo)
-		stripe_size = policy_ops->get_stripesize(lo, inode);
+		stripe_size = policy_ops->get_stripesize(lo);
 out:
 	return stripe_size;
 }
@@ -899,15 +899,15 @@ pnfs_writepages(struct nfs_write_data *wdata, int how)
 		numpages);
 	if (pnfs_get_type(inode) != LAYOUT_NFSV4_FILES)
 		wdata->pnfsflags |= PNFS_NO_RPC;
-	status = nfss->pnfs_curr_ld->ld_io_ops->write_pagelist(nfsi->current_layout,
-							       inode,
-							       args->pages,
-							       args->pgbase,
-							       numpages,
-							       (loff_t)args->offset,
-							       args->count,
-							       how,
-							       wdata);
+	status = nfss->pnfs_curr_ld->ld_io_ops->write_pagelist(
+							nfsi->current_layout,
+							args->pages,
+							args->pgbase,
+							numpages,
+							(loff_t)args->offset,
+							args->count,
+							how,
+							wdata);
 
 	if (status > 0) {
 		dprintk("%s: LD write_pagelist returned status %d > 0\n", __FUNCTION__, status);
@@ -993,14 +993,14 @@ pnfs_readpages(struct nfs_read_data *rdata)
 	dprintk("%s: Calling layout driver read with %d pages\n", __FUNCTION__, numpages);
 	if (pnfs_get_type(inode) != LAYOUT_NFSV4_FILES)
 		rdata->pnfsflags |= PNFS_NO_RPC;
-	status = nfss->pnfs_curr_ld->ld_io_ops->read_pagelist(nfsi->current_layout,
-							      inode,
-							      args->pages,
-							      args->pgbase,
-							      numpages,
-							      (loff_t)args->offset,
-							      args->count,
-							      rdata);
+	status = nfss->pnfs_curr_ld->ld_io_ops->read_pagelist(
+							nfsi->current_layout,
+							args->pages,
+							args->pgbase,
+							numpages,
+							(loff_t)args->offset,
+							args->count,
+							rdata);
 	if (status > 0) {
 		dprintk("%s: LD read_pagelist returned status %d > 0\n", __FUNCTION__, status);
 		status = 0;
@@ -1112,7 +1112,7 @@ pnfs_commit(struct inode *inode,
 
 	dprintk("%s: Calling layout driver commit\n", __FUNCTION__);
 	result = nfss->pnfs_curr_ld->ld_io_ops->commit(nfsi->current_layout,
-						       inode, head, sync, data);
+						       head, sync, data);
 
 	dprintk("%s end (err:%d)\n", __FUNCTION__, result);
 	return result;
@@ -1165,10 +1165,10 @@ pnfs_layoutcommit_done(
 	 * to directly xdr its layout on the wire.
 	 */
 	if (nfss->pnfs_curr_ld->ld_io_ops->cleanup_layoutcommit)
-		nfss->pnfs_curr_ld->ld_io_ops->cleanup_layoutcommit(nfsi->current_layout,
-								    data->inode,
-								    &data->args,
-								    &data->res);
+		nfss->pnfs_curr_ld->ld_io_ops->cleanup_layoutcommit(
+							nfsi->current_layout,
+							&data->args,
+							&data->res);
 
 	/* release the open_context acquired in pnfs_writeback_done */
 	put_nfs_open_context(data->ctx);
@@ -1241,7 +1241,6 @@ pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
 	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit) {
 		result = nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit(
 				nfsi->current_layout,
-				data->inode,
 				&data->args);
 		if (result)
 			goto out;
diff --git a/include/linux/nfs4_pnfs.h b/include/linux/nfs4_pnfs.h
index 941dda7..fdc4622 100644
--- a/include/linux/nfs4_pnfs.h
+++ b/include/linux/nfs4_pnfs.h
@@ -17,6 +17,14 @@
 #define NFS4_PNFS_DEV_MAXCOUNT 16
 #define NFS4_PNFS_DEV_MAXSIZE 128
 
+/* Per-layout driver specific registration structure */
+struct pnfs_layoutdriver_type {
+	const u32 id;
+	const char *name;
+	struct layoutdriver_io_operations *ld_io_ops;
+	struct layoutdriver_policy_operations *ld_policy_ops;
+};
+
 /* Layout driver specific identifier for a mount point.  For each mountpoint
  * a reference is stored in the nfs_server structure.
  */
@@ -29,11 +37,53 @@ struct pnfs_mount_type {
  * A reference is stored in the nfs_inode structure.
  */
 struct pnfs_layout_type {
-	struct pnfs_mount_type *mountid;
 	void *layoutid;
 	int roc_iomode;	/* iomode to return on close, 0=none */
+	struct inode *inode;
 };
 
+static inline struct inode *
+PNFS_INODE(struct pnfs_layout_type *lo)
+{
+	return lo->inode;
+}
+
+static inline struct nfs_inode *
+PNFS_NFS_INODE(struct pnfs_layout_type *lo)
+{
+	return NFS_I(PNFS_INODE(lo));
+}
+
+static inline struct nfs_server *
+PNFS_NFS_SERVER(struct pnfs_layout_type *lo)
+{
+	return NFS_SERVER(PNFS_INODE(lo));
+}
+
+static inline struct pnfs_mount_type *
+PNFS_MOUNTID(struct pnfs_layout_type *lo)
+{
+	return NFS_SERVER(PNFS_INODE(lo))->pnfs_mountid;
+}
+
+static inline struct pnfs_layoutdriver_type *
+PNFS_LD(struct pnfs_layout_type *lo)
+{
+	return NFS_SERVER(PNFS_INODE(lo))->pnfs_curr_ld;
+}
+
+static inline struct layoutdriver_io_operations *
+PNFS_LD_IO_OPS(struct pnfs_layout_type *lo)
+{
+	return PNFS_LD(lo)->ld_io_ops;
+}
+
+static inline struct layoutdriver_policy_operations *
+PNFS_LD_POLICY_OPS(struct pnfs_layout_type *lo)
+{
+	return PNFS_LD(lo)->ld_policy_ops;
+}
+
 /* Layout driver I/O operations.
  * Either the pagecache or non-pagecache read/write operations must be implemented
  */
@@ -41,26 +91,26 @@ struct layoutdriver_io_operations {
 	/* Functions that use the pagecache.
 	 * If use_pagecache == 1, then these functions must be implemented.
 	 */
-	ssize_t (*read_pagelist) (struct pnfs_layout_type *layoutid, struct inode *, struct page **pages, unsigned int pgbase, unsigned nr_pages, loff_t offset, size_t count, struct nfs_read_data *nfs_data);
-	ssize_t (*write_pagelist) (struct pnfs_layout_type *layoutid, struct inode *, struct page **pages, unsigned int pgbase, unsigned nr_pages, loff_t offset, size_t count, int sync, struct nfs_write_data *nfs_data);
+	ssize_t (*read_pagelist) (struct pnfs_layout_type *layoutid, struct page **pages, unsigned int pgbase, unsigned nr_pages, loff_t offset, size_t count, struct nfs_read_data *nfs_data);
+	ssize_t (*write_pagelist) (struct pnfs_layout_type *layoutid, struct page **pages, unsigned int pgbase, unsigned nr_pages, loff_t offset, size_t count, int sync, struct nfs_write_data *nfs_data);
 
 	/* Consistency ops */
 	/* 2 problems:
 	 * 1) the page list contains nfs_pages, NOT pages
 	 * 2) currently the NFS code doesn't create a page array (as it does with read/write)
 	 */
-	int (*commit) (struct pnfs_layout_type *layoutid, struct inode *, struct list_head *, int sync, struct nfs_write_data *nfs_data);
+	int (*commit) (struct pnfs_layout_type *layoutid, struct list_head *, int sync, struct nfs_write_data *nfs_data);
 
 	/* Layout information. For each inode, alloc_layout is executed once to retrieve an
 	 * inode specific layout structure.  Each subsequent layoutget operation results in
 	 * a set_layout call to set the opaque layout in the layout driver.*/
 	struct pnfs_layout_type * (*alloc_layout) (struct pnfs_mount_type *mountid, struct inode *inode);
 	int (*has_layout) (struct pnfs_layout_type *layoutid, struct inode *inode, struct nfs4_pnfs_layout_segment *range);
-	void (*free_layout) (struct pnfs_layout_type **layoutidp, struct inode *inode, struct nfs4_pnfs_layout_segment *range);
-	struct pnfs_layout_type * (*set_layout) (struct pnfs_layout_type *layoutid, struct inode *inode, struct nfs4_pnfs_layoutget_res *lgr);
+	void (*free_layout) (struct pnfs_layout_type **layoutidp, struct nfs4_pnfs_layout_segment *range);
+	struct pnfs_layout_type * (*set_layout) (struct pnfs_layout_type *layoutid, struct nfs4_pnfs_layoutget_res *lgr);
 
-	int (*setup_layoutcommit) (struct pnfs_layout_type *layoutid, struct inode *inode, struct pnfs_layoutcommit_arg *arg);
-	void (*cleanup_layoutcommit) (struct pnfs_layout_type *layoutid, struct inode *inode, struct pnfs_layoutcommit_arg *arg, struct pnfs_layoutcommit_res *res);
+	int (*setup_layoutcommit) (struct pnfs_layout_type *layoutid, struct pnfs_layoutcommit_arg *arg);
+	void (*cleanup_layoutcommit) (struct pnfs_layout_type *layoutid, struct pnfs_layoutcommit_arg *arg, struct pnfs_layoutcommit_res *res);
 
 	/* Registration information for a new mounted file system
 	 */
@@ -73,7 +123,7 @@ struct layoutdriver_io_operations {
 
 struct layoutdriver_policy_operations {
 	/* The stripe size of the file system */
-	ssize_t (*get_stripesize) (struct pnfs_layout_type *layoutid, struct inode *);
+	ssize_t (*get_stripesize) (struct pnfs_layout_type *layoutid);
 
 	/* Should the NFS req. gather algorithm cross stripe boundaries? */
 	int (*gather_across_stripes) (struct pnfs_mount_type *mountid);
@@ -103,14 +153,6 @@ struct layoutdriver_policy_operations {
 	int (*layoutret_on_setattr) (struct pnfs_mount_type *);
 };
 
-/* Per-layout driver specific registration structure */
-struct pnfs_layoutdriver_type {
-	const u32 id;
-	const char *name;
-	struct layoutdriver_io_operations *ld_io_ops;
-	struct layoutdriver_policy_operations *ld_policy_ops;
-};
-
 struct pnfs_device {
 	int           dev_id;
 	unsigned int  dev_count;
-- 
1.5.3.3



More information about the pNFS mailing list