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 | |
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')
-rw-r--r-- | fs/nfs/client.c | 1 | ||||
-rw-r--r-- | fs/nfs/nfs4proc.c | 1 | ||||
-rw-r--r-- | fs/nfs/nfs4xdr.c | 25 |
3 files changed, 27 insertions, 0 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 57c5a02f6213..d6d5d2a48e83 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -764,6 +764,7 @@ static void nfs_server_set_fsinfo(struct nfs_server *server, | |||
764 | 764 | ||
765 | server->time_delta = fsinfo->time_delta; | 765 | server->time_delta = fsinfo->time_delta; |
766 | 766 | ||
767 | server->clone_blksize = fsinfo->clone_blksize; | ||
767 | /* We're airborne Set socket buffersize */ | 768 | /* We're airborne Set socket buffersize */ |
768 | rpc_setbufsize(server->client, server->wsize + 100, server->rsize + 100); | 769 | rpc_setbufsize(server->client, server->wsize + 100, server->rsize + 100); |
769 | } | 770 | } |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 9688b1a9787f..8814fbe62623 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -239,6 +239,7 @@ const u32 nfs4_fsinfo_bitmap[3] = { FATTR4_WORD0_MAXFILESIZE | |||
239 | FATTR4_WORD1_TIME_DELTA | 239 | FATTR4_WORD1_TIME_DELTA |
240 | | FATTR4_WORD1_FS_LAYOUT_TYPES, | 240 | | FATTR4_WORD1_FS_LAYOUT_TYPES, |
241 | FATTR4_WORD2_LAYOUT_BLKSIZE | 241 | FATTR4_WORD2_LAYOUT_BLKSIZE |
242 | | FATTR4_WORD2_CLONE_BLKSIZE | ||
242 | }; | 243 | }; |
243 | 244 | ||
244 | const u32 nfs4_fs_locations_bitmap[3] = { | 245 | const u32 nfs4_fs_locations_bitmap[3] = { |
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: |