[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