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: Bryan Schumaker <bjschuma@netapp.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
committed by
J. Bruce Fields
parent
de5b8e8e04
commit
03cfb42025
@@ -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: \
|
|||||||
} \
|
} \
|
||||||
} 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,
|
|||||||
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
|
|||||||
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 {
|
|||||||
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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user