|
|
|
@ -728,22 +728,24 @@ static void nfs_umount_begin(struct super_block *sb)
|
|
|
|
|
unlock_kernel();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static struct nfs_parsed_mount_data *nfs_alloc_parsed_mount_data(int flags)
|
|
|
|
|
static struct nfs_parsed_mount_data *nfs_alloc_parsed_mount_data(unsigned int version)
|
|
|
|
|
{
|
|
|
|
|
struct nfs_parsed_mount_data *data;
|
|
|
|
|
|
|
|
|
|
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
|
|
|
|
if (data) {
|
|
|
|
|
data->flags = flags;
|
|
|
|
|
data->rsize = NFS_MAX_FILE_IO_SIZE;
|
|
|
|
|
data->wsize = NFS_MAX_FILE_IO_SIZE;
|
|
|
|
|
data->acregmin = NFS_DEF_ACREGMIN;
|
|
|
|
|
data->acregmax = NFS_DEF_ACREGMAX;
|
|
|
|
|
data->acdirmin = NFS_DEF_ACDIRMIN;
|
|
|
|
|
data->acdirmax = NFS_DEF_ACDIRMAX;
|
|
|
|
|
data->mount_server.port = NFS_UNSPEC_PORT;
|
|
|
|
|
data->nfs_server.port = NFS_UNSPEC_PORT;
|
|
|
|
|
data->nfs_server.protocol = XPRT_TRANSPORT_TCP;
|
|
|
|
|
data->auth_flavors[0] = RPC_AUTH_UNIX;
|
|
|
|
|
data->auth_flavor_len = 1;
|
|
|
|
|
data->version = version;
|
|
|
|
|
data->minorversion = 0;
|
|
|
|
|
}
|
|
|
|
|
return data;
|
|
|
|
@ -776,15 +778,13 @@ static int nfs_verify_server_address(struct sockaddr *addr)
|
|
|
|
|
* Select between a default port value and a user-specified port value.
|
|
|
|
|
* If a zero value is set, then autobind will be used.
|
|
|
|
|
*/
|
|
|
|
|
static void nfs_set_default_port(struct sockaddr *sap, const int parsed_port,
|
|
|
|
|
static void nfs_set_port(struct sockaddr *sap, int *port,
|
|
|
|
|
const unsigned short default_port)
|
|
|
|
|
{
|
|
|
|
|
unsigned short port = default_port;
|
|
|
|
|
if (*port == NFS_UNSPEC_PORT)
|
|
|
|
|
*port = default_port;
|
|
|
|
|
|
|
|
|
|
if (parsed_port != NFS_UNSPEC_PORT)
|
|
|
|
|
port = parsed_port;
|
|
|
|
|
|
|
|
|
|
rpc_set_port(sap, port);
|
|
|
|
|
rpc_set_port(sap, *port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1475,7 +1475,7 @@ static int nfs_try_mount(struct nfs_parsed_mount_data *args,
|
|
|
|
|
args->mount_server.addrlen = args->nfs_server.addrlen;
|
|
|
|
|
}
|
|
|
|
|
request.salen = args->mount_server.addrlen;
|
|
|
|
|
nfs_set_default_port(request.sap, args->mount_server.port, 0);
|
|
|
|
|
nfs_set_port(request.sap, &args->mount_server.port, 0);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Now ask the mount server to map our export path
|
|
|
|
@ -1711,8 +1711,6 @@ static int nfs_validate_mount_data(void *options,
|
|
|
|
|
|
|
|
|
|
if (!(data->flags & NFS_MOUNT_TCP))
|
|
|
|
|
args->nfs_server.protocol = XPRT_TRANSPORT_UDP;
|
|
|
|
|
else
|
|
|
|
|
args->nfs_server.protocol = XPRT_TRANSPORT_TCP;
|
|
|
|
|
/* N.B. caller will free nfs_server.hostname in all cases */
|
|
|
|
|
args->nfs_server.hostname = kstrdup(data->hostname, GFP_KERNEL);
|
|
|
|
|
args->namlen = data->namlen;
|
|
|
|
@ -1767,7 +1765,7 @@ static int nfs_validate_mount_data(void *options,
|
|
|
|
|
goto out_v4_not_compiled;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
nfs_set_default_port(sap, args->nfs_server.port, 0);
|
|
|
|
|
nfs_set_port(sap, &args->nfs_server.port, 0);
|
|
|
|
|
|
|
|
|
|
nfs_set_mount_transport_protocol(args);
|
|
|
|
|
|
|
|
|
@ -1848,9 +1846,10 @@ nfs_compare_remount_data(struct nfs_server *nfss,
|
|
|
|
|
data->acdirmin != nfss->acdirmin / HZ ||
|
|
|
|
|
data->acdirmax != nfss->acdirmax / HZ ||
|
|
|
|
|
data->timeo != (10U * nfss->client->cl_timeout->to_initval / HZ) ||
|
|
|
|
|
data->nfs_server.port != nfss->port ||
|
|
|
|
|
data->nfs_server.addrlen != nfss->nfs_client->cl_addrlen ||
|
|
|
|
|
memcmp(&data->nfs_server.address, &nfss->nfs_client->cl_addr,
|
|
|
|
|
data->nfs_server.addrlen) != 0)
|
|
|
|
|
!rpc_cmp_addr(&data->nfs_server.address,
|
|
|
|
|
&nfss->nfs_client->cl_addr))
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
@ -1893,6 +1892,7 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data)
|
|
|
|
|
data->acdirmin = nfss->acdirmin / HZ;
|
|
|
|
|
data->acdirmax = nfss->acdirmax / HZ;
|
|
|
|
|
data->timeo = 10U * nfss->client->cl_timeout->to_initval / HZ;
|
|
|
|
|
data->nfs_server.port = nfss->port;
|
|
|
|
|
data->nfs_server.addrlen = nfss->nfs_client->cl_addrlen;
|
|
|
|
|
memcpy(&data->nfs_server.address, &nfss->nfs_client->cl_addr,
|
|
|
|
|
data->nfs_server.addrlen);
|
|
|
|
@ -2106,7 +2106,7 @@ static int nfs_get_sb(struct file_system_type *fs_type,
|
|
|
|
|
};
|
|
|
|
|
int error = -ENOMEM;
|
|
|
|
|
|
|
|
|
|
data = nfs_alloc_parsed_mount_data(NFS_MOUNT_VER3 | NFS_MOUNT_TCP);
|
|
|
|
|
data = nfs_alloc_parsed_mount_data(3);
|
|
|
|
|
mntfh = kzalloc(sizeof(*mntfh), GFP_KERNEL);
|
|
|
|
|
if (data == NULL || mntfh == NULL)
|
|
|
|
|
goto out_free_fh;
|
|
|
|
@ -2331,7 +2331,7 @@ static int nfs4_validate_text_mount_data(void *options,
|
|
|
|
|
{
|
|
|
|
|
struct sockaddr *sap = (struct sockaddr *)&args->nfs_server.address;
|
|
|
|
|
|
|
|
|
|
nfs_set_default_port(sap, args->nfs_server.port, NFS_PORT);
|
|
|
|
|
nfs_set_port(sap, &args->nfs_server.port, NFS_PORT);
|
|
|
|
|
|
|
|
|
|
nfs_validate_transport_protocol(args);
|
|
|
|
|
|
|
|
|
@ -2376,7 +2376,6 @@ static int nfs4_validate_mount_data(void *options,
|
|
|
|
|
if (data == NULL)
|
|
|
|
|
goto out_no_data;
|
|
|
|
|
|
|
|
|
|
args->version = 4;
|
|
|
|
|
switch (data->version) {
|
|
|
|
|
case 1:
|
|
|
|
|
if (data->host_addrlen > sizeof(args->nfs_server.address))
|
|
|
|
@ -2660,7 +2659,7 @@ static int nfs4_get_sb(struct file_system_type *fs_type,
|
|
|
|
|
struct nfs_parsed_mount_data *data;
|
|
|
|
|
int error = -ENOMEM;
|
|
|
|
|
|
|
|
|
|
data = nfs_alloc_parsed_mount_data(0);
|
|
|
|
|
data = nfs_alloc_parsed_mount_data(4);
|
|
|
|
|
if (data == NULL)
|
|
|
|
|
goto out_free_data;
|
|
|
|
|
|
|
|
|
@ -2690,7 +2689,6 @@ static void nfs4_kill_super(struct super_block *sb)
|
|
|
|
|
dprintk("--> %s\n", __func__);
|
|
|
|
|
nfs_super_return_all_delegations(sb);
|
|
|
|
|
kill_anon_super(sb);
|
|
|
|
|
nfs4_renewd_prepare_shutdown(server);
|
|
|
|
|
nfs_fscache_release_super_cookie(sb);
|
|
|
|
|
nfs_free_server(server);
|
|
|
|
|
dprintk("<-- %s\n", __func__);
|
|
|
|
|