]> Git Repo - J-linux.git/blob - fs/nfs/fs_context.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / fs / nfs / fs_context.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * linux/fs/nfs/fs_context.c
4  *
5  * Copyright (C) 1992 Rick Sladkey
6  * Conversion to new mount api Copyright (C) David Howells
7  *
8  * NFS mount handling.
9  *
10  * Split from fs/nfs/super.c by David Howells <[email protected]>
11  */
12
13 #include <linux/compat.h>
14 #include <linux/module.h>
15 #include <linux/fs.h>
16 #include <linux/fs_context.h>
17 #include <linux/fs_parser.h>
18 #include <linux/nfs_fs.h>
19 #include <linux/nfs_mount.h>
20 #include <linux/nfs4_mount.h>
21
22 #include <net/handshake.h>
23
24 #include "nfs.h"
25 #include "internal.h"
26
27 #include "nfstrace.h"
28
29 #define NFSDBG_FACILITY         NFSDBG_MOUNT
30
31 #if IS_ENABLED(CONFIG_NFS_V3)
32 #define NFS_DEFAULT_VERSION 3
33 #else
34 #define NFS_DEFAULT_VERSION 2
35 #endif
36
37 #define NFS_MAX_CONNECTIONS 16
38
39 enum nfs_param {
40         Opt_ac,
41         Opt_acdirmax,
42         Opt_acdirmin,
43         Opt_acl,
44         Opt_acregmax,
45         Opt_acregmin,
46         Opt_actimeo,
47         Opt_addr,
48         Opt_bg,
49         Opt_bsize,
50         Opt_clientaddr,
51         Opt_cto,
52         Opt_alignwrite,
53         Opt_fg,
54         Opt_fscache,
55         Opt_fscache_flag,
56         Opt_hard,
57         Opt_intr,
58         Opt_local_lock,
59         Opt_lock,
60         Opt_lookupcache,
61         Opt_migration,
62         Opt_minorversion,
63         Opt_mountaddr,
64         Opt_mounthost,
65         Opt_mountport,
66         Opt_mountproto,
67         Opt_mountvers,
68         Opt_namelen,
69         Opt_nconnect,
70         Opt_max_connect,
71         Opt_port,
72         Opt_posix,
73         Opt_proto,
74         Opt_rdirplus,
75         Opt_rdma,
76         Opt_resvport,
77         Opt_retrans,
78         Opt_retry,
79         Opt_rsize,
80         Opt_sec,
81         Opt_sharecache,
82         Opt_sloppy,
83         Opt_soft,
84         Opt_softerr,
85         Opt_softreval,
86         Opt_source,
87         Opt_tcp,
88         Opt_timeo,
89         Opt_trunkdiscovery,
90         Opt_udp,
91         Opt_v,
92         Opt_vers,
93         Opt_wsize,
94         Opt_write,
95         Opt_xprtsec,
96 };
97
98 enum {
99         Opt_local_lock_all,
100         Opt_local_lock_flock,
101         Opt_local_lock_none,
102         Opt_local_lock_posix,
103 };
104
105 static const struct constant_table nfs_param_enums_local_lock[] = {
106         { "all",                Opt_local_lock_all },
107         { "flock",      Opt_local_lock_flock },
108         { "posix",      Opt_local_lock_posix },
109         { "none",               Opt_local_lock_none },
110         {}
111 };
112
113 enum {
114         Opt_lookupcache_all,
115         Opt_lookupcache_none,
116         Opt_lookupcache_positive,
117 };
118
119 static const struct constant_table nfs_param_enums_lookupcache[] = {
120         { "all",                Opt_lookupcache_all },
121         { "none",               Opt_lookupcache_none },
122         { "pos",                Opt_lookupcache_positive },
123         { "positive",           Opt_lookupcache_positive },
124         {}
125 };
126
127 enum {
128         Opt_write_lazy,
129         Opt_write_eager,
130         Opt_write_wait,
131 };
132
133 static const struct constant_table nfs_param_enums_write[] = {
134         { "lazy",               Opt_write_lazy },
135         { "eager",              Opt_write_eager },
136         { "wait",               Opt_write_wait },
137         {}
138 };
139
140 static const struct fs_parameter_spec nfs_fs_parameters[] = {
141         fsparam_flag_no("ac",           Opt_ac),
142         fsparam_u32   ("acdirmax",      Opt_acdirmax),
143         fsparam_u32   ("acdirmin",      Opt_acdirmin),
144         fsparam_flag_no("acl",          Opt_acl),
145         fsparam_u32   ("acregmax",      Opt_acregmax),
146         fsparam_u32   ("acregmin",      Opt_acregmin),
147         fsparam_u32   ("actimeo",       Opt_actimeo),
148         fsparam_string("addr",          Opt_addr),
149         fsparam_flag  ("bg",            Opt_bg),
150         fsparam_u32   ("bsize",         Opt_bsize),
151         fsparam_string("clientaddr",    Opt_clientaddr),
152         fsparam_flag_no("cto",          Opt_cto),
153         fsparam_flag_no("alignwrite",   Opt_alignwrite),
154         fsparam_flag  ("fg",            Opt_fg),
155         fsparam_flag_no("fsc",          Opt_fscache_flag),
156         fsparam_string("fsc",           Opt_fscache),
157         fsparam_flag  ("hard",          Opt_hard),
158         __fsparam(NULL, "intr",         Opt_intr,
159                   fs_param_neg_with_no|fs_param_deprecated, NULL),
160         fsparam_enum  ("local_lock",    Opt_local_lock, nfs_param_enums_local_lock),
161         fsparam_flag_no("lock",         Opt_lock),
162         fsparam_enum  ("lookupcache",   Opt_lookupcache, nfs_param_enums_lookupcache),
163         fsparam_flag_no("migration",    Opt_migration),
164         fsparam_u32   ("minorversion",  Opt_minorversion),
165         fsparam_string("mountaddr",     Opt_mountaddr),
166         fsparam_string("mounthost",     Opt_mounthost),
167         fsparam_u32   ("mountport",     Opt_mountport),
168         fsparam_string("mountproto",    Opt_mountproto),
169         fsparam_u32   ("mountvers",     Opt_mountvers),
170         fsparam_u32   ("namlen",        Opt_namelen),
171         fsparam_u32   ("nconnect",      Opt_nconnect),
172         fsparam_u32   ("max_connect",   Opt_max_connect),
173         fsparam_string("nfsvers",       Opt_vers),
174         fsparam_u32   ("port",          Opt_port),
175         fsparam_flag_no("posix",        Opt_posix),
176         fsparam_string("proto",         Opt_proto),
177         fsparam_flag_no("rdirplus",     Opt_rdirplus),
178         fsparam_flag  ("rdma",          Opt_rdma),
179         fsparam_flag_no("resvport",     Opt_resvport),
180         fsparam_u32   ("retrans",       Opt_retrans),
181         fsparam_string("retry",         Opt_retry),
182         fsparam_u32   ("rsize",         Opt_rsize),
183         fsparam_string("sec",           Opt_sec),
184         fsparam_flag_no("sharecache",   Opt_sharecache),
185         fsparam_flag  ("sloppy",        Opt_sloppy),
186         fsparam_flag  ("soft",          Opt_soft),
187         fsparam_flag  ("softerr",       Opt_softerr),
188         fsparam_flag  ("softreval",     Opt_softreval),
189         fsparam_string("source",        Opt_source),
190         fsparam_flag  ("tcp",           Opt_tcp),
191         fsparam_u32   ("timeo",         Opt_timeo),
192         fsparam_flag_no("trunkdiscovery", Opt_trunkdiscovery),
193         fsparam_flag  ("udp",           Opt_udp),
194         fsparam_flag  ("v2",            Opt_v),
195         fsparam_flag  ("v3",            Opt_v),
196         fsparam_flag  ("v4",            Opt_v),
197         fsparam_flag  ("v4.0",          Opt_v),
198         fsparam_flag  ("v4.1",          Opt_v),
199         fsparam_flag  ("v4.2",          Opt_v),
200         fsparam_string("vers",          Opt_vers),
201         fsparam_enum  ("write",         Opt_write, nfs_param_enums_write),
202         fsparam_u32   ("wsize",         Opt_wsize),
203         fsparam_string("xprtsec",       Opt_xprtsec),
204         {}
205 };
206
207 enum {
208         Opt_vers_2,
209         Opt_vers_3,
210         Opt_vers_4,
211         Opt_vers_4_0,
212         Opt_vers_4_1,
213         Opt_vers_4_2,
214 };
215
216 static const struct constant_table nfs_vers_tokens[] = {
217         { "2",          Opt_vers_2 },
218         { "3",          Opt_vers_3 },
219         { "4",          Opt_vers_4 },
220         { "4.0",        Opt_vers_4_0 },
221         { "4.1",        Opt_vers_4_1 },
222         { "4.2",        Opt_vers_4_2 },
223         {}
224 };
225
226 enum {
227         Opt_xprt_rdma,
228         Opt_xprt_rdma6,
229         Opt_xprt_tcp,
230         Opt_xprt_tcp6,
231         Opt_xprt_udp,
232         Opt_xprt_udp6,
233         nr__Opt_xprt
234 };
235
236 static const struct constant_table nfs_xprt_protocol_tokens[] = {
237         { "rdma",       Opt_xprt_rdma },
238         { "rdma6",      Opt_xprt_rdma6 },
239         { "tcp",        Opt_xprt_tcp },
240         { "tcp6",       Opt_xprt_tcp6 },
241         { "udp",        Opt_xprt_udp },
242         { "udp6",       Opt_xprt_udp6 },
243         {}
244 };
245
246 enum {
247         Opt_sec_krb5,
248         Opt_sec_krb5i,
249         Opt_sec_krb5p,
250         Opt_sec_lkey,
251         Opt_sec_lkeyi,
252         Opt_sec_lkeyp,
253         Opt_sec_none,
254         Opt_sec_spkm,
255         Opt_sec_spkmi,
256         Opt_sec_spkmp,
257         Opt_sec_sys,
258         nr__Opt_sec
259 };
260
261 static const struct constant_table nfs_secflavor_tokens[] = {
262         { "krb5",       Opt_sec_krb5 },
263         { "krb5i",      Opt_sec_krb5i },
264         { "krb5p",      Opt_sec_krb5p },
265         { "lkey",       Opt_sec_lkey },
266         { "lkeyi",      Opt_sec_lkeyi },
267         { "lkeyp",      Opt_sec_lkeyp },
268         { "none",       Opt_sec_none },
269         { "null",       Opt_sec_none },
270         { "spkm3",      Opt_sec_spkm },
271         { "spkm3i",     Opt_sec_spkmi },
272         { "spkm3p",     Opt_sec_spkmp },
273         { "sys",        Opt_sec_sys },
274         {}
275 };
276
277 enum {
278         Opt_xprtsec_none,
279         Opt_xprtsec_tls,
280         Opt_xprtsec_mtls,
281         nr__Opt_xprtsec
282 };
283
284 static const struct constant_table nfs_xprtsec_policies[] = {
285         { "none",       Opt_xprtsec_none },
286         { "tls",        Opt_xprtsec_tls },
287         { "mtls",       Opt_xprtsec_mtls },
288         {}
289 };
290
291 /*
292  * Sanity-check a server address provided by the mount command.
293  *
294  * Address family must be initialized, and address must not be
295  * the ANY address for that family.
296  */
297 static int nfs_verify_server_address(struct sockaddr_storage *addr)
298 {
299         switch (addr->ss_family) {
300         case AF_INET: {
301                 struct sockaddr_in *sa = (struct sockaddr_in *)addr;
302                 return sa->sin_addr.s_addr != htonl(INADDR_ANY);
303         }
304         case AF_INET6: {
305                 struct in6_addr *sa = &((struct sockaddr_in6 *)addr)->sin6_addr;
306                 return !ipv6_addr_any(sa);
307         }
308         }
309
310         return 0;
311 }
312
313 #ifdef CONFIG_NFS_DISABLE_UDP_SUPPORT
314 static bool nfs_server_transport_udp_invalid(const struct nfs_fs_context *ctx)
315 {
316         return true;
317 }
318 #else
319 static bool nfs_server_transport_udp_invalid(const struct nfs_fs_context *ctx)
320 {
321         if (ctx->version == 4)
322                 return true;
323         return false;
324 }
325 #endif
326
327 /*
328  * Sanity check the NFS transport protocol.
329  */
330 static int nfs_validate_transport_protocol(struct fs_context *fc,
331                                            struct nfs_fs_context *ctx)
332 {
333         switch (ctx->nfs_server.protocol) {
334         case XPRT_TRANSPORT_UDP:
335                 if (nfs_server_transport_udp_invalid(ctx))
336                         goto out_invalid_transport_udp;
337                 break;
338         case XPRT_TRANSPORT_TCP:
339         case XPRT_TRANSPORT_RDMA:
340                 break;
341         default:
342                 ctx->nfs_server.protocol = XPRT_TRANSPORT_TCP;
343         }
344
345         if (ctx->xprtsec.policy != RPC_XPRTSEC_NONE)
346                 switch (ctx->nfs_server.protocol) {
347                 case XPRT_TRANSPORT_TCP:
348                         ctx->nfs_server.protocol = XPRT_TRANSPORT_TCP_TLS;
349                         break;
350                 default:
351                         goto out_invalid_xprtsec_policy;
352         }
353
354         return 0;
355 out_invalid_transport_udp:
356         return nfs_invalf(fc, "NFS: Unsupported transport protocol udp");
357 out_invalid_xprtsec_policy:
358         return nfs_invalf(fc, "NFS: Transport does not support xprtsec");
359 }
360
361 /*
362  * For text based NFSv2/v3 mounts, the mount protocol transport default
363  * settings should depend upon the specified NFS transport.
364  */
365 static void nfs_set_mount_transport_protocol(struct nfs_fs_context *ctx)
366 {
367         if (ctx->mount_server.protocol == XPRT_TRANSPORT_UDP ||
368             ctx->mount_server.protocol == XPRT_TRANSPORT_TCP)
369                         return;
370         switch (ctx->nfs_server.protocol) {
371         case XPRT_TRANSPORT_UDP:
372                 ctx->mount_server.protocol = XPRT_TRANSPORT_UDP;
373                 break;
374         case XPRT_TRANSPORT_TCP:
375         case XPRT_TRANSPORT_RDMA:
376                 ctx->mount_server.protocol = XPRT_TRANSPORT_TCP;
377         }
378 }
379
380 /*
381  * Add 'flavor' to 'auth_info' if not already present.
382  * Returns true if 'flavor' ends up in the list, false otherwise
383  */
384 static int nfs_auth_info_add(struct fs_context *fc,
385                              struct nfs_auth_info *auth_info,
386                              rpc_authflavor_t flavor)
387 {
388         unsigned int i;
389         unsigned int max_flavor_len = ARRAY_SIZE(auth_info->flavors);
390
391         /* make sure this flavor isn't already in the list */
392         for (i = 0; i < auth_info->flavor_len; i++) {
393                 if (flavor == auth_info->flavors[i])
394                         return 0;
395         }
396
397         if (auth_info->flavor_len + 1 >= max_flavor_len)
398                 return nfs_invalf(fc, "NFS: too many sec= flavors");
399
400         auth_info->flavors[auth_info->flavor_len++] = flavor;
401         return 0;
402 }
403
404 /*
405  * Parse the value of the 'sec=' option.
406  */
407 static int nfs_parse_security_flavors(struct fs_context *fc,
408                                       struct fs_parameter *param)
409 {
410         struct nfs_fs_context *ctx = nfs_fc2context(fc);
411         rpc_authflavor_t pseudoflavor;
412         char *string = param->string, *p;
413         int ret;
414
415         trace_nfs_mount_assign(param->key, string);
416
417         while ((p = strsep(&string, ":")) != NULL) {
418                 if (!*p)
419                         continue;
420                 switch (lookup_constant(nfs_secflavor_tokens, p, -1)) {
421                 case Opt_sec_none:
422                         pseudoflavor = RPC_AUTH_NULL;
423                         break;
424                 case Opt_sec_sys:
425                         pseudoflavor = RPC_AUTH_UNIX;
426                         break;
427                 case Opt_sec_krb5:
428                         pseudoflavor = RPC_AUTH_GSS_KRB5;
429                         break;
430                 case Opt_sec_krb5i:
431                         pseudoflavor = RPC_AUTH_GSS_KRB5I;
432                         break;
433                 case Opt_sec_krb5p:
434                         pseudoflavor = RPC_AUTH_GSS_KRB5P;
435                         break;
436                 case Opt_sec_lkey:
437                         pseudoflavor = RPC_AUTH_GSS_LKEY;
438                         break;
439                 case Opt_sec_lkeyi:
440                         pseudoflavor = RPC_AUTH_GSS_LKEYI;
441                         break;
442                 case Opt_sec_lkeyp:
443                         pseudoflavor = RPC_AUTH_GSS_LKEYP;
444                         break;
445                 case Opt_sec_spkm:
446                         pseudoflavor = RPC_AUTH_GSS_SPKM;
447                         break;
448                 case Opt_sec_spkmi:
449                         pseudoflavor = RPC_AUTH_GSS_SPKMI;
450                         break;
451                 case Opt_sec_spkmp:
452                         pseudoflavor = RPC_AUTH_GSS_SPKMP;
453                         break;
454                 default:
455                         return nfs_invalf(fc, "NFS: sec=%s option not recognized", p);
456                 }
457
458                 ret = nfs_auth_info_add(fc, &ctx->auth_info, pseudoflavor);
459                 if (ret < 0)
460                         return ret;
461         }
462
463         return 0;
464 }
465
466 static int nfs_parse_xprtsec_policy(struct fs_context *fc,
467                                     struct fs_parameter *param)
468 {
469         struct nfs_fs_context *ctx = nfs_fc2context(fc);
470
471         trace_nfs_mount_assign(param->key, param->string);
472
473         switch (lookup_constant(nfs_xprtsec_policies, param->string, -1)) {
474         case Opt_xprtsec_none:
475                 ctx->xprtsec.policy = RPC_XPRTSEC_NONE;
476                 break;
477         case Opt_xprtsec_tls:
478                 ctx->xprtsec.policy = RPC_XPRTSEC_TLS_ANON;
479                 break;
480         case Opt_xprtsec_mtls:
481                 ctx->xprtsec.policy = RPC_XPRTSEC_TLS_X509;
482                 break;
483         default:
484                 return nfs_invalf(fc, "NFS: Unrecognized transport security policy");
485         }
486         return 0;
487 }
488
489 static int nfs_parse_version_string(struct fs_context *fc,
490                                     const char *string)
491 {
492         struct nfs_fs_context *ctx = nfs_fc2context(fc);
493
494         ctx->flags &= ~NFS_MOUNT_VER3;
495         switch (lookup_constant(nfs_vers_tokens, string, -1)) {
496         case Opt_vers_2:
497                 ctx->version = 2;
498                 break;
499         case Opt_vers_3:
500                 ctx->flags |= NFS_MOUNT_VER3;
501                 ctx->version = 3;
502                 break;
503         case Opt_vers_4:
504                 /* Backward compatibility option. In future,
505                  * the mount program should always supply
506                  * a NFSv4 minor version number.
507                  */
508                 ctx->version = 4;
509                 break;
510         case Opt_vers_4_0:
511                 ctx->version = 4;
512                 ctx->minorversion = 0;
513                 break;
514         case Opt_vers_4_1:
515                 ctx->version = 4;
516                 ctx->minorversion = 1;
517                 break;
518         case Opt_vers_4_2:
519                 ctx->version = 4;
520                 ctx->minorversion = 2;
521                 break;
522         default:
523                 return nfs_invalf(fc, "NFS: Unsupported NFS version");
524         }
525         return 0;
526 }
527
528 /*
529  * Parse a single mount parameter.
530  */
531 static int nfs_fs_context_parse_param(struct fs_context *fc,
532                                       struct fs_parameter *param)
533 {
534         struct fs_parse_result result;
535         struct nfs_fs_context *ctx = nfs_fc2context(fc);
536         unsigned short protofamily, mountfamily;
537         unsigned int len;
538         int ret, opt;
539
540         trace_nfs_mount_option(param);
541
542         opt = fs_parse(fc, nfs_fs_parameters, param, &result);
543         if (opt < 0)
544                 return (opt == -ENOPARAM && ctx->sloppy) ? 1 : opt;
545
546         if (fc->security)
547                 ctx->has_sec_mnt_opts = 1;
548
549         switch (opt) {
550         case Opt_source:
551                 if (fc->source)
552                         return nfs_invalf(fc, "NFS: Multiple sources not supported");
553                 fc->source = param->string;
554                 param->string = NULL;
555                 break;
556
557                 /*
558                  * boolean options:  foo/nofoo
559                  */
560         case Opt_soft:
561                 ctx->flags |= NFS_MOUNT_SOFT;
562                 ctx->flags &= ~NFS_MOUNT_SOFTERR;
563                 break;
564         case Opt_softerr:
565                 ctx->flags |= NFS_MOUNT_SOFTERR | NFS_MOUNT_SOFTREVAL;
566                 ctx->flags &= ~NFS_MOUNT_SOFT;
567                 break;
568         case Opt_hard:
569                 ctx->flags &= ~(NFS_MOUNT_SOFT |
570                                 NFS_MOUNT_SOFTERR |
571                                 NFS_MOUNT_SOFTREVAL);
572                 break;
573         case Opt_softreval:
574                 if (result.negated)
575                         ctx->flags &= ~NFS_MOUNT_SOFTREVAL;
576                 else
577                         ctx->flags |= NFS_MOUNT_SOFTREVAL;
578                 break;
579         case Opt_posix:
580                 if (result.negated)
581                         ctx->flags &= ~NFS_MOUNT_POSIX;
582                 else
583                         ctx->flags |= NFS_MOUNT_POSIX;
584                 break;
585         case Opt_cto:
586                 if (result.negated)
587                         ctx->flags |= NFS_MOUNT_NOCTO;
588                 else
589                         ctx->flags &= ~NFS_MOUNT_NOCTO;
590                 break;
591         case Opt_trunkdiscovery:
592                 if (result.negated)
593                         ctx->flags &= ~NFS_MOUNT_TRUNK_DISCOVERY;
594                 else
595                         ctx->flags |= NFS_MOUNT_TRUNK_DISCOVERY;
596                 break;
597         case Opt_alignwrite:
598                 if (result.negated)
599                         ctx->flags |= NFS_MOUNT_NO_ALIGNWRITE;
600                 else
601                         ctx->flags &= ~NFS_MOUNT_NO_ALIGNWRITE;
602                 break;
603         case Opt_ac:
604                 if (result.negated)
605                         ctx->flags |= NFS_MOUNT_NOAC;
606                 else
607                         ctx->flags &= ~NFS_MOUNT_NOAC;
608                 break;
609         case Opt_lock:
610                 if (result.negated) {
611                         ctx->lock_status = NFS_LOCK_NOLOCK;
612                         ctx->flags |= NFS_MOUNT_NONLM;
613                         ctx->flags |= (NFS_MOUNT_LOCAL_FLOCK | NFS_MOUNT_LOCAL_FCNTL);
614                 } else {
615                         ctx->lock_status = NFS_LOCK_LOCK;
616                         ctx->flags &= ~NFS_MOUNT_NONLM;
617                         ctx->flags &= ~(NFS_MOUNT_LOCAL_FLOCK | NFS_MOUNT_LOCAL_FCNTL);
618                 }
619                 break;
620         case Opt_udp:
621                 ctx->flags &= ~NFS_MOUNT_TCP;
622                 ctx->nfs_server.protocol = XPRT_TRANSPORT_UDP;
623                 break;
624         case Opt_tcp:
625         case Opt_rdma:
626                 ctx->flags |= NFS_MOUNT_TCP; /* for side protocols */
627                 ret = xprt_find_transport_ident(param->key);
628                 if (ret < 0)
629                         goto out_bad_transport;
630                 ctx->nfs_server.protocol = ret;
631                 break;
632         case Opt_acl:
633                 if (result.negated)
634                         ctx->flags |= NFS_MOUNT_NOACL;
635                 else
636                         ctx->flags &= ~NFS_MOUNT_NOACL;
637                 break;
638         case Opt_rdirplus:
639                 if (result.negated)
640                         ctx->flags |= NFS_MOUNT_NORDIRPLUS;
641                 else
642                         ctx->flags &= ~NFS_MOUNT_NORDIRPLUS;
643                 break;
644         case Opt_sharecache:
645                 if (result.negated)
646                         ctx->flags |= NFS_MOUNT_UNSHARED;
647                 else
648                         ctx->flags &= ~NFS_MOUNT_UNSHARED;
649                 break;
650         case Opt_resvport:
651                 if (result.negated)
652                         ctx->flags |= NFS_MOUNT_NORESVPORT;
653                 else
654                         ctx->flags &= ~NFS_MOUNT_NORESVPORT;
655                 break;
656         case Opt_fscache_flag:
657                 if (result.negated)
658                         ctx->options &= ~NFS_OPTION_FSCACHE;
659                 else
660                         ctx->options |= NFS_OPTION_FSCACHE;
661                 kfree(ctx->fscache_uniq);
662                 ctx->fscache_uniq = NULL;
663                 break;
664         case Opt_fscache:
665                 trace_nfs_mount_assign(param->key, param->string);
666                 ctx->options |= NFS_OPTION_FSCACHE;
667                 kfree(ctx->fscache_uniq);
668                 ctx->fscache_uniq = param->string;
669                 param->string = NULL;
670                 break;
671         case Opt_migration:
672                 if (result.negated)
673                         ctx->options &= ~NFS_OPTION_MIGRATION;
674                 else
675                         ctx->options |= NFS_OPTION_MIGRATION;
676                 break;
677
678                 /*
679                  * options that take numeric values
680                  */
681         case Opt_port:
682                 if (result.uint_32 > USHRT_MAX)
683                         goto out_of_bounds;
684                 ctx->nfs_server.port = result.uint_32;
685                 break;
686         case Opt_rsize:
687                 ctx->rsize = result.uint_32;
688                 break;
689         case Opt_wsize:
690                 ctx->wsize = result.uint_32;
691                 break;
692         case Opt_bsize:
693                 ctx->bsize = result.uint_32;
694                 break;
695         case Opt_timeo:
696                 if (result.uint_32 < 1 || result.uint_32 > INT_MAX)
697                         goto out_of_bounds;
698                 ctx->timeo = result.uint_32;
699                 break;
700         case Opt_retrans:
701                 if (result.uint_32 > INT_MAX)
702                         goto out_of_bounds;
703                 ctx->retrans = result.uint_32;
704                 break;
705         case Opt_acregmin:
706                 ctx->acregmin = result.uint_32;
707                 break;
708         case Opt_acregmax:
709                 ctx->acregmax = result.uint_32;
710                 break;
711         case Opt_acdirmin:
712                 ctx->acdirmin = result.uint_32;
713                 break;
714         case Opt_acdirmax:
715                 ctx->acdirmax = result.uint_32;
716                 break;
717         case Opt_actimeo:
718                 ctx->acregmin = result.uint_32;
719                 ctx->acregmax = result.uint_32;
720                 ctx->acdirmin = result.uint_32;
721                 ctx->acdirmax = result.uint_32;
722                 break;
723         case Opt_namelen:
724                 ctx->namlen = result.uint_32;
725                 break;
726         case Opt_mountport:
727                 if (result.uint_32 > USHRT_MAX)
728                         goto out_of_bounds;
729                 ctx->mount_server.port = result.uint_32;
730                 break;
731         case Opt_mountvers:
732                 if (result.uint_32 < NFS_MNT_VERSION ||
733                     result.uint_32 > NFS_MNT3_VERSION)
734                         goto out_of_bounds;
735                 ctx->mount_server.version = result.uint_32;
736                 break;
737         case Opt_minorversion:
738                 if (result.uint_32 > NFS4_MAX_MINOR_VERSION)
739                         goto out_of_bounds;
740                 ctx->minorversion = result.uint_32;
741                 break;
742
743                 /*
744                  * options that take text values
745                  */
746         case Opt_v:
747                 ret = nfs_parse_version_string(fc, param->key + 1);
748                 if (ret < 0)
749                         return ret;
750                 break;
751         case Opt_vers:
752                 if (!param->string)
753                         goto out_invalid_value;
754                 trace_nfs_mount_assign(param->key, param->string);
755                 ret = nfs_parse_version_string(fc, param->string);
756                 if (ret < 0)
757                         return ret;
758                 break;
759         case Opt_sec:
760                 ret = nfs_parse_security_flavors(fc, param);
761                 if (ret < 0)
762                         return ret;
763                 break;
764         case Opt_xprtsec:
765                 ret = nfs_parse_xprtsec_policy(fc, param);
766                 if (ret < 0)
767                         return ret;
768                 break;
769
770         case Opt_proto:
771                 if (!param->string)
772                         goto out_invalid_value;
773                 trace_nfs_mount_assign(param->key, param->string);
774                 protofamily = AF_INET;
775                 switch (lookup_constant(nfs_xprt_protocol_tokens, param->string, -1)) {
776                 case Opt_xprt_udp6:
777                         protofamily = AF_INET6;
778                         fallthrough;
779                 case Opt_xprt_udp:
780                         ctx->flags &= ~NFS_MOUNT_TCP;
781                         ctx->nfs_server.protocol = XPRT_TRANSPORT_UDP;
782                         break;
783                 case Opt_xprt_tcp6:
784                         protofamily = AF_INET6;
785                         fallthrough;
786                 case Opt_xprt_tcp:
787                         ctx->flags |= NFS_MOUNT_TCP;
788                         ctx->nfs_server.protocol = XPRT_TRANSPORT_TCP;
789                         break;
790                 case Opt_xprt_rdma6:
791                         protofamily = AF_INET6;
792                         fallthrough;
793                 case Opt_xprt_rdma:
794                         /* vector side protocols to TCP */
795                         ctx->flags |= NFS_MOUNT_TCP;
796                         ret = xprt_find_transport_ident(param->string);
797                         if (ret < 0)
798                                 goto out_bad_transport;
799                         ctx->nfs_server.protocol = ret;
800                         break;
801                 default:
802                         goto out_bad_transport;
803                 }
804
805                 ctx->protofamily = protofamily;
806                 break;
807
808         case Opt_mountproto:
809                 if (!param->string)
810                         goto out_invalid_value;
811                 trace_nfs_mount_assign(param->key, param->string);
812                 mountfamily = AF_INET;
813                 switch (lookup_constant(nfs_xprt_protocol_tokens, param->string, -1)) {
814                 case Opt_xprt_udp6:
815                         mountfamily = AF_INET6;
816                         fallthrough;
817                 case Opt_xprt_udp:
818                         ctx->mount_server.protocol = XPRT_TRANSPORT_UDP;
819                         break;
820                 case Opt_xprt_tcp6:
821                         mountfamily = AF_INET6;
822                         fallthrough;
823                 case Opt_xprt_tcp:
824                         ctx->mount_server.protocol = XPRT_TRANSPORT_TCP;
825                         break;
826                 case Opt_xprt_rdma: /* not used for side protocols */
827                 default:
828                         goto out_bad_transport;
829                 }
830                 ctx->mountfamily = mountfamily;
831                 break;
832
833         case Opt_addr:
834                 trace_nfs_mount_assign(param->key, param->string);
835                 len = rpc_pton(fc->net_ns, param->string, param->size,
836                                &ctx->nfs_server.address,
837                                sizeof(ctx->nfs_server._address));
838                 if (len == 0)
839                         goto out_invalid_address;
840                 ctx->nfs_server.addrlen = len;
841                 break;
842         case Opt_clientaddr:
843                 trace_nfs_mount_assign(param->key, param->string);
844                 kfree(ctx->client_address);
845                 ctx->client_address = param->string;
846                 param->string = NULL;
847                 break;
848         case Opt_mounthost:
849                 trace_nfs_mount_assign(param->key, param->string);
850                 kfree(ctx->mount_server.hostname);
851                 ctx->mount_server.hostname = param->string;
852                 param->string = NULL;
853                 break;
854         case Opt_mountaddr:
855                 trace_nfs_mount_assign(param->key, param->string);
856                 len = rpc_pton(fc->net_ns, param->string, param->size,
857                                &ctx->mount_server.address,
858                                sizeof(ctx->mount_server._address));
859                 if (len == 0)
860                         goto out_invalid_address;
861                 ctx->mount_server.addrlen = len;
862                 break;
863         case Opt_nconnect:
864                 trace_nfs_mount_assign(param->key, param->string);
865                 if (result.uint_32 < 1 || result.uint_32 > NFS_MAX_CONNECTIONS)
866                         goto out_of_bounds;
867                 ctx->nfs_server.nconnect = result.uint_32;
868                 break;
869         case Opt_max_connect:
870                 trace_nfs_mount_assign(param->key, param->string);
871                 if (result.uint_32 < 1 || result.uint_32 > NFS_MAX_TRANSPORTS)
872                         goto out_of_bounds;
873                 ctx->nfs_server.max_connect = result.uint_32;
874                 break;
875         case Opt_lookupcache:
876                 trace_nfs_mount_assign(param->key, param->string);
877                 switch (result.uint_32) {
878                 case Opt_lookupcache_all:
879                         ctx->flags &= ~(NFS_MOUNT_LOOKUP_CACHE_NONEG|NFS_MOUNT_LOOKUP_CACHE_NONE);
880                         break;
881                 case Opt_lookupcache_positive:
882                         ctx->flags &= ~NFS_MOUNT_LOOKUP_CACHE_NONE;
883                         ctx->flags |= NFS_MOUNT_LOOKUP_CACHE_NONEG;
884                         break;
885                 case Opt_lookupcache_none:
886                         ctx->flags |= NFS_MOUNT_LOOKUP_CACHE_NONEG|NFS_MOUNT_LOOKUP_CACHE_NONE;
887                         break;
888                 default:
889                         goto out_invalid_value;
890                 }
891                 break;
892         case Opt_local_lock:
893                 trace_nfs_mount_assign(param->key, param->string);
894                 switch (result.uint_32) {
895                 case Opt_local_lock_all:
896                         ctx->flags |= (NFS_MOUNT_LOCAL_FLOCK |
897                                        NFS_MOUNT_LOCAL_FCNTL);
898                         break;
899                 case Opt_local_lock_flock:
900                         ctx->flags |= NFS_MOUNT_LOCAL_FLOCK;
901                         break;
902                 case Opt_local_lock_posix:
903                         ctx->flags |= NFS_MOUNT_LOCAL_FCNTL;
904                         break;
905                 case Opt_local_lock_none:
906                         ctx->flags &= ~(NFS_MOUNT_LOCAL_FLOCK |
907                                         NFS_MOUNT_LOCAL_FCNTL);
908                         break;
909                 default:
910                         goto out_invalid_value;
911                 }
912                 break;
913         case Opt_write:
914                 trace_nfs_mount_assign(param->key, param->string);
915                 switch (result.uint_32) {
916                 case Opt_write_lazy:
917                         ctx->flags &=
918                                 ~(NFS_MOUNT_WRITE_EAGER | NFS_MOUNT_WRITE_WAIT);
919                         break;
920                 case Opt_write_eager:
921                         ctx->flags |= NFS_MOUNT_WRITE_EAGER;
922                         ctx->flags &= ~NFS_MOUNT_WRITE_WAIT;
923                         break;
924                 case Opt_write_wait:
925                         ctx->flags |=
926                                 NFS_MOUNT_WRITE_EAGER | NFS_MOUNT_WRITE_WAIT;
927                         break;
928                 default:
929                         goto out_invalid_value;
930                 }
931                 break;
932
933                 /*
934                  * Special options
935                  */
936         case Opt_sloppy:
937                 ctx->sloppy = true;
938                 break;
939         }
940
941         return 0;
942
943 out_invalid_value:
944         return nfs_invalf(fc, "NFS: Bad mount option value specified");
945 out_invalid_address:
946         return nfs_invalf(fc, "NFS: Bad IP address specified");
947 out_of_bounds:
948         return nfs_invalf(fc, "NFS: Value for '%s' out of range", param->key);
949 out_bad_transport:
950         return nfs_invalf(fc, "NFS: Unrecognized transport protocol");
951 }
952
953 /*
954  * Split fc->source into "hostname:export_path".
955  *
956  * The leftmost colon demarks the split between the server's hostname
957  * and the export path.  If the hostname starts with a left square
958  * bracket, then it may contain colons.
959  *
960  * Note: caller frees hostname and export path, even on error.
961  */
962 static int nfs_parse_source(struct fs_context *fc,
963                             size_t maxnamlen, size_t maxpathlen)
964 {
965         struct nfs_fs_context *ctx = nfs_fc2context(fc);
966         const char *dev_name = fc->source;
967         size_t len;
968         const char *end;
969
970         if (unlikely(!dev_name || !*dev_name))
971                 return -EINVAL;
972
973         /* Is the host name protected with square brakcets? */
974         if (*dev_name == '[') {
975                 end = strchr(++dev_name, ']');
976                 if (end == NULL || end[1] != ':')
977                         goto out_bad_devname;
978
979                 len = end - dev_name;
980                 end++;
981         } else {
982                 const char *comma;
983
984                 end = strchr(dev_name, ':');
985                 if (end == NULL)
986                         goto out_bad_devname;
987                 len = end - dev_name;
988
989                 /* kill possible hostname list: not supported */
990                 comma = memchr(dev_name, ',', len);
991                 if (comma)
992                         len = comma - dev_name;
993         }
994
995         if (len > maxnamlen)
996                 goto out_hostname;
997
998         kfree(ctx->nfs_server.hostname);
999
1000         /* N.B. caller will free nfs_server.hostname in all cases */
1001         ctx->nfs_server.hostname = kmemdup_nul(dev_name, len, GFP_KERNEL);
1002         if (!ctx->nfs_server.hostname)
1003                 goto out_nomem;
1004         len = strlen(++end);
1005         if (len > maxpathlen)
1006                 goto out_path;
1007         ctx->nfs_server.export_path = kmemdup_nul(end, len, GFP_KERNEL);
1008         if (!ctx->nfs_server.export_path)
1009                 goto out_nomem;
1010
1011         trace_nfs_mount_path(ctx->nfs_server.export_path);
1012         return 0;
1013
1014 out_bad_devname:
1015         return nfs_invalf(fc, "NFS: device name not in host:path format");
1016 out_nomem:
1017         nfs_errorf(fc, "NFS: not enough memory to parse device name");
1018         return -ENOMEM;
1019 out_hostname:
1020         nfs_errorf(fc, "NFS: server hostname too long");
1021         return -ENAMETOOLONG;
1022 out_path:
1023         nfs_errorf(fc, "NFS: export pathname too long");
1024         return -ENAMETOOLONG;
1025 }
1026
1027 static inline bool is_remount_fc(struct fs_context *fc)
1028 {
1029         return fc->root != NULL;
1030 }
1031
1032 /*
1033  * Parse monolithic NFS2/NFS3 mount data
1034  * - fills in the mount root filehandle
1035  *
1036  * For option strings, user space handles the following behaviors:
1037  *
1038  * + DNS: mapping server host name to IP address ("addr=" option)
1039  *
1040  * + failure mode: how to behave if a mount request can't be handled
1041  *   immediately ("fg/bg" option)
1042  *
1043  * + retry: how often to retry a mount request ("retry=" option)
1044  *
1045  * + breaking back: trying proto=udp after proto=tcp, v2 after v3,
1046  *   mountproto=tcp after mountproto=udp, and so on
1047  */
1048 static int nfs23_parse_monolithic(struct fs_context *fc,
1049                                   struct nfs_mount_data *data)
1050 {
1051         struct nfs_fs_context *ctx = nfs_fc2context(fc);
1052         struct nfs_fh *mntfh = ctx->mntfh;
1053         struct sockaddr_storage *sap = &ctx->nfs_server._address;
1054         int extra_flags = NFS_MOUNT_LEGACY_INTERFACE;
1055         int ret;
1056
1057         if (data == NULL)
1058                 goto out_no_data;
1059
1060         ctx->version = NFS_DEFAULT_VERSION;
1061         switch (data->version) {
1062         case 1:
1063                 data->namlen = 0;
1064                 fallthrough;
1065         case 2:
1066                 data->bsize = 0;
1067                 fallthrough;
1068         case 3:
1069                 if (data->flags & NFS_MOUNT_VER3)
1070                         goto out_no_v3;
1071                 data->root.size = NFS2_FHSIZE;
1072                 memcpy(data->root.data, data->old_root.data, NFS2_FHSIZE);
1073                 /* Turn off security negotiation */
1074                 extra_flags |= NFS_MOUNT_SECFLAVOUR;
1075                 fallthrough;
1076         case 4:
1077                 if (data->flags & NFS_MOUNT_SECFLAVOUR)
1078                         goto out_no_sec;
1079                 fallthrough;
1080         case 5:
1081                 memset(data->context, 0, sizeof(data->context));
1082                 fallthrough;
1083         case 6:
1084                 if (data->flags & NFS_MOUNT_VER3) {
1085                         if (data->root.size > NFS3_FHSIZE || data->root.size == 0)
1086                                 goto out_invalid_fh;
1087                         mntfh->size = data->root.size;
1088                         ctx->version = 3;
1089                 } else {
1090                         mntfh->size = NFS2_FHSIZE;
1091                         ctx->version = 2;
1092                 }
1093
1094
1095                 memcpy(mntfh->data, data->root.data, mntfh->size);
1096                 if (mntfh->size < sizeof(mntfh->data))
1097                         memset(mntfh->data + mntfh->size, 0,
1098                                sizeof(mntfh->data) - mntfh->size);
1099
1100                 /*
1101                  * for proto == XPRT_TRANSPORT_UDP, which is what uses
1102                  * to_exponential, implying shift: limit the shift value
1103                  * to BITS_PER_LONG (majortimeo is unsigned long)
1104                  */
1105                 if (!(data->flags & NFS_MOUNT_TCP)) /* this will be UDP */
1106                         if (data->retrans >= 64) /* shift value is too large */
1107                                 goto out_invalid_data;
1108
1109                 /*
1110                  * Translate to nfs_fs_context, which nfs_fill_super
1111                  * can deal with.
1112                  */
1113                 ctx->flags      = data->flags & NFS_MOUNT_FLAGMASK;
1114                 ctx->flags      |= extra_flags;
1115                 ctx->rsize      = data->rsize;
1116                 ctx->wsize      = data->wsize;
1117                 ctx->timeo      = data->timeo;
1118                 ctx->retrans    = data->retrans;
1119                 ctx->acregmin   = data->acregmin;
1120                 ctx->acregmax   = data->acregmax;
1121                 ctx->acdirmin   = data->acdirmin;
1122                 ctx->acdirmax   = data->acdirmax;
1123                 ctx->need_mount = false;
1124
1125                 if (!is_remount_fc(fc)) {
1126                         memcpy(sap, &data->addr, sizeof(data->addr));
1127                         ctx->nfs_server.addrlen = sizeof(data->addr);
1128                         ctx->nfs_server.port = ntohs(data->addr.sin_port);
1129                 }
1130
1131                 if (sap->ss_family != AF_INET ||
1132                     !nfs_verify_server_address(sap))
1133                         goto out_no_address;
1134
1135                 if (!(data->flags & NFS_MOUNT_TCP))
1136                         ctx->nfs_server.protocol = XPRT_TRANSPORT_UDP;
1137                 /* N.B. caller will free nfs_server.hostname in all cases */
1138                 ctx->nfs_server.hostname = kstrdup(data->hostname, GFP_KERNEL);
1139                 if (!ctx->nfs_server.hostname)
1140                         goto out_nomem;
1141
1142                 ctx->namlen             = data->namlen;
1143                 ctx->bsize              = data->bsize;
1144
1145                 if (data->flags & NFS_MOUNT_SECFLAVOUR)
1146                         ctx->selected_flavor = data->pseudoflavor;
1147                 else
1148                         ctx->selected_flavor = RPC_AUTH_UNIX;
1149
1150                 if (!(data->flags & NFS_MOUNT_NONLM))
1151                         ctx->flags &= ~(NFS_MOUNT_LOCAL_FLOCK|
1152                                          NFS_MOUNT_LOCAL_FCNTL);
1153                 else
1154                         ctx->flags |= (NFS_MOUNT_LOCAL_FLOCK|
1155                                         NFS_MOUNT_LOCAL_FCNTL);
1156
1157                 /*
1158                  * The legacy version 6 binary mount data from userspace has a
1159                  * field used only to transport selinux information into the
1160                  * kernel.  To continue to support that functionality we
1161                  * have a touch of selinux knowledge here in the NFS code. The
1162                  * userspace code converted context=blah to just blah so we are
1163                  * converting back to the full string selinux understands.
1164                  */
1165                 if (data->context[0]){
1166 #ifdef CONFIG_SECURITY_SELINUX
1167                         int ret;
1168
1169                         data->context[NFS_MAX_CONTEXT_LEN] = '\0';
1170                         ret = vfs_parse_fs_string(fc, "context",
1171                                                   data->context, strlen(data->context));
1172                         if (ret < 0)
1173                                 return ret;
1174 #else
1175                         return -EINVAL;
1176 #endif
1177                 }
1178
1179                 break;
1180         default:
1181                 goto generic;
1182         }
1183
1184         ret = nfs_validate_transport_protocol(fc, ctx);
1185         if (ret)
1186                 return ret;
1187
1188         ctx->skip_reconfig_option_check = true;
1189         return 0;
1190
1191 generic:
1192         return generic_parse_monolithic(fc, data);
1193
1194 out_no_data:
1195         if (is_remount_fc(fc)) {
1196                 ctx->skip_reconfig_option_check = true;
1197                 return 0;
1198         }
1199         return nfs_invalf(fc, "NFS: mount program didn't pass any mount data");
1200
1201 out_no_v3:
1202         return nfs_invalf(fc, "NFS: nfs_mount_data version does not support v3");
1203
1204 out_no_sec:
1205         return nfs_invalf(fc, "NFS: nfs_mount_data version supports only AUTH_SYS");
1206
1207 out_nomem:
1208         return -ENOMEM;
1209
1210 out_no_address:
1211         return nfs_invalf(fc, "NFS: mount program didn't pass remote address");
1212
1213 out_invalid_fh:
1214         return nfs_invalf(fc, "NFS: invalid root filehandle");
1215
1216 out_invalid_data:
1217         return nfs_invalf(fc, "NFS: invalid binary mount data");
1218 }
1219
1220 #if IS_ENABLED(CONFIG_NFS_V4)
1221 struct compat_nfs_string {
1222         compat_uint_t len;
1223         compat_uptr_t data;
1224 };
1225
1226 static inline void compat_nfs_string(struct nfs_string *dst,
1227                                      struct compat_nfs_string *src)
1228 {
1229         dst->data = compat_ptr(src->data);
1230         dst->len = src->len;
1231 }
1232
1233 struct compat_nfs4_mount_data_v1 {
1234         compat_int_t version;
1235         compat_int_t flags;
1236         compat_int_t rsize;
1237         compat_int_t wsize;
1238         compat_int_t timeo;
1239         compat_int_t retrans;
1240         compat_int_t acregmin;
1241         compat_int_t acregmax;
1242         compat_int_t acdirmin;
1243         compat_int_t acdirmax;
1244         struct compat_nfs_string client_addr;
1245         struct compat_nfs_string mnt_path;
1246         struct compat_nfs_string hostname;
1247         compat_uint_t host_addrlen;
1248         compat_uptr_t host_addr;
1249         compat_int_t proto;
1250         compat_int_t auth_flavourlen;
1251         compat_uptr_t auth_flavours;
1252 };
1253
1254 static void nfs4_compat_mount_data_conv(struct nfs4_mount_data *data)
1255 {
1256         struct compat_nfs4_mount_data_v1 *compat =
1257                         (struct compat_nfs4_mount_data_v1 *)data;
1258
1259         /* copy the fields backwards */
1260         data->auth_flavours = compat_ptr(compat->auth_flavours);
1261         data->auth_flavourlen = compat->auth_flavourlen;
1262         data->proto = compat->proto;
1263         data->host_addr = compat_ptr(compat->host_addr);
1264         data->host_addrlen = compat->host_addrlen;
1265         compat_nfs_string(&data->hostname, &compat->hostname);
1266         compat_nfs_string(&data->mnt_path, &compat->mnt_path);
1267         compat_nfs_string(&data->client_addr, &compat->client_addr);
1268         data->acdirmax = compat->acdirmax;
1269         data->acdirmin = compat->acdirmin;
1270         data->acregmax = compat->acregmax;
1271         data->acregmin = compat->acregmin;
1272         data->retrans = compat->retrans;
1273         data->timeo = compat->timeo;
1274         data->wsize = compat->wsize;
1275         data->rsize = compat->rsize;
1276         data->flags = compat->flags;
1277         data->version = compat->version;
1278 }
1279
1280 /*
1281  * Validate NFSv4 mount options
1282  */
1283 static int nfs4_parse_monolithic(struct fs_context *fc,
1284                                  struct nfs4_mount_data *data)
1285 {
1286         struct nfs_fs_context *ctx = nfs_fc2context(fc);
1287         struct sockaddr_storage *sap = &ctx->nfs_server._address;
1288         int ret;
1289         char *c;
1290
1291         if (!data) {
1292                 if (is_remount_fc(fc))
1293                         goto done;
1294                 return nfs_invalf(fc,
1295                         "NFS4: mount program didn't pass any mount data");
1296         }
1297
1298         ctx->version = 4;
1299
1300         if (data->version != 1)
1301                 return generic_parse_monolithic(fc, data);
1302
1303         if (in_compat_syscall())
1304                 nfs4_compat_mount_data_conv(data);
1305
1306         if (data->host_addrlen > sizeof(ctx->nfs_server.address))
1307                 goto out_no_address;
1308         if (data->host_addrlen == 0)
1309                 goto out_no_address;
1310         ctx->nfs_server.addrlen = data->host_addrlen;
1311         if (copy_from_user(sap, data->host_addr, data->host_addrlen))
1312                 return -EFAULT;
1313         if (!nfs_verify_server_address(sap))
1314                 goto out_no_address;
1315         ctx->nfs_server.port = ntohs(((struct sockaddr_in *)sap)->sin_port);
1316
1317         if (data->auth_flavourlen) {
1318                 rpc_authflavor_t pseudoflavor;
1319
1320                 if (data->auth_flavourlen > 1)
1321                         goto out_inval_auth;
1322                 if (copy_from_user(&pseudoflavor, data->auth_flavours,
1323                                    sizeof(pseudoflavor)))
1324                         return -EFAULT;
1325                 ctx->selected_flavor = pseudoflavor;
1326         } else {
1327                 ctx->selected_flavor = RPC_AUTH_UNIX;
1328         }
1329
1330         c = strndup_user(data->hostname.data, NFS4_MAXNAMLEN);
1331         if (IS_ERR(c))
1332                 return PTR_ERR(c);
1333         ctx->nfs_server.hostname = c;
1334
1335         c = strndup_user(data->mnt_path.data, NFS4_MAXPATHLEN);
1336         if (IS_ERR(c))
1337                 return PTR_ERR(c);
1338         ctx->nfs_server.export_path = c;
1339         trace_nfs_mount_path(c);
1340
1341         c = strndup_user(data->client_addr.data, 16);
1342         if (IS_ERR(c))
1343                 return PTR_ERR(c);
1344         ctx->client_address = c;
1345
1346         /*
1347          * Translate to nfs_fs_context, which nfs_fill_super
1348          * can deal with.
1349          */
1350
1351         ctx->flags      = data->flags & NFS4_MOUNT_FLAGMASK;
1352         ctx->rsize      = data->rsize;
1353         ctx->wsize      = data->wsize;
1354         ctx->timeo      = data->timeo;
1355         ctx->retrans    = data->retrans;
1356         ctx->acregmin   = data->acregmin;
1357         ctx->acregmax   = data->acregmax;
1358         ctx->acdirmin   = data->acdirmin;
1359         ctx->acdirmax   = data->acdirmax;
1360         ctx->nfs_server.protocol = data->proto;
1361         ret = nfs_validate_transport_protocol(fc, ctx);
1362         if (ret)
1363                 return ret;
1364 done:
1365         ctx->skip_reconfig_option_check = true;
1366         return 0;
1367
1368 out_inval_auth:
1369         return nfs_invalf(fc, "NFS4: Invalid number of RPC auth flavours %d",
1370                       data->auth_flavourlen);
1371
1372 out_no_address:
1373         return nfs_invalf(fc, "NFS4: mount program didn't pass remote address");
1374 }
1375 #endif
1376
1377 /*
1378  * Parse a monolithic block of data from sys_mount().
1379  */
1380 static int nfs_fs_context_parse_monolithic(struct fs_context *fc,
1381                                            void *data)
1382 {
1383         if (fc->fs_type == &nfs_fs_type)
1384                 return nfs23_parse_monolithic(fc, data);
1385
1386 #if IS_ENABLED(CONFIG_NFS_V4)
1387         if (fc->fs_type == &nfs4_fs_type)
1388                 return nfs4_parse_monolithic(fc, data);
1389 #endif
1390
1391         return nfs_invalf(fc, "NFS: Unsupported monolithic data version");
1392 }
1393
1394 /*
1395  * Validate the preparsed information in the config.
1396  */
1397 static int nfs_fs_context_validate(struct fs_context *fc)
1398 {
1399         struct nfs_fs_context *ctx = nfs_fc2context(fc);
1400         struct nfs_subversion *nfs_mod;
1401         struct sockaddr_storage *sap = &ctx->nfs_server._address;
1402         int max_namelen = PAGE_SIZE;
1403         int max_pathlen = NFS_MAXPATHLEN;
1404         int port = 0;
1405         int ret;
1406
1407         if (!fc->source)
1408                 goto out_no_device_name;
1409
1410         /* Check for sanity first. */
1411         if (ctx->minorversion && ctx->version != 4)
1412                 goto out_minorversion_mismatch;
1413
1414         if (ctx->options & NFS_OPTION_MIGRATION &&
1415             (ctx->version != 4 || ctx->minorversion != 0))
1416                 goto out_migration_misuse;
1417
1418         /* Verify that any proto=/mountproto= options match the address
1419          * families in the addr=/mountaddr= options.
1420          */
1421         if (ctx->protofamily != AF_UNSPEC &&
1422             ctx->protofamily != ctx->nfs_server.address.sa_family)
1423                 goto out_proto_mismatch;
1424
1425         if (ctx->mountfamily != AF_UNSPEC) {
1426                 if (ctx->mount_server.addrlen) {
1427                         if (ctx->mountfamily != ctx->mount_server.address.sa_family)
1428                                 goto out_mountproto_mismatch;
1429                 } else {
1430                         if (ctx->mountfamily != ctx->nfs_server.address.sa_family)
1431                                 goto out_mountproto_mismatch;
1432                 }
1433         }
1434
1435         if (!nfs_verify_server_address(sap))
1436                 goto out_no_address;
1437
1438         ret = nfs_validate_transport_protocol(fc, ctx);
1439         if (ret)
1440                 return ret;
1441
1442         if (ctx->version == 4) {
1443                 if (IS_ENABLED(CONFIG_NFS_V4)) {
1444                         if (ctx->nfs_server.protocol == XPRT_TRANSPORT_RDMA)
1445                                 port = NFS_RDMA_PORT;
1446                         else
1447                                 port = NFS_PORT;
1448                         max_namelen = NFS4_MAXNAMLEN;
1449                         max_pathlen = NFS4_MAXPATHLEN;
1450                         ctx->flags &= ~(NFS_MOUNT_NONLM | NFS_MOUNT_NOACL |
1451                                         NFS_MOUNT_VER3 | NFS_MOUNT_LOCAL_FLOCK |
1452                                         NFS_MOUNT_LOCAL_FCNTL);
1453                 } else {
1454                         goto out_v4_not_compiled;
1455                 }
1456         } else {
1457                 nfs_set_mount_transport_protocol(ctx);
1458                 if (ctx->nfs_server.protocol == XPRT_TRANSPORT_RDMA)
1459                         port = NFS_RDMA_PORT;
1460         }
1461
1462         nfs_set_port(sap, &ctx->nfs_server.port, port);
1463
1464         ret = nfs_parse_source(fc, max_namelen, max_pathlen);
1465         if (ret < 0)
1466                 return ret;
1467
1468         /* Load the NFS protocol module if we haven't done so yet */
1469         if (!ctx->nfs_mod) {
1470                 nfs_mod = find_nfs_version(ctx->version);
1471                 if (IS_ERR(nfs_mod)) {
1472                         ret = PTR_ERR(nfs_mod);
1473                         goto out_version_unavailable;
1474                 }
1475                 ctx->nfs_mod = nfs_mod;
1476         }
1477
1478         /* Ensure the filesystem context has the correct fs_type */
1479         if (fc->fs_type != ctx->nfs_mod->nfs_fs) {
1480                 module_put(fc->fs_type->owner);
1481                 __module_get(ctx->nfs_mod->nfs_fs->owner);
1482                 fc->fs_type = ctx->nfs_mod->nfs_fs;
1483         }
1484         return 0;
1485
1486 out_no_device_name:
1487         return nfs_invalf(fc, "NFS: Device name not specified");
1488 out_v4_not_compiled:
1489         nfs_errorf(fc, "NFS: NFSv4 is not compiled into kernel");
1490         return -EPROTONOSUPPORT;
1491 out_no_address:
1492         return nfs_invalf(fc, "NFS: mount program didn't pass remote address");
1493 out_mountproto_mismatch:
1494         return nfs_invalf(fc, "NFS: Mount server address does not match mountproto= option");
1495 out_proto_mismatch:
1496         return nfs_invalf(fc, "NFS: Server address does not match proto= option");
1497 out_minorversion_mismatch:
1498         return nfs_invalf(fc, "NFS: Mount option vers=%u does not support minorversion=%u",
1499                           ctx->version, ctx->minorversion);
1500 out_migration_misuse:
1501         return nfs_invalf(fc, "NFS: 'Migration' not supported for this NFS version");
1502 out_version_unavailable:
1503         nfs_errorf(fc, "NFS: Version unavailable");
1504         return ret;
1505 }
1506
1507 /*
1508  * Create an NFS superblock by the appropriate method.
1509  */
1510 static int nfs_get_tree(struct fs_context *fc)
1511 {
1512         struct nfs_fs_context *ctx = nfs_fc2context(fc);
1513         int err = nfs_fs_context_validate(fc);
1514
1515         if (err)
1516                 return err;
1517         if (!ctx->internal)
1518                 return ctx->nfs_mod->rpc_ops->try_get_tree(fc);
1519         else
1520                 return nfs_get_tree_common(fc);
1521 }
1522
1523 /*
1524  * Handle duplication of a configuration.  The caller copied *src into *sc, but
1525  * it can't deal with resource pointers in the filesystem context, so we have
1526  * to do that.  We need to clear pointers, copy data or get extra refs as
1527  * appropriate.
1528  */
1529 static int nfs_fs_context_dup(struct fs_context *fc, struct fs_context *src_fc)
1530 {
1531         struct nfs_fs_context *src = nfs_fc2context(src_fc), *ctx;
1532
1533         ctx = kmemdup(src, sizeof(struct nfs_fs_context), GFP_KERNEL);
1534         if (!ctx)
1535                 return -ENOMEM;
1536
1537         ctx->mntfh = nfs_alloc_fhandle();
1538         if (!ctx->mntfh) {
1539                 kfree(ctx);
1540                 return -ENOMEM;
1541         }
1542         nfs_copy_fh(ctx->mntfh, src->mntfh);
1543
1544         get_nfs_version(ctx->nfs_mod);
1545         ctx->client_address             = NULL;
1546         ctx->mount_server.hostname      = NULL;
1547         ctx->nfs_server.export_path     = NULL;
1548         ctx->nfs_server.hostname        = NULL;
1549         ctx->fscache_uniq               = NULL;
1550         ctx->clone_data.fattr           = NULL;
1551         fc->fs_private = ctx;
1552         return 0;
1553 }
1554
1555 static void nfs_fs_context_free(struct fs_context *fc)
1556 {
1557         struct nfs_fs_context *ctx = nfs_fc2context(fc);
1558
1559         if (ctx) {
1560                 if (ctx->server)
1561                         nfs_free_server(ctx->server);
1562                 if (ctx->nfs_mod)
1563                         put_nfs_version(ctx->nfs_mod);
1564                 kfree(ctx->client_address);
1565                 kfree(ctx->mount_server.hostname);
1566                 kfree(ctx->nfs_server.export_path);
1567                 kfree(ctx->nfs_server.hostname);
1568                 kfree(ctx->fscache_uniq);
1569                 nfs_free_fhandle(ctx->mntfh);
1570                 nfs_free_fattr(ctx->clone_data.fattr);
1571                 kfree(ctx);
1572         }
1573 }
1574
1575 static const struct fs_context_operations nfs_fs_context_ops = {
1576         .free                   = nfs_fs_context_free,
1577         .dup                    = nfs_fs_context_dup,
1578         .parse_param            = nfs_fs_context_parse_param,
1579         .parse_monolithic       = nfs_fs_context_parse_monolithic,
1580         .get_tree               = nfs_get_tree,
1581         .reconfigure            = nfs_reconfigure,
1582 };
1583
1584 /*
1585  * Prepare superblock configuration.  We use the namespaces attached to the
1586  * context.  This may be the current process's namespaces, or it may be a
1587  * container's namespaces.
1588  */
1589 static int nfs_init_fs_context(struct fs_context *fc)
1590 {
1591         struct nfs_fs_context *ctx;
1592
1593         ctx = kzalloc(sizeof(struct nfs_fs_context), GFP_KERNEL);
1594         if (unlikely(!ctx))
1595                 return -ENOMEM;
1596
1597         ctx->mntfh = nfs_alloc_fhandle();
1598         if (unlikely(!ctx->mntfh)) {
1599                 kfree(ctx);
1600                 return -ENOMEM;
1601         }
1602
1603         ctx->protofamily        = AF_UNSPEC;
1604         ctx->mountfamily        = AF_UNSPEC;
1605         ctx->mount_server.port  = NFS_UNSPEC_PORT;
1606
1607         if (fc->root) {
1608                 /* reconfigure, start with the current config */
1609                 struct nfs_server *nfss = fc->root->d_sb->s_fs_info;
1610                 struct net *net = nfss->nfs_client->cl_net;
1611
1612                 ctx->flags              = nfss->flags;
1613                 ctx->rsize              = nfss->rsize;
1614                 ctx->wsize              = nfss->wsize;
1615                 ctx->retrans            = nfss->client->cl_timeout->to_retries;
1616                 ctx->selected_flavor    = nfss->client->cl_auth->au_flavor;
1617                 ctx->acregmin           = nfss->acregmin / HZ;
1618                 ctx->acregmax           = nfss->acregmax / HZ;
1619                 ctx->acdirmin           = nfss->acdirmin / HZ;
1620                 ctx->acdirmax           = nfss->acdirmax / HZ;
1621                 ctx->timeo              = 10U * nfss->client->cl_timeout->to_initval / HZ;
1622                 ctx->nfs_server.port    = nfss->port;
1623                 ctx->nfs_server.addrlen = nfss->nfs_client->cl_addrlen;
1624                 ctx->version            = nfss->nfs_client->rpc_ops->version;
1625                 ctx->minorversion       = nfss->nfs_client->cl_minorversion;
1626
1627                 memcpy(&ctx->nfs_server._address, &nfss->nfs_client->cl_addr,
1628                         ctx->nfs_server.addrlen);
1629
1630                 if (fc->net_ns != net) {
1631                         put_net(fc->net_ns);
1632                         fc->net_ns = get_net(net);
1633                 }
1634
1635                 ctx->nfs_mod = nfss->nfs_client->cl_nfs_mod;
1636                 get_nfs_version(ctx->nfs_mod);
1637         } else {
1638                 /* defaults */
1639                 ctx->timeo              = NFS_UNSPEC_TIMEO;
1640                 ctx->retrans            = NFS_UNSPEC_RETRANS;
1641                 ctx->acregmin           = NFS_DEF_ACREGMIN;
1642                 ctx->acregmax           = NFS_DEF_ACREGMAX;
1643                 ctx->acdirmin           = NFS_DEF_ACDIRMIN;
1644                 ctx->acdirmax           = NFS_DEF_ACDIRMAX;
1645                 ctx->nfs_server.port    = NFS_UNSPEC_PORT;
1646                 ctx->nfs_server.protocol = XPRT_TRANSPORT_TCP;
1647                 ctx->selected_flavor    = RPC_AUTH_MAXFLAVOR;
1648                 ctx->minorversion       = 0;
1649                 ctx->need_mount         = true;
1650                 ctx->xprtsec.policy     = RPC_XPRTSEC_NONE;
1651                 ctx->xprtsec.cert_serial        = TLS_NO_CERT;
1652                 ctx->xprtsec.privkey_serial     = TLS_NO_PRIVKEY;
1653
1654                 fc->s_iflags            |= SB_I_STABLE_WRITES;
1655         }
1656         fc->fs_private = ctx;
1657         fc->ops = &nfs_fs_context_ops;
1658         return 0;
1659 }
1660
1661 struct file_system_type nfs_fs_type = {
1662         .owner                  = THIS_MODULE,
1663         .name                   = "nfs",
1664         .init_fs_context        = nfs_init_fs_context,
1665         .parameters             = nfs_fs_parameters,
1666         .kill_sb                = nfs_kill_super,
1667         .fs_flags               = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
1668 };
1669 MODULE_ALIAS_FS("nfs");
1670 EXPORT_SYMBOL_GPL(nfs_fs_type);
1671
1672 #if IS_ENABLED(CONFIG_NFS_V4)
1673 struct file_system_type nfs4_fs_type = {
1674         .owner                  = THIS_MODULE,
1675         .name                   = "nfs4",
1676         .init_fs_context        = nfs_init_fs_context,
1677         .parameters             = nfs_fs_parameters,
1678         .kill_sb                = nfs_kill_super,
1679         .fs_flags               = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
1680 };
1681 MODULE_ALIAS_FS("nfs4");
1682 MODULE_ALIAS("nfs4");
1683 EXPORT_SYMBOL_GPL(nfs4_fs_type);
1684 #endif /* CONFIG_NFS_V4 */
This page took 0.123138 seconds and 4 git commands to generate.