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>
        struct rpc_clnt *clnt;
        int             status;
        struct nsm_args args;
+       struct rpc_message msg = {
+               .rpc_argp       = &args,
+               .rpc_resp       = res,
+       };
 
        clnt = nsm_create();
        if (IS_ERR(clnt)) {
        args.proc = NLMPROC_NSM_NOTIFY;
        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)
                printk(KERN_DEBUG "nsm_mon_unmon: rpc failed, status=%d\n",
                        status);
 
        struct mnt_fhstatus     result = {
                .fh             = fh
        };
+       struct rpc_message msg  = {
+               .rpc_argp       = path,
+               .rpc_resp       = &result,
+       };
        char                    hostname[32];
        int                     status;
-       int                     call;
 
        dprintk("NFS:      nfs_mount(%08x:%s)\n",
                        (unsigned)ntohl(addr->sin_addr.s_addr), path);
        if (IS_ERR(mnt_clnt))
                return PTR_ERR(mnt_clnt);
 
-       call = (version == NFS_MNT3_VERSION) ? MOUNTPROC3_MNT : MNTPROC_MNT;
-       status = rpc_call(mnt_clnt, call, path, &result, 0);
+       if (version == NFS_MNT3_VERSION)
+               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);
 }
 
 
        struct nfs3_getaclres res = {
                .fattr =        &fattr,
        };
+       struct rpc_message msg = {
+               .rpc_argp       = &args,
+               .rpc_resp       = &res,
+       };
        struct posix_acl *acl;
        int status, count;
 
                return NULL;
 
        dprintk("NFS call getacl\n");
-       status = rpc_call(server->client_acl, ACLPROC3_GETACL,
-                         &args, &res, 0);
+       msg.rpc_proc = &server->client_acl->cl_procinfo[ACLPROC3_GETACL];
+       status = rpc_call_sync(server->client_acl, &msg, 0);
        dprintk("NFS reply getacl: %d\n", status);
 
        /* pages may have been allocated at the xdr layer. */
                .acl_access = acl,
                .pages = pages,
        };
+       struct rpc_message msg = {
+               .rpc_argp       = &args,
+               .rpc_resp       = &fattr,
+       };
        int status, count;
 
        status = -EOPNOTSUPP;
 
        dprintk("NFS call setacl\n");
        nfs_begin_data_update(inode);
-       status = rpc_call(server->client_acl, ACLPROC3_SETACL,
-                         &args, &fattr, 0);
+       msg.rpc_proc = &server->client_acl->cl_procinfo[ACLPROC3_SETACL];
+       status = rpc_call_sync(server->client_acl, &msg, 0);
        spin_lock(&inode->i_lock);
        NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ACCESS;
        spin_unlock(&inode->i_lock);
 
        return res;
 }
 
-static inline int
-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)
+#define rpc_call_sync(clnt, msg, flags)        nfs3_rpc_wrapper(clnt, msg, flags)
 
 static int
 nfs3_async_handle_jukebox(struct rpc_task *task, struct inode *inode)
 do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle,
                 struct nfs_fsinfo *info)
 {
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_FSINFO],
+               .rpc_argp       = fhandle,
+               .rpc_resp       = info,
+       };
        int     status;
 
        dprintk("%s: call  fsinfo\n", __FUNCTION__);
        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);
        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);
        }
        return status;
 nfs3_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
                struct nfs_fattr *fattr)
 {
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_GETATTR],
+               .rpc_argp       = fhandle,
+               .rpc_resp       = fattr,
+       };
        int     status;
 
        dprintk("NFS call  getattr\n");
        nfs_fattr_init(fattr);
-       status = rpc_call(server->client, NFS3PROC_GETATTR,
-                         fhandle, fattr, 0);
+       status = rpc_call_sync(server->client, &msg, 0);
        dprintk("NFS reply getattr: %d\n", status);
        return status;
 }
                .fh             = NFS_FH(inode),
                .sattr          = sattr,
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_SETATTR],
+               .rpc_argp       = &arg,
+               .rpc_resp       = fattr,
+       };
        int     status;
 
        dprintk("NFS call  setattr\n");
        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)
                nfs_setattr_update_inode(inode, sattr);
        dprintk("NFS reply setattr: %d\n", status);
                .fh             = fhandle,
                .fattr          = fattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_LOOKUP],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        int                     status;
 
        dprintk("NFS call  lookup %s\n", name->name);
        nfs_fattr_init(&dir_attr);
        nfs_fattr_init(fattr);
-       status = rpc_call(NFS_CLIENT(dir), NFS3PROC_LOOKUP, &arg, &res, 0);
-       if (status >= 0 && !(fattr->valid & NFS_ATTR_FATTR))
-               status = rpc_call(NFS_CLIENT(dir), NFS3PROC_GETATTR,
-                        fhandle, fattr, 0);
+       status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
+       if (status >= 0 && !(fattr->valid & NFS_ATTR_FATTR)) {
+               msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];
+               msg.rpc_argp = fhandle;
+               msg.rpc_resp = fattr;
+               status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
+       }
        dprintk("NFS reply lookup: %d\n", status);
        if (status >= 0)
                status = nfs_refresh_inode(dir, &dir_attr);
                .rpc_proc       = &nfs3_procedures[NFS3PROC_ACCESS],
                .rpc_argp       = &arg,
                .rpc_resp       = &res,
-               .rpc_cred       = entry->cred
+               .rpc_cred       = entry->cred,
        };
        int mode = entry->mask;
        int status;
                .pglen          = pglen,
                .pages          = &page
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_READLINK],
+               .rpc_argp       = &args,
+               .rpc_resp       = &fattr,
+       };
        int                     status;
 
        dprintk("NFS call  readlink\n");
        nfs_fattr_init(&fattr);
-       status = rpc_call(NFS_CLIENT(inode), NFS3PROC_READLINK,
-                         &args, &fattr, 0);
+       status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
        nfs_refresh_inode(inode, &fattr);
        dprintk("NFS reply readlink: %d\n", status);
        return status;
                .fh             = &fhandle,
                .fattr          = &fattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_CREATE],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        mode_t mode = sattr->ia_mode;
        int status;
 
 again:
        nfs_fattr_init(&dir_attr);
        nfs_fattr_init(&fattr);
-       status = rpc_call(NFS_CLIENT(dir), NFS3PROC_CREATE, &arg, &res, 0);
-       nfs_post_op_update_inode(dir, &dir_attr);
+       status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
+       nfs_refresh_inode(dir, &dir_attr);
 
        /* If the server doesn't support the exclusive creation semantics,
         * try again with simple 'guarded' mode. */
                .fromattr       = &old_dir_attr,
                .toattr         = &new_dir_attr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_RENAME],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        int                     status;
 
        dprintk("NFS call  rename %s -> %s\n", old_name->name, new_name->name);
        nfs_fattr_init(&old_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(new_dir, &new_dir_attr);
        dprintk("NFS reply rename: %d\n", status);
                .dir_attr       = &dir_attr,
                .fattr          = &fattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_LINK],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        int                     status;
 
        dprintk("NFS call  link %s\n", name->name);
        nfs_fattr_init(&dir_attr);
        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(inode, &fattr);
        dprintk("NFS reply link: %d\n", status);
                .fh             = fhandle,
                .fattr          = fattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_SYMLINK],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        int                     status;
 
        if (path->len > NFS3_MAXPATHLEN)
        dprintk("NFS call  symlink %s -> %s\n", name->name, path->name);
        nfs_fattr_init(&dir_attr);
        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);
        dprintk("NFS reply symlink: %d\n", status);
        return status;
                .fh             = &fhandle,
                .fattr          = &fattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_MKDIR],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        int mode = sattr->ia_mode;
        int status;
 
 
        nfs_fattr_init(&dir_attr);
        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);
        if (status != 0)
                goto out;
                .name           = name->name,
                .len            = name->len
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_RMDIR],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &dir_attr,
+       };
        int                     status;
 
        dprintk("NFS call  rmdir %s\n", name->name);
        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);
        dprintk("NFS reply rmdir: %d\n", status);
        return status;
                .fh             = &fh,
                .fattr          = &fattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_MKNOD],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        mode_t mode = sattr->ia_mode;
        int status;
 
 
        nfs_fattr_init(&dir_attr);
        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);
        if (status != 0)
                goto out;
 nfs3_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
                 struct nfs_fsstat *stat)
 {
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_FSSTAT],
+               .rpc_argp       = fhandle,
+               .rpc_resp       = stat,
+       };
        int     status;
 
        dprintk("NFS call  fsstat\n");
        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);
        return status;
 }
 nfs3_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
                 struct nfs_fsinfo *info)
 {
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_FSINFO],
+               .rpc_argp       = fhandle,
+               .rpc_resp       = info,
+       };
        int     status;
 
        dprintk("NFS call  fsinfo\n");
        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);
        return status;
 }
 nfs3_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
                   struct nfs_pathconf *info)
 {
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs3_procedures[NFS3PROC_PATHCONF],
+               .rpc_argp       = fhandle,
+               .rpc_resp       = info,
+       };
        int     status;
 
        dprintk("NFS call  pathconf\n");
        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);
        return status;
 }
 
 {
        struct nfs_fattr *fattr = info->fattr;
        struct nfs2_fsstat fsinfo;
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_GETATTR],
+               .rpc_argp       = fhandle,
+               .rpc_resp       = fattr,
+       };
        int status;
 
        dprintk("%s: call getattr\n", __FUNCTION__);
        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);
        if (status)
                return status;
        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);
        if (status)
                return status;
 nfs_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
                struct nfs_fattr *fattr)
 {
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_GETATTR],
+               .rpc_argp       = fhandle,
+               .rpc_resp       = fattr,
+       };
        int     status;
 
        dprintk("NFS call  getattr\n");
        nfs_fattr_init(fattr);
-       status = rpc_call(server->client, NFSPROC_GETATTR,
-                               fhandle, fattr, 0);
+       status = rpc_call_sync(server->client, &msg, 0);
        dprintk("NFS reply getattr: %d\n", status);
        return status;
 }
                .fh     = NFS_FH(inode),
                .sattr  = sattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_SETATTR],
+               .rpc_argp       = &arg,
+               .rpc_resp       = fattr,
+       };
        int     status;
 
        /* Mask out the non-modebit related stuff from attr->ia_mode */
 
        dprintk("NFS call  setattr\n");
        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)
                nfs_setattr_update_inode(inode, sattr);
        dprintk("NFS reply setattr: %d\n", status);
                .fh             = fhandle,
                .fattr          = fattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_LOOKUP],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        int                     status;
 
        dprintk("NFS call  lookup %s\n", name->name);
        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);
        return status;
 }
                .pglen          = pglen,
                .pages          = &page
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_READLINK],
+               .rpc_argp       = &args,
+       };
        int                     status;
 
        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);
        return status;
 }
                .fh             = &fhandle,
                .fattr          = &fattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_CREATE],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        int                     status;
 
        nfs_fattr_init(&fattr);
        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)
                status = nfs_instantiate(dentry, &fhandle, &fattr);
        dprintk("NFS reply create: %d\n", status);
                .fh             = &fhandle,
                .fattr          = &fattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_CREATE],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        int status, mode;
 
        dprintk("NFS call  mknod %s\n", dentry->d_name.name);
        }
 
        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);
 
        if (status == -EINVAL && S_ISFIFO(mode)) {
                sattr->ia_mode = mode;
                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)
                status = nfs_instantiate(dentry, &fhandle, &fattr);
        struct rpc_message      msg = { 
                .rpc_proc       = &nfs_procedures[NFSPROC_REMOVE],
                .rpc_argp       = &arg,
-               .rpc_resp       = NULL,
-               .rpc_cred       = NULL
        };
        int                     status;
 
                .toname         = new_name->name,
                .tolen          = new_name->len
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_RENAME],
+               .rpc_argp       = &arg,
+       };
        int                     status;
 
        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(new_dir);
        dprintk("NFS reply rename: %d\n", status);
                .toname         = name->name,
                .tolen          = name->len
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_LINK],
+               .rpc_argp       = &arg,
+       };
        int                     status;
 
        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(dir);
        dprintk("NFS reply link: %d\n", status);
                .tolen          = path->len,
                .sattr          = sattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_SYMLINK],
+               .rpc_argp       = &arg,
+       };
        int                     status;
 
        if (path->len > NFS2_MAXPATHLEN)
        dprintk("NFS call  symlink %s -> %s\n", name->name, path->name);
        nfs_fattr_init(fattr);
        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);
        dprintk("NFS reply symlink: %d\n", status);
        return status;
                .fh             = &fhandle,
                .fattr          = &fattr
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_MKDIR],
+               .rpc_argp       = &arg,
+               .rpc_resp       = &res,
+       };
        int                     status;
 
        dprintk("NFS call  mkdir %s\n", dentry->d_name.name);
        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);
        if (status == 0)
                status = nfs_instantiate(dentry, &fhandle, &fattr);
                .name           = name->name,
                .len            = name->len
        };
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_RMDIR],
+               .rpc_argp       = &arg,
+       };
        int                     status;
 
        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);
        dprintk("NFS reply rmdir: %d\n", status);
        return status;
                .fh             = NFS_FH(dir),
                .cookie         = cookie,
                .count          = count,
-               .pages          = &page
+               .pages          = &page,
        };
        struct rpc_message      msg = {
                .rpc_proc       = &nfs_procedures[NFSPROC_READDIR],
                .rpc_argp       = &arg,
-               .rpc_resp       = NULL,
-               .rpc_cred       = cred
+               .rpc_cred       = cred,
        };
        int                     status;
 
                        struct nfs_fsstat *stat)
 {
        struct nfs2_fsstat fsinfo;
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_STATFS],
+               .rpc_argp       = fhandle,
+               .rpc_resp       = &fsinfo,
+       };
        int     status;
 
        dprintk("NFS call  statfs\n");
        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);
        if (status)
                goto out;
                        struct nfs_fsinfo *info)
 {
        struct nfs2_fsstat fsinfo;
+       struct rpc_message msg = {
+               .rpc_proc       = &nfs_procedures[NFSPROC_STATFS],
+               .rpc_argp       = fhandle,
+               .rpc_resp       = &fsinfo,
+       };
        int     status;
 
        dprintk("NFS call  fsinfo\n");
        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);
        if (status)
                goto out;
 
 void           rpc_force_rebind(struct rpc_clnt *);
 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
  */
 
 void           rpc_free(struct rpc_task *);
 int            rpciod_up(void);
 void           rpciod_down(void);
-void           rpciod_wake_up(void);
 int            __rpc_wait_for_completion_task(struct rpc_task *task, int (*)(void *));
 #ifdef RPC_DEBUG
 void           rpc_show_tasks(void);
 
                .pm_prot        = prot,
                .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;
        char            hostname[32];
        int             status;
                return PTR_ERR(pmap_clnt);
 
        /* 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 (map.pm_port != 0)
 int
 rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
 {
-       struct sockaddr_in      sin;
-       struct rpc_portmap      map;
+       struct sockaddr_in      sin = {
+               .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;
        int error = 0;
 
        dprintk("RPC: registering (%d, %d, %d, %d) with portmapper.\n",
                        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);
        if (IS_ERR(pmap_clnt)) {
                error = PTR_ERR(pmap_clnt);
                return error;
        }
 
-       map.pm_prog = prog;
-       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);
+       error = rpc_call_sync(pmap_clnt, &msg, 0);
 
        if (error < 0) {
                printk(KERN_WARNING