nfs: hornor timeo and retrans option when mounting NFSv3

Mounting NFSv3 uses default timeout parameters specified by underlying
sunrpc transport, and mount options like 'timeo' and 'retrans', unlike
NFSv4, are not honored.

But sometimes we want to set non-default timeout value when mounting
NFSv3, so pass 'timeo' and 'retrans' to nfs_mount() and fill the
'timeout' field of struct rpc_create_args before creating RPC
connection. This is also consistent with NFSv4 behavior.

Note that this only sets the timeout value of rpc connection to mountd,
but the timeout of rpcbind connection should be set as well. A later
patch will fix the rpcbind part.

Signed-off-by: Eryu Guan <eguan@linux.alibaba.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
Eryu Guan 2021-03-23 10:57:13 +08:00 committed by Trond Myklebust
parent 6b996476f3
commit c9301cb35b
3 changed files with 11 additions and 7 deletions

View File

@ -180,7 +180,7 @@ struct nfs_mount_request {
struct net *net; struct net *net;
}; };
extern int nfs_mount(struct nfs_mount_request *info); extern int nfs_mount(struct nfs_mount_request *info, int timeo, int retrans);
extern void nfs_umount(const struct nfs_mount_request *info); extern void nfs_umount(const struct nfs_mount_request *info);
/* client.c */ /* client.c */

View File

@ -136,14 +136,16 @@ struct mnt_fhstatus {
/** /**
* nfs_mount - Obtain an NFS file handle for the given host and path * nfs_mount - Obtain an NFS file handle for the given host and path
* @info: pointer to mount request arguments * @info: pointer to mount request arguments
* @timeo: deciseconds the mount waits for a response before it retries
* @retrans: number of times the mount retries a request
* *
* Uses default timeout parameters specified by underlying transport. On * Uses timeout parameters specified by caller. On successful return, the
* successful return, the auth_flavs list and auth_flav_len will be populated * auth_flavs list and auth_flav_len will be populated with the list from the
* with the list from the server or a faked-up list if the server didn't * server or a faked-up list if the server didn't provide one.
* provide one.
*/ */
int nfs_mount(struct nfs_mount_request *info) int nfs_mount(struct nfs_mount_request *info, int timeo, int retrans)
{ {
struct rpc_timeout mnt_timeout;
struct mountres result = { struct mountres result = {
.fh = info->fh, .fh = info->fh,
.auth_count = info->auth_flav_len, .auth_count = info->auth_flav_len,
@ -158,6 +160,7 @@ int nfs_mount(struct nfs_mount_request *info)
.protocol = info->protocol, .protocol = info->protocol,
.address = info->sap, .address = info->sap,
.addrsize = info->salen, .addrsize = info->salen,
.timeout = &mnt_timeout,
.servername = info->hostname, .servername = info->hostname,
.program = &mnt_program, .program = &mnt_program,
.version = info->version, .version = info->version,
@ -177,6 +180,7 @@ int nfs_mount(struct nfs_mount_request *info)
if (info->noresvport) if (info->noresvport)
args.flags |= RPC_CLNT_CREATE_NONPRIVPORT; args.flags |= RPC_CLNT_CREATE_NONPRIVPORT;
nfs_init_timeout_values(&mnt_timeout, info->protocol, timeo, retrans);
mnt_clnt = rpc_create(&args); mnt_clnt = rpc_create(&args);
if (IS_ERR(mnt_clnt)) if (IS_ERR(mnt_clnt))
goto out_clnt_err; goto out_clnt_err;

View File

@ -867,7 +867,7 @@ static int nfs_request_mount(struct fs_context *fc,
* Now ask the mount server to map our export path * Now ask the mount server to map our export path
* to a file handle. * to a file handle.
*/ */
status = nfs_mount(&request); status = nfs_mount(&request, ctx->timeo, ctx->retrans);
if (status != 0) { if (status != 0) {
dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n", dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n",
request.hostname, status); request.hostname, status);