Commit 03cfb420 authored by Bryan Schumaker's avatar Bryan Schumaker Committed by J. Bruce Fields

NFSD: Clean up the test_stateid function

When I initially wrote it, I didn't understand how lists worked so I
wrote something that didn't use them.  I think making a list of stateids
to test is a more straightforward implementation, especially compared to
especially compared to decoding stateids while simultaneously encoding
a reply to the client.
Signed-off-by: default avatarBryan Schumaker <bjschuma@netapp.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent de5b8e8e
...@@ -3402,7 +3402,14 @@ __be32 ...@@ -3402,7 +3402,14 @@ __be32
nfsd4_test_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, nfsd4_test_stateid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
struct nfsd4_test_stateid *test_stateid) struct nfsd4_test_stateid *test_stateid)
{ {
/* real work is done during encoding */ struct nfsd4_test_stateid_id *stateid;
struct nfs4_client *cl = cstate->session->se_client;
nfs4_lock_state();
list_for_each_entry(stateid, &test_stateid->ts_stateid_list, ts_id_list)
stateid->ts_id_status = nfs4_validate_stateid(cl, &stateid->ts_id_stateid);
nfs4_unlock_state();
return nfs_ok; return nfs_ok;
} }
......
...@@ -133,22 +133,6 @@ xdr_error: \ ...@@ -133,22 +133,6 @@ xdr_error: \
} \ } \
} while (0) } while (0)
static void save_buf(struct nfsd4_compoundargs *argp, struct nfsd4_saved_compoundargs *savep)
{
savep->p = argp->p;
savep->end = argp->end;
savep->pagelen = argp->pagelen;
savep->pagelist = argp->pagelist;
}
static void restore_buf(struct nfsd4_compoundargs *argp, struct nfsd4_saved_compoundargs *savep)
{
argp->p = savep->p;
argp->end = savep->end;
argp->pagelen = savep->pagelen;
argp->pagelist = savep->pagelist;
}
static __be32 *read_buf(struct nfsd4_compoundargs *argp, u32 nbytes) static __be32 *read_buf(struct nfsd4_compoundargs *argp, u32 nbytes)
{ {
/* We want more bytes than seem to be available. /* We want more bytes than seem to be available.
...@@ -1396,26 +1380,29 @@ nfsd4_decode_sequence(struct nfsd4_compoundargs *argp, ...@@ -1396,26 +1380,29 @@ nfsd4_decode_sequence(struct nfsd4_compoundargs *argp,
static __be32 static __be32
nfsd4_decode_test_stateid(struct nfsd4_compoundargs *argp, struct nfsd4_test_stateid *test_stateid) nfsd4_decode_test_stateid(struct nfsd4_compoundargs *argp, struct nfsd4_test_stateid *test_stateid)
{ {
unsigned int nbytes;
stateid_t si;
int i; int i;
__be32 *p; __be32 *p, status;
__be32 status; struct nfsd4_test_stateid_id *stateid;
READ_BUF(4); READ_BUF(4);
test_stateid->ts_num_ids = ntohl(*p++); test_stateid->ts_num_ids = ntohl(*p++);
nbytes = test_stateid->ts_num_ids * sizeof(stateid_t); INIT_LIST_HEAD(&test_stateid->ts_stateid_list);
if (nbytes > (u32)((char *)argp->end - (char *)argp->p))
goto xdr_error;
test_stateid->ts_saved_args = argp;
save_buf(argp, &test_stateid->ts_savedp);
for (i = 0; i < test_stateid->ts_num_ids; i++) { for (i = 0; i < test_stateid->ts_num_ids; i++) {
status = nfsd4_decode_stateid(argp, &si); stateid = kmalloc(sizeof(struct nfsd4_test_stateid_id), GFP_KERNEL);
if (!stateid) {
status = PTR_ERR(stateid);
goto out;
}
defer_free(argp, kfree, stateid);
INIT_LIST_HEAD(&stateid->ts_id_list);
list_add_tail(&stateid->ts_id_list, &test_stateid->ts_stateid_list);
status = nfsd4_decode_stateid(argp, &stateid->ts_id_stateid);
if (status) if (status)
return status; goto out;
} }
status = 0; status = 0;
...@@ -3402,30 +3389,17 @@ __be32 ...@@ -3402,30 +3389,17 @@ __be32
nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, int nfserr, nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, int nfserr,
struct nfsd4_test_stateid *test_stateid) struct nfsd4_test_stateid *test_stateid)
{ {
struct nfsd4_compoundargs *argp; struct nfsd4_test_stateid_id *stateid, *next;
struct nfs4_client *cl = resp->cstate.session->se_client;
stateid_t si;
__be32 *p; __be32 *p;
int i;
int valid;
restore_buf(test_stateid->ts_saved_args, &test_stateid->ts_savedp); RESERVE_SPACE(4 + (4 * test_stateid->ts_num_ids));
argp = test_stateid->ts_saved_args;
RESERVE_SPACE(4);
*p++ = htonl(test_stateid->ts_num_ids); *p++ = htonl(test_stateid->ts_num_ids);
resp->p = p;
nfs4_lock_state(); list_for_each_entry_safe(stateid, next, &test_stateid->ts_stateid_list, ts_id_list) {
for (i = 0; i < test_stateid->ts_num_ids; i++) { *p++ = htonl(stateid->ts_id_status);
nfsd4_decode_stateid(argp, &si);
valid = nfs4_validate_stateid(cl, &si);
RESERVE_SPACE(4);
*p++ = htonl(valid);
resp->p = p;
} }
nfs4_unlock_state();
ADJUST_ARGS();
return nfserr; return nfserr;
} }
......
...@@ -356,10 +356,15 @@ struct nfsd4_saved_compoundargs { ...@@ -356,10 +356,15 @@ struct nfsd4_saved_compoundargs {
struct page **pagelist; struct page **pagelist;
}; };
struct nfsd4_test_stateid_id {
__be32 ts_id_status;
stateid_t ts_id_stateid;
struct list_head ts_id_list;
};
struct nfsd4_test_stateid { struct nfsd4_test_stateid {
__be32 ts_num_ids; __be32 ts_num_ids;
struct nfsd4_compoundargs *ts_saved_args; struct list_head ts_stateid_list;
struct nfsd4_saved_compoundargs ts_savedp;
}; };
struct nfsd4_free_stateid { struct nfsd4_free_stateid {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment