aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/super.c63
1 files changed, 35 insertions, 28 deletions
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 05544336f7de..599e8c5fe6ce 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -272,6 +272,8 @@ static const struct super_operations nfs_sops = {
272}; 272};
273 273
274#ifdef CONFIG_NFS_V4 274#ifdef CONFIG_NFS_V4
275static int nfs4_validate_text_mount_data(void *options,
276 struct nfs_parsed_mount_data *args, const char *dev_name);
275static int nfs4_get_sb(struct file_system_type *fs_type, 277static int nfs4_get_sb(struct file_system_type *fs_type,
276 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); 278 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt);
277static int nfs4_remote_get_sb(struct file_system_type *fs_type, 279static int nfs4_remote_get_sb(struct file_system_type *fs_type,
@@ -2262,6 +2264,37 @@ static void nfs4_validate_mount_flags(struct nfs_parsed_mount_data *args)
2262 args->flags &= ~(NFS_MOUNT_NONLM|NFS_MOUNT_NOACL|NFS_MOUNT_VER3); 2264 args->flags &= ~(NFS_MOUNT_NONLM|NFS_MOUNT_NOACL|NFS_MOUNT_VER3);
2263} 2265}
2264 2266
2267static int nfs4_validate_text_mount_data(void *options,
2268 struct nfs_parsed_mount_data *args,
2269 const char *dev_name)
2270{
2271 struct sockaddr *sap = (struct sockaddr *)&args->nfs_server.address;
2272
2273 nfs_set_default_port(sap, args->nfs_server.port, NFS_PORT);
2274
2275 nfs_validate_transport_protocol(args);
2276
2277 nfs4_validate_mount_flags(args);
2278
2279 if (args->auth_flavor_len > 1) {
2280 dfprintk(MOUNT,
2281 "NFS4: Too many RPC auth flavours specified\n");
2282 return -EINVAL;
2283 }
2284
2285 if (args->client_address == NULL) {
2286 dfprintk(MOUNT,
2287 "NFS4: mount program didn't pass callback address\n");
2288 return -EINVAL;
2289 }
2290
2291 return nfs_parse_devname(dev_name,
2292 &args->nfs_server.hostname,
2293 NFS4_MAXNAMLEN,
2294 &args->nfs_server.export_path,
2295 NFS4_MAXPATHLEN);
2296}
2297
2265/* 2298/*
2266 * Validate NFSv4 mount options 2299 * Validate NFSv4 mount options
2267 */ 2300 */
@@ -2342,36 +2375,14 @@ static int nfs4_validate_mount_data(void *options,
2342 nfs_validate_transport_protocol(args); 2375 nfs_validate_transport_protocol(args);
2343 2376
2344 break; 2377 break;
2345 default: { 2378 default:
2346 int status;
2347
2348 if (nfs_parse_mount_options((char *)options, args) == 0) 2379 if (nfs_parse_mount_options((char *)options, args) == 0)
2349 return -EINVAL; 2380 return -EINVAL;
2350 2381
2351 if (!nfs_verify_server_address(sap)) 2382 if (!nfs_verify_server_address(sap))
2352 return -EINVAL; 2383 return -EINVAL;
2353 nfs_set_default_port(sap, args->nfs_server.port, NFS_PORT);
2354
2355 nfs_validate_transport_protocol(args);
2356
2357 nfs4_validate_mount_flags(args);
2358
2359 if (args->auth_flavor_len > 1)
2360 goto out_inval_auth;
2361
2362 if (args->client_address == NULL)
2363 goto out_no_client_address;
2364
2365 status = nfs_parse_devname(dev_name,
2366 &args->nfs_server.hostname,
2367 NFS4_MAXNAMLEN,
2368 &args->nfs_server.export_path,
2369 NFS4_MAXPATHLEN);
2370 if (status < 0)
2371 return status;
2372 2384
2373 break; 2385 return nfs4_validate_text_mount_data(options, args, dev_name);
2374 }
2375 } 2386 }
2376 2387
2377 return 0; 2388 return 0;
@@ -2388,10 +2399,6 @@ out_inval_auth:
2388out_no_address: 2399out_no_address:
2389 dfprintk(MOUNT, "NFS4: mount program didn't pass remote address\n"); 2400 dfprintk(MOUNT, "NFS4: mount program didn't pass remote address\n");
2390 return -EINVAL; 2401 return -EINVAL;
2391
2392out_no_client_address:
2393 dfprintk(MOUNT, "NFS4: mount program didn't pass callback address\n");
2394 return -EINVAL;
2395} 2402}
2396 2403
2397/* 2404/*