diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/nfs4proc.c | 1 | ||||
-rw-r--r-- | fs/nfs/nfs4xdr.c | 26 |
2 files changed, 27 insertions, 0 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 281c2def2b19..87b9b91f76cf 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -2220,6 +2220,7 @@ static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *f | |||
2220 | server->cache_consistency_bitmask[0] &= FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE; | 2220 | server->cache_consistency_bitmask[0] &= FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE; |
2221 | server->cache_consistency_bitmask[1] &= FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY; | 2221 | server->cache_consistency_bitmask[1] &= FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY; |
2222 | server->acl_bitmask = res.acl_bitmask; | 2222 | server->acl_bitmask = res.acl_bitmask; |
2223 | server->fh_expire_type = res.fh_expire_type; | ||
2223 | } | 2224 | } |
2224 | 2225 | ||
2225 | return status; | 2226 | return status; |
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index a6fb55da874c..3e0fe9f92e7c 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
@@ -2676,6 +2676,7 @@ static void nfs4_xdr_enc_server_caps(struct rpc_rqst *req, | |||
2676 | encode_sequence(xdr, &args->seq_args, &hdr); | 2676 | encode_sequence(xdr, &args->seq_args, &hdr); |
2677 | encode_putfh(xdr, args->fhandle, &hdr); | 2677 | encode_putfh(xdr, args->fhandle, &hdr); |
2678 | encode_getattr_one(xdr, FATTR4_WORD0_SUPPORTED_ATTRS| | 2678 | encode_getattr_one(xdr, FATTR4_WORD0_SUPPORTED_ATTRS| |
2679 | FATTR4_WORD0_FH_EXPIRE_TYPE| | ||
2679 | FATTR4_WORD0_LINK_SUPPORT| | 2680 | FATTR4_WORD0_LINK_SUPPORT| |
2680 | FATTR4_WORD0_SYMLINK_SUPPORT| | 2681 | FATTR4_WORD0_SYMLINK_SUPPORT| |
2681 | FATTR4_WORD0_ACLSUPPORT, &hdr); | 2682 | FATTR4_WORD0_ACLSUPPORT, &hdr); |
@@ -3223,6 +3224,28 @@ out_overflow: | |||
3223 | return -EIO; | 3224 | return -EIO; |
3224 | } | 3225 | } |
3225 | 3226 | ||
3227 | static int decode_attr_fh_expire_type(struct xdr_stream *xdr, | ||
3228 | uint32_t *bitmap, uint32_t *type) | ||
3229 | { | ||
3230 | __be32 *p; | ||
3231 | |||
3232 | *type = 0; | ||
3233 | if (unlikely(bitmap[0] & (FATTR4_WORD0_FH_EXPIRE_TYPE - 1U))) | ||
3234 | return -EIO; | ||
3235 | if (likely(bitmap[0] & FATTR4_WORD0_FH_EXPIRE_TYPE)) { | ||
3236 | p = xdr_inline_decode(xdr, 4); | ||
3237 | if (unlikely(!p)) | ||
3238 | goto out_overflow; | ||
3239 | *type = be32_to_cpup(p); | ||
3240 | bitmap[0] &= ~FATTR4_WORD0_FH_EXPIRE_TYPE; | ||
3241 | } | ||
3242 | dprintk("%s: expire type=0x%x\n", __func__, *type); | ||
3243 | return 0; | ||
3244 | out_overflow: | ||
3245 | print_overflow_msg(__func__, xdr); | ||
3246 | return -EIO; | ||
3247 | } | ||
3248 | |||
3226 | static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *change) | 3249 | static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *change) |
3227 | { | 3250 | { |
3228 | __be32 *p; | 3251 | __be32 *p; |
@@ -4271,6 +4294,9 @@ static int decode_server_caps(struct xdr_stream *xdr, struct nfs4_server_caps_re | |||
4271 | goto xdr_error; | 4294 | goto xdr_error; |
4272 | if ((status = decode_attr_supported(xdr, bitmap, res->attr_bitmask)) != 0) | 4295 | if ((status = decode_attr_supported(xdr, bitmap, res->attr_bitmask)) != 0) |
4273 | goto xdr_error; | 4296 | goto xdr_error; |
4297 | if ((status = decode_attr_fh_expire_type(xdr, bitmap, | ||
4298 | &res->fh_expire_type)) != 0) | ||
4299 | goto xdr_error; | ||
4274 | if ((status = decode_attr_link_support(xdr, bitmap, &res->has_links)) != 0) | 4300 | if ((status = decode_attr_link_support(xdr, bitmap, &res->has_links)) != 0) |
4275 | goto xdr_error; | 4301 | goto xdr_error; |
4276 | if ((status = decode_attr_symlink_support(xdr, bitmap, &res->has_symlinks)) != 0) | 4302 | if ((status = decode_attr_symlink_support(xdr, bitmap, &res->has_symlinks)) != 0) |