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

Commit 663c79b3 authored by Benny Halevy's avatar Benny Halevy
Browse files

nfs41: use nfs4_getaclres



In preparation for nfs41 sequence processing.

Signed-off-by: default avatarAndy Admason <andros@netapp.com>
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
[nfs41: embed resp_len in nfs_getaclres]
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent d45b2989
Loading
Loading
Loading
Loading
+11 −9
Original line number Original line Diff line number Diff line
@@ -2755,12 +2755,14 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu
		.acl_pages = pages,
		.acl_pages = pages,
		.acl_len = buflen,
		.acl_len = buflen,
	};
	};
	size_t resp_len = buflen;
	struct nfs_getaclres res = {
		.acl_len = buflen,
	};
	void *resp_buf;
	void *resp_buf;
	struct rpc_message msg = {
	struct rpc_message msg = {
		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL],
		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL],
		.rpc_argp = &args,
		.rpc_argp = &args,
		.rpc_resp = &resp_len,
		.rpc_resp = &res,
	};
	};
	struct page *localpage = NULL;
	struct page *localpage = NULL;
	int ret;
	int ret;
@@ -2774,7 +2776,7 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu
			return -ENOMEM;
			return -ENOMEM;
		args.acl_pages[0] = localpage;
		args.acl_pages[0] = localpage;
		args.acl_pgbase = 0;
		args.acl_pgbase = 0;
		resp_len = args.acl_len = PAGE_SIZE;
		args.acl_len = PAGE_SIZE;
	} else {
	} else {
		resp_buf = buf;
		resp_buf = buf;
		buf_to_pages(buf, buflen, args.acl_pages, &args.acl_pgbase);
		buf_to_pages(buf, buflen, args.acl_pages, &args.acl_pgbase);
@@ -2782,18 +2784,18 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu
	ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
	ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
	if (ret)
	if (ret)
		goto out_free;
		goto out_free;
	if (resp_len > args.acl_len)
	if (res.acl_len > args.acl_len)
		nfs4_write_cached_acl(inode, NULL, resp_len);
		nfs4_write_cached_acl(inode, NULL, res.acl_len);
	else
	else
		nfs4_write_cached_acl(inode, resp_buf, resp_len);
		nfs4_write_cached_acl(inode, resp_buf, res.acl_len);
	if (buf) {
	if (buf) {
		ret = -ERANGE;
		ret = -ERANGE;
		if (resp_len > buflen)
		if (res.acl_len > buflen)
			goto out_free;
			goto out_free;
		if (localpage)
		if (localpage)
			memcpy(buf, resp_buf, resp_len);
			memcpy(buf, resp_buf, res.acl_len);
	}
	}
	ret = resp_len;
	ret = res.acl_len;
out_free:
out_free:
	if (localpage)
	if (localpage)
		__free_page(localpage);
		__free_page(localpage);
+3 −2
Original line number Original line Diff line number Diff line
@@ -4018,7 +4018,8 @@ nfs4_xdr_dec_setacl(struct rpc_rqst *rqstp, __be32 *p, void *res)
 * Decode GETACL response
 * Decode GETACL response
 */
 */
static int
static int
nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, __be32 *p, size_t *acl_len)
nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, __be32 *p,
		    struct nfs_getaclres *res)
{
{
	struct xdr_stream xdr;
	struct xdr_stream xdr;
	struct compound_hdr hdr;
	struct compound_hdr hdr;
@@ -4031,7 +4032,7 @@ nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, __be32 *p, size_t *acl_len)
	status = decode_putfh(&xdr);
	status = decode_putfh(&xdr);
	if (status)
	if (status)
		goto out;
		goto out;
	status = decode_getacl(&xdr, rqstp, acl_len);
	status = decode_getacl(&xdr, rqstp, &res->acl_len);


out:
out:
	return status;
	return status;
+5 −0
Original line number Original line Diff line number Diff line
@@ -444,6 +444,11 @@ struct nfs_getaclargs {
	struct nfs4_sequence_args 	seq_args;
	struct nfs4_sequence_args 	seq_args;
};
};


struct nfs_getaclres {
	size_t				acl_len;
	struct nfs4_sequence_res	seq_res;
};

struct nfs_setattrres {
struct nfs_setattrres {
	struct nfs_fattr *              fattr;
	struct nfs_fattr *              fattr;
	const struct nfs_server *	server;
	const struct nfs_server *	server;