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
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.