summaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4xdr.c
diff options
context:
space:
mode:
authorPeng Tao <tao.peng@primarydata.com>2015-09-25 14:24:37 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2015-10-15 16:08:18 -0400
commit2a92ee92d4545448066fb664674c0ae5a9d5ea99 (patch)
treee24c885891708e270231568400d1edd3041cabc1 /fs/nfs/nfs4xdr.c
parentbea51b30b281039f0f43fb4f42028ddf33fb601f (diff)
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>
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
-rw-r--r--fs/nfs/nfs4xdr.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 868472b6b303..9f656791a338 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -4764,6 +4764,28 @@ static int decode_attr_layout_blksize(struct xdr_stream *xdr, uint32_t *bitmap,
4764 return 0; 4764 return 0;
4765} 4765}
4766 4766
4767/*
4768 * The granularity of a CLONE operation.
4769 */
4770static int decode_attr_clone_blksize(struct xdr_stream *xdr, uint32_t *bitmap,
4771 uint32_t *res)
4772{
4773 __be32 *p;
4774
4775 dprintk("%s: bitmap is %x\n", __func__, bitmap[2]);
4776 *res = 0;
4777 if (bitmap[2] & FATTR4_WORD2_CLONE_BLKSIZE) {
4778 p = xdr_inline_decode(xdr, 4);
4779 if (unlikely(!p)) {
4780 print_overflow_msg(__func__, xdr);
4781 return -EIO;
4782 }
4783 *res = be32_to_cpup(p);
4784 bitmap[2] &= ~FATTR4_WORD2_CLONE_BLKSIZE;
4785 }
4786 return 0;
4787}
4788
4767static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo) 4789static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
4768{ 4790{
4769 unsigned int savep; 4791 unsigned int savep;
@@ -4798,6 +4820,9 @@ static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
4798 status = decode_attr_layout_blksize(xdr, bitmap, &fsinfo->blksize); 4820 status = decode_attr_layout_blksize(xdr, bitmap, &fsinfo->blksize);
4799 if (status) 4821 if (status)
4800 goto xdr_error; 4822 goto xdr_error;
4823 status = decode_attr_clone_blksize(xdr, bitmap, &fsinfo->clone_blksize);
4824 if (status)
4825 goto xdr_error;
4801 4826
4802 status = verify_attr_len(xdr, savep, attrlen); 4827 status = verify_attr_len(xdr, savep, attrlen);
4803xdr_error: 4828xdr_error: