Skip to content

Commit

Permalink
NFS: Pass a stateid to test_stateid() and free_stateid()
Browse files Browse the repository at this point in the history
This takes the guesswork out of what stateid to use.  The caller is
expected to figure this out and pass in the correct one.

Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
  • Loading branch information
Bryan Schumaker authored and Trond Myklebust committed Feb 6, 2012
1 parent 8833812 commit 1cab065
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 16 deletions.
37 changes: 22 additions & 15 deletions fs/nfs/nfs4proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
struct nfs_fattr *fattr, struct iattr *sattr,
struct nfs4_state *state);
#ifdef CONFIG_NFS_V4_1
static int nfs41_test_stateid(struct nfs_server *, struct nfs4_state *);
static int nfs41_free_stateid(struct nfs_server *, struct nfs4_state *);
static int nfs41_test_stateid(struct nfs_server *, nfs4_stateid *);
static int nfs41_free_stateid(struct nfs_server *, nfs4_stateid *);
#endif
/* Prevent leaks of NFSv4 errors into userland */
static int nfs4_map_errors(int err)
Expand Down Expand Up @@ -1728,10 +1728,10 @@ static int nfs41_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *st
int status;
struct nfs_server *server = NFS_SERVER(state->inode);

status = nfs41_test_stateid(server, state);
status = nfs41_test_stateid(server, &state->stateid);
if (status == NFS_OK)
return 0;
nfs41_free_stateid(server, state);
nfs41_free_stateid(server, &state->stateid);
return nfs4_open_expired(sp, state);
}
#endif
Expand Down Expand Up @@ -4509,10 +4509,10 @@ static int nfs41_lock_expired(struct nfs4_state *state, struct file_lock *reques
int status;
struct nfs_server *server = NFS_SERVER(state->inode);

status = nfs41_test_stateid(server, state);
status = nfs41_test_stateid(server, &state->stateid);
if (status == NFS_OK)
return 0;
nfs41_free_stateid(server, state);
nfs41_free_stateid(server, &state->stateid);
return nfs4_lock_expired(state, request);
}
#endif
Expand Down Expand Up @@ -6142,37 +6142,44 @@ nfs41_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
out:
return err;
}
static int _nfs41_test_stateid(struct nfs_server *server, struct nfs4_state *state)

static int _nfs41_test_stateid(struct nfs_server *server, nfs4_stateid *stateid)
{
int status;
struct nfs41_test_stateid_args args = {
.stateid = &state->stateid,
.stateid = stateid,
};
struct nfs41_test_stateid_res res;
struct rpc_message msg = {
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_TEST_STATEID],
.rpc_argp = &args,
.rpc_resp = &res,
};

nfs41_init_sequence(&args.seq_args, &res.seq_res, 0);
return nfs4_call_sync_sequence(server->client, server, &msg, &args.seq_args, &res.seq_res, 1);
status = nfs4_call_sync_sequence(server->client, server, &msg, &args.seq_args, &res.seq_res, 1);

if (status == NFS_OK)
return res.status;
return status;
}

static int nfs41_test_stateid(struct nfs_server *server, struct nfs4_state *state)
static int nfs41_test_stateid(struct nfs_server *server, nfs4_stateid *stateid)
{
struct nfs4_exception exception = { };
int err;
do {
err = nfs4_handle_exception(server,
_nfs41_test_stateid(server, state),
_nfs41_test_stateid(server, stateid),
&exception);
} while (exception.retry);
return err;
}

static int _nfs4_free_stateid(struct nfs_server *server, struct nfs4_state *state)
static int _nfs4_free_stateid(struct nfs_server *server, nfs4_stateid *stateid)
{
struct nfs41_free_stateid_args args = {
.stateid = &state->stateid,
.stateid = stateid,
};
struct nfs41_free_stateid_res res;
struct rpc_message msg = {
Expand All @@ -6185,13 +6192,13 @@ static int _nfs4_free_stateid(struct nfs_server *server, struct nfs4_state *stat
return nfs4_call_sync_sequence(server->client, server, &msg, &args.seq_args, &res.seq_res, 1);
}

static int nfs41_free_stateid(struct nfs_server *server, struct nfs4_state *state)
static int nfs41_free_stateid(struct nfs_server *server, nfs4_stateid *stateid)
{
struct nfs4_exception exception = { };
int err;
do {
err = nfs4_handle_exception(server,
_nfs4_free_stateid(server, state),
_nfs4_free_stateid(server, stateid),
&exception);
} while (exception.retry);
return err;
Expand Down
3 changes: 2 additions & 1 deletion fs/nfs/nfs4xdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -5671,7 +5671,8 @@ static int decode_test_stateid(struct xdr_stream *xdr,
if (unlikely(!p))
goto out_overflow;
res->status = be32_to_cpup(p++);
return res->status;

return status;
out_overflow:
print_overflow_msg(__func__, xdr);
out:
Expand Down

0 comments on commit 1cab065

Please sign in to comment.