~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/nfs/fs_context.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/nfs/fs_context.c (Version linux-6.12-rc7) and /fs/nfs/fs_context.c (Version linux-5.19.17)


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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php