Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -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;
}
}


+20 −46
Original line number Original line Diff line number Diff line
@@ -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;
}
}


+7 −2
Original line number Original line Diff line number Diff line
@@ -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 {