aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/nfs4proc.c1
-rw-r--r--fs/nfs/nfs4xdr.c26
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
3227static 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;
3244out_overflow:
3245 print_overflow_msg(__func__, xdr);
3246 return -EIO;
3247}
3248
3226static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *change) 3249static 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)