SUNRPC: eliminate rpc_call()

Clean-up: replace rpc_call() helper with direct call to rpc_call_sync.

This makes NFSv2 and NFSv3 synchronous calls more computationally
efficient, and reduces stack consumption in functions that used to
invoke rpc_call more than once.

Test plan:
Compile kernel with CONFIG_NFS enabled.  Connectathon on NFS version 2,
version 3, and version 4 mount points.

Signed-off-by: Chuck Lever <cel@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Chuck Lever 2006-03-20 13:44:23 -05:00 committed by Trond Myklebust
parent cc0175c1dc
commit dead28da8e
8 changed files with 237 additions and 95 deletions

View file

@ -35,6 +35,10 @@ nsm_mon_unmon(struct nlm_host *host, u32 proc, struct nsm_res *res)
struct rpc_clnt *clnt; struct rpc_clnt *clnt;
int status; int status;
struct nsm_args args; struct nsm_args args;
struct rpc_message msg = {
.rpc_argp = &args,
.rpc_resp = res,
};
clnt = nsm_create(); clnt = nsm_create();
if (IS_ERR(clnt)) { if (IS_ERR(clnt)) {
@ -49,7 +53,8 @@ nsm_mon_unmon(struct nlm_host *host, u32 proc, struct nsm_res *res)
args.proc = NLMPROC_NSM_NOTIFY; args.proc = NLMPROC_NSM_NOTIFY;
memset(res, 0, sizeof(*res)); memset(res, 0, sizeof(*res));
status = rpc_call(clnt, proc, &args, res, 0); msg.rpc_proc = &clnt->cl_procinfo[proc];
status = rpc_call_sync(clnt, &msg, 0);
if (status < 0) if (status < 0)
printk(KERN_DEBUG "nsm_mon_unmon: rpc failed, status=%d\n", printk(KERN_DEBUG "nsm_mon_unmon: rpc failed, status=%d\n",
status); status);

View file

@ -49,9 +49,12 @@ nfsroot_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh,
struct mnt_fhstatus result = { struct mnt_fhstatus result = {
.fh = fh .fh = fh
}; };
struct rpc_message msg = {
.rpc_argp = path,
.rpc_resp = &result,
};
char hostname[32]; char hostname[32];
int status; int status;
int call;
dprintk("NFS: nfs_mount(%08x:%s)\n", dprintk("NFS: nfs_mount(%08x:%s)\n",
(unsigned)ntohl(addr->sin_addr.s_addr), path); (unsigned)ntohl(addr->sin_addr.s_addr), path);
@ -61,8 +64,12 @@ nfsroot_mount(struct sockaddr_in *addr, char *path, struct nfs_fh *fh,
if (IS_ERR(mnt_clnt)) if (IS_ERR(mnt_clnt))
return PTR_ERR(mnt_clnt); return PTR_ERR(mnt_clnt);
call = (version == NFS_MNT3_VERSION) ? MOUNTPROC3_MNT : MNTPROC_MNT; if (version == NFS_MNT3_VERSION)
status = rpc_call(mnt_clnt, call, path, &result, 0); msg.rpc_proc = &mnt_clnt->cl_procinfo[MOUNTPROC3_MNT];
else
msg.rpc_proc = &mnt_clnt->cl_procinfo[MNTPROC_MNT];
status = rpc_call_sync(mnt_clnt, &msg, 0);
return status < 0? status : (result.status? -EACCES : 0); return status < 0? status : (result.status? -EACCES : 0);
} }

View file

@ -190,6 +190,10 @@ struct posix_acl *nfs3_proc_getacl(struct inode *inode, int type)
struct nfs3_getaclres res = { struct nfs3_getaclres res = {
.fattr = &fattr, .fattr = &fattr,
}; };
struct rpc_message msg = {
.rpc_argp = &args,
.rpc_resp = &res,
};
struct posix_acl *acl; struct posix_acl *acl;
int status, count; int status, count;
@ -218,8 +222,8 @@ struct posix_acl *nfs3_proc_getacl(struct inode *inode, int type)
return NULL; return NULL;
dprintk("NFS call getacl\n"); dprintk("NFS call getacl\n");
status = rpc_call(server->client_acl, ACLPROC3_GETACL, msg.rpc_proc = &server->client_acl->cl_procinfo[ACLPROC3_GETACL];
&args, &res, 0); status = rpc_call_sync(server->client_acl, &msg, 0);
dprintk("NFS reply getacl: %d\n", status); dprintk("NFS reply getacl: %d\n", status);
/* pages may have been allocated at the xdr layer. */ /* pages may have been allocated at the xdr layer. */
@ -286,6 +290,10 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,
.acl_access = acl, .acl_access = acl,
.pages = pages, .pages = pages,
}; };
struct rpc_message msg = {
.rpc_argp = &args,
.rpc_resp = &fattr,
};
int status, count; int status, count;
status = -EOPNOTSUPP; status = -EOPNOTSUPP;
@ -306,8 +314,8 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,
dprintk("NFS call setacl\n"); dprintk("NFS call setacl\n");
nfs_begin_data_update(inode); nfs_begin_data_update(inode);
status = rpc_call(server->client_acl, ACLPROC3_SETACL, msg.rpc_proc = &server->client_acl->cl_procinfo[ACLPROC3_SETACL];
&args, &fattr, 0); status = rpc_call_sync(server->client_acl, &msg, 0);
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ACCESS; NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ACCESS;
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);

View file

@ -43,21 +43,7 @@ nfs3_rpc_wrapper(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
return res; return res;
} }
static inline int #define rpc_call_sync(clnt, msg, flags) nfs3_rpc_wrapper(clnt, msg, flags)
nfs3_rpc_call_wrapper(struct rpc_clnt *clnt, u32 proc, void *argp, void *resp, int flags)
{
struct rpc_message msg = {
.rpc_proc = &clnt->cl_procinfo[proc],
.rpc_argp = argp,
.rpc_resp = resp,
};
return nfs3_rpc_wrapper(clnt, &msg, flags);
}
#define rpc_call(clnt, proc, argp, resp, flags) \
nfs3_rpc_call_wrapper(clnt, proc, argp, resp, flags)
#define rpc_call_sync(clnt, msg, flags) \
nfs3_rpc_wrapper(clnt, msg, flags)
static int static int
nfs3_async_handle_jukebox(struct rpc_task *task, struct inode *inode) nfs3_async_handle_jukebox(struct rpc_task *task, struct inode *inode)
@ -75,14 +61,21 @@ static int
do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle, do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle,
struct nfs_fsinfo *info) struct nfs_fsinfo *info)
{ {
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_FSINFO],
.rpc_argp = fhandle,
.rpc_resp = info,
};
int status; int status;
dprintk("%s: call fsinfo\n", __FUNCTION__); dprintk("%s: call fsinfo\n", __FUNCTION__);
nfs_fattr_init(info->fattr); nfs_fattr_init(info->fattr);
status = rpc_call(client, NFS3PROC_FSINFO, fhandle, info, 0); status = rpc_call_sync(client, &msg, 0);
dprintk("%s: reply fsinfo: %d\n", __FUNCTION__, status); dprintk("%s: reply fsinfo: %d\n", __FUNCTION__, status);
if (!(info->fattr->valid & NFS_ATTR_FATTR)) { if (!(info->fattr->valid & NFS_ATTR_FATTR)) {
status = rpc_call(client, NFS3PROC_GETATTR, fhandle, info->fattr, 0); msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];
msg.rpc_resp = info->fattr;
status = rpc_call_sync(client, &msg, 0);
dprintk("%s: reply getattr: %d\n", __FUNCTION__, status); dprintk("%s: reply getattr: %d\n", __FUNCTION__, status);
} }
return status; return status;
@ -110,12 +103,16 @@ static int
nfs3_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, nfs3_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_fattr *fattr) struct nfs_fattr *fattr)
{ {
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR],
.rpc_argp = fhandle,
.rpc_resp = fattr,
};
int status; int status;
dprintk("NFS call getattr\n"); dprintk("NFS call getattr\n");
nfs_fattr_init(fattr); nfs_fattr_init(fattr);
status = rpc_call(server->client, NFS3PROC_GETATTR, status = rpc_call_sync(server->client, &msg, 0);
fhandle, fattr, 0);
dprintk("NFS reply getattr: %d\n", status); dprintk("NFS reply getattr: %d\n", status);
return status; return status;
} }
@ -129,11 +126,16 @@ nfs3_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
.fh = NFS_FH(inode), .fh = NFS_FH(inode),
.sattr = sattr, .sattr = sattr,
}; };
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_SETATTR],
.rpc_argp = &arg,
.rpc_resp = fattr,
};
int status; int status;
dprintk("NFS call setattr\n"); dprintk("NFS call setattr\n");
nfs_fattr_init(fattr); nfs_fattr_init(fattr);
status = rpc_call(NFS_CLIENT(inode), NFS3PROC_SETATTR, &arg, fattr, 0); status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
if (status == 0) if (status == 0)
nfs_setattr_update_inode(inode, sattr); nfs_setattr_update_inode(inode, sattr);
dprintk("NFS reply setattr: %d\n", status); dprintk("NFS reply setattr: %d\n", status);
@ -155,15 +157,23 @@ nfs3_proc_lookup(struct inode *dir, struct qstr *name,
.fh = fhandle, .fh = fhandle,
.fattr = fattr .fattr = fattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_LOOKUP],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status; int status;
dprintk("NFS call lookup %s\n", name->name); dprintk("NFS call lookup %s\n", name->name);
nfs_fattr_init(&dir_attr); nfs_fattr_init(&dir_attr);
nfs_fattr_init(fattr); nfs_fattr_init(fattr);
status = rpc_call(NFS_CLIENT(dir), NFS3PROC_LOOKUP, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
if (status >= 0 && !(fattr->valid & NFS_ATTR_FATTR)) if (status >= 0 && !(fattr->valid & NFS_ATTR_FATTR)) {
status = rpc_call(NFS_CLIENT(dir), NFS3PROC_GETATTR, msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];
fhandle, fattr, 0); msg.rpc_argp = fhandle;
msg.rpc_resp = fattr;
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
}
dprintk("NFS reply lookup: %d\n", status); dprintk("NFS reply lookup: %d\n", status);
if (status >= 0) if (status >= 0)
status = nfs_refresh_inode(dir, &dir_attr); status = nfs_refresh_inode(dir, &dir_attr);
@ -183,7 +193,7 @@ static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry)
.rpc_proc = &nfs3_procedures[NFS3PROC_ACCESS], .rpc_proc = &nfs3_procedures[NFS3PROC_ACCESS],
.rpc_argp = &arg, .rpc_argp = &arg,
.rpc_resp = &res, .rpc_resp = &res,
.rpc_cred = entry->cred .rpc_cred = entry->cred,
}; };
int mode = entry->mask; int mode = entry->mask;
int status; int status;
@ -229,12 +239,16 @@ static int nfs3_proc_readlink(struct inode *inode, struct page *page,
.pglen = pglen, .pglen = pglen,
.pages = &page .pages = &page
}; };
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_READLINK],
.rpc_argp = &args,
.rpc_resp = &fattr,
};
int status; int status;
dprintk("NFS call readlink\n"); dprintk("NFS call readlink\n");
nfs_fattr_init(&fattr); nfs_fattr_init(&fattr);
status = rpc_call(NFS_CLIENT(inode), NFS3PROC_READLINK, status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
&args, &fattr, 0);
nfs_refresh_inode(inode, &fattr); nfs_refresh_inode(inode, &fattr);
dprintk("NFS reply readlink: %d\n", status); dprintk("NFS reply readlink: %d\n", status);
return status; return status;
@ -330,6 +344,11 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
.fh = &fhandle, .fh = &fhandle,
.fattr = &fattr .fattr = &fattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_CREATE],
.rpc_argp = &arg,
.rpc_resp = &res,
};
mode_t mode = sattr->ia_mode; mode_t mode = sattr->ia_mode;
int status; int status;
@ -346,8 +365,8 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
again: again:
nfs_fattr_init(&dir_attr); nfs_fattr_init(&dir_attr);
nfs_fattr_init(&fattr); nfs_fattr_init(&fattr);
status = rpc_call(NFS_CLIENT(dir), NFS3PROC_CREATE, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_post_op_update_inode(dir, &dir_attr); nfs_refresh_inode(dir, &dir_attr);
/* If the server doesn't support the exclusive creation semantics, /* If the server doesn't support the exclusive creation semantics,
* try again with simple 'guarded' mode. */ * try again with simple 'guarded' mode. */
@ -477,12 +496,17 @@ nfs3_proc_rename(struct inode *old_dir, struct qstr *old_name,
.fromattr = &old_dir_attr, .fromattr = &old_dir_attr,
.toattr = &new_dir_attr .toattr = &new_dir_attr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_RENAME],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status; int status;
dprintk("NFS call rename %s -> %s\n", old_name->name, new_name->name); dprintk("NFS call rename %s -> %s\n", old_name->name, new_name->name);
nfs_fattr_init(&old_dir_attr); nfs_fattr_init(&old_dir_attr);
nfs_fattr_init(&new_dir_attr); nfs_fattr_init(&new_dir_attr);
status = rpc_call(NFS_CLIENT(old_dir), NFS3PROC_RENAME, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(old_dir), &msg, 0);
nfs_post_op_update_inode(old_dir, &old_dir_attr); nfs_post_op_update_inode(old_dir, &old_dir_attr);
nfs_post_op_update_inode(new_dir, &new_dir_attr); nfs_post_op_update_inode(new_dir, &new_dir_attr);
dprintk("NFS reply rename: %d\n", status); dprintk("NFS reply rename: %d\n", status);
@ -503,12 +527,17 @@ nfs3_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
.dir_attr = &dir_attr, .dir_attr = &dir_attr,
.fattr = &fattr .fattr = &fattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_LINK],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status; int status;
dprintk("NFS call link %s\n", name->name); dprintk("NFS call link %s\n", name->name);
nfs_fattr_init(&dir_attr); nfs_fattr_init(&dir_attr);
nfs_fattr_init(&fattr); nfs_fattr_init(&fattr);
status = rpc_call(NFS_CLIENT(inode), NFS3PROC_LINK, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
nfs_post_op_update_inode(dir, &dir_attr); nfs_post_op_update_inode(dir, &dir_attr);
nfs_post_op_update_inode(inode, &fattr); nfs_post_op_update_inode(inode, &fattr);
dprintk("NFS reply link: %d\n", status); dprintk("NFS reply link: %d\n", status);
@ -534,6 +563,11 @@ nfs3_proc_symlink(struct inode *dir, struct qstr *name, struct qstr *path,
.fh = fhandle, .fh = fhandle,
.fattr = fattr .fattr = fattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_SYMLINK],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status; int status;
if (path->len > NFS3_MAXPATHLEN) if (path->len > NFS3_MAXPATHLEN)
@ -541,7 +575,7 @@ nfs3_proc_symlink(struct inode *dir, struct qstr *name, struct qstr *path,
dprintk("NFS call symlink %s -> %s\n", name->name, path->name); dprintk("NFS call symlink %s -> %s\n", name->name, path->name);
nfs_fattr_init(&dir_attr); nfs_fattr_init(&dir_attr);
nfs_fattr_init(fattr); nfs_fattr_init(fattr);
status = rpc_call(NFS_CLIENT(dir), NFS3PROC_SYMLINK, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_post_op_update_inode(dir, &dir_attr); nfs_post_op_update_inode(dir, &dir_attr);
dprintk("NFS reply symlink: %d\n", status); dprintk("NFS reply symlink: %d\n", status);
return status; return status;
@ -563,6 +597,11 @@ nfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr)
.fh = &fhandle, .fh = &fhandle,
.fattr = &fattr .fattr = &fattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_MKDIR],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int mode = sattr->ia_mode; int mode = sattr->ia_mode;
int status; int status;
@ -572,7 +611,7 @@ nfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr)
nfs_fattr_init(&dir_attr); nfs_fattr_init(&dir_attr);
nfs_fattr_init(&fattr); nfs_fattr_init(&fattr);
status = rpc_call(NFS_CLIENT(dir), NFS3PROC_MKDIR, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_post_op_update_inode(dir, &dir_attr); nfs_post_op_update_inode(dir, &dir_attr);
if (status != 0) if (status != 0)
goto out; goto out;
@ -594,11 +633,16 @@ nfs3_proc_rmdir(struct inode *dir, struct qstr *name)
.name = name->name, .name = name->name,
.len = name->len .len = name->len
}; };
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_RMDIR],
.rpc_argp = &arg,
.rpc_resp = &dir_attr,
};
int status; int status;
dprintk("NFS call rmdir %s\n", name->name); dprintk("NFS call rmdir %s\n", name->name);
nfs_fattr_init(&dir_attr); nfs_fattr_init(&dir_attr);
status = rpc_call(NFS_CLIENT(dir), NFS3PROC_RMDIR, &arg, &dir_attr, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_post_op_update_inode(dir, &dir_attr); nfs_post_op_update_inode(dir, &dir_attr);
dprintk("NFS reply rmdir: %d\n", status); dprintk("NFS reply rmdir: %d\n", status);
return status; return status;
@ -675,6 +719,11 @@ nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
.fh = &fh, .fh = &fh,
.fattr = &fattr .fattr = &fattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_MKNOD],
.rpc_argp = &arg,
.rpc_resp = &res,
};
mode_t mode = sattr->ia_mode; mode_t mode = sattr->ia_mode;
int status; int status;
@ -693,7 +742,7 @@ nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
nfs_fattr_init(&dir_attr); nfs_fattr_init(&dir_attr);
nfs_fattr_init(&fattr); nfs_fattr_init(&fattr);
status = rpc_call(NFS_CLIENT(dir), NFS3PROC_MKNOD, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_post_op_update_inode(dir, &dir_attr); nfs_post_op_update_inode(dir, &dir_attr);
if (status != 0) if (status != 0)
goto out; goto out;
@ -710,11 +759,16 @@ static int
nfs3_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, nfs3_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_fsstat *stat) struct nfs_fsstat *stat)
{ {
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_FSSTAT],
.rpc_argp = fhandle,
.rpc_resp = stat,
};
int status; int status;
dprintk("NFS call fsstat\n"); dprintk("NFS call fsstat\n");
nfs_fattr_init(stat->fattr); nfs_fattr_init(stat->fattr);
status = rpc_call(server->client, NFS3PROC_FSSTAT, fhandle, stat, 0); status = rpc_call_sync(server->client, &msg, 0);
dprintk("NFS reply statfs: %d\n", status); dprintk("NFS reply statfs: %d\n", status);
return status; return status;
} }
@ -723,11 +777,16 @@ static int
nfs3_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, nfs3_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_fsinfo *info) struct nfs_fsinfo *info)
{ {
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_FSINFO],
.rpc_argp = fhandle,
.rpc_resp = info,
};
int status; int status;
dprintk("NFS call fsinfo\n"); dprintk("NFS call fsinfo\n");
nfs_fattr_init(info->fattr); nfs_fattr_init(info->fattr);
status = rpc_call(server->client_sys, NFS3PROC_FSINFO, fhandle, info, 0); status = rpc_call_sync(server->client_sys, &msg, 0);
dprintk("NFS reply fsinfo: %d\n", status); dprintk("NFS reply fsinfo: %d\n", status);
return status; return status;
} }
@ -736,11 +795,16 @@ static int
nfs3_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle, nfs3_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_pathconf *info) struct nfs_pathconf *info)
{ {
struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_PATHCONF],
.rpc_argp = fhandle,
.rpc_resp = info,
};
int status; int status;
dprintk("NFS call pathconf\n"); dprintk("NFS call pathconf\n");
nfs_fattr_init(info->fattr); nfs_fattr_init(info->fattr);
status = rpc_call(server->client, NFS3PROC_PATHCONF, fhandle, info, 0); status = rpc_call_sync(server->client, &msg, 0);
dprintk("NFS reply pathconf: %d\n", status); dprintk("NFS reply pathconf: %d\n", status);
return status; return status;
} }

View file

@ -58,16 +58,23 @@ nfs_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
{ {
struct nfs_fattr *fattr = info->fattr; struct nfs_fattr *fattr = info->fattr;
struct nfs2_fsstat fsinfo; struct nfs2_fsstat fsinfo;
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_GETATTR],
.rpc_argp = fhandle,
.rpc_resp = fattr,
};
int status; int status;
dprintk("%s: call getattr\n", __FUNCTION__); dprintk("%s: call getattr\n", __FUNCTION__);
nfs_fattr_init(fattr); nfs_fattr_init(fattr);
status = rpc_call(server->client_sys, NFSPROC_GETATTR, fhandle, fattr, 0); status = rpc_call_sync(server->client_sys, &msg, 0);
dprintk("%s: reply getattr: %d\n", __FUNCTION__, status); dprintk("%s: reply getattr: %d\n", __FUNCTION__, status);
if (status) if (status)
return status; return status;
dprintk("%s: call statfs\n", __FUNCTION__); dprintk("%s: call statfs\n", __FUNCTION__);
status = rpc_call(server->client_sys, NFSPROC_STATFS, fhandle, &fsinfo, 0); msg.rpc_proc = &nfs_procedures[NFSPROC_STATFS];
msg.rpc_resp = &fsinfo;
status = rpc_call_sync(server->client_sys, &msg, 0);
dprintk("%s: reply statfs: %d\n", __FUNCTION__, status); dprintk("%s: reply statfs: %d\n", __FUNCTION__, status);
if (status) if (status)
return status; return status;
@ -90,12 +97,16 @@ static int
nfs_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, nfs_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_fattr *fattr) struct nfs_fattr *fattr)
{ {
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_GETATTR],
.rpc_argp = fhandle,
.rpc_resp = fattr,
};
int status; int status;
dprintk("NFS call getattr\n"); dprintk("NFS call getattr\n");
nfs_fattr_init(fattr); nfs_fattr_init(fattr);
status = rpc_call(server->client, NFSPROC_GETATTR, status = rpc_call_sync(server->client, &msg, 0);
fhandle, fattr, 0);
dprintk("NFS reply getattr: %d\n", status); dprintk("NFS reply getattr: %d\n", status);
return status; return status;
} }
@ -109,6 +120,11 @@ nfs_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
.fh = NFS_FH(inode), .fh = NFS_FH(inode),
.sattr = sattr .sattr = sattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_SETATTR],
.rpc_argp = &arg,
.rpc_resp = fattr,
};
int status; int status;
/* Mask out the non-modebit related stuff from attr->ia_mode */ /* Mask out the non-modebit related stuff from attr->ia_mode */
@ -116,7 +132,7 @@ nfs_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
dprintk("NFS call setattr\n"); dprintk("NFS call setattr\n");
nfs_fattr_init(fattr); nfs_fattr_init(fattr);
status = rpc_call(NFS_CLIENT(inode), NFSPROC_SETATTR, &arg, fattr, 0); status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
if (status == 0) if (status == 0)
nfs_setattr_update_inode(inode, sattr); nfs_setattr_update_inode(inode, sattr);
dprintk("NFS reply setattr: %d\n", status); dprintk("NFS reply setattr: %d\n", status);
@ -136,11 +152,16 @@ nfs_proc_lookup(struct inode *dir, struct qstr *name,
.fh = fhandle, .fh = fhandle,
.fattr = fattr .fattr = fattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_LOOKUP],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status; int status;
dprintk("NFS call lookup %s\n", name->name); dprintk("NFS call lookup %s\n", name->name);
nfs_fattr_init(fattr); nfs_fattr_init(fattr);
status = rpc_call(NFS_CLIENT(dir), NFSPROC_LOOKUP, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
dprintk("NFS reply lookup: %d\n", status); dprintk("NFS reply lookup: %d\n", status);
return status; return status;
} }
@ -154,10 +175,14 @@ static int nfs_proc_readlink(struct inode *inode, struct page *page,
.pglen = pglen, .pglen = pglen,
.pages = &page .pages = &page
}; };
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_READLINK],
.rpc_argp = &args,
};
int status; int status;
dprintk("NFS call readlink\n"); dprintk("NFS call readlink\n");
status = rpc_call(NFS_CLIENT(inode), NFSPROC_READLINK, &args, NULL, 0); status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
dprintk("NFS reply readlink: %d\n", status); dprintk("NFS reply readlink: %d\n", status);
return status; return status;
} }
@ -233,11 +258,16 @@ nfs_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
.fh = &fhandle, .fh = &fhandle,
.fattr = &fattr .fattr = &fattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_CREATE],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status; int status;
nfs_fattr_init(&fattr); nfs_fattr_init(&fattr);
dprintk("NFS call create %s\n", dentry->d_name.name); dprintk("NFS call create %s\n", dentry->d_name.name);
status = rpc_call(NFS_CLIENT(dir), NFSPROC_CREATE, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
if (status == 0) if (status == 0)
status = nfs_instantiate(dentry, &fhandle, &fattr); status = nfs_instantiate(dentry, &fhandle, &fattr);
dprintk("NFS reply create: %d\n", status); dprintk("NFS reply create: %d\n", status);
@ -263,6 +293,11 @@ nfs_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
.fh = &fhandle, .fh = &fhandle,
.fattr = &fattr .fattr = &fattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_CREATE],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status, mode; int status, mode;
dprintk("NFS call mknod %s\n", dentry->d_name.name); dprintk("NFS call mknod %s\n", dentry->d_name.name);
@ -277,13 +312,13 @@ nfs_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
} }
nfs_fattr_init(&fattr); nfs_fattr_init(&fattr);
status = rpc_call(NFS_CLIENT(dir), NFSPROC_CREATE, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_mark_for_revalidate(dir); nfs_mark_for_revalidate(dir);
if (status == -EINVAL && S_ISFIFO(mode)) { if (status == -EINVAL && S_ISFIFO(mode)) {
sattr->ia_mode = mode; sattr->ia_mode = mode;
nfs_fattr_init(&fattr); nfs_fattr_init(&fattr);
status = rpc_call(NFS_CLIENT(dir), NFSPROC_CREATE, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
} }
if (status == 0) if (status == 0)
status = nfs_instantiate(dentry, &fhandle, &fattr); status = nfs_instantiate(dentry, &fhandle, &fattr);
@ -302,8 +337,6 @@ nfs_proc_remove(struct inode *dir, struct qstr *name)
struct rpc_message msg = { struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_REMOVE], .rpc_proc = &nfs_procedures[NFSPROC_REMOVE],
.rpc_argp = &arg, .rpc_argp = &arg,
.rpc_resp = NULL,
.rpc_cred = NULL
}; };
int status; int status;
@ -355,10 +388,14 @@ nfs_proc_rename(struct inode *old_dir, struct qstr *old_name,
.toname = new_name->name, .toname = new_name->name,
.tolen = new_name->len .tolen = new_name->len
}; };
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_RENAME],
.rpc_argp = &arg,
};
int status; int status;
dprintk("NFS call rename %s -> %s\n", old_name->name, new_name->name); dprintk("NFS call rename %s -> %s\n", old_name->name, new_name->name);
status = rpc_call(NFS_CLIENT(old_dir), NFSPROC_RENAME, &arg, NULL, 0); status = rpc_call_sync(NFS_CLIENT(old_dir), &msg, 0);
nfs_mark_for_revalidate(old_dir); nfs_mark_for_revalidate(old_dir);
nfs_mark_for_revalidate(new_dir); nfs_mark_for_revalidate(new_dir);
dprintk("NFS reply rename: %d\n", status); dprintk("NFS reply rename: %d\n", status);
@ -374,10 +411,14 @@ nfs_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
.toname = name->name, .toname = name->name,
.tolen = name->len .tolen = name->len
}; };
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_LINK],
.rpc_argp = &arg,
};
int status; int status;
dprintk("NFS call link %s\n", name->name); dprintk("NFS call link %s\n", name->name);
status = rpc_call(NFS_CLIENT(inode), NFSPROC_LINK, &arg, NULL, 0); status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
nfs_mark_for_revalidate(inode); nfs_mark_for_revalidate(inode);
nfs_mark_for_revalidate(dir); nfs_mark_for_revalidate(dir);
dprintk("NFS reply link: %d\n", status); dprintk("NFS reply link: %d\n", status);
@ -397,6 +438,10 @@ nfs_proc_symlink(struct inode *dir, struct qstr *name, struct qstr *path,
.tolen = path->len, .tolen = path->len,
.sattr = sattr .sattr = sattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_SYMLINK],
.rpc_argp = &arg,
};
int status; int status;
if (path->len > NFS2_MAXPATHLEN) if (path->len > NFS2_MAXPATHLEN)
@ -404,7 +449,7 @@ nfs_proc_symlink(struct inode *dir, struct qstr *name, struct qstr *path,
dprintk("NFS call symlink %s -> %s\n", name->name, path->name); dprintk("NFS call symlink %s -> %s\n", name->name, path->name);
nfs_fattr_init(fattr); nfs_fattr_init(fattr);
fhandle->size = 0; fhandle->size = 0;
status = rpc_call(NFS_CLIENT(dir), NFSPROC_SYMLINK, &arg, NULL, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_mark_for_revalidate(dir); nfs_mark_for_revalidate(dir);
dprintk("NFS reply symlink: %d\n", status); dprintk("NFS reply symlink: %d\n", status);
return status; return status;
@ -425,11 +470,16 @@ nfs_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr)
.fh = &fhandle, .fh = &fhandle,
.fattr = &fattr .fattr = &fattr
}; };
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_MKDIR],
.rpc_argp = &arg,
.rpc_resp = &res,
};
int status; int status;
dprintk("NFS call mkdir %s\n", dentry->d_name.name); dprintk("NFS call mkdir %s\n", dentry->d_name.name);
nfs_fattr_init(&fattr); nfs_fattr_init(&fattr);
status = rpc_call(NFS_CLIENT(dir), NFSPROC_MKDIR, &arg, &res, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_mark_for_revalidate(dir); nfs_mark_for_revalidate(dir);
if (status == 0) if (status == 0)
status = nfs_instantiate(dentry, &fhandle, &fattr); status = nfs_instantiate(dentry, &fhandle, &fattr);
@ -445,10 +495,14 @@ nfs_proc_rmdir(struct inode *dir, struct qstr *name)
.name = name->name, .name = name->name,
.len = name->len .len = name->len
}; };
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_RMDIR],
.rpc_argp = &arg,
};
int status; int status;
dprintk("NFS call rmdir %s\n", name->name); dprintk("NFS call rmdir %s\n", name->name);
status = rpc_call(NFS_CLIENT(dir), NFSPROC_RMDIR, &arg, NULL, 0); status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
nfs_mark_for_revalidate(dir); nfs_mark_for_revalidate(dir);
dprintk("NFS reply rmdir: %d\n", status); dprintk("NFS reply rmdir: %d\n", status);
return status; return status;
@ -470,13 +524,12 @@ nfs_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
.fh = NFS_FH(dir), .fh = NFS_FH(dir),
.cookie = cookie, .cookie = cookie,
.count = count, .count = count,
.pages = &page .pages = &page,
}; };
struct rpc_message msg = { struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_READDIR], .rpc_proc = &nfs_procedures[NFSPROC_READDIR],
.rpc_argp = &arg, .rpc_argp = &arg,
.rpc_resp = NULL, .rpc_cred = cred,
.rpc_cred = cred
}; };
int status; int status;
@ -495,11 +548,16 @@ nfs_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_fsstat *stat) struct nfs_fsstat *stat)
{ {
struct nfs2_fsstat fsinfo; struct nfs2_fsstat fsinfo;
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_STATFS],
.rpc_argp = fhandle,
.rpc_resp = &fsinfo,
};
int status; int status;
dprintk("NFS call statfs\n"); dprintk("NFS call statfs\n");
nfs_fattr_init(stat->fattr); nfs_fattr_init(stat->fattr);
status = rpc_call(server->client, NFSPROC_STATFS, fhandle, &fsinfo, 0); status = rpc_call_sync(server->client, &msg, 0);
dprintk("NFS reply statfs: %d\n", status); dprintk("NFS reply statfs: %d\n", status);
if (status) if (status)
goto out; goto out;
@ -518,11 +576,16 @@ nfs_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
struct nfs_fsinfo *info) struct nfs_fsinfo *info)
{ {
struct nfs2_fsstat fsinfo; struct nfs2_fsstat fsinfo;
struct rpc_message msg = {
.rpc_proc = &nfs_procedures[NFSPROC_STATFS],
.rpc_argp = fhandle,
.rpc_resp = &fsinfo,
};
int status; int status;
dprintk("NFS call fsinfo\n"); dprintk("NFS call fsinfo\n");
nfs_fattr_init(info->fattr); nfs_fattr_init(info->fattr);
status = rpc_call(server->client, NFSPROC_STATFS, fhandle, &fsinfo, 0); status = rpc_call_sync(server->client, &msg, 0);
dprintk("NFS reply fsinfo: %d\n", status); dprintk("NFS reply fsinfo: %d\n", status);
if (status) if (status)
goto out; goto out;

View file

@ -140,20 +140,6 @@ size_t rpc_max_payload(struct rpc_clnt *);
void rpc_force_rebind(struct rpc_clnt *); void rpc_force_rebind(struct rpc_clnt *);
int rpc_ping(struct rpc_clnt *clnt, int flags); int rpc_ping(struct rpc_clnt *clnt, int flags);
static __inline__
int rpc_call(struct rpc_clnt *clnt, u32 proc, void *argp, void *resp, int flags)
{
struct rpc_message msg = {
.rpc_proc = &clnt->cl_procinfo[proc],
.rpc_argp = argp,
.rpc_resp = resp,
.rpc_cred = NULL
};
return rpc_call_sync(clnt, &msg, flags);
}
extern void rpciod_wake_up(void);
/* /*
* Helper function for NFSroot support * Helper function for NFSroot support
*/ */

View file

@ -276,7 +276,6 @@ void * rpc_malloc(struct rpc_task *, size_t);
void rpc_free(struct rpc_task *); void rpc_free(struct rpc_task *);
int rpciod_up(void); int rpciod_up(void);
void rpciod_down(void); void rpciod_down(void);
void rpciod_wake_up(void);
int __rpc_wait_for_completion_task(struct rpc_task *task, int (*)(void *)); int __rpc_wait_for_completion_task(struct rpc_task *task, int (*)(void *));
#ifdef RPC_DEBUG #ifdef RPC_DEBUG
void rpc_show_tasks(void); void rpc_show_tasks(void);

View file

@ -104,6 +104,11 @@ rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot)
.pm_prot = prot, .pm_prot = prot,
.pm_port = 0 .pm_port = 0
}; };
struct rpc_message msg = {
.rpc_proc = &pmap_procedures[PMAP_GETPORT],
.rpc_argp = &map,
.rpc_resp = &map.pm_port,
};
struct rpc_clnt *pmap_clnt; struct rpc_clnt *pmap_clnt;
char hostname[32]; char hostname[32];
int status; int status;
@ -117,7 +122,7 @@ rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int prot)
return PTR_ERR(pmap_clnt); return PTR_ERR(pmap_clnt);
/* Setup the call info struct */ /* Setup the call info struct */
status = rpc_call(pmap_clnt, PMAP_GETPORT, &map, &map.pm_port, 0); status = rpc_call_sync(pmap_clnt, &msg, 0);
if (status >= 0) { if (status >= 0) {
if (map.pm_port != 0) if (map.pm_port != 0)
@ -162,16 +167,27 @@ pmap_getport_done(struct rpc_task *task)
int int
rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay) rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
{ {
struct sockaddr_in sin; struct sockaddr_in sin = {
struct rpc_portmap map; .sin_family = AF_INET,
.sin_addr.s_addr = htonl(INADDR_LOOPBACK),
};
struct rpc_portmap map = {
.pm_prog = prog,
.pm_vers = vers,
.pm_prot = prot,
.pm_port = port,
};
struct rpc_message msg = {
.rpc_proc = &pmap_procedures[port ? PMAP_SET : PMAP_UNSET],
.rpc_argp = &map,
.rpc_resp = okay,
};
struct rpc_clnt *pmap_clnt; struct rpc_clnt *pmap_clnt;
int error = 0; int error = 0;
dprintk("RPC: registering (%d, %d, %d, %d) with portmapper.\n", dprintk("RPC: registering (%d, %d, %d, %d) with portmapper.\n",
prog, vers, prot, port); prog, vers, prot, port);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
pmap_clnt = pmap_create("localhost", &sin, IPPROTO_UDP, 1); pmap_clnt = pmap_create("localhost", &sin, IPPROTO_UDP, 1);
if (IS_ERR(pmap_clnt)) { if (IS_ERR(pmap_clnt)) {
error = PTR_ERR(pmap_clnt); error = PTR_ERR(pmap_clnt);
@ -179,13 +195,7 @@ rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
return error; return error;
} }
map.pm_prog = prog; error = rpc_call_sync(pmap_clnt, &msg, 0);
map.pm_vers = vers;
map.pm_prot = prot;
map.pm_port = port;
error = rpc_call(pmap_clnt, port? PMAP_SET : PMAP_UNSET,
&map, okay, 0);
if (error < 0) { if (error < 0) {
printk(KERN_WARNING printk(KERN_WARNING