1 /* 2 * linux/fs/nfs/super.c 3 * 4 * Copyright (C) 1992 Rick Sladkey 5 * 6 * nfs superblock handling functions 7 * 8 * Modularised by Alan Cox <alan@lxorguk.ukuu.org.uk>, while hacking some 9 * experimental NFS changes. Modularisation taken straight from SYS5 fs. 10 * 11 * Change to nfs_read_super() to permit NFS mounts to multi-homed hosts. 12 * J.S.Peatfield@damtp.cam.ac.uk 13 * 14 * Split from inode.c by David Howells <dhowells@redhat.com> 15 * 16 * - superblocks are indexed on server only - all inodes, dentries, etc. associated with a 17 * particular server are held in the same superblock 18 * - NFS superblocks can have several effective roots to the dentry tree 19 * - directory type roots are spliced into the tree when a path from one root reaches the root 20 * of another (see nfs_lookup()) 21 */ 22 23 #include <linux/module.h> 24 #include <linux/init.h> 25 26 #include <linux/time.h> 27 #include <linux/kernel.h> 28 #include <linux/mm.h> 29 #include <linux/string.h> 30 #include <linux/stat.h> 31 #include <linux/errno.h> 32 #include <linux/unistd.h> 33 #include <linux/sunrpc/clnt.h> 34 #include <linux/sunrpc/stats.h> 35 #include <linux/sunrpc/metrics.h> 36 #include <linux/sunrpc/xprtsock.h> 37 #include <linux/sunrpc/xprtrdma.h> 38 #include <linux/nfs_fs.h> 39 #include <linux/nfs_mount.h> 40 #include <linux/nfs4_mount.h> 41 #include <linux/lockd/bind.h> 42 #include <linux/smp_lock.h> 43 #include <linux/seq_file.h> 44 #include <linux/mount.h> 45 #include <linux/nfs_idmap.h> 46 #include <linux/vfs.h> 47 #include <linux/inet.h> 48 #include <linux/in6.h> 49 #include <net/ipv6.h> 50 #include <linux/netdevice.h> 51 #include <linux/nfs_xdr.h> 52 #include <linux/magic.h> 53 #include <linux/parser.h> 54 55 #include <asm/system.h> 56 #include <asm/uaccess.h> 57 58 #include "nfs4_fs.h" 59 #include "callback.h" 60 #include "delegation.h" 61 #include "iostat.h" 62 #include "internal.h" 63 #include "fscache.h" 64 65 #define NFSDBG_FACILITY NFSDBG_VFS 66 67 enum { 68 /* Mount options that take no arguments */ 69 Opt_soft, Opt_hard, 70 Opt_posix, Opt_noposix, 71 Opt_cto, Opt_nocto, 72 Opt_ac, Opt_noac, 73 Opt_lock, Opt_nolock, 74 Opt_v2, Opt_v3, 75 Opt_udp, Opt_tcp, Opt_rdma, 76 Opt_acl, Opt_noacl, 77 Opt_rdirplus, Opt_nordirplus, 78 Opt_sharecache, Opt_nosharecache, 79 Opt_resvport, Opt_noresvport, 80 Opt_fscache, Opt_nofscache, 81 82 /* Mount options that take integer arguments */ 83 Opt_port, 84 Opt_rsize, Opt_wsize, Opt_bsize, 85 Opt_timeo, Opt_retrans, 86 Opt_acregmin, Opt_acregmax, 87 Opt_acdirmin, Opt_acdirmax, 88 Opt_actimeo, 89 Opt_namelen, 90 Opt_mountport, 91 Opt_mountvers, 92 Opt_nfsvers, 93 94 /* Mount options that take string arguments */ 95 Opt_sec, Opt_proto, Opt_mountproto, Opt_mounthost, 96 Opt_addr, Opt_mountaddr, Opt_clientaddr, 97 Opt_lookupcache, 98 Opt_fscache_uniq, 99 100 /* Special mount options */ 101 Opt_userspace, Opt_deprecated, Opt_sloppy, 102 103 Opt_err 104 }; 105 106 static const match_table_t nfs_mount_option_tokens = { 107 { Opt_userspace, "bg" }, 108 { Opt_userspace, "fg" }, 109 { Opt_userspace, "retry=%s" }, 110 111 { Opt_sloppy, "sloppy" }, 112 113 { Opt_soft, "soft" }, 114 { Opt_hard, "hard" }, 115 { Opt_deprecated, "intr" }, 116 { Opt_deprecated, "nointr" }, 117 { Opt_posix, "posix" }, 118 { Opt_noposix, "noposix" }, 119 { Opt_cto, "cto" }, 120 { Opt_nocto, "nocto" }, 121 { Opt_ac, "ac" }, 122 { Opt_noac, "noac" }, 123 { Opt_lock, "lock" }, 124 { Opt_nolock, "nolock" }, 125 { Opt_v2, "v2" }, 126 { Opt_v3, "v3" }, 127 { Opt_udp, "udp" }, 128 { Opt_tcp, "tcp" }, 129 { Opt_rdma, "rdma" }, 130 { Opt_acl, "acl" }, 131 { Opt_noacl, "noacl" }, 132 { Opt_rdirplus, "rdirplus" }, 133 { Opt_nordirplus, "nordirplus" }, 134 { Opt_sharecache, "sharecache" }, 135 { Opt_nosharecache, "nosharecache" }, 136 { Opt_resvport, "resvport" }, 137 { Opt_noresvport, "noresvport" }, 138 { Opt_fscache, "fsc" }, 139 { Opt_fscache_uniq, "fsc=%s" }, 140 { Opt_nofscache, "nofsc" }, 141 142 { Opt_port, "port=%u" }, 143 { Opt_rsize, "rsize=%u" }, 144 { Opt_wsize, "wsize=%u" }, 145 { Opt_bsize, "bsize=%u" }, 146 { Opt_timeo, "timeo=%u" }, 147 { Opt_retrans, "retrans=%u" }, 148 { Opt_acregmin, "acregmin=%u" }, 149 { Opt_acregmax, "acregmax=%u" }, 150 { Opt_acdirmin, "acdirmin=%u" }, 151 { Opt_acdirmax, "acdirmax=%u" }, 152 { Opt_actimeo, "actimeo=%u" }, 153 { Opt_namelen, "namlen=%u" }, 154 { Opt_mountport, "mountport=%u" }, 155 { Opt_mountvers, "mountvers=%u" }, 156 { Opt_nfsvers, "nfsvers=%u" }, 157 { Opt_nfsvers, "vers=%u" }, 158 159 { Opt_sec, "sec=%s" }, 160 { Opt_proto, "proto=%s" }, 161 { Opt_mountproto, "mountproto=%s" }, 162 { Opt_addr, "addr=%s" }, 163 { Opt_clientaddr, "clientaddr=%s" }, 164 { Opt_mounthost, "mounthost=%s" }, 165 { Opt_mountaddr, "mountaddr=%s" }, 166 167 { Opt_lookupcache, "lookupcache=%s" }, 168 169 { Opt_err, NULL } 170 }; 171 172 enum { 173 Opt_xprt_udp, Opt_xprt_tcp, Opt_xprt_rdma, 174 175 Opt_xprt_err 176 }; 177 178 static const match_table_t nfs_xprt_protocol_tokens = { 179 { Opt_xprt_udp, "udp" }, 180 { Opt_xprt_tcp, "tcp" }, 181 { Opt_xprt_rdma, "rdma" }, 182 183 { Opt_xprt_err, NULL } 184 }; 185 186 enum { 187 Opt_sec_none, Opt_sec_sys, 188 Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p, 189 Opt_sec_lkey, Opt_sec_lkeyi, Opt_sec_lkeyp, 190 Opt_sec_spkm, Opt_sec_spkmi, Opt_sec_spkmp, 191 192 Opt_sec_err 193 }; 194 195 static const match_table_t nfs_secflavor_tokens = { 196 { Opt_sec_none, "none" }, 197 { Opt_sec_none, "null" }, 198 { Opt_sec_sys, "sys" }, 199 200 { Opt_sec_krb5, "krb5" }, 201 { Opt_sec_krb5i, "krb5i" }, 202 { Opt_sec_krb5p, "krb5p" }, 203 204 { Opt_sec_lkey, "lkey" }, 205 { Opt_sec_lkeyi, "lkeyi" }, 206 { Opt_sec_lkeyp, "lkeyp" }, 207 208 { Opt_sec_spkm, "spkm3" }, 209 { Opt_sec_spkmi, "spkm3i" }, 210 { Opt_sec_spkmp, "spkm3p" }, 211 212 { Opt_sec_err, NULL } 213 }; 214 215 enum { 216 Opt_lookupcache_all, Opt_lookupcache_positive, 217 Opt_lookupcache_none, 218 219 Opt_lookupcache_err 220 }; 221 222 static match_table_t nfs_lookupcache_tokens = { 223 { Opt_lookupcache_all, "all" }, 224 { Opt_lookupcache_positive, "pos" }, 225 { Opt_lookupcache_positive, "positive" }, 226 { Opt_lookupcache_none, "none" }, 227 228 { Opt_lookupcache_err, NULL } 229 }; 230 231 232 static void nfs_umount_begin(struct super_block *); 233 static int nfs_statfs(struct dentry *, struct kstatfs *); 234 static int nfs_show_options(struct seq_file *, struct vfsmount *); 235 static int nfs_show_stats(struct seq_file *, struct vfsmount *); 236 static int nfs_get_sb(struct file_system_type *, int, const char *, void *, struct vfsmount *); 237 static int nfs_xdev_get_sb(struct file_system_type *fs_type, 238 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); 239 static void nfs_kill_super(struct super_block *); 240 static int nfs_remount(struct super_block *sb, int *flags, char *raw_data); 241 242 static struct file_system_type nfs_fs_type = { 243 .owner = THIS_MODULE, 244 .name = "nfs", 245 .get_sb = nfs_get_sb, 246 .kill_sb = nfs_kill_super, 247 .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, 248 }; 249 250 struct file_system_type nfs_xdev_fs_type = { 251 .owner = THIS_MODULE, 252 .name = "nfs", 253 .get_sb = nfs_xdev_get_sb, 254 .kill_sb = nfs_kill_super, 255 .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, 256 }; 257 258 static const struct super_operations nfs_sops = { 259 .alloc_inode = nfs_alloc_inode, 260 .destroy_inode = nfs_destroy_inode, 261 .write_inode = nfs_write_inode, 262 .statfs = nfs_statfs, 263 .clear_inode = nfs_clear_inode, 264 .umount_begin = nfs_umount_begin, 265 .show_options = nfs_show_options, 266 .show_stats = nfs_show_stats, 267 .remount_fs = nfs_remount, 268 }; 269 270 #ifdef CONFIG_NFS_V4 271 static int nfs4_get_sb(struct file_system_type *fs_type, 272 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); 273 static int nfs4_xdev_get_sb(struct file_system_type *fs_type, 274 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); 275 static int nfs4_referral_get_sb(struct file_system_type *fs_type, 276 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt); 277 static void nfs4_kill_super(struct super_block *sb); 278 279 static struct file_system_type nfs4_fs_type = { 280 .owner = THIS_MODULE, 281 .name = "nfs4", 282 .get_sb = nfs4_get_sb, 283 .kill_sb = nfs4_kill_super, 284 .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, 285 }; 286 287 struct file_system_type nfs4_xdev_fs_type = { 288 .owner = THIS_MODULE, 289 .name = "nfs4", 290 .get_sb = nfs4_xdev_get_sb, 291 .kill_sb = nfs4_kill_super, 292 .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, 293 }; 294 295 struct file_system_type nfs4_referral_fs_type = { 296 .owner = THIS_MODULE, 297 .name = "nfs4", 298 .get_sb = nfs4_referral_get_sb, 299 .kill_sb = nfs4_kill_super, 300 .fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, 301 }; 302 303 static const struct super_operations nfs4_sops = { 304 .alloc_inode = nfs_alloc_inode, 305 .destroy_inode = nfs_destroy_inode, 306 .write_inode = nfs_write_inode, 307 .statfs = nfs_statfs, 308 .clear_inode = nfs4_clear_inode, 309 .umount_begin = nfs_umount_begin, 310 .show_options = nfs_show_options, 311 .show_stats = nfs_show_stats, 312 .remount_fs = nfs_remount, 313 }; 314 #endif 315 316 static struct shrinker acl_shrinker = { 317 .shrink = nfs_access_cache_shrinker, 318 .seeks = DEFAULT_SEEKS, 319 }; 320 321 /* 322 * Register the NFS filesystems 323 */ 324 int __init register_nfs_fs(void) 325 { 326 int ret; 327 328 ret = register_filesystem(&nfs_fs_type); 329 if (ret < 0) 330 goto error_0; 331 332 ret = nfs_register_sysctl(); 333 if (ret < 0) 334 goto error_1; 335 #ifdef CONFIG_NFS_V4 336 ret = register_filesystem(&nfs4_fs_type); 337 if (ret < 0) 338 goto error_2; 339 #endif 340 register_shrinker(&acl_shrinker); 341 return 0; 342 343 #ifdef CONFIG_NFS_V4 344 error_2: 345 nfs_unregister_sysctl(); 346 #endif 347 error_1: 348 unregister_filesystem(&nfs_fs_type); 349 error_0: 350 return ret; 351 } 352 353 /* 354 * Unregister the NFS filesystems 355 */ 356 void __exit unregister_nfs_fs(void) 357 { 358 unregister_shrinker(&acl_shrinker); 359 #ifdef CONFIG_NFS_V4 360 unregister_filesystem(&nfs4_fs_type); 361 #endif 362 nfs_unregister_sysctl(); 363 unregister_filesystem(&nfs_fs_type); 364 } 365 366 void nfs_sb_active(struct super_block *sb) 367 { 368 struct nfs_server *server = NFS_SB(sb); 369 370 if (atomic_inc_return(&server->active) == 1) 371 atomic_inc(&sb->s_active); 372 } 373 374 void nfs_sb_deactive(struct super_block *sb) 375 { 376 struct nfs_server *server = NFS_SB(sb); 377 378 if (atomic_dec_and_test(&server->active)) 379 deactivate_super(sb); 380 } 381 382 /* 383 * Deliver file system statistics to userspace 384 */ 385 static int nfs_statfs(struct dentry *dentry, struct kstatfs *buf) 386 { 387 struct nfs_server *server = NFS_SB(dentry->d_sb); 388 unsigned char blockbits; 389 unsigned long blockres; 390 struct nfs_fh *fh = NFS_FH(dentry->d_inode); 391 struct nfs_fattr fattr; 392 struct nfs_fsstat res = { 393 .fattr = &fattr, 394 }; 395 int error; 396 397 error = server->nfs_client->rpc_ops->statfs(server, fh, &res); 398 if (error < 0) 399 goto out_err; 400 buf->f_type = NFS_SUPER_MAGIC; 401 402 /* 403 * Current versions of glibc do not correctly handle the 404 * case where f_frsize != f_bsize. Eventually we want to 405 * report the value of wtmult in this field. 406 */ 407 buf->f_frsize = dentry->d_sb->s_blocksize; 408 409 /* 410 * On most *nix systems, f_blocks, f_bfree, and f_bavail 411 * are reported in units of f_frsize. Linux hasn't had 412 * an f_frsize field in its statfs struct until recently, 413 * thus historically Linux's sys_statfs reports these 414 * fields in units of f_bsize. 415 */ 416 buf->f_bsize = dentry->d_sb->s_blocksize; 417 blockbits = dentry->d_sb->s_blocksize_bits; 418 blockres = (1 << blockbits) - 1; 419 buf->f_blocks = (res.tbytes + blockres) >> blockbits; 420 buf->f_bfree = (res.fbytes + blockres) >> blockbits; 421 buf->f_bavail = (res.abytes + blockres) >> blockbits; 422 423 buf->f_files = res.tfiles; 424 buf->f_ffree = res.afiles; 425 426 buf->f_namelen = server->namelen; 427 428 return 0; 429 430 out_err: 431 dprintk("%s: statfs error = %d\n", __func__, -error); 432 return error; 433 } 434 435 /* 436 * Map the security flavour number to a name 437 */ 438 static const char *nfs_pseudoflavour_to_name(rpc_authflavor_t flavour) 439 { 440 static const struct { 441 rpc_authflavor_t flavour; 442 const char *str; 443 } sec_flavours[] = { 444 { RPC_AUTH_NULL, "null" }, 445 { RPC_AUTH_UNIX, "sys" }, 446 { RPC_AUTH_GSS_KRB5, "krb5" }, 447 { RPC_AUTH_GSS_KRB5I, "krb5i" }, 448 { RPC_AUTH_GSS_KRB5P, "krb5p" }, 449 { RPC_AUTH_GSS_LKEY, "lkey" }, 450 { RPC_AUTH_GSS_LKEYI, "lkeyi" }, 451 { RPC_AUTH_GSS_LKEYP, "lkeyp" }, 452 { RPC_AUTH_GSS_SPKM, "spkm" }, 453 { RPC_AUTH_GSS_SPKMI, "spkmi" }, 454 { RPC_AUTH_GSS_SPKMP, "spkmp" }, 455 { UINT_MAX, "unknown" } 456 }; 457 int i; 458 459 for (i = 0; sec_flavours[i].flavour != UINT_MAX; i++) { 460 if (sec_flavours[i].flavour == flavour) 461 break; 462 } 463 return sec_flavours[i].str; 464 } 465 466 static void nfs_show_mountd_options(struct seq_file *m, struct nfs_server *nfss, 467 int showdefaults) 468 { 469 struct sockaddr *sap = (struct sockaddr *)&nfss->mountd_address; 470 471 switch (sap->sa_family) { 472 case AF_INET: { 473 struct sockaddr_in *sin = (struct sockaddr_in *)sap; 474 seq_printf(m, ",mountaddr=%pI4", &sin->sin_addr.s_addr); 475 break; 476 } 477 case AF_INET6: { 478 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap; 479 seq_printf(m, ",mountaddr=%pI6", &sin6->sin6_addr); 480 break; 481 } 482 default: 483 if (showdefaults) 484 seq_printf(m, ",mountaddr=unspecified"); 485 } 486 487 if (nfss->mountd_version || showdefaults) 488 seq_printf(m, ",mountvers=%u", nfss->mountd_version); 489 if (nfss->mountd_port || showdefaults) 490 seq_printf(m, ",mountport=%u", nfss->mountd_port); 491 492 switch (nfss->mountd_protocol) { 493 case IPPROTO_UDP: 494 seq_printf(m, ",mountproto=udp"); 495 break; 496 case IPPROTO_TCP: 497 seq_printf(m, ",mountproto=tcp"); 498 break; 499 default: 500 if (showdefaults) 501 seq_printf(m, ",mountproto=auto"); 502 } 503 } 504 505 /* 506 * Describe the mount options in force on this server representation 507 */ 508 static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss, 509 int showdefaults) 510 { 511 static const struct proc_nfs_info { 512 int flag; 513 const char *str; 514 const char *nostr; 515 } nfs_info[] = { 516 { NFS_MOUNT_SOFT, ",soft", ",hard" }, 517 { NFS_MOUNT_INTR, ",intr", ",nointr" }, 518 { NFS_MOUNT_POSIX, ",posix", "" }, 519 { NFS_MOUNT_NOCTO, ",nocto", "" }, 520 { NFS_MOUNT_NOAC, ",noac", "" }, 521 { NFS_MOUNT_NONLM, ",nolock", "" }, 522 { NFS_MOUNT_NOACL, ",noacl", "" }, 523 { NFS_MOUNT_NORDIRPLUS, ",nordirplus", "" }, 524 { NFS_MOUNT_UNSHARED, ",nosharecache", "" }, 525 { NFS_MOUNT_NORESVPORT, ",noresvport", "" }, 526 { 0, NULL, NULL } 527 }; 528 const struct proc_nfs_info *nfs_infop; 529 struct nfs_client *clp = nfss->nfs_client; 530 u32 version = clp->rpc_ops->version; 531 532 seq_printf(m, ",vers=%u", version); 533 seq_printf(m, ",rsize=%u", nfss->rsize); 534 seq_printf(m, ",wsize=%u", nfss->wsize); 535 if (nfss->bsize != 0) 536 seq_printf(m, ",bsize=%u", nfss->bsize); 537 seq_printf(m, ",namlen=%u", nfss->namelen); 538 if (nfss->acregmin != NFS_DEF_ACREGMIN*HZ || showdefaults) 539 seq_printf(m, ",acregmin=%u", nfss->acregmin/HZ); 540 if (nfss->acregmax != NFS_DEF_ACREGMAX*HZ || showdefaults) 541 seq_printf(m, ",acregmax=%u", nfss->acregmax/HZ); 542 if (nfss->acdirmin != NFS_DEF_ACDIRMIN*HZ || showdefaults) 543 seq_printf(m, ",acdirmin=%u", nfss->acdirmin/HZ); 544 if (nfss->acdirmax != NFS_DEF_ACDIRMAX*HZ || showdefaults) 545 seq_printf(m, ",acdirmax=%u", nfss->acdirmax/HZ); 546 for (nfs_infop = nfs_info; nfs_infop->flag; nfs_infop++) { 547 if (nfss->flags & nfs_infop->flag) 548 seq_puts(m, nfs_infop->str); 549 else 550 seq_puts(m, nfs_infop->nostr); 551 } 552 seq_printf(m, ",proto=%s", 553 rpc_peeraddr2str(nfss->client, RPC_DISPLAY_PROTO)); 554 if (version == 4) { 555 if (nfss->port != NFS_PORT) 556 seq_printf(m, ",port=%u", nfss->port); 557 } else 558 if (nfss->port) 559 seq_printf(m, ",port=%u", nfss->port); 560 561 seq_printf(m, ",timeo=%lu", 10U * nfss->client->cl_timeout->to_initval / HZ); 562 seq_printf(m, ",retrans=%u", nfss->client->cl_timeout->to_retries); 563 seq_printf(m, ",sec=%s", nfs_pseudoflavour_to_name(nfss->client->cl_auth->au_flavor)); 564 565 if (version != 4) 566 nfs_show_mountd_options(m, nfss, showdefaults); 567 568 #ifdef CONFIG_NFS_V4 569 if (clp->rpc_ops->version == 4) 570 seq_printf(m, ",clientaddr=%s", clp->cl_ipaddr); 571 #endif 572 if (nfss->options & NFS_OPTION_FSCACHE) 573 seq_printf(m, ",fsc"); 574 } 575 576 /* 577 * Describe the mount options on this VFS mountpoint 578 */ 579 static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt) 580 { 581 struct nfs_server *nfss = NFS_SB(mnt->mnt_sb); 582 583 nfs_show_mount_options(m, nfss, 0); 584 585 seq_printf(m, ",addr=%s", 586 rpc_peeraddr2str(nfss->nfs_client->cl_rpcclient, 587 RPC_DISPLAY_ADDR)); 588 589 return 0; 590 } 591 592 /* 593 * Present statistical information for this VFS mountpoint 594 */ 595 static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt) 596 { 597 int i, cpu; 598 struct nfs_server *nfss = NFS_SB(mnt->mnt_sb); 599 struct rpc_auth *auth = nfss->client->cl_auth; 600 struct nfs_iostats totals = { }; 601 602 seq_printf(m, "statvers=%s", NFS_IOSTAT_VERS); 603 604 /* 605 * Display all mount option settings 606 */ 607 seq_printf(m, "\n\topts:\t"); 608 seq_puts(m, mnt->mnt_sb->s_flags & MS_RDONLY ? "ro" : "rw"); 609 seq_puts(m, mnt->mnt_sb->s_flags & MS_SYNCHRONOUS ? ",sync" : ""); 610 seq_puts(m, mnt->mnt_sb->s_flags & MS_NOATIME ? ",noatime" : ""); 611 seq_puts(m, mnt->mnt_sb->s_flags & MS_NODIRATIME ? ",nodiratime" : ""); 612 nfs_show_mount_options(m, nfss, 1); 613 614 seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ); 615 616 seq_printf(m, "\n\tcaps:\t"); 617 seq_printf(m, "caps=0x%x", nfss->caps); 618 seq_printf(m, ",wtmult=%u", nfss->wtmult); 619 seq_printf(m, ",dtsize=%u", nfss->dtsize); 620 seq_printf(m, ",bsize=%u", nfss->bsize); 621 seq_printf(m, ",namlen=%u", nfss->namelen); 622 623 #ifdef CONFIG_NFS_V4 624 if (nfss->nfs_client->rpc_ops->version == 4) { 625 seq_printf(m, "\n\tnfsv4:\t"); 626 seq_printf(m, "bm0=0x%x", nfss->attr_bitmask[0]); 627 seq_printf(m, ",bm1=0x%x", nfss->attr_bitmask[1]); 628 seq_printf(m, ",acl=0x%x", nfss->acl_bitmask); 629 } 630 #endif 631 632 /* 633 * Display security flavor in effect for this mount 634 */ 635 seq_printf(m, "\n\tsec:\tflavor=%u", auth->au_ops->au_flavor); 636 if (auth->au_flavor) 637 seq_printf(m, ",pseudoflavor=%u", auth->au_flavor); 638 639 /* 640 * Display superblock I/O counters 641 */ 642 for_each_possible_cpu(cpu) { 643 struct nfs_iostats *stats; 644 645 preempt_disable(); 646 stats = per_cpu_ptr(nfss->io_stats, cpu); 647 648 for (i = 0; i < __NFSIOS_COUNTSMAX; i++) 649 totals.events[i] += stats->events[i]; 650 for (i = 0; i < __NFSIOS_BYTESMAX; i++) 651 totals.bytes[i] += stats->bytes[i]; 652 #ifdef CONFIG_NFS_FSCACHE 653 for (i = 0; i < __NFSIOS_FSCACHEMAX; i++) 654 totals.fscache[i] += stats->fscache[i]; 655 #endif 656 657 preempt_enable(); 658 } 659 660 seq_printf(m, "\n\tevents:\t"); 661 for (i = 0; i < __NFSIOS_COUNTSMAX; i++) 662 seq_printf(m, "%lu ", totals.events[i]); 663 seq_printf(m, "\n\tbytes:\t"); 664 for (i = 0; i < __NFSIOS_BYTESMAX; i++) 665 seq_printf(m, "%Lu ", totals.bytes[i]); 666 #ifdef CONFIG_NFS_FSCACHE 667 if (nfss->options & NFS_OPTION_FSCACHE) { 668 seq_printf(m, "\n\tfsc:\t"); 669 for (i = 0; i < __NFSIOS_FSCACHEMAX; i++) 670 seq_printf(m, "%Lu ", totals.bytes[i]); 671 } 672 #endif 673 seq_printf(m, "\n"); 674 675 rpc_print_iostats(m, nfss->client); 676 677 return 0; 678 } 679 680 /* 681 * Begin unmount by attempting to remove all automounted mountpoints we added 682 * in response to xdev traversals and referrals 683 */ 684 static void nfs_umount_begin(struct super_block *sb) 685 { 686 struct nfs_server *server; 687 struct rpc_clnt *rpc; 688 689 lock_kernel(); 690 691 server = NFS_SB(sb); 692 /* -EIO all pending I/O */ 693 rpc = server->client_acl; 694 if (!IS_ERR(rpc)) 695 rpc_killall_tasks(rpc); 696 rpc = server->client; 697 if (!IS_ERR(rpc)) 698 rpc_killall_tasks(rpc); 699 700 unlock_kernel(); 701 } 702 703 /* 704 * Sanity-check a server address provided by the mount command. 705 * 706 * Address family must be initialized, and address must not be 707 * the ANY address for that family. 708 */ 709 static int nfs_verify_server_address(struct sockaddr *addr) 710 { 711 switch (addr->sa_family) { 712 case AF_INET: { 713 struct sockaddr_in *sa = (struct sockaddr_in *)addr; 714 return sa->sin_addr.s_addr != htonl(INADDR_ANY); 715 } 716 case AF_INET6: { 717 struct in6_addr *sa = &((struct sockaddr_in6 *)addr)->sin6_addr; 718 return !ipv6_addr_any(sa); 719 } 720 } 721 722 return 0; 723 } 724 725 static void nfs_parse_ipv4_address(char *string, size_t str_len, 726 struct sockaddr *sap, size_t *addr_len) 727 { 728 struct sockaddr_in *sin = (struct sockaddr_in *)sap; 729 u8 *addr = (u8 *)&sin->sin_addr.s_addr; 730 731 if (str_len <= INET_ADDRSTRLEN) { 732 dfprintk(MOUNT, "NFS: parsing IPv4 address %*s\n", 733 (int)str_len, string); 734 735 sin->sin_family = AF_INET; 736 *addr_len = sizeof(*sin); 737 if (in4_pton(string, str_len, addr, '\0', NULL)) 738 return; 739 } 740 741 sap->sa_family = AF_UNSPEC; 742 *addr_len = 0; 743 } 744 745 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 746 static int nfs_parse_ipv6_scope_id(const char *string, const size_t str_len, 747 const char *delim, 748 struct sockaddr_in6 *sin6) 749 { 750 char *p; 751 size_t len; 752 753 if ((string + str_len) == delim) 754 return 1; 755 756 if (*delim != IPV6_SCOPE_DELIMITER) 757 return 0; 758 759 if (!(ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL)) 760 return 0; 761 762 len = (string + str_len) - delim - 1; 763 p = kstrndup(delim + 1, len, GFP_KERNEL); 764 if (p) { 765 unsigned long scope_id = 0; 766 struct net_device *dev; 767 768 dev = dev_get_by_name(&init_net, p); 769 if (dev != NULL) { 770 scope_id = dev->ifindex; 771 dev_put(dev); 772 } else { 773 if (strict_strtoul(p, 10, &scope_id) == 0) { 774 kfree(p); 775 return 0; 776 } 777 } 778 779 kfree(p); 780 781 sin6->sin6_scope_id = scope_id; 782 dfprintk(MOUNT, "NFS: IPv6 scope ID = %lu\n", scope_id); 783 return 1; 784 } 785 786 return 0; 787 } 788 789 static void nfs_parse_ipv6_address(char *string, size_t str_len, 790 struct sockaddr *sap, size_t *addr_len) 791 { 792 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap; 793 u8 *addr = (u8 *)&sin6->sin6_addr.in6_u; 794 const char *delim; 795 796 if (str_len <= INET6_ADDRSTRLEN) { 797 dfprintk(MOUNT, "NFS: parsing IPv6 address %*s\n", 798 (int)str_len, string); 799 800 sin6->sin6_family = AF_INET6; 801 *addr_len = sizeof(*sin6); 802 if (in6_pton(string, str_len, addr, 803 IPV6_SCOPE_DELIMITER, &delim) != 0) { 804 if (nfs_parse_ipv6_scope_id(string, str_len, 805 delim, sin6) != 0) 806 return; 807 } 808 } 809 810 sap->sa_family = AF_UNSPEC; 811 *addr_len = 0; 812 } 813 #else 814 static void nfs_parse_ipv6_address(char *string, size_t str_len, 815 struct sockaddr *sap, size_t *addr_len) 816 { 817 sap->sa_family = AF_UNSPEC; 818 *addr_len = 0; 819 } 820 #endif 821 822 /* 823 * Construct a sockaddr based on the contents of a string that contains 824 * an IP address in presentation format. 825 * 826 * If there is a problem constructing the new sockaddr, set the address 827 * family to AF_UNSPEC. 828 */ 829 void nfs_parse_ip_address(char *string, size_t str_len, 830 struct sockaddr *sap, size_t *addr_len) 831 { 832 unsigned int i, colons; 833 834 colons = 0; 835 for (i = 0; i < str_len; i++) 836 if (string[i] == ':') 837 colons++; 838 839 if (colons >= 2) 840 nfs_parse_ipv6_address(string, str_len, sap, addr_len); 841 else 842 nfs_parse_ipv4_address(string, str_len, sap, addr_len); 843 } 844 845 /* 846 * Sanity check the NFS transport protocol. 847 * 848 */ 849 static void nfs_validate_transport_protocol(struct nfs_parsed_mount_data *mnt) 850 { 851 switch (mnt->nfs_server.protocol) { 852 case XPRT_TRANSPORT_UDP: 853 case XPRT_TRANSPORT_TCP: 854 case XPRT_TRANSPORT_RDMA: 855 break; 856 default: 857 mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP; 858 } 859 } 860 861 /* 862 * For text based NFSv2/v3 mounts, the mount protocol transport default 863 * settings should depend upon the specified NFS transport. 864 */ 865 static void nfs_set_mount_transport_protocol(struct nfs_parsed_mount_data *mnt) 866 { 867 nfs_validate_transport_protocol(mnt); 868 869 if (mnt->mount_server.protocol == XPRT_TRANSPORT_UDP || 870 mnt->mount_server.protocol == XPRT_TRANSPORT_TCP) 871 return; 872 switch (mnt->nfs_server.protocol) { 873 case XPRT_TRANSPORT_UDP: 874 mnt->mount_server.protocol = XPRT_TRANSPORT_UDP; 875 break; 876 case XPRT_TRANSPORT_TCP: 877 case XPRT_TRANSPORT_RDMA: 878 mnt->mount_server.protocol = XPRT_TRANSPORT_TCP; 879 } 880 } 881 882 /* 883 * Parse the value of the 'sec=' option. 884 * 885 * The flavor_len setting is for v4 mounts. 886 */ 887 static int nfs_parse_security_flavors(char *value, 888 struct nfs_parsed_mount_data *mnt) 889 { 890 substring_t args[MAX_OPT_ARGS]; 891 892 dfprintk(MOUNT, "NFS: parsing sec=%s option\n", value); 893 894 switch (match_token(value, nfs_secflavor_tokens, args)) { 895 case Opt_sec_none: 896 mnt->auth_flavor_len = 0; 897 mnt->auth_flavors[0] = RPC_AUTH_NULL; 898 break; 899 case Opt_sec_sys: 900 mnt->auth_flavor_len = 0; 901 mnt->auth_flavors[0] = RPC_AUTH_UNIX; 902 break; 903 case Opt_sec_krb5: 904 mnt->auth_flavor_len = 1; 905 mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5; 906 break; 907 case Opt_sec_krb5i: 908 mnt->auth_flavor_len = 1; 909 mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5I; 910 break; 911 case Opt_sec_krb5p: 912 mnt->auth_flavor_len = 1; 913 mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5P; 914 break; 915 case Opt_sec_lkey: 916 mnt->auth_flavor_len = 1; 917 mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEY; 918 break; 919 case Opt_sec_lkeyi: 920 mnt->auth_flavor_len = 1; 921 mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEYI; 922 break; 923 case Opt_sec_lkeyp: 924 mnt->auth_flavor_len = 1; 925 mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEYP; 926 break; 927 case Opt_sec_spkm: 928 mnt->auth_flavor_len = 1; 929 mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKM; 930 break; 931 case Opt_sec_spkmi: 932 mnt->auth_flavor_len = 1; 933 mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKMI; 934 break; 935 case Opt_sec_spkmp: 936 mnt->auth_flavor_len = 1; 937 mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKMP; 938 break; 939 default: 940 return 0; 941 } 942 943 return 1; 944 } 945 946 static void nfs_parse_invalid_value(const char *option) 947 { 948 dfprintk(MOUNT, "NFS: bad value specified for %s option\n", option); 949 } 950 951 /* 952 * Error-check and convert a string of mount options from user space into 953 * a data structure. The whole mount string is processed; bad options are 954 * skipped as they are encountered. If there were no errors, return 1; 955 * otherwise return 0 (zero). 956 */ 957 static int nfs_parse_mount_options(char *raw, 958 struct nfs_parsed_mount_data *mnt) 959 { 960 char *p, *string, *secdata; 961 int rc, sloppy = 0, errors = 0; 962 963 if (!raw) { 964 dfprintk(MOUNT, "NFS: mount options string was NULL.\n"); 965 return 1; 966 } 967 dfprintk(MOUNT, "NFS: nfs mount opts='%s'\n", raw); 968 969 secdata = alloc_secdata(); 970 if (!secdata) 971 goto out_nomem; 972 973 rc = security_sb_copy_data(raw, secdata); 974 if (rc) 975 goto out_security_failure; 976 977 rc = security_sb_parse_opts_str(secdata, &mnt->lsm_opts); 978 if (rc) 979 goto out_security_failure; 980 981 free_secdata(secdata); 982 983 while ((p = strsep(&raw, ",")) != NULL) { 984 substring_t args[MAX_OPT_ARGS]; 985 int option, token; 986 987 if (!*p) 988 continue; 989 990 dfprintk(MOUNT, "NFS: parsing nfs mount option '%s'\n", p); 991 992 token = match_token(p, nfs_mount_option_tokens, args); 993 switch (token) { 994 995 /* 996 * boolean options: foo/nofoo 997 */ 998 case Opt_soft: 999 mnt->flags |= NFS_MOUNT_SOFT; 1000 break; 1001 case Opt_hard: 1002 mnt->flags &= ~NFS_MOUNT_SOFT; 1003 break; 1004 case Opt_posix: 1005 mnt->flags |= NFS_MOUNT_POSIX; 1006 break; 1007 case Opt_noposix: 1008 mnt->flags &= ~NFS_MOUNT_POSIX; 1009 break; 1010 case Opt_cto: 1011 mnt->flags &= ~NFS_MOUNT_NOCTO; 1012 break; 1013 case Opt_nocto: 1014 mnt->flags |= NFS_MOUNT_NOCTO; 1015 break; 1016 case Opt_ac: 1017 mnt->flags &= ~NFS_MOUNT_NOAC; 1018 break; 1019 case Opt_noac: 1020 mnt->flags |= NFS_MOUNT_NOAC; 1021 break; 1022 case Opt_lock: 1023 mnt->flags &= ~NFS_MOUNT_NONLM; 1024 break; 1025 case Opt_nolock: 1026 mnt->flags |= NFS_MOUNT_NONLM; 1027 break; 1028 case Opt_v2: 1029 mnt->flags &= ~NFS_MOUNT_VER3; 1030 break; 1031 case Opt_v3: 1032 mnt->flags |= NFS_MOUNT_VER3; 1033 break; 1034 case Opt_udp: 1035 mnt->flags &= ~NFS_MOUNT_TCP; 1036 mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP; 1037 break; 1038 case Opt_tcp: 1039 mnt->flags |= NFS_MOUNT_TCP; 1040 mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP; 1041 break; 1042 case Opt_rdma: 1043 mnt->flags |= NFS_MOUNT_TCP; /* for side protocols */ 1044 mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA; 1045 xprt_load_transport(p); 1046 break; 1047 case Opt_acl: 1048 mnt->flags &= ~NFS_MOUNT_NOACL; 1049 break; 1050 case Opt_noacl: 1051 mnt->flags |= NFS_MOUNT_NOACL; 1052 break; 1053 case Opt_rdirplus: 1054 mnt->flags &= ~NFS_MOUNT_NORDIRPLUS; 1055 break; 1056 case Opt_nordirplus: 1057 mnt->flags |= NFS_MOUNT_NORDIRPLUS; 1058 break; 1059 case Opt_sharecache: 1060 mnt->flags &= ~NFS_MOUNT_UNSHARED; 1061 break; 1062 case Opt_nosharecache: 1063 mnt->flags |= NFS_MOUNT_UNSHARED; 1064 break; 1065 case Opt_resvport: 1066 mnt->flags &= ~NFS_MOUNT_NORESVPORT; 1067 break; 1068 case Opt_noresvport: 1069 mnt->flags |= NFS_MOUNT_NORESVPORT; 1070 break; 1071 case Opt_fscache: 1072 mnt->options |= NFS_OPTION_FSCACHE; 1073 kfree(mnt->fscache_uniq); 1074 mnt->fscache_uniq = NULL; 1075 break; 1076 case Opt_nofscache: 1077 mnt->options &= ~NFS_OPTION_FSCACHE; 1078 kfree(mnt->fscache_uniq); 1079 mnt->fscache_uniq = NULL; 1080 break; 1081 case Opt_fscache_uniq: 1082 string = match_strdup(args); 1083 if (!string) 1084 goto out_nomem; 1085 kfree(mnt->fscache_uniq); 1086 mnt->fscache_uniq = string; 1087 mnt->options |= NFS_OPTION_FSCACHE; 1088 break; 1089 1090 /* 1091 * options that take numeric values 1092 */ 1093 case Opt_port: 1094 if (match_int(args, &option) || 1095 option < 0 || option > USHORT_MAX) { 1096 errors++; 1097 nfs_parse_invalid_value("port"); 1098 } else 1099 mnt->nfs_server.port = option; 1100 break; 1101 case Opt_rsize: 1102 if (match_int(args, &option) || option < 0) { 1103 errors++; 1104 nfs_parse_invalid_value("rsize"); 1105 } else 1106 mnt->rsize = option; 1107 break; 1108 case Opt_wsize: 1109 if (match_int(args, &option) || option < 0) { 1110 errors++; 1111 nfs_parse_invalid_value("wsize"); 1112 } else 1113 mnt->wsize = option; 1114 break; 1115 case Opt_bsize: 1116 if (match_int(args, &option) || option < 0) { 1117 errors++; 1118 nfs_parse_invalid_value("bsize"); 1119 } else 1120 mnt->bsize = option; 1121 break; 1122 case Opt_timeo: 1123 if (match_int(args, &option) || option <= 0) { 1124 errors++; 1125 nfs_parse_invalid_value("timeo"); 1126 } else 1127 mnt->timeo = option; 1128 break; 1129 case Opt_retrans: 1130 if (match_int(args, &option) || option <= 0) { 1131 errors++; 1132 nfs_parse_invalid_value("retrans"); 1133 } else 1134 mnt->retrans = option; 1135 break; 1136 case Opt_acregmin: 1137 if (match_int(args, &option) || option < 0) { 1138 errors++; 1139 nfs_parse_invalid_value("acregmin"); 1140 } else 1141 mnt->acregmin = option; 1142 break; 1143 case Opt_acregmax: 1144 if (match_int(args, &option) || option < 0) { 1145 errors++; 1146 nfs_parse_invalid_value("acregmax"); 1147 } else 1148 mnt->acregmax = option; 1149 break; 1150 case Opt_acdirmin: 1151 if (match_int(args, &option) || option < 0) { 1152 errors++; 1153 nfs_parse_invalid_value("acdirmin"); 1154 } else 1155 mnt->acdirmin = option; 1156 break; 1157 case Opt_acdirmax: 1158 if (match_int(args, &option) || option < 0) { 1159 errors++; 1160 nfs_parse_invalid_value("acdirmax"); 1161 } else 1162 mnt->acdirmax = option; 1163 break; 1164 case Opt_actimeo: 1165 if (match_int(args, &option) || option < 0) { 1166 errors++; 1167 nfs_parse_invalid_value("actimeo"); 1168 } else 1169 mnt->acregmin = mnt->acregmax = 1170 mnt->acdirmin = mnt->acdirmax = option; 1171 break; 1172 case Opt_namelen: 1173 if (match_int(args, &option) || option < 0) { 1174 errors++; 1175 nfs_parse_invalid_value("namlen"); 1176 } else 1177 mnt->namlen = option; 1178 break; 1179 case Opt_mountport: 1180 if (match_int(args, &option) || 1181 option < 0 || option > USHORT_MAX) { 1182 errors++; 1183 nfs_parse_invalid_value("mountport"); 1184 } else 1185 mnt->mount_server.port = option; 1186 break; 1187 case Opt_mountvers: 1188 if (match_int(args, &option) || 1189 option < NFS_MNT_VERSION || 1190 option > NFS_MNT3_VERSION) { 1191 errors++; 1192 nfs_parse_invalid_value("mountvers"); 1193 } else 1194 mnt->mount_server.version = option; 1195 break; 1196 case Opt_nfsvers: 1197 if (match_int(args, &option)) { 1198 errors++; 1199 nfs_parse_invalid_value("nfsvers"); 1200 break; 1201 } 1202 switch (option) { 1203 case NFS2_VERSION: 1204 mnt->flags &= ~NFS_MOUNT_VER3; 1205 break; 1206 case NFS3_VERSION: 1207 mnt->flags |= NFS_MOUNT_VER3; 1208 break; 1209 default: 1210 errors++; 1211 nfs_parse_invalid_value("nfsvers"); 1212 } 1213 break; 1214 1215 /* 1216 * options that take text values 1217 */ 1218 case Opt_sec: 1219 string = match_strdup(args); 1220 if (string == NULL) 1221 goto out_nomem; 1222 rc = nfs_parse_security_flavors(string, mnt); 1223 kfree(string); 1224 if (!rc) { 1225 errors++; 1226 dfprintk(MOUNT, "NFS: unrecognized " 1227 "security flavor\n"); 1228 } 1229 break; 1230 case Opt_proto: 1231 string = match_strdup(args); 1232 if (string == NULL) 1233 goto out_nomem; 1234 token = match_token(string, 1235 nfs_xprt_protocol_tokens, args); 1236 1237 switch (token) { 1238 case Opt_xprt_udp: 1239 mnt->flags &= ~NFS_MOUNT_TCP; 1240 mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP; 1241 break; 1242 case Opt_xprt_tcp: 1243 mnt->flags |= NFS_MOUNT_TCP; 1244 mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP; 1245 break; 1246 case Opt_xprt_rdma: 1247 /* vector side protocols to TCP */ 1248 mnt->flags |= NFS_MOUNT_TCP; 1249 mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA; 1250 xprt_load_transport(string); 1251 break; 1252 default: 1253 errors++; 1254 dfprintk(MOUNT, "NFS: unrecognized " 1255 "transport protocol\n"); 1256 } 1257 kfree(string); 1258 break; 1259 case Opt_mountproto: 1260 string = match_strdup(args); 1261 if (string == NULL) 1262 goto out_nomem; 1263 token = match_token(string, 1264 nfs_xprt_protocol_tokens, args); 1265 kfree(string); 1266 1267 switch (token) { 1268 case Opt_xprt_udp: 1269 mnt->mount_server.protocol = XPRT_TRANSPORT_UDP; 1270 break; 1271 case Opt_xprt_tcp: 1272 mnt->mount_server.protocol = XPRT_TRANSPORT_TCP; 1273 break; 1274 case Opt_xprt_rdma: /* not used for side protocols */ 1275 default: 1276 errors++; 1277 dfprintk(MOUNT, "NFS: unrecognized " 1278 "transport protocol\n"); 1279 } 1280 break; 1281 case Opt_addr: 1282 string = match_strdup(args); 1283 if (string == NULL) 1284 goto out_nomem; 1285 nfs_parse_ip_address(string, strlen(string), 1286 (struct sockaddr *) 1287 &mnt->nfs_server.address, 1288 &mnt->nfs_server.addrlen); 1289 kfree(string); 1290 break; 1291 case Opt_clientaddr: 1292 string = match_strdup(args); 1293 if (string == NULL) 1294 goto out_nomem; 1295 kfree(mnt->client_address); 1296 mnt->client_address = string; 1297 break; 1298 case Opt_mounthost: 1299 string = match_strdup(args); 1300 if (string == NULL) 1301 goto out_nomem; 1302 kfree(mnt->mount_server.hostname); 1303 mnt->mount_server.hostname = string; 1304 break; 1305 case Opt_mountaddr: 1306 string = match_strdup(args); 1307 if (string == NULL) 1308 goto out_nomem; 1309 nfs_parse_ip_address(string, strlen(string), 1310 (struct sockaddr *) 1311 &mnt->mount_server.address, 1312 &mnt->mount_server.addrlen); 1313 kfree(string); 1314 break; 1315 case Opt_lookupcache: 1316 string = match_strdup(args); 1317 if (string == NULL) 1318 goto out_nomem; 1319 token = match_token(string, 1320 nfs_lookupcache_tokens, args); 1321 kfree(string); 1322 switch (token) { 1323 case Opt_lookupcache_all: 1324 mnt->flags &= ~(NFS_MOUNT_LOOKUP_CACHE_NONEG|NFS_MOUNT_LOOKUP_CACHE_NONE); 1325 break; 1326 case Opt_lookupcache_positive: 1327 mnt->flags &= ~NFS_MOUNT_LOOKUP_CACHE_NONE; 1328 mnt->flags |= NFS_MOUNT_LOOKUP_CACHE_NONEG; 1329 break; 1330 case Opt_lookupcache_none: 1331 mnt->flags |= NFS_MOUNT_LOOKUP_CACHE_NONEG|NFS_MOUNT_LOOKUP_CACHE_NONE; 1332 break; 1333 default: 1334 errors++; 1335 dfprintk(MOUNT, "NFS: invalid " 1336 "lookupcache argument\n"); 1337 }; 1338 break; 1339 1340 /* 1341 * Special options 1342 */ 1343 case Opt_sloppy: 1344 sloppy = 1; 1345 dfprintk(MOUNT, "NFS: relaxing parsing rules\n"); 1346 break; 1347 case Opt_userspace: 1348 case Opt_deprecated: 1349 dfprintk(MOUNT, "NFS: ignoring mount option " 1350 "'%s'\n", p); 1351 break; 1352 1353 default: 1354 errors++; 1355 dfprintk(MOUNT, "NFS: unrecognized mount option " 1356 "'%s'\n", p); 1357 } 1358 } 1359 1360 if (errors > 0) { 1361 dfprintk(MOUNT, "NFS: parsing encountered %d error%s\n", 1362 errors, (errors == 1 ? "" : "s")); 1363 if (!sloppy) 1364 return 0; 1365 } 1366 return 1; 1367 1368 out_nomem: 1369 printk(KERN_INFO "NFS: not enough memory to parse option\n"); 1370 return 0; 1371 out_security_failure: 1372 free_secdata(secdata); 1373 printk(KERN_INFO "NFS: security options invalid: %d\n", rc); 1374 return 0; 1375 } 1376 1377 /* 1378 * Use the remote server's MOUNT service to request the NFS file handle 1379 * corresponding to the provided path. 1380 */ 1381 static int nfs_try_mount(struct nfs_parsed_mount_data *args, 1382 struct nfs_fh *root_fh) 1383 { 1384 struct nfs_mount_request request = { 1385 .sap = (struct sockaddr *) 1386 &args->mount_server.address, 1387 .dirpath = args->nfs_server.export_path, 1388 .protocol = args->mount_server.protocol, 1389 .fh = root_fh, 1390 .noresvport = args->flags & NFS_MOUNT_NORESVPORT, 1391 }; 1392 int status; 1393 1394 if (args->mount_server.version == 0) { 1395 if (args->flags & NFS_MOUNT_VER3) 1396 args->mount_server.version = NFS_MNT3_VERSION; 1397 else 1398 args->mount_server.version = NFS_MNT_VERSION; 1399 } 1400 request.version = args->mount_server.version; 1401 1402 if (args->mount_server.hostname) 1403 request.hostname = args->mount_server.hostname; 1404 else 1405 request.hostname = args->nfs_server.hostname; 1406 1407 /* 1408 * Construct the mount server's address. 1409 */ 1410 if (args->mount_server.address.ss_family == AF_UNSPEC) { 1411 memcpy(request.sap, &args->nfs_server.address, 1412 args->nfs_server.addrlen); 1413 args->mount_server.addrlen = args->nfs_server.addrlen; 1414 } 1415 request.salen = args->mount_server.addrlen; 1416 1417 /* 1418 * autobind will be used if mount_server.port == 0 1419 */ 1420 nfs_set_port(request.sap, args->mount_server.port); 1421 1422 /* 1423 * Now ask the mount server to map our export path 1424 * to a file handle. 1425 */ 1426 status = nfs_mount(&request); 1427 if (status == 0) 1428 return 0; 1429 1430 dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n", 1431 request.hostname, status); 1432 return status; 1433 } 1434 1435 static int nfs_parse_simple_hostname(const char *dev_name, 1436 char **hostname, size_t maxnamlen, 1437 char **export_path, size_t maxpathlen) 1438 { 1439 size_t len; 1440 char *colon, *comma; 1441 1442 colon = strchr(dev_name, ':'); 1443 if (colon == NULL) 1444 goto out_bad_devname; 1445 1446 len = colon - dev_name; 1447 if (len > maxnamlen) 1448 goto out_hostname; 1449 1450 /* N.B. caller will free nfs_server.hostname in all cases */ 1451 *hostname = kstrndup(dev_name, len, GFP_KERNEL); 1452 if (!*hostname) 1453 goto out_nomem; 1454 1455 /* kill possible hostname list: not supported */ 1456 comma = strchr(*hostname, ','); 1457 if (comma != NULL) { 1458 if (comma == *hostname) 1459 goto out_bad_devname; 1460 *comma = '\0'; 1461 } 1462 1463 colon++; 1464 len = strlen(colon); 1465 if (len > maxpathlen) 1466 goto out_path; 1467 *export_path = kstrndup(colon, len, GFP_KERNEL); 1468 if (!*export_path) 1469 goto out_nomem; 1470 1471 dfprintk(MOUNT, "NFS: MNTPATH: '%s'\n", *export_path); 1472 return 0; 1473 1474 out_bad_devname: 1475 dfprintk(MOUNT, "NFS: device name not in host:path format\n"); 1476 return -EINVAL; 1477 1478 out_nomem: 1479 dfprintk(MOUNT, "NFS: not enough memory to parse device name\n"); 1480 return -ENOMEM; 1481 1482 out_hostname: 1483 dfprintk(MOUNT, "NFS: server hostname too long\n"); 1484 return -ENAMETOOLONG; 1485 1486 out_path: 1487 dfprintk(MOUNT, "NFS: export pathname too long\n"); 1488 return -ENAMETOOLONG; 1489 } 1490 1491 /* 1492 * Hostname has square brackets around it because it contains one or 1493 * more colons. We look for the first closing square bracket, and a 1494 * colon must follow it. 1495 */ 1496 static int nfs_parse_protected_hostname(const char *dev_name, 1497 char **hostname, size_t maxnamlen, 1498 char **export_path, size_t maxpathlen) 1499 { 1500 size_t len; 1501 char *start, *end; 1502 1503 start = (char *)(dev_name + 1); 1504 1505 end = strchr(start, ']'); 1506 if (end == NULL) 1507 goto out_bad_devname; 1508 if (*(end + 1) != ':') 1509 goto out_bad_devname; 1510 1511 len = end - start; 1512 if (len > maxnamlen) 1513 goto out_hostname; 1514 1515 /* N.B. caller will free nfs_server.hostname in all cases */ 1516 *hostname = kstrndup(start, len, GFP_KERNEL); 1517 if (*hostname == NULL) 1518 goto out_nomem; 1519 1520 end += 2; 1521 len = strlen(end); 1522 if (len > maxpathlen) 1523 goto out_path; 1524 *export_path = kstrndup(end, len, GFP_KERNEL); 1525 if (!*export_path) 1526 goto out_nomem; 1527 1528 return 0; 1529 1530 out_bad_devname: 1531 dfprintk(MOUNT, "NFS: device name not in host:path format\n"); 1532 return -EINVAL; 1533 1534 out_nomem: 1535 dfprintk(MOUNT, "NFS: not enough memory to parse device name\n"); 1536 return -ENOMEM; 1537 1538 out_hostname: 1539 dfprintk(MOUNT, "NFS: server hostname too long\n"); 1540 return -ENAMETOOLONG; 1541 1542 out_path: 1543 dfprintk(MOUNT, "NFS: export pathname too long\n"); 1544 return -ENAMETOOLONG; 1545 } 1546 1547 /* 1548 * Split "dev_name" into "hostname:export_path". 1549 * 1550 * The leftmost colon demarks the split between the server's hostname 1551 * and the export path. If the hostname starts with a left square 1552 * bracket, then it may contain colons. 1553 * 1554 * Note: caller frees hostname and export path, even on error. 1555 */ 1556 static int nfs_parse_devname(const char *dev_name, 1557 char **hostname, size_t maxnamlen, 1558 char **export_path, size_t maxpathlen) 1559 { 1560 if (*dev_name == '[') 1561 return nfs_parse_protected_hostname(dev_name, 1562 hostname, maxnamlen, 1563 export_path, maxpathlen); 1564 1565 return nfs_parse_simple_hostname(dev_name, 1566 hostname, maxnamlen, 1567 export_path, maxpathlen); 1568 } 1569 1570 /* 1571 * Validate the NFS2/NFS3 mount data 1572 * - fills in the mount root filehandle 1573 * 1574 * For option strings, user space handles the following behaviors: 1575 * 1576 * + DNS: mapping server host name to IP address ("addr=" option) 1577 * 1578 * + failure mode: how to behave if a mount request can't be handled 1579 * immediately ("fg/bg" option) 1580 * 1581 * + retry: how often to retry a mount request ("retry=" option) 1582 * 1583 * + breaking back: trying proto=udp after proto=tcp, v2 after v3, 1584 * mountproto=tcp after mountproto=udp, and so on 1585 */ 1586 static int nfs_validate_mount_data(void *options, 1587 struct nfs_parsed_mount_data *args, 1588 struct nfs_fh *mntfh, 1589 const char *dev_name) 1590 { 1591 struct nfs_mount_data *data = (struct nfs_mount_data *)options; 1592 1593 if (data == NULL) 1594 goto out_no_data; 1595 1596 args->flags = (NFS_MOUNT_VER3 | NFS_MOUNT_TCP); 1597 args->rsize = NFS_MAX_FILE_IO_SIZE; 1598 args->wsize = NFS_MAX_FILE_IO_SIZE; 1599 args->acregmin = NFS_DEF_ACREGMIN; 1600 args->acregmax = NFS_DEF_ACREGMAX; 1601 args->acdirmin = NFS_DEF_ACDIRMIN; 1602 args->acdirmax = NFS_DEF_ACDIRMAX; 1603 args->mount_server.port = 0; /* autobind unless user sets port */ 1604 args->nfs_server.port = 0; /* autobind unless user sets port */ 1605 args->nfs_server.protocol = XPRT_TRANSPORT_TCP; 1606 args->auth_flavors[0] = RPC_AUTH_UNIX; 1607 1608 switch (data->version) { 1609 case 1: 1610 data->namlen = 0; 1611 case 2: 1612 data->bsize = 0; 1613 case 3: 1614 if (data->flags & NFS_MOUNT_VER3) 1615 goto out_no_v3; 1616 data->root.size = NFS2_FHSIZE; 1617 memcpy(data->root.data, data->old_root.data, NFS2_FHSIZE); 1618 case 4: 1619 if (data->flags & NFS_MOUNT_SECFLAVOUR) 1620 goto out_no_sec; 1621 case 5: 1622 memset(data->context, 0, sizeof(data->context)); 1623 case 6: 1624 if (data->flags & NFS_MOUNT_VER3) { 1625 if (data->root.size > NFS3_FHSIZE || data->root.size == 0) 1626 goto out_invalid_fh; 1627 mntfh->size = data->root.size; 1628 } else 1629 mntfh->size = NFS2_FHSIZE; 1630 1631 1632 memcpy(mntfh->data, data->root.data, mntfh->size); 1633 if (mntfh->size < sizeof(mntfh->data)) 1634 memset(mntfh->data + mntfh->size, 0, 1635 sizeof(mntfh->data) - mntfh->size); 1636 1637 /* 1638 * Translate to nfs_parsed_mount_data, which nfs_fill_super 1639 * can deal with. 1640 */ 1641 args->flags = data->flags & NFS_MOUNT_FLAGMASK; 1642 args->rsize = data->rsize; 1643 args->wsize = data->wsize; 1644 args->timeo = data->timeo; 1645 args->retrans = data->retrans; 1646 args->acregmin = data->acregmin; 1647 args->acregmax = data->acregmax; 1648 args->acdirmin = data->acdirmin; 1649 args->acdirmax = data->acdirmax; 1650 1651 memcpy(&args->nfs_server.address, &data->addr, 1652 sizeof(data->addr)); 1653 args->nfs_server.addrlen = sizeof(data->addr); 1654 if (!nfs_verify_server_address((struct sockaddr *) 1655 &args->nfs_server.address)) 1656 goto out_no_address; 1657 1658 if (!(data->flags & NFS_MOUNT_TCP)) 1659 args->nfs_server.protocol = XPRT_TRANSPORT_UDP; 1660 /* N.B. caller will free nfs_server.hostname in all cases */ 1661 args->nfs_server.hostname = kstrdup(data->hostname, GFP_KERNEL); 1662 args->namlen = data->namlen; 1663 args->bsize = data->bsize; 1664 1665 if (data->flags & NFS_MOUNT_SECFLAVOUR) 1666 args->auth_flavors[0] = data->pseudoflavor; 1667 if (!args->nfs_server.hostname) 1668 goto out_nomem; 1669 1670 /* 1671 * The legacy version 6 binary mount data from userspace has a 1672 * field used only to transport selinux information into the 1673 * the kernel. To continue to support that functionality we 1674 * have a touch of selinux knowledge here in the NFS code. The 1675 * userspace code converted context=blah to just blah so we are 1676 * converting back to the full string selinux understands. 1677 */ 1678 if (data->context[0]){ 1679 #ifdef CONFIG_SECURITY_SELINUX 1680 int rc; 1681 char *opts_str = kmalloc(sizeof(data->context) + 8, GFP_KERNEL); 1682 if (!opts_str) 1683 return -ENOMEM; 1684 strcpy(opts_str, "context="); 1685 data->context[NFS_MAX_CONTEXT_LEN] = '\0'; 1686 strcat(opts_str, &data->context[0]); 1687 rc = security_sb_parse_opts_str(opts_str, &args->lsm_opts); 1688 kfree(opts_str); 1689 if (rc) 1690 return rc; 1691 #else 1692 return -EINVAL; 1693 #endif 1694 } 1695 1696 break; 1697 default: { 1698 int status; 1699 1700 if (nfs_parse_mount_options((char *)options, args) == 0) 1701 return -EINVAL; 1702 1703 if (!nfs_verify_server_address((struct sockaddr *) 1704 &args->nfs_server.address)) 1705 goto out_no_address; 1706 1707 nfs_set_port((struct sockaddr *)&args->nfs_server.address, 1708 args->nfs_server.port); 1709 1710 nfs_set_mount_transport_protocol(args); 1711 1712 status = nfs_parse_devname(dev_name, 1713 &args->nfs_server.hostname, 1714 PAGE_SIZE, 1715 &args->nfs_server.export_path, 1716 NFS_MAXPATHLEN); 1717 if (!status) 1718 status = nfs_try_mount(args, mntfh); 1719 1720 kfree(args->nfs_server.export_path); 1721 args->nfs_server.export_path = NULL; 1722 1723 if (status) 1724 return status; 1725 1726 break; 1727 } 1728 } 1729 1730 #ifndef CONFIG_NFS_V3 1731 if (args->flags & NFS_MOUNT_VER3) 1732 goto out_v3_not_compiled; 1733 #endif /* !CONFIG_NFS_V3 */ 1734 1735 return 0; 1736 1737 out_no_data: 1738 dfprintk(MOUNT, "NFS: mount program didn't pass any mount data\n"); 1739 return -EINVAL; 1740 1741 out_no_v3: 1742 dfprintk(MOUNT, "NFS: nfs_mount_data version %d does not support v3\n", 1743 data->version); 1744 return -EINVAL; 1745 1746 out_no_sec: 1747 dfprintk(MOUNT, "NFS: nfs_mount_data version supports only AUTH_SYS\n"); 1748 return -EINVAL; 1749 1750 #ifndef CONFIG_NFS_V3 1751 out_v3_not_compiled: 1752 dfprintk(MOUNT, "NFS: NFSv3 is not compiled into kernel\n"); 1753 return -EPROTONOSUPPORT; 1754 #endif /* !CONFIG_NFS_V3 */ 1755 1756 out_nomem: 1757 dfprintk(MOUNT, "NFS: not enough memory to handle mount options\n"); 1758 return -ENOMEM; 1759 1760 out_no_address: 1761 dfprintk(MOUNT, "NFS: mount program didn't pass remote address\n"); 1762 return -EINVAL; 1763 1764 out_invalid_fh: 1765 dfprintk(MOUNT, "NFS: invalid root filehandle\n"); 1766 return -EINVAL; 1767 } 1768 1769 static int 1770 nfs_compare_remount_data(struct nfs_server *nfss, 1771 struct nfs_parsed_mount_data *data) 1772 { 1773 if (data->flags != nfss->flags || 1774 data->rsize != nfss->rsize || 1775 data->wsize != nfss->wsize || 1776 data->retrans != nfss->client->cl_timeout->to_retries || 1777 data->auth_flavors[0] != nfss->client->cl_auth->au_flavor || 1778 data->acregmin != nfss->acregmin / HZ || 1779 data->acregmax != nfss->acregmax / HZ || 1780 data->acdirmin != nfss->acdirmin / HZ || 1781 data->acdirmax != nfss->acdirmax / HZ || 1782 data->timeo != (10U * nfss->client->cl_timeout->to_initval / HZ) || 1783 data->nfs_server.addrlen != nfss->nfs_client->cl_addrlen || 1784 memcmp(&data->nfs_server.address, &nfss->nfs_client->cl_addr, 1785 data->nfs_server.addrlen) != 0) 1786 return -EINVAL; 1787 1788 return 0; 1789 } 1790 1791 static int 1792 nfs_remount(struct super_block *sb, int *flags, char *raw_data) 1793 { 1794 int error; 1795 struct nfs_server *nfss = sb->s_fs_info; 1796 struct nfs_parsed_mount_data *data; 1797 struct nfs_mount_data *options = (struct nfs_mount_data *)raw_data; 1798 struct nfs4_mount_data *options4 = (struct nfs4_mount_data *)raw_data; 1799 u32 nfsvers = nfss->nfs_client->rpc_ops->version; 1800 1801 /* 1802 * Userspace mount programs that send binary options generally send 1803 * them populated with default values. We have no way to know which 1804 * ones were explicitly specified. Fall back to legacy behavior and 1805 * just return success. 1806 */ 1807 if ((nfsvers == 4 && (!options4 || options4->version == 1)) || 1808 (nfsvers <= 3 && (!options || (options->version >= 1 && 1809 options->version <= 6)))) 1810 return 0; 1811 1812 data = kzalloc(sizeof(*data), GFP_KERNEL); 1813 if (data == NULL) 1814 return -ENOMEM; 1815 1816 /* fill out struct with values from existing mount */ 1817 data->flags = nfss->flags; 1818 data->rsize = nfss->rsize; 1819 data->wsize = nfss->wsize; 1820 data->retrans = nfss->client->cl_timeout->to_retries; 1821 data->auth_flavors[0] = nfss->client->cl_auth->au_flavor; 1822 data->acregmin = nfss->acregmin / HZ; 1823 data->acregmax = nfss->acregmax / HZ; 1824 data->acdirmin = nfss->acdirmin / HZ; 1825 data->acdirmax = nfss->acdirmax / HZ; 1826 data->timeo = 10U * nfss->client->cl_timeout->to_initval / HZ; 1827 data->nfs_server.addrlen = nfss->nfs_client->cl_addrlen; 1828 memcpy(&data->nfs_server.address, &nfss->nfs_client->cl_addr, 1829 data->nfs_server.addrlen); 1830 1831 /* overwrite those values with any that were specified */ 1832 error = nfs_parse_mount_options((char *)options, data); 1833 if (error < 0) 1834 goto out; 1835 1836 /* compare new mount options with old ones */ 1837 error = nfs_compare_remount_data(nfss, data); 1838 out: 1839 kfree(data); 1840 return error; 1841 } 1842 1843 /* 1844 * Initialise the common bits of the superblock 1845 */ 1846 static inline void nfs_initialise_sb(struct super_block *sb) 1847 { 1848 struct nfs_server *server = NFS_SB(sb); 1849 1850 sb->s_magic = NFS_SUPER_MAGIC; 1851 1852 /* We probably want something more informative here */ 1853 snprintf(sb->s_id, sizeof(sb->s_id), 1854 "%x:%x", MAJOR(sb->s_dev), MINOR(sb->s_dev)); 1855 1856 if (sb->s_blocksize == 0) 1857 sb->s_blocksize = nfs_block_bits(server->wsize, 1858 &sb->s_blocksize_bits); 1859 1860 if (server->flags & NFS_MOUNT_NOAC) 1861 sb->s_flags |= MS_SYNCHRONOUS; 1862 1863 nfs_super_set_maxbytes(sb, server->maxfilesize); 1864 } 1865 1866 /* 1867 * Finish setting up an NFS2/3 superblock 1868 */ 1869 static void nfs_fill_super(struct super_block *sb, 1870 struct nfs_parsed_mount_data *data) 1871 { 1872 struct nfs_server *server = NFS_SB(sb); 1873 1874 sb->s_blocksize_bits = 0; 1875 sb->s_blocksize = 0; 1876 if (data->bsize) 1877 sb->s_blocksize = nfs_block_size(data->bsize, &sb->s_blocksize_bits); 1878 1879 if (server->flags & NFS_MOUNT_VER3) { 1880 /* The VFS shouldn't apply the umask to mode bits. We will do 1881 * so ourselves when necessary. 1882 */ 1883 sb->s_flags |= MS_POSIXACL; 1884 sb->s_time_gran = 1; 1885 } 1886 1887 sb->s_op = &nfs_sops; 1888 nfs_initialise_sb(sb); 1889 } 1890 1891 /* 1892 * Finish setting up a cloned NFS2/3 superblock 1893 */ 1894 static void nfs_clone_super(struct super_block *sb, 1895 const struct super_block *old_sb) 1896 { 1897 struct nfs_server *server = NFS_SB(sb); 1898 1899 sb->s_blocksize_bits = old_sb->s_blocksize_bits; 1900 sb->s_blocksize = old_sb->s_blocksize; 1901 sb->s_maxbytes = old_sb->s_maxbytes; 1902 1903 if (server->flags & NFS_MOUNT_VER3) { 1904 /* The VFS shouldn't apply the umask to mode bits. We will do 1905 * so ourselves when necessary. 1906 */ 1907 sb->s_flags |= MS_POSIXACL; 1908 sb->s_time_gran = 1; 1909 } 1910 1911 sb->s_op = old_sb->s_op; 1912 nfs_initialise_sb(sb); 1913 } 1914 1915 static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags) 1916 { 1917 const struct nfs_server *a = s->s_fs_info; 1918 const struct rpc_clnt *clnt_a = a->client; 1919 const struct rpc_clnt *clnt_b = b->client; 1920 1921 if ((s->s_flags & NFS_MS_MASK) != (flags & NFS_MS_MASK)) 1922 goto Ebusy; 1923 if (a->nfs_client != b->nfs_client) 1924 goto Ebusy; 1925 if (a->flags != b->flags) 1926 goto Ebusy; 1927 if (a->wsize != b->wsize) 1928 goto Ebusy; 1929 if (a->rsize != b->rsize) 1930 goto Ebusy; 1931 if (a->acregmin != b->acregmin) 1932 goto Ebusy; 1933 if (a->acregmax != b->acregmax) 1934 goto Ebusy; 1935 if (a->acdirmin != b->acdirmin) 1936 goto Ebusy; 1937 if (a->acdirmax != b->acdirmax) 1938 goto Ebusy; 1939 if (clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor) 1940 goto Ebusy; 1941 return 1; 1942 Ebusy: 1943 return 0; 1944 } 1945 1946 struct nfs_sb_mountdata { 1947 struct nfs_server *server; 1948 int mntflags; 1949 }; 1950 1951 static int nfs_set_super(struct super_block *s, void *data) 1952 { 1953 struct nfs_sb_mountdata *sb_mntdata = data; 1954 struct nfs_server *server = sb_mntdata->server; 1955 int ret; 1956 1957 s->s_flags = sb_mntdata->mntflags; 1958 s->s_fs_info = server; 1959 ret = set_anon_super(s, server); 1960 if (ret == 0) 1961 server->s_dev = s->s_dev; 1962 return ret; 1963 } 1964 1965 static int nfs_compare_super_address(struct nfs_server *server1, 1966 struct nfs_server *server2) 1967 { 1968 struct sockaddr *sap1, *sap2; 1969 1970 sap1 = (struct sockaddr *)&server1->nfs_client->cl_addr; 1971 sap2 = (struct sockaddr *)&server2->nfs_client->cl_addr; 1972 1973 if (sap1->sa_family != sap2->sa_family) 1974 return 0; 1975 1976 switch (sap1->sa_family) { 1977 case AF_INET: { 1978 struct sockaddr_in *sin1 = (struct sockaddr_in *)sap1; 1979 struct sockaddr_in *sin2 = (struct sockaddr_in *)sap2; 1980 if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) 1981 return 0; 1982 if (sin1->sin_port != sin2->sin_port) 1983 return 0; 1984 break; 1985 } 1986 case AF_INET6: { 1987 struct sockaddr_in6 *sin1 = (struct sockaddr_in6 *)sap1; 1988 struct sockaddr_in6 *sin2 = (struct sockaddr_in6 *)sap2; 1989 if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr)) 1990 return 0; 1991 if (sin1->sin6_port != sin2->sin6_port) 1992 return 0; 1993 break; 1994 } 1995 default: 1996 return 0; 1997 } 1998 1999 return 1; 2000 } 2001 2002 static int nfs_compare_super(struct super_block *sb, void *data) 2003 { 2004 struct nfs_sb_mountdata *sb_mntdata = data; 2005 struct nfs_server *server = sb_mntdata->server, *old = NFS_SB(sb); 2006 int mntflags = sb_mntdata->mntflags; 2007 2008 if (!nfs_compare_super_address(old, server)) 2009 return 0; 2010 /* Note: NFS_MOUNT_UNSHARED == NFS4_MOUNT_UNSHARED */ 2011 if (old->flags & NFS_MOUNT_UNSHARED) 2012 return 0; 2013 if (memcmp(&old->fsid, &server->fsid, sizeof(old->fsid)) != 0) 2014 return 0; 2015 return nfs_compare_mount_options(sb, server, mntflags); 2016 } 2017 2018 static int nfs_bdi_register(struct nfs_server *server) 2019 { 2020 return bdi_register_dev(&server->backing_dev_info, server->s_dev); 2021 } 2022 2023 static int nfs_get_sb(struct file_system_type *fs_type, 2024 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt) 2025 { 2026 struct nfs_server *server = NULL; 2027 struct super_block *s; 2028 struct nfs_parsed_mount_data *data; 2029 struct nfs_fh *mntfh; 2030 struct dentry *mntroot; 2031 int (*compare_super)(struct super_block *, void *) = nfs_compare_super; 2032 struct nfs_sb_mountdata sb_mntdata = { 2033 .mntflags = flags, 2034 }; 2035 int error = -ENOMEM; 2036 2037 data = kzalloc(sizeof(*data), GFP_KERNEL); 2038 mntfh = kzalloc(sizeof(*mntfh), GFP_KERNEL); 2039 if (data == NULL || mntfh == NULL) 2040 goto out_free_fh; 2041 2042 security_init_mnt_opts(&data->lsm_opts); 2043 2044 /* Validate the mount data */ 2045 error = nfs_validate_mount_data(raw_data, data, mntfh, dev_name); 2046 if (error < 0) 2047 goto out; 2048 2049 /* Get a volume representation */ 2050 server = nfs_create_server(data, mntfh); 2051 if (IS_ERR(server)) { 2052 error = PTR_ERR(server); 2053 goto out; 2054 } 2055 sb_mntdata.server = server; 2056 2057 if (server->flags & NFS_MOUNT_UNSHARED) 2058 compare_super = NULL; 2059 2060 /* Get a superblock - note that we may end up sharing one that already exists */ 2061 s = sget(fs_type, compare_super, nfs_set_super, &sb_mntdata); 2062 if (IS_ERR(s)) { 2063 error = PTR_ERR(s); 2064 goto out_err_nosb; 2065 } 2066 2067 if (s->s_fs_info != server) { 2068 nfs_free_server(server); 2069 server = NULL; 2070 } else { 2071 error = nfs_bdi_register(server); 2072 if (error) 2073 goto error_splat_super; 2074 } 2075 2076 if (!s->s_root) { 2077 /* initial superblock/root creation */ 2078 nfs_fill_super(s, data); 2079 nfs_fscache_get_super_cookie(s, data); 2080 } 2081 2082 mntroot = nfs_get_root(s, mntfh); 2083 if (IS_ERR(mntroot)) { 2084 error = PTR_ERR(mntroot); 2085 goto error_splat_super; 2086 } 2087 2088 error = security_sb_set_mnt_opts(s, &data->lsm_opts); 2089 if (error) 2090 goto error_splat_root; 2091 2092 s->s_flags |= MS_ACTIVE; 2093 mnt->mnt_sb = s; 2094 mnt->mnt_root = mntroot; 2095 error = 0; 2096 2097 out: 2098 kfree(data->nfs_server.hostname); 2099 kfree(data->mount_server.hostname); 2100 kfree(data->fscache_uniq); 2101 security_free_mnt_opts(&data->lsm_opts); 2102 out_free_fh: 2103 kfree(mntfh); 2104 kfree(data); 2105 return error; 2106 2107 out_err_nosb: 2108 nfs_free_server(server); 2109 goto out; 2110 2111 error_splat_root: 2112 dput(mntroot); 2113 error_splat_super: 2114 deactivate_locked_super(s); 2115 goto out; 2116 } 2117 2118 /* 2119 * Destroy an NFS2/3 superblock 2120 */ 2121 static void nfs_kill_super(struct super_block *s) 2122 { 2123 struct nfs_server *server = NFS_SB(s); 2124 2125 bdi_unregister(&server->backing_dev_info); 2126 kill_anon_super(s); 2127 nfs_fscache_release_super_cookie(s); 2128 nfs_free_server(server); 2129 } 2130 2131 /* 2132 * Clone an NFS2/3 server record on xdev traversal (FSID-change) 2133 */ 2134 static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, 2135 const char *dev_name, void *raw_data, 2136 struct vfsmount *mnt) 2137 { 2138 struct nfs_clone_mount *data = raw_data; 2139 struct super_block *s; 2140 struct nfs_server *server; 2141 struct dentry *mntroot; 2142 int (*compare_super)(struct super_block *, void *) = nfs_compare_super; 2143 struct nfs_sb_mountdata sb_mntdata = { 2144 .mntflags = flags, 2145 }; 2146 int error; 2147 2148 dprintk("--> nfs_xdev_get_sb()\n"); 2149 2150 /* create a new volume representation */ 2151 server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr); 2152 if (IS_ERR(server)) { 2153 error = PTR_ERR(server); 2154 goto out_err_noserver; 2155 } 2156 sb_mntdata.server = server; 2157 2158 if (server->flags & NFS_MOUNT_UNSHARED) 2159 compare_super = NULL; 2160 2161 /* Get a superblock - note that we may end up sharing one that already exists */ 2162 s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata); 2163 if (IS_ERR(s)) { 2164 error = PTR_ERR(s); 2165 goto out_err_nosb; 2166 } 2167 2168 if (s->s_fs_info != server) { 2169 nfs_free_server(server); 2170 server = NULL; 2171 } else { 2172 error = nfs_bdi_register(server); 2173 if (error) 2174 goto error_splat_super; 2175 } 2176 2177 if (!s->s_root) { 2178 /* initial superblock/root creation */ 2179 nfs_clone_super(s, data->sb); 2180 } 2181 2182 mntroot = nfs_get_root(s, data->fh); 2183 if (IS_ERR(mntroot)) { 2184 error = PTR_ERR(mntroot); 2185 goto error_splat_super; 2186 } 2187 if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops) { 2188 dput(mntroot); 2189 error = -ESTALE; 2190 goto error_splat_super; 2191 } 2192 2193 s->s_flags |= MS_ACTIVE; 2194 mnt->mnt_sb = s; 2195 mnt->mnt_root = mntroot; 2196 2197 /* clone any lsm security options from the parent to the new sb */ 2198 security_sb_clone_mnt_opts(data->sb, s); 2199 2200 dprintk("<-- nfs_xdev_get_sb() = 0\n"); 2201 return 0; 2202 2203 out_err_nosb: 2204 nfs_free_server(server); 2205 out_err_noserver: 2206 dprintk("<-- nfs_xdev_get_sb() = %d [error]\n", error); 2207 return error; 2208 2209 error_splat_super: 2210 deactivate_locked_super(s); 2211 dprintk("<-- nfs_xdev_get_sb() = %d [splat]\n", error); 2212 return error; 2213 } 2214 2215 #ifdef CONFIG_NFS_V4 2216 2217 /* 2218 * Finish setting up a cloned NFS4 superblock 2219 */ 2220 static void nfs4_clone_super(struct super_block *sb, 2221 const struct super_block *old_sb) 2222 { 2223 sb->s_blocksize_bits = old_sb->s_blocksize_bits; 2224 sb->s_blocksize = old_sb->s_blocksize; 2225 sb->s_maxbytes = old_sb->s_maxbytes; 2226 sb->s_time_gran = 1; 2227 sb->s_op = old_sb->s_op; 2228 nfs_initialise_sb(sb); 2229 } 2230 2231 /* 2232 * Set up an NFS4 superblock 2233 */ 2234 static void nfs4_fill_super(struct super_block *sb) 2235 { 2236 sb->s_time_gran = 1; 2237 sb->s_op = &nfs4_sops; 2238 nfs_initialise_sb(sb); 2239 } 2240 2241 /* 2242 * Validate NFSv4 mount options 2243 */ 2244 static int nfs4_validate_mount_data(void *options, 2245 struct nfs_parsed_mount_data *args, 2246 const char *dev_name) 2247 { 2248 struct sockaddr_in *ap; 2249 struct nfs4_mount_data *data = (struct nfs4_mount_data *)options; 2250 char *c; 2251 2252 if (data == NULL) 2253 goto out_no_data; 2254 2255 args->rsize = NFS_MAX_FILE_IO_SIZE; 2256 args->wsize = NFS_MAX_FILE_IO_SIZE; 2257 args->acregmin = NFS_DEF_ACREGMIN; 2258 args->acregmax = NFS_DEF_ACREGMAX; 2259 args->acdirmin = NFS_DEF_ACDIRMIN; 2260 args->acdirmax = NFS_DEF_ACDIRMAX; 2261 args->nfs_server.port = NFS_PORT; /* 2049 unless user set port= */ 2262 args->auth_flavors[0] = RPC_AUTH_UNIX; 2263 args->auth_flavor_len = 0; 2264 2265 switch (data->version) { 2266 case 1: 2267 ap = (struct sockaddr_in *)&args->nfs_server.address; 2268 if (data->host_addrlen > sizeof(args->nfs_server.address)) 2269 goto out_no_address; 2270 if (data->host_addrlen == 0) 2271 goto out_no_address; 2272 args->nfs_server.addrlen = data->host_addrlen; 2273 if (copy_from_user(ap, data->host_addr, data->host_addrlen)) 2274 return -EFAULT; 2275 if (!nfs_verify_server_address((struct sockaddr *) 2276 &args->nfs_server.address)) 2277 goto out_no_address; 2278 2279 if (data->auth_flavourlen) { 2280 if (data->auth_flavourlen > 1) 2281 goto out_inval_auth; 2282 if (copy_from_user(&args->auth_flavors[0], 2283 data->auth_flavours, 2284 sizeof(args->auth_flavors[0]))) 2285 return -EFAULT; 2286 } 2287 2288 c = strndup_user(data->hostname.data, NFS4_MAXNAMLEN); 2289 if (IS_ERR(c)) 2290 return PTR_ERR(c); 2291 args->nfs_server.hostname = c; 2292 2293 c = strndup_user(data->mnt_path.data, NFS4_MAXPATHLEN); 2294 if (IS_ERR(c)) 2295 return PTR_ERR(c); 2296 args->nfs_server.export_path = c; 2297 dfprintk(MOUNT, "NFS: MNTPATH: '%s'\n", c); 2298 2299 c = strndup_user(data->client_addr.data, 16); 2300 if (IS_ERR(c)) 2301 return PTR_ERR(c); 2302 args->client_address = c; 2303 2304 /* 2305 * Translate to nfs_parsed_mount_data, which nfs4_fill_super 2306 * can deal with. 2307 */ 2308 2309 args->flags = data->flags & NFS4_MOUNT_FLAGMASK; 2310 args->rsize = data->rsize; 2311 args->wsize = data->wsize; 2312 args->timeo = data->timeo; 2313 args->retrans = data->retrans; 2314 args->acregmin = data->acregmin; 2315 args->acregmax = data->acregmax; 2316 args->acdirmin = data->acdirmin; 2317 args->acdirmax = data->acdirmax; 2318 args->nfs_server.protocol = data->proto; 2319 nfs_validate_transport_protocol(args); 2320 2321 break; 2322 default: { 2323 int status; 2324 2325 if (nfs_parse_mount_options((char *)options, args) == 0) 2326 return -EINVAL; 2327 2328 if (!nfs_verify_server_address((struct sockaddr *) 2329 &args->nfs_server.address)) 2330 return -EINVAL; 2331 2332 nfs_set_port((struct sockaddr *)&args->nfs_server.address, 2333 args->nfs_server.port); 2334 2335 nfs_validate_transport_protocol(args); 2336 2337 if (args->auth_flavor_len > 1) 2338 goto out_inval_auth; 2339 2340 if (args->client_address == NULL) 2341 goto out_no_client_address; 2342 2343 status = nfs_parse_devname(dev_name, 2344 &args->nfs_server.hostname, 2345 NFS4_MAXNAMLEN, 2346 &args->nfs_server.export_path, 2347 NFS4_MAXPATHLEN); 2348 if (status < 0) 2349 return status; 2350 2351 break; 2352 } 2353 } 2354 2355 return 0; 2356 2357 out_no_data: 2358 dfprintk(MOUNT, "NFS4: mount program didn't pass any mount data\n"); 2359 return -EINVAL; 2360 2361 out_inval_auth: 2362 dfprintk(MOUNT, "NFS4: Invalid number of RPC auth flavours %d\n", 2363 data->auth_flavourlen); 2364 return -EINVAL; 2365 2366 out_no_address: 2367 dfprintk(MOUNT, "NFS4: mount program didn't pass remote address\n"); 2368 return -EINVAL; 2369 2370 out_no_client_address: 2371 dfprintk(MOUNT, "NFS4: mount program didn't pass callback address\n"); 2372 return -EINVAL; 2373 } 2374 2375 /* 2376 * Get the superblock for an NFS4 mountpoint 2377 */ 2378 static int nfs4_get_sb(struct file_system_type *fs_type, 2379 int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt) 2380 { 2381 struct nfs_parsed_mount_data *data; 2382 struct super_block *s; 2383 struct nfs_server *server; 2384 struct nfs_fh *mntfh; 2385 struct dentry *mntroot; 2386 int (*compare_super)(struct super_block *, void *) = nfs_compare_super; 2387 struct nfs_sb_mountdata sb_mntdata = { 2388 .mntflags = flags, 2389 }; 2390 int error = -ENOMEM; 2391 2392 data = kzalloc(sizeof(*data), GFP_KERNEL); 2393 mntfh = kzalloc(sizeof(*mntfh), GFP_KERNEL); 2394 if (data == NULL || mntfh == NULL) 2395 goto out_free_fh; 2396 2397 security_init_mnt_opts(&data->lsm_opts); 2398 2399 /* Validate the mount data */ 2400 error = nfs4_validate_mount_data(raw_data, data, dev_name); 2401 if (error < 0) 2402 goto out; 2403 2404 /* Get a volume representation */ 2405 server = nfs4_create_server(data, mntfh); 2406 if (IS_ERR(server)) { 2407 error = PTR_ERR(server); 2408 goto out; 2409 } 2410 sb_mntdata.server = server; 2411 2412 if (server->flags & NFS4_MOUNT_UNSHARED) 2413 compare_super = NULL; 2414 2415 /* Get a superblock - note that we may end up sharing one that already exists */ 2416 s = sget(fs_type, compare_super, nfs_set_super, &sb_mntdata); 2417 if (IS_ERR(s)) { 2418 error = PTR_ERR(s); 2419 goto out_free; 2420 } 2421 2422 if (s->s_fs_info != server) { 2423 nfs_free_server(server); 2424 server = NULL; 2425 } else { 2426 error = nfs_bdi_register(server); 2427 if (error) 2428 goto error_splat_super; 2429 } 2430 2431 if (!s->s_root) { 2432 /* initial superblock/root creation */ 2433 nfs4_fill_super(s); 2434 nfs_fscache_get_super_cookie(s, data); 2435 } 2436 2437 mntroot = nfs4_get_root(s, mntfh); 2438 if (IS_ERR(mntroot)) { 2439 error = PTR_ERR(mntroot); 2440 goto error_splat_super; 2441 } 2442 2443 error = security_sb_set_mnt_opts(s, &data->lsm_opts); 2444 if (error) 2445 goto error_splat_root; 2446 2447 s->s_flags |= MS_ACTIVE; 2448 mnt->mnt_sb = s; 2449 mnt->mnt_root = mntroot; 2450 error = 0; 2451 2452 out: 2453 kfree(data->client_address); 2454 kfree(data->nfs_server.export_path); 2455 kfree(data->nfs_server.hostname); 2456 kfree(data->fscache_uniq); 2457 security_free_mnt_opts(&data->lsm_opts); 2458 out_free_fh: 2459 kfree(mntfh); 2460 kfree(data); 2461 return error; 2462 2463 out_free: 2464 nfs_free_server(server); 2465 goto out; 2466 2467 error_splat_root: 2468 dput(mntroot); 2469 error_splat_super: 2470 deactivate_locked_super(s); 2471 goto out; 2472 } 2473 2474 static void nfs4_kill_super(struct super_block *sb) 2475 { 2476 struct nfs_server *server = NFS_SB(sb); 2477 2478 nfs_super_return_all_delegations(sb); 2479 kill_anon_super(sb); 2480 2481 nfs4_renewd_prepare_shutdown(server); 2482 nfs_fscache_release_super_cookie(sb); 2483 nfs_free_server(server); 2484 } 2485 2486 /* 2487 * Clone an NFS4 server record on xdev traversal (FSID-change) 2488 */ 2489 static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags, 2490 const char *dev_name, void *raw_data, 2491 struct vfsmount *mnt) 2492 { 2493 struct nfs_clone_mount *data = raw_data; 2494 struct super_block *s; 2495 struct nfs_server *server; 2496 struct dentry *mntroot; 2497 int (*compare_super)(struct super_block *, void *) = nfs_compare_super; 2498 struct nfs_sb_mountdata sb_mntdata = { 2499 .mntflags = flags, 2500 }; 2501 int error; 2502 2503 dprintk("--> nfs4_xdev_get_sb()\n"); 2504 2505 /* create a new volume representation */ 2506 server = nfs_clone_server(NFS_SB(data->sb), data->fh, data->fattr); 2507 if (IS_ERR(server)) { 2508 error = PTR_ERR(server); 2509 goto out_err_noserver; 2510 } 2511 sb_mntdata.server = server; 2512 2513 if (server->flags & NFS4_MOUNT_UNSHARED) 2514 compare_super = NULL; 2515 2516 /* Get a superblock - note that we may end up sharing one that already exists */ 2517 s = sget(&nfs4_fs_type, compare_super, nfs_set_super, &sb_mntdata); 2518 if (IS_ERR(s)) { 2519 error = PTR_ERR(s); 2520 goto out_err_nosb; 2521 } 2522 2523 if (s->s_fs_info != server) { 2524 nfs_free_server(server); 2525 server = NULL; 2526 } else { 2527 error = nfs_bdi_register(server); 2528 if (error) 2529 goto error_splat_super; 2530 } 2531 2532 if (!s->s_root) { 2533 /* initial superblock/root creation */ 2534 nfs4_clone_super(s, data->sb); 2535 } 2536 2537 mntroot = nfs4_get_root(s, data->fh); 2538 if (IS_ERR(mntroot)) { 2539 error = PTR_ERR(mntroot); 2540 goto error_splat_super; 2541 } 2542 if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops) { 2543 dput(mntroot); 2544 error = -ESTALE; 2545 goto error_splat_super; 2546 } 2547 2548 s->s_flags |= MS_ACTIVE; 2549 mnt->mnt_sb = s; 2550 mnt->mnt_root = mntroot; 2551 2552 security_sb_clone_mnt_opts(data->sb, s); 2553 2554 dprintk("<-- nfs4_xdev_get_sb() = 0\n"); 2555 return 0; 2556 2557 out_err_nosb: 2558 nfs_free_server(server); 2559 out_err_noserver: 2560 dprintk("<-- nfs4_xdev_get_sb() = %d [error]\n", error); 2561 return error; 2562 2563 error_splat_super: 2564 deactivate_locked_super(s); 2565 dprintk("<-- nfs4_xdev_get_sb() = %d [splat]\n", error); 2566 return error; 2567 } 2568 2569 /* 2570 * Create an NFS4 server record on referral traversal 2571 */ 2572 static int nfs4_referral_get_sb(struct file_system_type *fs_type, int flags, 2573 const char *dev_name, void *raw_data, 2574 struct vfsmount *mnt) 2575 { 2576 struct nfs_clone_mount *data = raw_data; 2577 struct super_block *s; 2578 struct nfs_server *server; 2579 struct dentry *mntroot; 2580 struct nfs_fh mntfh; 2581 int (*compare_super)(struct super_block *, void *) = nfs_compare_super; 2582 struct nfs_sb_mountdata sb_mntdata = { 2583 .mntflags = flags, 2584 }; 2585 int error; 2586 2587 dprintk("--> nfs4_referral_get_sb()\n"); 2588 2589 /* create a new volume representation */ 2590 server = nfs4_create_referral_server(data, &mntfh); 2591 if (IS_ERR(server)) { 2592 error = PTR_ERR(server); 2593 goto out_err_noserver; 2594 } 2595 sb_mntdata.server = server; 2596 2597 if (server->flags & NFS4_MOUNT_UNSHARED) 2598 compare_super = NULL; 2599 2600 /* Get a superblock - note that we may end up sharing one that already exists */ 2601 s = sget(&nfs4_fs_type, compare_super, nfs_set_super, &sb_mntdata); 2602 if (IS_ERR(s)) { 2603 error = PTR_ERR(s); 2604 goto out_err_nosb; 2605 } 2606 2607 if (s->s_fs_info != server) { 2608 nfs_free_server(server); 2609 server = NULL; 2610 } else { 2611 error = nfs_bdi_register(server); 2612 if (error) 2613 goto error_splat_super; 2614 } 2615 2616 if (!s->s_root) { 2617 /* initial superblock/root creation */ 2618 nfs4_fill_super(s); 2619 } 2620 2621 mntroot = nfs4_get_root(s, &mntfh); 2622 if (IS_ERR(mntroot)) { 2623 error = PTR_ERR(mntroot); 2624 goto error_splat_super; 2625 } 2626 if (mntroot->d_inode->i_op != NFS_SB(s)->nfs_client->rpc_ops->dir_inode_ops) { 2627 dput(mntroot); 2628 error = -ESTALE; 2629 goto error_splat_super; 2630 } 2631 2632 s->s_flags |= MS_ACTIVE; 2633 mnt->mnt_sb = s; 2634 mnt->mnt_root = mntroot; 2635 2636 security_sb_clone_mnt_opts(data->sb, s); 2637 2638 dprintk("<-- nfs4_referral_get_sb() = 0\n"); 2639 return 0; 2640 2641 out_err_nosb: 2642 nfs_free_server(server); 2643 out_err_noserver: 2644 dprintk("<-- nfs4_referral_get_sb() = %d [error]\n", error); 2645 return error; 2646 2647 error_splat_super: 2648 deactivate_locked_super(s); 2649 dprintk("<-- nfs4_referral_get_sb() = %d [splat]\n", error); 2650 return error; 2651 } 2652 2653 #endif /* CONFIG_NFS_V4 */ 2654