[pnfs] [PATCH] pnfs: carry reference to pnfs_layout_type in nfs4_pnfs_layoutget

Benny Halevy bhalevy at panasas.com
Tue Jul 15 14:04:13 EDT 2008


This allows the code using it to get the reference when
instantiating the nfs4_pnfs_layoutget state and use the pointer
through the complete execution path without having to get
the pointer from the associated nfs_inode every time it's needed.

Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/nfs4proc.c        |    8 ++------
 fs/nfs/pnfs.c            |   14 +++++---------
 fs/nfs/pnfs.h            |    6 ++----
 include/linux/pnfs_xdr.h |    1 +
 4 files changed, 10 insertions(+), 19 deletions(-)

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 15e51bf..540a3b8 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -5198,18 +5198,14 @@ static void nfs4_pnfs_layoutget_done(struct rpc_task *task, void *calldata)
 	struct nfs4_pnfs_layoutget *lgp = calldata;
 	struct inode *ino = lgp->args.inode;
 	struct nfs_server *server = NFS_SERVER(ino);
-	struct nfs_inode *nfsi = NFS_I(ino);
-	struct pnfs_layout_type *lo;
 
 	dprintk("--> %s\n", __func__);
 
 	nfs4_sequence_done(server, &lgp->res.seq_res, task->tk_status);
 	if (RPC_ASSASSINATED(task))
 		return;
-	lo = nfsi->current_layout;
-	BUG_ON(!lo);
 
-	pnfs_get_layout_done(lo, lgp, task->tk_status);
+	pnfs_get_layout_done(lgp, task->tk_status);
 	dprintk("<-- %s\n", __func__);
 }
 
@@ -5274,7 +5270,7 @@ static int nfs4_proc_pnfs_layoutget(struct nfs4_pnfs_layoutget *lgp)
 	if (status == 0) {
 		status = lgp->status;
 		if (status == 0)
-			status = pnfs_layout_process(NFS_I(ino)->current_layout, lgp);
+			status = pnfs_layout_process(lgp);
 	}
 	rpc_put_task(task);
 out:
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index fa7b08d..67cb598 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -527,6 +527,7 @@ get_layout(struct inode *ino,
 	lgp = kzalloc(sizeof(*lgp), GFP_KERNEL);
 	if (lgp == NULL)
 		return -ENOMEM;
+	lgp->lo = lo;
 	lgp->args.lseg.iomode = range->iomode;
 	lgp->args.lseg.offset = range->offset;
 	lgp->args.lseg.length = range->length;
@@ -946,13 +947,11 @@ out_put:
 }
 
 void
-pnfs_get_layout_done(struct pnfs_layout_type *lo,
-		     struct nfs4_pnfs_layoutget *lgp,
-		     int rpc_status)
+pnfs_get_layout_done(struct nfs4_pnfs_layoutget *lgp, int rpc_status)
 {
 	struct nfs4_pnfs_layoutget_res *res = &lgp->res;
 	struct pnfs_layout_segment *lseg = NULL;
-	struct nfs_inode *nfsi = NFS_I(lo->inode);
+	struct nfs_inode *nfsi = NFS_I(lgp->lo->inode);
 	time_t suspend = 0;
 
 	dprintk("-->%s\n", __func__);
@@ -1012,17 +1011,14 @@ get_out:
 }
 
 int
-pnfs_layout_process(struct pnfs_layout_type *lo,
-		    struct nfs4_pnfs_layoutget *lgp)
+pnfs_layout_process(struct nfs4_pnfs_layoutget *lgp)
 {
+	struct pnfs_layout_type *lo = lgp->lo;
 	struct nfs4_pnfs_layoutget_res *res = &lgp->res;
 	struct pnfs_layout_segment *lseg;
 	struct nfs_inode *nfsi = NFS_I(lo->inode);
 	int status = 0;
 
-	/* FIXME: WTF? */
-	BUG_ON(nfsi->current_layout != lo);
-
 	/* Inject layout blob into I/O device driver */
 	lseg = PNFS_LD_IO_OPS(lo)->alloc_lseg(lo, res);
 	if (!lseg || IS_ERR(lseg)) {
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 77d39c6..eabd4fb 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -55,10 +55,8 @@ void pnfs_pageio_init_write(struct nfs_pageio_descriptor *, struct inode *);
 void pnfs_update_layout_commit(struct inode *, struct list_head *, pgoff_t, unsigned int);
 void pnfs_free_fsdata(struct pnfs_fsdata *fsdata);
 ssize_t pnfs_file_write(struct file *, const char __user *, size_t, loff_t *);
-void pnfs_get_layout_done(struct pnfs_layout_type *,
-			  struct nfs4_pnfs_layoutget *, int);
-int pnfs_layout_process(struct pnfs_layout_type *lo,
-		    struct nfs4_pnfs_layoutget *lgp);
+void pnfs_get_layout_done(struct nfs4_pnfs_layoutget *, int rpc_status);
+int pnfs_layout_process(struct nfs4_pnfs_layoutget *lgp);
 void pnfs_layout_release(struct pnfs_layout_type *);
 int _pnfs_write_begin(struct inode *inode, struct page *page,
 		      loff_t pos, unsigned len, void **fsdata);
diff --git a/include/linux/pnfs_xdr.h b/include/linux/pnfs_xdr.h
index c443d19..0da6bea 100644
--- a/include/linux/pnfs_xdr.h
+++ b/include/linux/pnfs_xdr.h
@@ -56,6 +56,7 @@ struct nfs4_pnfs_layoutget_res {
 };
 
 struct nfs4_pnfs_layoutget {
+	struct pnfs_layout_type *lo;
 	struct nfs4_pnfs_layoutget_arg args;
 	struct nfs4_pnfs_layoutget_res res;
 	struct pnfs_layout_segment **lsegpp;
-- 
1.5.6.3



More information about the pNFS mailing list