|
@@ -2676,6 +2676,7 @@ static void nfs4_xdr_enc_server_caps(struct rpc_rqst *req,
|
|
|
encode_sequence(xdr, &args->seq_args, &hdr);
|
|
|
encode_putfh(xdr, args->fhandle, &hdr);
|
|
|
encode_getattr_one(xdr, FATTR4_WORD0_SUPPORTED_ATTRS|
|
|
|
+ FATTR4_WORD0_FH_EXPIRE_TYPE|
|
|
|
FATTR4_WORD0_LINK_SUPPORT|
|
|
|
FATTR4_WORD0_SYMLINK_SUPPORT|
|
|
|
FATTR4_WORD0_ACLSUPPORT, &hdr);
|
|
@@ -3223,6 +3224,28 @@ out_overflow:
|
|
|
return -EIO;
|
|
|
}
|
|
|
|
|
|
+static int decode_attr_fh_expire_type(struct xdr_stream *xdr,
|
|
|
+ uint32_t *bitmap, uint32_t *type)
|
|
|
+{
|
|
|
+ __be32 *p;
|
|
|
+
|
|
|
+ *type = 0;
|
|
|
+ if (unlikely(bitmap[0] & (FATTR4_WORD0_FH_EXPIRE_TYPE - 1U)))
|
|
|
+ return -EIO;
|
|
|
+ if (likely(bitmap[0] & FATTR4_WORD0_FH_EXPIRE_TYPE)) {
|
|
|
+ p = xdr_inline_decode(xdr, 4);
|
|
|
+ if (unlikely(!p))
|
|
|
+ goto out_overflow;
|
|
|
+ *type = be32_to_cpup(p);
|
|
|
+ bitmap[0] &= ~FATTR4_WORD0_FH_EXPIRE_TYPE;
|
|
|
+ }
|
|
|
+ dprintk("%s: expire type=0x%x\n", __func__, *type);
|
|
|
+ return 0;
|
|
|
+out_overflow:
|
|
|
+ print_overflow_msg(__func__, xdr);
|
|
|
+ return -EIO;
|
|
|
+}
|
|
|
+
|
|
|
static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *change)
|
|
|
{
|
|
|
__be32 *p;
|
|
@@ -4271,6 +4294,9 @@ static int decode_server_caps(struct xdr_stream *xdr, struct nfs4_server_caps_re
|
|
|
goto xdr_error;
|
|
|
if ((status = decode_attr_supported(xdr, bitmap, res->attr_bitmask)) != 0)
|
|
|
goto xdr_error;
|
|
|
+ if ((status = decode_attr_fh_expire_type(xdr, bitmap,
|
|
|
+ &res->fh_expire_type)) != 0)
|
|
|
+ goto xdr_error;
|
|
|
if ((status = decode_attr_link_support(xdr, bitmap, &res->has_links)) != 0)
|
|
|
goto xdr_error;
|
|
|
if ((status = decode_attr_symlink_support(xdr, bitmap, &res->has_symlinks)) != 0)
|