Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

NFS: Allow setting rsize / wsize to a multiple of PAGE_SIZE

Previously, we required this to value to be a power of 2 for UDP related
reasons. This patch keeps the power of 2 rule for UDP but allows more
flexibility for TCP and RDMA.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>

authored by

Anna Schumaker and committed by
Trond Myklebust
940261a1 f1bafa73

+31 -10
+7 -6
fs/nfs/client.c
··· 708 708 } 709 709 710 710 if (ctx->rsize) 711 - server->rsize = nfs_block_size(ctx->rsize, NULL); 711 + server->rsize = nfs_io_size(ctx->rsize, clp->cl_proto); 712 712 if (ctx->wsize) 713 - server->wsize = nfs_block_size(ctx->wsize, NULL); 713 + server->wsize = nfs_io_size(ctx->wsize, clp->cl_proto); 714 714 715 715 server->acregmin = ctx->acregmin * HZ; 716 716 server->acregmax = ctx->acregmax * HZ; ··· 755 755 static void nfs_server_set_fsinfo(struct nfs_server *server, 756 756 struct nfs_fsinfo *fsinfo) 757 757 { 758 + struct nfs_client *clp = server->nfs_client; 758 759 unsigned long max_rpc_payload, raw_max_rpc_payload; 759 760 760 761 /* Work out a lot of parameters */ 761 762 if (server->rsize == 0) 762 - server->rsize = nfs_block_size(fsinfo->rtpref, NULL); 763 + server->rsize = nfs_io_size(fsinfo->rtpref, clp->cl_proto); 763 764 if (server->wsize == 0) 764 - server->wsize = nfs_block_size(fsinfo->wtpref, NULL); 765 + server->wsize = nfs_io_size(fsinfo->wtpref, clp->cl_proto); 765 766 766 767 if (fsinfo->rtmax >= 512 && server->rsize > fsinfo->rtmax) 767 - server->rsize = nfs_block_size(fsinfo->rtmax, NULL); 768 + server->rsize = nfs_io_size(fsinfo->rtmax, clp->cl_proto); 768 769 if (fsinfo->wtmax >= 512 && server->wsize > fsinfo->wtmax) 769 - server->wsize = nfs_block_size(fsinfo->wtmax, NULL); 770 + server->wsize = nfs_io_size(fsinfo->wtmax, clp->cl_proto); 770 771 771 772 raw_max_rpc_payload = rpc_max_payload(server->client); 772 773 max_rpc_payload = nfs_block_size(raw_max_rpc_payload, NULL);
+4 -2
fs/nfs/flexfilelayout/flexfilelayoutdev.c
··· 113 113 goto out_err_drain_dsaddrs; 114 114 ds_versions[i].version = be32_to_cpup(p++); 115 115 ds_versions[i].minor_version = be32_to_cpup(p++); 116 - ds_versions[i].rsize = nfs_block_size(be32_to_cpup(p++), NULL); 117 - ds_versions[i].wsize = nfs_block_size(be32_to_cpup(p++), NULL); 116 + ds_versions[i].rsize = nfs_io_size(be32_to_cpup(p++), 117 + server->nfs_client->cl_proto); 118 + ds_versions[i].wsize = nfs_io_size(be32_to_cpup(p++), 119 + server->nfs_client->cl_proto); 118 120 ds_versions[i].tightly_coupled = be32_to_cpup(p); 119 121 120 122 if (ds_versions[i].rsize > NFS_MAX_FILE_IO_SIZE)
+18
fs/nfs/internal.h
··· 705 705 } 706 706 707 707 /* 708 + * Compute and set NFS server rsize / wsize 709 + */ 710 + static inline 711 + unsigned long nfs_io_size(unsigned long iosize, enum xprt_transports proto) 712 + { 713 + if (iosize < NFS_MIN_FILE_IO_SIZE) 714 + iosize = NFS_DEF_FILE_IO_SIZE; 715 + else if (iosize >= NFS_MAX_FILE_IO_SIZE) 716 + iosize = NFS_MAX_FILE_IO_SIZE; 717 + else 718 + iosize = iosize & PAGE_MASK; 719 + 720 + if (proto == XPRT_TRANSPORT_UDP) 721 + return nfs_block_bits(iosize, NULL); 722 + return iosize; 723 + } 724 + 725 + /* 708 726 * Determine the maximum file size for a superblock 709 727 */ 710 728 static inline
+2 -2
fs/nfs/nfs4client.c
··· 1161 1161 return error; 1162 1162 1163 1163 if (ctx->rsize) 1164 - server->rsize = nfs_block_size(ctx->rsize, NULL); 1164 + server->rsize = nfs_io_size(ctx->rsize, server->nfs_client->cl_proto); 1165 1165 if (ctx->wsize) 1166 - server->wsize = nfs_block_size(ctx->wsize, NULL); 1166 + server->wsize = nfs_io_size(ctx->wsize, server->nfs_client->cl_proto); 1167 1167 1168 1168 server->acregmin = ctx->acregmin * HZ; 1169 1169 server->acregmax = ctx->acregmax * HZ;