Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 374814
b: refs/heads/master
c: 7c1d5fa
h: refs/heads/master
v: v3
  • Loading branch information
Trond Myklebust authored and Trond Myklebust committed May 6, 2013
1 parent 4bfe7a4 commit a6f43dd
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 26 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9b1d75b75505cff4468ceba0da51a1ba47e15ea2
refs/heads/master: 7c1d5fae4a87d3cf3e9ffd68bcdbaf6529013009
98 changes: 75 additions & 23 deletions trunk/fs/nfs/nfs4proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -6783,26 +6783,76 @@ static int nfs41_test_stateid(struct nfs_server *server, nfs4_stateid *stateid)
return err;
}

static int _nfs4_free_stateid(struct nfs_server *server, nfs4_stateid *stateid)
{
struct nfs41_free_stateid_args args = {
.stateid = stateid,
};
struct nfs_free_stateid_data {
struct nfs_server *server;
struct nfs41_free_stateid_args args;
struct nfs41_free_stateid_res res;
};

static void nfs41_free_stateid_prepare(struct rpc_task *task, void *calldata)
{
struct nfs_free_stateid_data *data = calldata;
nfs41_setup_sequence(nfs4_get_session(data->server),
&data->args.seq_args,
&data->res.seq_res,
task);
}

static void nfs41_free_stateid_done(struct rpc_task *task, void *calldata)
{
struct nfs_free_stateid_data *data = calldata;

nfs41_sequence_done(task, &data->res.seq_res);

switch (task->tk_status) {
case -NFS4ERR_DELAY:
if (nfs4_async_handle_error(task, data->server, NULL) == -EAGAIN)
rpc_restart_call_prepare(task);
}
}

static void nfs41_free_stateid_release(void *calldata)
{
kfree(calldata);
}

const struct rpc_call_ops nfs41_free_stateid_ops = {
.rpc_call_prepare = nfs41_free_stateid_prepare,
.rpc_call_done = nfs41_free_stateid_done,
.rpc_release = nfs41_free_stateid_release,
};

static struct rpc_task *_nfs41_free_stateid(struct nfs_server *server,
nfs4_stateid *stateid,
bool privileged)
{
struct rpc_message msg = {
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FREE_STATEID],
.rpc_argp = &args,
.rpc_resp = &res,
};
int status;
struct rpc_task_setup task_setup = {
.rpc_client = server->client,
.rpc_message = &msg,
.callback_ops = &nfs41_free_stateid_ops,
.flags = RPC_TASK_ASYNC,
};
struct nfs_free_stateid_data *data;

dprintk("NFS call free_stateid %p\n", stateid);
nfs41_init_sequence(&args.seq_args, &res.seq_res, 0);
nfs4_set_sequence_privileged(&args.seq_args);
status = nfs4_call_sync_sequence(server->client, server, &msg,
&args.seq_args, &res.seq_res);
dprintk("NFS reply free_stateid: %d\n", status);
return status;
data = kmalloc(sizeof(*data), GFP_NOFS);
if (!data)
return ERR_PTR(-ENOMEM);
data->server = server;
nfs4_stateid_copy(&data->args.stateid, stateid);

task_setup.callback_data = data;

msg.rpc_argp = &data->args;
msg.rpc_resp = &data->res;
nfs41_init_sequence(&data->args.seq_args, &data->res.seq_res, 0);
if (privileged)
nfs4_set_sequence_privileged(&data->args.seq_args);

return rpc_run_task(&task_setup);
}

/**
Expand All @@ -6816,15 +6866,17 @@ static int _nfs4_free_stateid(struct nfs_server *server, nfs4_stateid *stateid)
*/
static int nfs41_free_stateid(struct nfs_server *server, nfs4_stateid *stateid)
{
struct nfs4_exception exception = { };
int err;
do {
err = _nfs4_free_stateid(server, stateid);
if (err != -NFS4ERR_DELAY)
break;
nfs4_handle_exception(server, err, &exception);
} while (exception.retry);
return err;
struct rpc_task *task;
int ret;

task = _nfs41_free_stateid(server, stateid, true);
if (IS_ERR(task))
return PTR_ERR(task);
ret = rpc_wait_for_completion_task(task);
if (!ret)
ret = task->tk_status;
rpc_put_task(task);
return ret;
}

static bool nfs41_match_stateid(const nfs4_stateid *s1,
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/nfs/nfs4xdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -2003,7 +2003,7 @@ static void encode_free_stateid(struct xdr_stream *xdr,
struct compound_hdr *hdr)
{
encode_op_hdr(xdr, OP_FREE_STATEID, decode_free_stateid_maxsz, hdr);
encode_nfs4_stateid(xdr, args->stateid);
encode_nfs4_stateid(xdr, &args->stateid);
}
#endif /* CONFIG_NFS_V4_1 */

Expand Down
2 changes: 1 addition & 1 deletion trunk/include/linux/nfs_xdr.h
Original file line number Diff line number Diff line change
Expand Up @@ -1176,7 +1176,7 @@ struct nfs41_test_stateid_res {

struct nfs41_free_stateid_args {
struct nfs4_sequence_args seq_args;
nfs4_stateid *stateid;
nfs4_stateid stateid;
};

struct nfs41_free_stateid_res {
Expand Down

0 comments on commit a6f43dd

Please sign in to comment.