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