diff options
| -rw-r--r-- | fs/nfs/super.c | 63 |
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 |
| 275 | static int nfs4_validate_text_mount_data(void *options, | ||
| 276 | struct nfs_parsed_mount_data *args, const char *dev_name); | ||
| 275 | static int nfs4_get_sb(struct file_system_type *fs_type, | 277 | static 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); |
| 277 | static int nfs4_remote_get_sb(struct file_system_type *fs_type, | 279 | static 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 | ||
| 2267 | static 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: | |||
| 2388 | out_no_address: | 2399 | out_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 | |||
| 2392 | out_no_client_address: | ||
| 2393 | dfprintk(MOUNT, "NFS4: mount program didn't pass callback address\n"); | ||
| 2394 | return -EINVAL; | ||
| 2395 | } | 2402 | } |
| 2396 | 2403 | ||
| 2397 | /* | 2404 | /* |
