[pnfs] [PATCH 7/8] pnfs: refactor pnfs_return_layout
andros at umich.edu
andros at umich.edu
Mon Mar 10 14:39:19 EDT 2008
From: Andy Adamson <andros at umich.edu>
Remove pnfs_return_layout_rpc(). Add a recall type parameter to
pnfs_return_layout() and simplify calls in pnfs_recall_layout().
Signed-off-by: Andy Adamson<andros at umich.edu>
---
fs/nfs/callback_proc.c | 19 +++++-----------
fs/nfs/inode.c | 2 +-
fs/nfs/nfs4proc.c | 2 +-
fs/nfs/nfs4state.c | 2 +-
fs/nfs/pnfs.c | 53 ++++++++++++-----------------------------------
fs/nfs/pnfs.h | 4 +-
6 files changed, 25 insertions(+), 57 deletions(-)
diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
index 18fa030..b4bbb3d 100644
--- a/fs/nfs/callback_proc.c
+++ b/fs/nfs/callback_proc.c
@@ -148,11 +148,9 @@ static int pnfs_recall_layout(void *data)
{
struct inode *inode, *ino;
struct nfs_client *clp;
- struct nfs_server *server = NULL;
struct cb_pnfs_layoutrecallargs rl;
struct recall_layout_threadargs *args =
(struct recall_layout_threadargs *)data;
- struct nfs4_pnfs_layoutreturn_arg lr_arg;
int status;
daemonize("nfsv4-layoutreturn");
@@ -163,7 +161,6 @@ static int pnfs_recall_layout(void *data)
clp = args->clp;
inode = args->inode;
- server = NFS_SERVER(inode);
rl = args->rl;
args->result = 0;
complete(&args->started);
@@ -180,7 +177,8 @@ static int pnfs_recall_layout(void *data)
*/
if (rl.cbl_recall_type == RECALL_FILE) {
- pnfs_return_layout(inode, &rl.cbl_seg);
+ /* XXX need to check status on pnfs_return_layout */
+ pnfs_return_layout(inode, &rl.cbl_seg, RECALL_FILE);
goto out;
}
@@ -189,21 +187,16 @@ static int pnfs_recall_layout(void *data)
/* FIXME: This loop is inefficient, running in O(|s_inodes|^2) */
while ((ino = nfs_layoutrecall_find_inode(clp, &rl)) != NULL) {
- pnfs_return_layout(ino, &rl.cbl_seg);
+ /* XXX need to check status on pnfs_return_layout */
+ pnfs_return_layout(ino, &rl.cbl_seg, RECALL_FILE);
iput(ino);
}
/* send final layoutreturn */
- lr_arg.reclaim = 0;
- lr_arg.layout_type = server->pnfs_curr_ld->id;
- lr_arg.return_type = rl.cbl_recall_type;
- lr_arg.lseg = rl.cbl_seg;
- lr_arg.inode = inode;
-
- status = pnfs_return_layout_rpc(server, &lr_arg);
+ status = pnfs_return_layout(inode, &rl.cbl_seg, rl.cbl_recall_type);
if (status)
printk(KERN_INFO
- "%s: ignoring pnfs_return_layout_rpc status=%d\n",
+ "%s: ignoring pnfs_return_layout status=%d\n",
__func__, status);
out:
iput(inode);
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index b0c5308..38c9359 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1151,7 +1151,7 @@ void nfs4_clear_inode(struct inode *inode)
/* First call standard NFS clear_inode() code */
nfs_clear_inode(inode);
#ifdef CONFIG_PNFS
- pnfs_return_layout(inode, NULL);
+ pnfs_return_layout(inode, NULL, RECALL_FILE);
#endif /* CONFIG_PNFS */
}
#endif
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 3634814..729e14e 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2160,7 +2160,7 @@ pnfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
if (p_ops && p_ops->layoutret_on_setattr) {
if (nfsi->layoutcommit_ctx)
pnfs_layoutcommit_inode(inode, 0);
- pnfs_return_layout(inode, NULL);
+ pnfs_return_layout(inode, NULL, RECALL_FILE);
}
}
return nfs4_proc_setattr(dentry, fattr, sattr);
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index db7222f..3a4e16e 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -508,7 +508,7 @@ static void __nfs4_close(struct path *path, struct nfs4_state *state, mode_t mod
range.iomode = nfsi->current_layout->roc_iomode;
range.offset = 0;
range.length = NFS4_LENGTH_EOF;
- pnfs_return_layout(state->inode, &range);
+ pnfs_return_layout(state->inode, &range, RECALL_FILE);
}
#endif /* CONFIG_PNFS */
nfs4_do_close(path, state, wait);
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index d33fcc7..e4ed81f 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -535,23 +535,29 @@ pnfs_free_layout(struct pnfs_layout_type *lo,
}
int
-pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range)
+pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range,
+ enum pnfs_layoutreturn_type type)
{
+ struct nfs4_pnfs_layoutreturn_arg arg;
+ struct nfs4_pnfs_layoutreturn_res res;
+ struct nfs4_pnfs_layoutreturn gdata = {
+ .args = &arg,
+ .res = &res,
+ };
struct pnfs_layout_type *lo;
struct nfs_inode *nfsi = NFS_I(ino);
struct nfs_server *server = NFS_SERVER(ino);
- struct nfs4_pnfs_layoutreturn_arg arg;
int status;
lo = get_lock_current_layout(nfsi);
- dprintk("%s:Begin layout %p\n", __FUNCTION__, lo);
-
if (lo == NULL)
return 0;
+ dprintk("%s:Begin layout %p\n", __FUNCTION__, lo);
+
arg.reclaim = 0;
arg.layout_type = server->pnfs_curr_ld->id;
- arg.return_type = RETURN_FILE;
+ arg.return_type = type;
if (range)
arg.lseg = *range;
else {
@@ -562,44 +568,13 @@ pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range)
arg.inode = ino;
pnfs_free_layout(lo, &arg.lseg);
- put_unlock_current_layout(nfsi, lo);
-
- status = pnfs_return_layout_rpc(server, &arg);
-
- dprintk("%s:Exit status %d\n", __FUNCTION__, status);
- return status;
-}
-
-int
-pnfs_return_layout_rpc(struct nfs_server *server,
- struct nfs4_pnfs_layoutreturn_arg *argp)
-{
- int status;
- struct nfs4_pnfs_layoutreturn_res res;
- struct nfs4_pnfs_layoutreturn gdata = {
- .args = argp,
- .res = &res,
- };
- dprintk("%s:Begin\n", __FUNCTION__);
- /* XXX Need to setup the sequence */
-/*
- status = server->nfs_client->rpc_ops->setup_sequence(
- server->session,
- argp->minorversion_info,
- res.minorversion_info)
- if (status)
- goto out;
-*/
- /* Return layout to server */
+ spin_unlock(&nfsi->lo_lock);
status = server->nfs_client->rpc_ops->pnfs_layoutreturn(&gdata);
+ spin_lock(&nfsi->lo_lock);
-/*
- server->nfs_client->rpc_ops->sequence_done(server->session,
- res.minorversion_info, status);
+ put_unlock_current_layout(nfsi, lo);
-out:
-*/
dprintk("%s:Exit status %d\n", __FUNCTION__, status);
return status;
}
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index db25489..0e0e678 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -20,8 +20,8 @@ int pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx,
size_t count, loff_t pos, enum pnfs_iomode access_type,
struct pnfs_layout_segment **lsegpp);
-int pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range);
-int pnfs_return_layout_rpc(struct nfs_server *server, struct nfs4_pnfs_layoutreturn_arg *argp);
+int pnfs_return_layout(struct inode *, struct nfs4_pnfs_layout_segment *,
+ enum pnfs_layoutreturn_type);
void set_pnfs_layoutdriver(struct super_block *sb, struct nfs_fh *fh, u32 id);
void unmount_pnfs_layoutdriver(struct super_block *sb);
int pnfs_use_read(struct inode *inode, ssize_t count);
--
1.5.0.2
More information about the pNFS
mailing list