nfs: get clone_blksize when probing fsinfo
NFSv42 CLONE operation is supposed to respect it. Signed-off-by: Peng Tao <tao.peng@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:

committed by
Trond Myklebust

parent
bea51b30b2
commit
2a92ee92d4
@@ -4764,6 +4764,28 @@ static int decode_attr_layout_blksize(struct xdr_stream *xdr, uint32_t *bitmap,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The granularity of a CLONE operation.
|
||||
*/
|
||||
static int decode_attr_clone_blksize(struct xdr_stream *xdr, uint32_t *bitmap,
|
||||
uint32_t *res)
|
||||
{
|
||||
__be32 *p;
|
||||
|
||||
dprintk("%s: bitmap is %x\n", __func__, bitmap[2]);
|
||||
*res = 0;
|
||||
if (bitmap[2] & FATTR4_WORD2_CLONE_BLKSIZE) {
|
||||
p = xdr_inline_decode(xdr, 4);
|
||||
if (unlikely(!p)) {
|
||||
print_overflow_msg(__func__, xdr);
|
||||
return -EIO;
|
||||
}
|
||||
*res = be32_to_cpup(p);
|
||||
bitmap[2] &= ~FATTR4_WORD2_CLONE_BLKSIZE;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
|
||||
{
|
||||
unsigned int savep;
|
||||
@@ -4796,6 +4818,9 @@ static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
|
||||
if (status != 0)
|
||||
goto xdr_error;
|
||||
status = decode_attr_layout_blksize(xdr, bitmap, &fsinfo->blksize);
|
||||
if (status)
|
||||
goto xdr_error;
|
||||
status = decode_attr_clone_blksize(xdr, bitmap, &fsinfo->clone_blksize);
|
||||
if (status)
|
||||
goto xdr_error;
|
||||
|
||||
|
Reference in New Issue
Block a user