[pnfs] [PATCH] fix recall layout for fsid

Marc Eshel eshel at almaden.ibm.com
Tue Jun 5 03:00:01 EDT 2007


From: Marc Eshel <eshel at almaden.ibm.com>


---

 fs/nfs/callback_proc.c |    2 +-
 fs/nfs/delegation.c    |   22 +++++++++++++---------
 fs/nfs/delegation.h    |    2 +-
 fs/nfs/inode.c         |    2 +-
 fs/nfs/nfs4proc.c      |    2 +-
 fs/nfs/nfs4state.c     |    2 +-
 fs/nfs/pnfs.c          |    4 ++--
 fs/nfs/pnfs.h          |    2 +-
 fs/nfsd/nfs4callback.c |    2 +-
 fs/nfsd/nfs4state.c    |    4 +++-
 fs/nfsd/nfs4xdr.c      |    3 ++-
 11 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
index 30e0e91..998ad6b 100644
--- a/fs/nfs/callback_proc.c
+++ b/fs/nfs/callback_proc.c
@@ -130,7 +130,7 @@ unsigned nfs4_callback_pnfs_layoutrecall
 			goto out_putclient;
 	}
 	/* Set up a helper thread to actually return the delegation */
-	switch(nfs_async_return_layout(clp, inode, &args->cbl_fsid)) {
+	switch(nfs_async_return_layout(clp, inode, args)) {
 		case 0:
 			res = 0;
 			break;
diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
index faf0bd8..3795280 100644
--- a/fs/nfs/delegation.c
+++ b/fs/nfs/delegation.c
@@ -20,6 +20,7 @@ #include <linux/writeback.h>
 #include "nfs4_fs.h"
 #include "delegation.h"
 #include "pnfs.h"
+#include "callback.h"
 
 #define NFSDBG_FACILITY NFSDBG_CALLBACK
 
@@ -314,8 +315,8 @@ struct recall_layout_threadargs {
 	struct inode *inode;
 	struct nfs4_client *clp;
 	const nfs4_stateid *stateid;
-        struct nfs_fsid fsid;
 	struct completion started;
+	struct cb_pnfs_layoutrecallargs rl;
 	int result;
 };
 
@@ -370,7 +371,7 @@ static int recall_layout_thread(void *da
 	daemonize("nfsv4-layoutreturn");
 
 	dprintk("%s: fsid 0x%llx-0x%llx start\n",
-		__FUNCTION__, args->fsid.major, args->fsid.minor);
+		__FUNCTION__, args->rl.cbl_fsid.major, args->rl.cbl_fsid.minor);
 
 	clp = args->clp;
 	args->result = 0;
@@ -379,18 +380,18 @@ static int recall_layout_thread(void *da
 //??? commit the files first ???
 
 	if (args->inode != NULL) {
-		pnfs_return_layout(args->inode);
+		pnfs_return_layout(args->inode, args->rl.cbl_recall_type);
 		goto out;
 	}
 
 	down_read(&clp->cl_sem);
 	list_for_each_entry(server, &clp->cl_superblocks, nfs4_siblings) {
 		dprintk("%s: fsid 0x%llx-0x%llx 0x%llx-0x%llx\n",
-			__FUNCTION__, args->fsid.major, args->fsid.minor,
+			__FUNCTION__, args->rl.cbl_fsid.major, args->rl.cbl_fsid.minor,
 			server->fsid.major, server->fsid.minor);
 
-		if (server->fsid.major == args->fsid.major &&
-			server->fsid.minor == args->fsid.minor) {
+		if (server->fsid.major == args->rl.cbl_fsid.major &&
+			server->fsid.minor == args->rl.cbl_fsid.minor) {
 			found = 1;
 			break;
 		}
@@ -420,7 +421,7 @@ static int recall_layout_thread(void *da
 
 		if (found) {
 			igrab(inode);
-			pnfs_return_layout(inode);
+			pnfs_return_layout(inode, args->rl.cbl_recall_type);
 			iput(inode);
 		}
 
@@ -458,15 +459,18 @@ out_module_put:
 /*
  * Asynchronous layout recall!
  */
-int nfs_async_return_layout(struct nfs4_client *clp, struct inode *inode, struct nfs_fsid *fsid)
+int nfs_async_return_layout(struct nfs4_client *clp, struct inode *inode, void *args)
 {
+	struct cb_pnfs_layoutrecallargs *rl = args;
 	struct recall_layout_threadargs data = {
 		.clp = clp,
 		.inode = inode,
-		.fsid = *fsid,
 	};
 	int status;
 
+	data.rl.cbl_fsid = rl->cbl_fsid;
+	data.rl.cbl_recall_type = rl->cbl_recall_type;
+	
 	init_completion(&data.started);
 	__module_get(THIS_MODULE);
 	status = kernel_thread(recall_layout_thread, &data, CLONE_KERNEL);
diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h
index a594131..43fcb55 100644
--- a/fs/nfs/delegation.h
+++ b/fs/nfs/delegation.h
@@ -28,7 +28,7 @@ int nfs_inode_set_delegation(struct inod
 void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res);
 int __nfs_inode_return_delegation(struct inode *inode);
 int nfs_async_inode_return_delegation(struct inode *inode, const nfs4_stateid *stateid);
-int nfs_async_return_layout(struct nfs4_client *clp, struct inode *inode, struct nfs_fsid *fsid);
+int nfs_async_return_layout(struct nfs4_client *clp, struct inode *inode, void *arg);
 
 struct inode *nfs_delegation_find_inode(struct nfs4_client *clp, const struct nfs_fh *fhandle);
 struct inode *nfs_layout_find_inode(struct nfs4_client *clp, const struct nfs_fh *fhandle);
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 97e0421..a3ea1ce 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1074,7 +1074,7 @@ void nfs4_clear_inode(struct inode *inod
 
 #ifdef CONFIG_PNFS
 	/* Return the layout and free it if this inode has a cached layout */
-	pnfs_return_layout(inode);
+	pnfs_return_layout(inode, RETURN_FILE);
 #endif
 
 	/* Now clear out any remaining state */
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 59ec57a..b906ac3 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2028,7 +2028,7 @@ pnfs4_proc_setattr(struct dentry *dentry
 			if (NFS_I(inode)->layoutcommit_ctx) {
 				pnfs_layoutcommit_inode(inode, 0);
 			}
-			pnfs_return_layout(inode);
+			pnfs_return_layout(inode, RETURN_FILE);
 		}
 	}
 
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 8e990a5..4c2c9e5 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -535,7 +535,7 @@ void nfs4_close_state(struct nfs4_state 
 			/* TODO: make finer grained returns here */
 			if (NFS_I(inode)->current_layout &&
 			    NFS_I(inode)->current_layout->roc_iomode) {
-				pnfs_return_layout(inode);
+				pnfs_return_layout(inode, RETURN_FILE);
 			}
 		}
 		if (nfs4_do_close(inode, state) == 0)
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 45899b3..89b165e 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -350,7 +350,7 @@ get_layout(struct inode* ino,
 }
 
 int
-pnfs_return_layout(struct inode* ino)
+pnfs_return_layout(struct inode* ino, int type)
 {
 	struct nfs4_pnfs_layoutreturn_arg arg;
 	struct nfs4_pnfs_layoutreturn_res res;
@@ -374,7 +374,7 @@ pnfs_return_layout(struct inode* ino)
 	arg.reclaim = 0;
 	arg.layout_type = server->pnfs_curr_ld->id;
 	arg.iomode = IOMODE_ANY /* for now */;
-	arg.return_type = RETURN_FILE;
+	arg.return_type = type;
 	arg.offset = 0;
 	arg.length = ~0;
 	arg.inode = ino;
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 37d2baf..5aef025 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -16,7 +16,7 @@ #ifdef CONFIG_PNFS
 int virtual_update_layout(struct inode* ino, struct nfs_open_context* ctx,
 	size_t count, loff_t pos, enum pnfs_iomode access_type);
 
-int pnfs_return_layout(struct inode* ino);
+int pnfs_return_layout(struct inode* ino, int type);
 void set_pnfs_layoutdriver(struct super_block *sb, u32 id);
 void unmount_pnfs_layoutdriver(struct super_block *sb);
 ssize_t pnfs_file_write(struct file* filp, const char __user *buf, size_t count, loff_t* pos);
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index b7bc5c3..da20278 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -413,7 +413,7 @@ nfs41_xdr_enc_cb_layout(struct rpc_rqst 
 	struct nfs4_layoutrecall *args = rpc_args->args_op;
 	struct nfs4_cb_compound_hdr hdr = {
 		.ident = 0,
-		.nops   = 1,
+		.nops   = 2,
 	};
 
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 2fe5414..a7fc88a 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -4017,6 +4017,7 @@ hash_layoutrecall(struct nfs4_layoutreca
 
 	dprintk("NFSD %s clr %p clp %p fp %p\n", __FUNCTION__, clr, clp, fp);
 	list_add(&clr->clr_perclnt, &clp->cl_layoutrecalls);
+	kref_get(&clr->clr_ref);
 	if (fp)
 		get_nfs4_file(fp);
 	dprintk("NFSD %s exit\n", __FUNCTION__);
@@ -4394,7 +4395,8 @@ int nfs4_pnfs_return_layout(struct super
 	if (!fp)
 		goto out;
 
-	dprintk("pNFS %s: clp %p fp %p\n", __FUNCTION__, clp, fp);
+	dprintk("pNFS %s: clp %p fp %p type %d\n",
+				__FUNCTION__, clp, fp, lrp->lr_return_type);
 
 	/* update layouts */
 	if (lrp->lr_return_type == RETURN_FILE) {
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index f040c38..52bc3db 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -1292,13 +1292,14 @@ nfsd4_decode_layoutreturn(struct nfsd4_c
 {
 	DECODE_HEAD;
 
-	READ_BUF(32);
+	READ_BUF(16);
 	READ32(lrp->lr_reclaim);
 	READ32(lrp->lr_seg.layout_type);
 	READ32(lrp->lr_seg.iomode);
 	READ32(lrp->lr_return_type);
 	if (lrp->lr_return_type == RETURN_FILE)
 	{
+		READ_BUF(16);
 		READ64(lrp->lr_seg.offset);
 		READ64(lrp->lr_seg.length);
 	}


More information about the pNFS mailing list