|
|
|
@ -71,7 +71,9 @@ static int _nfs4_proc_open(struct nfs4_opendata *data);
|
|
|
|
|
static int _nfs4_recover_proc_open(struct nfs4_opendata *data);
|
|
|
|
|
static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
|
|
|
|
|
static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *, struct nfs4_state *);
|
|
|
|
|
static int _nfs4_proc_lookup(struct inode *dir, const struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr);
|
|
|
|
|
static int _nfs4_proc_lookup(struct rpc_clnt *client, struct inode *dir,
|
|
|
|
|
const struct qstr *name, struct nfs_fh *fhandle,
|
|
|
|
|
struct nfs_fattr *fattr);
|
|
|
|
|
static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr);
|
|
|
|
|
static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
|
|
|
|
|
struct nfs_fattr *fattr, struct iattr *sattr,
|
|
|
|
@ -657,7 +659,8 @@ struct rpc_call_ops nfs41_call_priv_sync_ops = {
|
|
|
|
|
.rpc_call_done = nfs41_call_sync_done,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static int nfs4_call_sync_sequence(struct nfs_server *server,
|
|
|
|
|
static int nfs4_call_sync_sequence(struct rpc_clnt *clnt,
|
|
|
|
|
struct nfs_server *server,
|
|
|
|
|
struct rpc_message *msg,
|
|
|
|
|
struct nfs4_sequence_args *args,
|
|
|
|
|
struct nfs4_sequence_res *res,
|
|
|
|
@ -673,7 +676,7 @@ static int nfs4_call_sync_sequence(struct nfs_server *server,
|
|
|
|
|
.cache_reply = cache_reply,
|
|
|
|
|
};
|
|
|
|
|
struct rpc_task_setup task_setup = {
|
|
|
|
|
.rpc_client = server->client,
|
|
|
|
|
.rpc_client = clnt,
|
|
|
|
|
.rpc_message = msg,
|
|
|
|
|
.callback_ops = &nfs41_call_sync_ops,
|
|
|
|
|
.callback_data = &data
|
|
|
|
@ -692,13 +695,14 @@ static int nfs4_call_sync_sequence(struct nfs_server *server,
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int _nfs4_call_sync_session(struct nfs_server *server,
|
|
|
|
|
int _nfs4_call_sync_session(struct rpc_clnt *clnt,
|
|
|
|
|
struct nfs_server *server,
|
|
|
|
|
struct rpc_message *msg,
|
|
|
|
|
struct nfs4_sequence_args *args,
|
|
|
|
|
struct nfs4_sequence_res *res,
|
|
|
|
|
int cache_reply)
|
|
|
|
|
{
|
|
|
|
|
return nfs4_call_sync_sequence(server, msg, args, res, cache_reply, 0);
|
|
|
|
|
return nfs4_call_sync_sequence(clnt, server, msg, args, res, cache_reply, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
@ -709,25 +713,27 @@ static int nfs4_sequence_done(struct rpc_task *task,
|
|
|
|
|
}
|
|
|
|
|
#endif /* CONFIG_NFS_V4_1 */
|
|
|
|
|
|
|
|
|
|
int _nfs4_call_sync(struct nfs_server *server,
|
|
|
|
|
int _nfs4_call_sync(struct rpc_clnt *clnt,
|
|
|
|
|
struct nfs_server *server,
|
|
|
|
|
struct rpc_message *msg,
|
|
|
|
|
struct nfs4_sequence_args *args,
|
|
|
|
|
struct nfs4_sequence_res *res,
|
|
|
|
|
int cache_reply)
|
|
|
|
|
{
|
|
|
|
|
args->sa_session = res->sr_session = NULL;
|
|
|
|
|
return rpc_call_sync(server->client, msg, 0);
|
|
|
|
|
return rpc_call_sync(clnt, msg, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline
|
|
|
|
|
int nfs4_call_sync(struct nfs_server *server,
|
|
|
|
|
int nfs4_call_sync(struct rpc_clnt *clnt,
|
|
|
|
|
struct nfs_server *server,
|
|
|
|
|
struct rpc_message *msg,
|
|
|
|
|
struct nfs4_sequence_args *args,
|
|
|
|
|
struct nfs4_sequence_res *res,
|
|
|
|
|
int cache_reply)
|
|
|
|
|
{
|
|
|
|
|
return server->nfs_client->cl_mvops->call_sync(server, msg, args,
|
|
|
|
|
res, cache_reply);
|
|
|
|
|
return server->nfs_client->cl_mvops->call_sync(clnt, server, msg,
|
|
|
|
|
args, res, cache_reply);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo)
|
|
|
|
@ -1838,7 +1844,7 @@ static int _nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
|
|
|
|
|
} else
|
|
|
|
|
memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid));
|
|
|
|
|
|
|
|
|
|
status = nfs4_call_sync(server, &msg, &arg.seq_args, &res.seq_res, 1);
|
|
|
|
|
status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
|
|
|
|
|
if (status == 0 && state != NULL)
|
|
|
|
|
renew_lease(server, timestamp);
|
|
|
|
|
return status;
|
|
|
|
@ -2097,7 +2103,7 @@ static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *f
|
|
|
|
|
};
|
|
|
|
|
int status;
|
|
|
|
|
|
|
|
|
|
status = nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
if (status == 0) {
|
|
|
|
|
memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask));
|
|
|
|
|
server->caps &= ~(NFS_CAP_ACLS|NFS_CAP_HARDLINKS|
|
|
|
|
@ -2167,7 +2173,7 @@ static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
nfs_fattr_init(info->fattr);
|
|
|
|
|
return nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
|
|
|
|
@ -2256,7 +2262,7 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
nfs_fattr_init(fattr);
|
|
|
|
|
return nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
|
|
|
@ -2316,9 +2322,9 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int _nfs4_proc_lookupfh(struct nfs_server *server, const struct nfs_fh *dirfh,
|
|
|
|
|
const struct qstr *name, struct nfs_fh *fhandle,
|
|
|
|
|
struct nfs_fattr *fattr)
|
|
|
|
|
static int _nfs4_proc_lookupfh(struct rpc_clnt *clnt, struct nfs_server *server,
|
|
|
|
|
const struct nfs_fh *dirfh, const struct qstr *name,
|
|
|
|
|
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
|
|
|
|
{
|
|
|
|
|
int status;
|
|
|
|
|
struct nfs4_lookup_arg args = {
|
|
|
|
@ -2340,7 +2346,7 @@ static int _nfs4_proc_lookupfh(struct nfs_server *server, const struct nfs_fh *d
|
|
|
|
|
nfs_fattr_init(fattr);
|
|
|
|
|
|
|
|
|
|
dprintk("NFS call lookupfh %s\n", name->name);
|
|
|
|
|
status = nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
status = nfs4_call_sync(clnt, server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
dprintk("NFS reply lookupfh: %d\n", status);
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
@ -2352,7 +2358,7 @@ static int nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh,
|
|
|
|
|
struct nfs4_exception exception = { };
|
|
|
|
|
int err;
|
|
|
|
|
do {
|
|
|
|
|
err = _nfs4_proc_lookupfh(server, dirfh, name, fhandle, fattr);
|
|
|
|
|
err = _nfs4_proc_lookupfh(server->client, server, dirfh, name, fhandle, fattr);
|
|
|
|
|
/* FIXME: !!!! */
|
|
|
|
|
if (err == -NFS4ERR_MOVED) {
|
|
|
|
|
err = -EREMOTE;
|
|
|
|
@ -2363,26 +2369,28 @@ static int nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh,
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int _nfs4_proc_lookup(struct inode *dir, const struct qstr *name,
|
|
|
|
|
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
|
|
|
|
static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
|
|
|
|
|
const struct qstr *name, struct nfs_fh *fhandle,
|
|
|
|
|
struct nfs_fattr *fattr)
|
|
|
|
|
{
|
|
|
|
|
int status;
|
|
|
|
|
|
|
|
|
|
dprintk("NFS call lookup %s\n", name->name);
|
|
|
|
|
status = _nfs4_proc_lookupfh(NFS_SERVER(dir), NFS_FH(dir), name, fhandle, fattr);
|
|
|
|
|
status = _nfs4_proc_lookupfh(clnt, NFS_SERVER(dir), NFS_FH(dir), name, fhandle, fattr);
|
|
|
|
|
if (status == -NFS4ERR_MOVED)
|
|
|
|
|
status = nfs4_get_referral(dir, name, fattr, fhandle);
|
|
|
|
|
dprintk("NFS reply lookup: %d\n", status);
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int nfs4_proc_lookup(struct inode *dir, struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
|
|
|
|
static int nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, struct qstr *name,
|
|
|
|
|
struct nfs_fh *fhandle, struct nfs_fattr *fattr)
|
|
|
|
|
{
|
|
|
|
|
struct nfs4_exception exception = { };
|
|
|
|
|
int err;
|
|
|
|
|
do {
|
|
|
|
|
err = nfs4_handle_exception(NFS_SERVER(dir),
|
|
|
|
|
_nfs4_proc_lookup(dir, name, fhandle, fattr),
|
|
|
|
|
_nfs4_proc_lookup(clnt, dir, name, fhandle, fattr),
|
|
|
|
|
&exception);
|
|
|
|
|
} while (exception.retry);
|
|
|
|
|
return err;
|
|
|
|
@ -2428,7 +2436,7 @@ static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry
|
|
|
|
|
if (res.fattr == NULL)
|
|
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
|
|
status = nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
if (!status) {
|
|
|
|
|
entry->mask = 0;
|
|
|
|
|
if (res.access & NFS4_ACCESS_READ)
|
|
|
|
@ -2495,7 +2503,7 @@ static int _nfs4_proc_readlink(struct inode *inode, struct page *page,
|
|
|
|
|
.rpc_resp = &res,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return nfs4_call_sync(NFS_SERVER(inode), &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
return nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode), &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int nfs4_proc_readlink(struct inode *inode, struct page *page,
|
|
|
|
@ -2584,7 +2592,7 @@ static int _nfs4_proc_remove(struct inode *dir, struct qstr *name)
|
|
|
|
|
if (res.dir_attr == NULL)
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
status = nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 1);
|
|
|
|
|
status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 1);
|
|
|
|
|
if (status == 0) {
|
|
|
|
|
update_changeattr(dir, &res.cinfo);
|
|
|
|
|
nfs_post_op_update_inode(dir, res.dir_attr);
|
|
|
|
@ -2685,7 +2693,7 @@ static int _nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
|
|
|
|
|
if (res.old_fattr == NULL || res.new_fattr == NULL)
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
status = nfs4_call_sync(server, &msg, &arg.seq_args, &res.seq_res, 1);
|
|
|
|
|
status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
|
|
|
|
|
if (!status) {
|
|
|
|
|
update_changeattr(old_dir, &res.old_cinfo);
|
|
|
|
|
nfs_post_op_update_inode(old_dir, res.old_fattr);
|
|
|
|
@ -2736,7 +2744,7 @@ static int _nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *
|
|
|
|
|
if (res.fattr == NULL || res.dir_attr == NULL)
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
status = nfs4_call_sync(server, &msg, &arg.seq_args, &res.seq_res, 1);
|
|
|
|
|
status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
|
|
|
|
|
if (!status) {
|
|
|
|
|
update_changeattr(dir, &res.cinfo);
|
|
|
|
|
nfs_post_op_update_inode(dir, res.dir_attr);
|
|
|
|
@ -2799,7 +2807,7 @@ static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir,
|
|
|
|
|
|
|
|
|
|
static int nfs4_do_create(struct inode *dir, struct dentry *dentry, struct nfs4_createdata *data)
|
|
|
|
|
{
|
|
|
|
|
int status = nfs4_call_sync(NFS_SERVER(dir), &data->msg,
|
|
|
|
|
int status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &data->msg,
|
|
|
|
|
&data->arg.seq_args, &data->res.seq_res, 1);
|
|
|
|
|
if (status == 0) {
|
|
|
|
|
update_changeattr(dir, &data->res.dir_cinfo);
|
|
|
|
@ -2912,7 +2920,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
|
|
|
|
|
(unsigned long long)cookie);
|
|
|
|
|
nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);
|
|
|
|
|
res.pgbase = args.pgbase;
|
|
|
|
|
status = nfs4_call_sync(NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
if (status >= 0) {
|
|
|
|
|
memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE);
|
|
|
|
|
status += args.pgbase;
|
|
|
|
@ -3004,7 +3012,7 @@ static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
nfs_fattr_init(fsstat->fattr);
|
|
|
|
|
return nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
|
|
|
|
@ -3035,7 +3043,7 @@ static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
|
|
|
|
|
.rpc_resp = &res,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
|
|
|
|
@ -3080,7 +3088,7 @@ static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nfs_fattr_init(pathconf->fattr);
|
|
|
|
|
return nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
|
|
|
|
@ -3459,7 +3467,7 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu
|
|
|
|
|
resp_buf = buf;
|
|
|
|
|
buf_to_pages(buf, buflen, args.acl_pages, &args.acl_pgbase);
|
|
|
|
|
}
|
|
|
|
|
ret = nfs4_call_sync(NFS_SERVER(inode), &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
ret = nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode), &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
if (ret)
|
|
|
|
|
goto out_free;
|
|
|
|
|
if (res.acl_len > args.acl_len)
|
|
|
|
@ -3534,7 +3542,7 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl
|
|
|
|
|
if (i < 0)
|
|
|
|
|
return i;
|
|
|
|
|
nfs_inode_return_delegation(inode);
|
|
|
|
|
ret = nfs4_call_sync(server, &msg, &arg.seq_args, &res.seq_res, 1);
|
|
|
|
|
ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Free each page after tx, so the only ref left is
|
|
|
|
@ -3897,7 +3905,7 @@ static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock
|
|
|
|
|
lsp = request->fl_u.nfs4_fl.owner;
|
|
|
|
|
arg.lock_owner.id = lsp->ls_id.id;
|
|
|
|
|
arg.lock_owner.s_dev = server->s_dev;
|
|
|
|
|
status = nfs4_call_sync(server, &msg, &arg.seq_args, &res.seq_res, 1);
|
|
|
|
|
status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
|
|
|
|
|
switch (status) {
|
|
|
|
|
case 0:
|
|
|
|
|
request->fl_type = F_UNLCK;
|
|
|
|
@ -4625,7 +4633,7 @@ int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
|
|
|
|
|
nfs_fattr_init(&fs_locations->fattr);
|
|
|
|
|
fs_locations->server = server;
|
|
|
|
|
fs_locations->nlocations = 0;
|
|
|
|
|
status = nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
nfs_fixup_referral_attributes(&fs_locations->fattr);
|
|
|
|
|
dprintk("%s: returned status = %d\n", __func__, status);
|
|
|
|
|
return status;
|
|
|
|
@ -5593,7 +5601,7 @@ _nfs4_proc_getdeviceinfo(struct nfs_server *server, struct pnfs_device *pdev)
|
|
|
|
|
int status;
|
|
|
|
|
|
|
|
|
|
dprintk("--> %s\n", __func__);
|
|
|
|
|
status = nfs4_call_sync(server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
|
|
|
|
|
dprintk("<-- %s status=%d\n", __func__, status);
|
|
|
|
|
|
|
|
|
|
return status;
|
|
|
|
|