|
@@ -2298,7 +2298,7 @@ static void nfs4_xdr_enc_open(struct rpc_rqst *req, struct xdr_stream *xdr,
|
|
|
encode_getfh(xdr, &hdr);
|
|
|
encode_getfattr(xdr, args->bitmask, &hdr);
|
|
|
encode_restorefh(xdr, &hdr);
|
|
|
- encode_getfattr(xdr, args->bitmask, &hdr);
|
|
|
+ encode_getfattr(xdr, args->dir_bitmask, &hdr);
|
|
|
encode_nops(&hdr);
|
|
|
}
|
|
|
|
|
@@ -3792,7 +3792,8 @@ out_overflow:
|
|
|
}
|
|
|
|
|
|
static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap,
|
|
|
- const struct nfs_server *server, uint32_t *uid, int may_sleep)
|
|
|
+ const struct nfs_server *server, uint32_t *uid,
|
|
|
+ struct nfs4_string *owner_name)
|
|
|
{
|
|
|
uint32_t len;
|
|
|
__be32 *p;
|
|
@@ -3809,8 +3810,12 @@ static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap,
|
|
|
p = xdr_inline_decode(xdr, len);
|
|
|
if (unlikely(!p))
|
|
|
goto out_overflow;
|
|
|
- if (!may_sleep) {
|
|
|
- /* do nothing */
|
|
|
+ if (owner_name != NULL) {
|
|
|
+ owner_name->data = kmemdup(p, len, GFP_NOWAIT);
|
|
|
+ if (owner_name->data != NULL) {
|
|
|
+ owner_name->len = len;
|
|
|
+ ret = NFS_ATTR_FATTR_OWNER_NAME;
|
|
|
+ }
|
|
|
} else if (len < XDR_MAX_NETOBJ) {
|
|
|
if (nfs_map_name_to_uid(server, (char *)p, len, uid) == 0)
|
|
|
ret = NFS_ATTR_FATTR_OWNER;
|
|
@@ -3830,7 +3835,8 @@ out_overflow:
|
|
|
}
|
|
|
|
|
|
static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap,
|
|
|
- const struct nfs_server *server, uint32_t *gid, int may_sleep)
|
|
|
+ const struct nfs_server *server, uint32_t *gid,
|
|
|
+ struct nfs4_string *group_name)
|
|
|
{
|
|
|
uint32_t len;
|
|
|
__be32 *p;
|
|
@@ -3847,8 +3853,12 @@ static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap,
|
|
|
p = xdr_inline_decode(xdr, len);
|
|
|
if (unlikely(!p))
|
|
|
goto out_overflow;
|
|
|
- if (!may_sleep) {
|
|
|
- /* do nothing */
|
|
|
+ if (group_name != NULL) {
|
|
|
+ group_name->data = kmemdup(p, len, GFP_NOWAIT);
|
|
|
+ if (group_name->data != NULL) {
|
|
|
+ group_name->len = len;
|
|
|
+ ret = NFS_ATTR_FATTR_GROUP_NAME;
|
|
|
+ }
|
|
|
} else if (len < XDR_MAX_NETOBJ) {
|
|
|
if (nfs_map_group_to_gid(server, (char *)p, len, gid) == 0)
|
|
|
ret = NFS_ATTR_FATTR_GROUP;
|
|
@@ -4285,7 +4295,7 @@ xdr_error:
|
|
|
|
|
|
static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
|
|
|
struct nfs_fattr *fattr, struct nfs_fh *fh,
|
|
|
- const struct nfs_server *server, int may_sleep)
|
|
|
+ const struct nfs_server *server)
|
|
|
{
|
|
|
int status;
|
|
|
umode_t fmode = 0;
|
|
@@ -4352,12 +4362,12 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap,
|
|
|
goto xdr_error;
|
|
|
fattr->valid |= status;
|
|
|
|
|
|
- status = decode_attr_owner(xdr, bitmap, server, &fattr->uid, may_sleep);
|
|
|
+ status = decode_attr_owner(xdr, bitmap, server, &fattr->uid, fattr->owner_name);
|
|
|
if (status < 0)
|
|
|
goto xdr_error;
|
|
|
fattr->valid |= status;
|
|
|
|
|
|
- status = decode_attr_group(xdr, bitmap, server, &fattr->gid, may_sleep);
|
|
|
+ status = decode_attr_group(xdr, bitmap, server, &fattr->gid, fattr->group_name);
|
|
|
if (status < 0)
|
|
|
goto xdr_error;
|
|
|
fattr->valid |= status;
|
|
@@ -4398,7 +4408,7 @@ xdr_error:
|
|
|
}
|
|
|
|
|
|
static int decode_getfattr_generic(struct xdr_stream *xdr, struct nfs_fattr *fattr,
|
|
|
- struct nfs_fh *fh, const struct nfs_server *server, int may_sleep)
|
|
|
+ struct nfs_fh *fh, const struct nfs_server *server)
|
|
|
{
|
|
|
__be32 *savep;
|
|
|
uint32_t attrlen,
|
|
@@ -4417,7 +4427,7 @@ static int decode_getfattr_generic(struct xdr_stream *xdr, struct nfs_fattr *fat
|
|
|
if (status < 0)
|
|
|
goto xdr_error;
|
|
|
|
|
|
- status = decode_getfattr_attrs(xdr, bitmap, fattr, fh, server, may_sleep);
|
|
|
+ status = decode_getfattr_attrs(xdr, bitmap, fattr, fh, server);
|
|
|
if (status < 0)
|
|
|
goto xdr_error;
|
|
|
|
|
@@ -4428,9 +4438,9 @@ xdr_error:
|
|
|
}
|
|
|
|
|
|
static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr,
|
|
|
- const struct nfs_server *server, int may_sleep)
|
|
|
+ const struct nfs_server *server)
|
|
|
{
|
|
|
- return decode_getfattr_generic(xdr, fattr, NULL, server, may_sleep);
|
|
|
+ return decode_getfattr_generic(xdr, fattr, NULL, server);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -5711,8 +5721,7 @@ static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp,
|
|
|
status = decode_open_downgrade(xdr, res);
|
|
|
if (status != 0)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -5738,8 +5747,7 @@ static int nfs4_xdr_dec_access(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
status = decode_access(xdr, res);
|
|
|
if (status != 0)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -5768,8 +5776,7 @@ static int nfs4_xdr_dec_lookup(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
status = decode_getfh(xdr, res->fh);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
- status = decode_getfattr(xdr, res->fattr, res->server
|
|
|
- ,!RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ status = decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -5795,8 +5802,7 @@ static int nfs4_xdr_dec_lookup_root(struct rpc_rqst *rqstp,
|
|
|
goto out;
|
|
|
status = decode_getfh(xdr, res->fh);
|
|
|
if (status == 0)
|
|
|
- status = decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ status = decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -5822,8 +5828,7 @@ static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
status = decode_remove(xdr, &res->cinfo);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->dir_attr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->dir_attr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -5856,14 +5861,12 @@ static int nfs4_xdr_dec_rename(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
if (status)
|
|
|
goto out;
|
|
|
/* Current FH is target directory */
|
|
|
- if (decode_getfattr(xdr, res->new_fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task)) != 0)
|
|
|
+ if (decode_getfattr(xdr, res->new_fattr, res->server))
|
|
|
goto out;
|
|
|
status = decode_restorefh(xdr);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->old_fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->old_fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -5899,14 +5902,12 @@ static int nfs4_xdr_dec_link(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
* Note order: OP_LINK leaves the directory as the current
|
|
|
* filehandle.
|
|
|
*/
|
|
|
- if (decode_getfattr(xdr, res->dir_attr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task)) != 0)
|
|
|
+ if (decode_getfattr(xdr, res->dir_attr, res->server))
|
|
|
goto out;
|
|
|
status = decode_restorefh(xdr);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -5938,14 +5939,12 @@ static int nfs4_xdr_dec_create(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
status = decode_getfh(xdr, res->fh);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
- if (decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task)) != 0)
|
|
|
+ if (decode_getfattr(xdr, res->fattr, res->server))
|
|
|
goto out;
|
|
|
status = decode_restorefh(xdr);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->dir_fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->dir_fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -5977,8 +5976,7 @@ static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
status = decode_putfh(xdr);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
- status = decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ status = decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -6076,8 +6074,7 @@ static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
* an ESTALE error. Shouldn't be a problem,
|
|
|
* though, since fattr->valid will remain unset.
|
|
|
*/
|
|
|
- decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -6108,13 +6105,11 @@ static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
goto out;
|
|
|
if (decode_getfh(xdr, &res->fh) != 0)
|
|
|
goto out;
|
|
|
- if (decode_getfattr(xdr, res->f_attr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task)) != 0)
|
|
|
+ if (decode_getfattr(xdr, res->f_attr, res->server) != 0)
|
|
|
goto out;
|
|
|
if (decode_restorefh(xdr) != 0)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->dir_attr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->dir_attr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -6162,8 +6157,7 @@ static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp,
|
|
|
status = decode_open(xdr, res);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->f_attr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->f_attr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -6190,8 +6184,7 @@ static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp,
|
|
|
status = decode_setattr(xdr);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -6371,8 +6364,7 @@ static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
if (status)
|
|
|
goto out;
|
|
|
if (res->fattr)
|
|
|
- decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->fattr, res->server);
|
|
|
if (!status)
|
|
|
status = res->count;
|
|
|
out:
|
|
@@ -6401,8 +6393,7 @@ static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
|
|
|
if (status)
|
|
|
goto out;
|
|
|
if (res->fattr)
|
|
|
- decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -6561,8 +6552,7 @@ static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp,
|
|
|
status = decode_delegreturn(xdr);
|
|
|
if (status != 0)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -6591,8 +6581,7 @@ static int nfs4_xdr_dec_fs_locations(struct rpc_rqst *req,
|
|
|
goto out;
|
|
|
xdr_enter_page(xdr, PAGE_SIZE);
|
|
|
status = decode_getfattr(xdr, &res->fs_locations->fattr,
|
|
|
- res->fs_locations->server,
|
|
|
- !RPC_IS_ASYNC(req->rq_task));
|
|
|
+ res->fs_locations->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -6841,8 +6830,7 @@ static int nfs4_xdr_dec_layoutcommit(struct rpc_rqst *rqstp,
|
|
|
status = decode_layoutcommit(xdr, rqstp, res);
|
|
|
if (status)
|
|
|
goto out;
|
|
|
- decode_getfattr(xdr, res->fattr, res->server,
|
|
|
- !RPC_IS_ASYNC(rqstp->rq_task));
|
|
|
+ decode_getfattr(xdr, res->fattr, res->server);
|
|
|
out:
|
|
|
return status;
|
|
|
}
|
|
@@ -6973,7 +6961,7 @@ int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
|
|
|
goto out_overflow;
|
|
|
|
|
|
if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh,
|
|
|
- entry->server, 1) < 0)
|
|
|
+ entry->server) < 0)
|
|
|
goto out_overflow;
|
|
|
if (entry->fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID)
|
|
|
entry->ino = entry->fattr->mounted_on_fileid;
|