diff options
author | Peng Tao <tao.peng@primarydata.com> | 2015-09-25 14:24:37 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2015-10-15 16:08:18 -0400 |
commit | 2a92ee92d4545448066fb664674c0ae5a9d5ea99 (patch) | |
tree | e24c885891708e270231568400d1edd3041cabc1 /fs/nfs/nfs4xdr.c | |
parent | bea51b30b281039f0f43fb4f42028ddf33fb601f (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.c | 25 |
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 | */ | ||
4770 | static 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 | |||
4767 | static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo) | 4789 | static 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); |
4803 | xdr_error: | 4828 | xdr_error: |