1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Syscall interface to knfsd. 4 * 5 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de> 6 */ 7 8 #include <linux/slab.h> 9 #include <linux/namei.h> 10 #include <linux/ctype.h> 11 12 #include <linux/sunrpc/svcsock.h> 13 #include <linux/lockd/lockd.h> 14 #include <linux/sunrpc/addr.h> 15 #include <linux/sunrpc/gss_api.h> 16 #include <linux/sunrpc/gss_krb5_enctypes.h> 17 #include <linux/sunrpc/rpc_pipe_fs.h> 18 #include <linux/module.h> 19 #include <linux/fsnotify.h> 20 21 #include "idmap.h" 22 #include "nfsd.h" 23 #include "cache.h" 24 #include "state.h" 25 #include "netns.h" 26 #include "pnfs.h" 27 28 /* 29 * We have a single directory with several nodes in it. 30 */ 31 enum { 32 NFSD_Root = 1, 33 NFSD_List, 34 NFSD_Export_features, 35 NFSD_Fh, 36 NFSD_FO_UnlockIP, 37 NFSD_FO_UnlockFS, 38 NFSD_Threads, 39 NFSD_Pool_Threads, 40 NFSD_Pool_Stats, 41 NFSD_Reply_Cache_Stats, 42 NFSD_Versions, 43 NFSD_Ports, 44 NFSD_MaxBlkSize, 45 NFSD_MaxConnections, 46 NFSD_SupportedEnctypes, 47 /* 48 * The below MUST come last. Otherwise we leave a hole in nfsd_files[] 49 * with !CONFIG_NFSD_V4 and simple_fill_super() goes oops 50 */ 51 #ifdef CONFIG_NFSD_V4 52 NFSD_Leasetime, 53 NFSD_Gracetime, 54 NFSD_RecoveryDir, 55 NFSD_V4EndGrace, 56 #endif 57 NFSD_MaxReserved 58 }; 59 60 /* 61 * write() for these nodes. 62 */ 63 static ssize_t write_filehandle(struct file *file, char *buf, size_t size); 64 static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size); 65 static ssize_t write_unlock_fs(struct file *file, char *buf, size_t size); 66 static ssize_t write_threads(struct file *file, char *buf, size_t size); 67 static ssize_t write_pool_threads(struct file *file, char *buf, size_t size); 68 static ssize_t write_versions(struct file *file, char *buf, size_t size); 69 static ssize_t write_ports(struct file *file, char *buf, size_t size); 70 static ssize_t write_maxblksize(struct file *file, char *buf, size_t size); 71 static ssize_t write_maxconn(struct file *file, char *buf, size_t size); 72 #ifdef CONFIG_NFSD_V4 73 static ssize_t write_leasetime(struct file *file, char *buf, size_t size); 74 static ssize_t write_gracetime(struct file *file, char *buf, size_t size); 75 static ssize_t write_recoverydir(struct file *file, char *buf, size_t size); 76 static ssize_t write_v4_end_grace(struct file *file, char *buf, size_t size); 77 #endif 78 79 static ssize_t (*const write_op[])(struct file *, char *, size_t) = { 80 [NFSD_Fh] = write_filehandle, 81 [NFSD_FO_UnlockIP] = write_unlock_ip, 82 [NFSD_FO_UnlockFS] = write_unlock_fs, 83 [NFSD_Threads] = write_threads, 84 [NFSD_Pool_Threads] = write_pool_threads, 85 [NFSD_Versions] = write_versions, 86 [NFSD_Ports] = write_ports, 87 [NFSD_MaxBlkSize] = write_maxblksize, 88 [NFSD_MaxConnections] = write_maxconn, 89 #ifdef CONFIG_NFSD_V4 90 [NFSD_Leasetime] = write_leasetime, 91 [NFSD_Gracetime] = write_gracetime, 92 [NFSD_RecoveryDir] = write_recoverydir, 93 [NFSD_V4EndGrace] = write_v4_end_grace, 94 #endif 95 }; 96 97 static ssize_t nfsctl_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos) 98 { 99 ino_t ino = file_inode(file)->i_ino; 100 char *data; 101 ssize_t rv; 102 103 if (ino >= ARRAY_SIZE(write_op) || !write_op[ino]) 104 return -EINVAL; 105 106 data = simple_transaction_get(file, buf, size); 107 if (IS_ERR(data)) 108 return PTR_ERR(data); 109 110 rv = write_op[ino](file, data, size); 111 if (rv >= 0) { 112 simple_transaction_set(file, rv); 113 rv = size; 114 } 115 return rv; 116 } 117 118 static ssize_t nfsctl_transaction_read(struct file *file, char __user *buf, size_t size, loff_t *pos) 119 { 120 if (! file->private_data) { 121 /* An attempt to read a transaction file without writing 122 * causes a 0-byte write so that the file can return 123 * state information 124 */ 125 ssize_t rv = nfsctl_transaction_write(file, buf, 0, pos); 126 if (rv < 0) 127 return rv; 128 } 129 return simple_transaction_read(file, buf, size, pos); 130 } 131 132 static const struct file_operations transaction_ops = { 133 .write = nfsctl_transaction_write, 134 .read = nfsctl_transaction_read, 135 .release = simple_transaction_release, 136 .llseek = default_llseek, 137 }; 138 139 static int exports_net_open(struct net *net, struct file *file) 140 { 141 int err; 142 struct seq_file *seq; 143 struct nfsd_net *nn = net_generic(net, nfsd_net_id); 144 145 err = seq_open(file, &nfs_exports_op); 146 if (err) 147 return err; 148 149 seq = file->private_data; 150 seq->private = nn->svc_export_cache; 151 return 0; 152 } 153 154 static int exports_proc_open(struct inode *inode, struct file *file) 155 { 156 return exports_net_open(current->nsproxy->net_ns, file); 157 } 158 159 static const struct file_operations exports_proc_operations = { 160 .open = exports_proc_open, 161 .read = seq_read, 162 .llseek = seq_lseek, 163 .release = seq_release, 164 }; 165 166 static int exports_nfsd_open(struct inode *inode, struct file *file) 167 { 168 return exports_net_open(inode->i_sb->s_fs_info, file); 169 } 170 171 static const struct file_operations exports_nfsd_operations = { 172 .open = exports_nfsd_open, 173 .read = seq_read, 174 .llseek = seq_lseek, 175 .release = seq_release, 176 }; 177 178 static int export_features_show(struct seq_file *m, void *v) 179 { 180 seq_printf(m, "0x%x 0x%x\n", NFSEXP_ALLFLAGS, NFSEXP_SECINFO_FLAGS); 181 return 0; 182 } 183 184 static int export_features_open(struct inode *inode, struct file *file) 185 { 186 return single_open(file, export_features_show, NULL); 187 } 188 189 static const struct file_operations export_features_operations = { 190 .open = export_features_open, 191 .read = seq_read, 192 .llseek = seq_lseek, 193 .release = single_release, 194 }; 195 196 #if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE) 197 static int supported_enctypes_show(struct seq_file *m, void *v) 198 { 199 seq_printf(m, KRB5_SUPPORTED_ENCTYPES); 200 return 0; 201 } 202 203 static int supported_enctypes_open(struct inode *inode, struct file *file) 204 { 205 return single_open(file, supported_enctypes_show, NULL); 206 } 207 208 static const struct file_operations supported_enctypes_ops = { 209 .open = supported_enctypes_open, 210 .read = seq_read, 211 .llseek = seq_lseek, 212 .release = single_release, 213 }; 214 #endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */ 215 216 static const struct file_operations pool_stats_operations = { 217 .open = nfsd_pool_stats_open, 218 .read = seq_read, 219 .llseek = seq_lseek, 220 .release = nfsd_pool_stats_release, 221 }; 222 223 static const struct file_operations reply_cache_stats_operations = { 224 .open = nfsd_reply_cache_stats_open, 225 .read = seq_read, 226 .llseek = seq_lseek, 227 .release = single_release, 228 }; 229 230 /*----------------------------------------------------------------------------*/ 231 /* 232 * payload - write methods 233 */ 234 235 static inline struct net *netns(struct file *file) 236 { 237 return file_inode(file)->i_sb->s_fs_info; 238 } 239 240 /** 241 * write_unlock_ip - Release all locks used by a client 242 * 243 * Experimental. 244 * 245 * Input: 246 * buf: '\n'-terminated C string containing a 247 * presentation format IP address 248 * size: length of C string in @buf 249 * Output: 250 * On success: returns zero if all specified locks were released; 251 * returns one if one or more locks were not released 252 * On error: return code is negative errno value 253 */ 254 static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size) 255 { 256 struct sockaddr_storage address; 257 struct sockaddr *sap = (struct sockaddr *)&address; 258 size_t salen = sizeof(address); 259 char *fo_path; 260 struct net *net = netns(file); 261 262 /* sanity check */ 263 if (size == 0) 264 return -EINVAL; 265 266 if (buf[size-1] != '\n') 267 return -EINVAL; 268 269 fo_path = buf; 270 if (qword_get(&buf, fo_path, size) < 0) 271 return -EINVAL; 272 273 if (rpc_pton(net, fo_path, size, sap, salen) == 0) 274 return -EINVAL; 275 276 return nlmsvc_unlock_all_by_ip(sap); 277 } 278 279 /** 280 * write_unlock_fs - Release all locks on a local file system 281 * 282 * Experimental. 283 * 284 * Input: 285 * buf: '\n'-terminated C string containing the 286 * absolute pathname of a local file system 287 * size: length of C string in @buf 288 * Output: 289 * On success: returns zero if all specified locks were released; 290 * returns one if one or more locks were not released 291 * On error: return code is negative errno value 292 */ 293 static ssize_t write_unlock_fs(struct file *file, char *buf, size_t size) 294 { 295 struct path path; 296 char *fo_path; 297 int error; 298 299 /* sanity check */ 300 if (size == 0) 301 return -EINVAL; 302 303 if (buf[size-1] != '\n') 304 return -EINVAL; 305 306 fo_path = buf; 307 if (qword_get(&buf, fo_path, size) < 0) 308 return -EINVAL; 309 310 error = kern_path(fo_path, 0, &path); 311 if (error) 312 return error; 313 314 /* 315 * XXX: Needs better sanity checking. Otherwise we could end up 316 * releasing locks on the wrong file system. 317 * 318 * For example: 319 * 1. Does the path refer to a directory? 320 * 2. Is that directory a mount point, or 321 * 3. Is that directory the root of an exported file system? 322 */ 323 error = nlmsvc_unlock_all_by_sb(path.dentry->d_sb); 324 325 path_put(&path); 326 return error; 327 } 328 329 /** 330 * write_filehandle - Get a variable-length NFS file handle by path 331 * 332 * On input, the buffer contains a '\n'-terminated C string comprised of 333 * three alphanumeric words separated by whitespace. The string may 334 * contain escape sequences. 335 * 336 * Input: 337 * buf: 338 * domain: client domain name 339 * path: export pathname 340 * maxsize: numeric maximum size of 341 * @buf 342 * size: length of C string in @buf 343 * Output: 344 * On success: passed-in buffer filled with '\n'-terminated C 345 * string containing a ASCII hex text version 346 * of the NFS file handle; 347 * return code is the size in bytes of the string 348 * On error: return code is negative errno value 349 */ 350 static ssize_t write_filehandle(struct file *file, char *buf, size_t size) 351 { 352 char *dname, *path; 353 int uninitialized_var(maxsize); 354 char *mesg = buf; 355 int len; 356 struct auth_domain *dom; 357 struct knfsd_fh fh; 358 359 if (size == 0) 360 return -EINVAL; 361 362 if (buf[size-1] != '\n') 363 return -EINVAL; 364 buf[size-1] = 0; 365 366 dname = mesg; 367 len = qword_get(&mesg, dname, size); 368 if (len <= 0) 369 return -EINVAL; 370 371 path = dname+len+1; 372 len = qword_get(&mesg, path, size); 373 if (len <= 0) 374 return -EINVAL; 375 376 len = get_int(&mesg, &maxsize); 377 if (len) 378 return len; 379 380 if (maxsize < NFS_FHSIZE) 381 return -EINVAL; 382 maxsize = min(maxsize, NFS3_FHSIZE); 383 384 if (qword_get(&mesg, mesg, size)>0) 385 return -EINVAL; 386 387 /* we have all the words, they are in buf.. */ 388 dom = unix_domain_find(dname); 389 if (!dom) 390 return -ENOMEM; 391 392 len = exp_rootfh(netns(file), dom, path, &fh, maxsize); 393 auth_domain_put(dom); 394 if (len) 395 return len; 396 397 mesg = buf; 398 len = SIMPLE_TRANSACTION_LIMIT; 399 qword_addhex(&mesg, &len, (char*)&fh.fh_base, fh.fh_size); 400 mesg[-1] = '\n'; 401 return mesg - buf; 402 } 403 404 /** 405 * write_threads - Start NFSD, or report the current number of running threads 406 * 407 * Input: 408 * buf: ignored 409 * size: zero 410 * Output: 411 * On success: passed-in buffer filled with '\n'-terminated C 412 * string numeric value representing the number of 413 * running NFSD threads; 414 * return code is the size in bytes of the string 415 * On error: return code is zero 416 * 417 * OR 418 * 419 * Input: 420 * buf: C string containing an unsigned 421 * integer value representing the 422 * number of NFSD threads to start 423 * size: non-zero length of C string in @buf 424 * Output: 425 * On success: NFS service is started; 426 * passed-in buffer filled with '\n'-terminated C 427 * string numeric value representing the number of 428 * running NFSD threads; 429 * return code is the size in bytes of the string 430 * On error: return code is zero or a negative errno value 431 */ 432 static ssize_t write_threads(struct file *file, char *buf, size_t size) 433 { 434 char *mesg = buf; 435 int rv; 436 struct net *net = netns(file); 437 438 if (size > 0) { 439 int newthreads; 440 rv = get_int(&mesg, &newthreads); 441 if (rv) 442 return rv; 443 if (newthreads < 0) 444 return -EINVAL; 445 rv = nfsd_svc(newthreads, net, file->f_cred); 446 if (rv < 0) 447 return rv; 448 } else 449 rv = nfsd_nrthreads(net); 450 451 return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%d\n", rv); 452 } 453 454 /** 455 * write_pool_threads - Set or report the current number of threads per pool 456 * 457 * Input: 458 * buf: ignored 459 * size: zero 460 * 461 * OR 462 * 463 * Input: 464 * buf: C string containing whitespace- 465 * separated unsigned integer values 466 * representing the number of NFSD 467 * threads to start in each pool 468 * size: non-zero length of C string in @buf 469 * Output: 470 * On success: passed-in buffer filled with '\n'-terminated C 471 * string containing integer values representing the 472 * number of NFSD threads in each pool; 473 * return code is the size in bytes of the string 474 * On error: return code is zero or a negative errno value 475 */ 476 static ssize_t write_pool_threads(struct file *file, char *buf, size_t size) 477 { 478 /* if size > 0, look for an array of number of threads per node 479 * and apply them then write out number of threads per node as reply 480 */ 481 char *mesg = buf; 482 int i; 483 int rv; 484 int len; 485 int npools; 486 int *nthreads; 487 struct net *net = netns(file); 488 489 mutex_lock(&nfsd_mutex); 490 npools = nfsd_nrpools(net); 491 if (npools == 0) { 492 /* 493 * NFS is shut down. The admin can start it by 494 * writing to the threads file but NOT the pool_threads 495 * file, sorry. Report zero threads. 496 */ 497 mutex_unlock(&nfsd_mutex); 498 strcpy(buf, "0\n"); 499 return strlen(buf); 500 } 501 502 nthreads = kcalloc(npools, sizeof(int), GFP_KERNEL); 503 rv = -ENOMEM; 504 if (nthreads == NULL) 505 goto out_free; 506 507 if (size > 0) { 508 for (i = 0; i < npools; i++) { 509 rv = get_int(&mesg, &nthreads[i]); 510 if (rv == -ENOENT) 511 break; /* fewer numbers than pools */ 512 if (rv) 513 goto out_free; /* syntax error */ 514 rv = -EINVAL; 515 if (nthreads[i] < 0) 516 goto out_free; 517 } 518 rv = nfsd_set_nrthreads(i, nthreads, net); 519 if (rv) 520 goto out_free; 521 } 522 523 rv = nfsd_get_nrthreads(npools, nthreads, net); 524 if (rv) 525 goto out_free; 526 527 mesg = buf; 528 size = SIMPLE_TRANSACTION_LIMIT; 529 for (i = 0; i < npools && size > 0; i++) { 530 snprintf(mesg, size, "%d%c", nthreads[i], (i == npools-1 ? '\n' : ' ')); 531 len = strlen(mesg); 532 size -= len; 533 mesg += len; 534 } 535 rv = mesg - buf; 536 out_free: 537 kfree(nthreads); 538 mutex_unlock(&nfsd_mutex); 539 return rv; 540 } 541 542 static ssize_t 543 nfsd_print_version_support(struct nfsd_net *nn, char *buf, int remaining, 544 const char *sep, unsigned vers, int minor) 545 { 546 const char *format = minor < 0 ? "%s%c%u" : "%s%c%u.%u"; 547 bool supported = !!nfsd_vers(nn, vers, NFSD_TEST); 548 549 if (vers == 4 && minor >= 0 && 550 !nfsd_minorversion(nn, minor, NFSD_TEST)) 551 supported = false; 552 if (minor == 0 && supported) 553 /* 554 * special case for backward compatability. 555 * +4.0 is never reported, it is implied by 556 * +4, unless -4.0 is present. 557 */ 558 return 0; 559 return snprintf(buf, remaining, format, sep, 560 supported ? '+' : '-', vers, minor); 561 } 562 563 static ssize_t __write_versions(struct file *file, char *buf, size_t size) 564 { 565 char *mesg = buf; 566 char *vers, *minorp, sign; 567 int len, num, remaining; 568 ssize_t tlen = 0; 569 char *sep; 570 struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id); 571 572 if (size>0) { 573 if (nn->nfsd_serv) 574 /* Cannot change versions without updating 575 * nn->nfsd_serv->sv_xdrsize, and reallocing 576 * rq_argp and rq_resp 577 */ 578 return -EBUSY; 579 if (buf[size-1] != '\n') 580 return -EINVAL; 581 buf[size-1] = 0; 582 583 vers = mesg; 584 len = qword_get(&mesg, vers, size); 585 if (len <= 0) return -EINVAL; 586 do { 587 enum vers_op cmd; 588 unsigned minor; 589 sign = *vers; 590 if (sign == '+' || sign == '-') 591 num = simple_strtol((vers+1), &minorp, 0); 592 else 593 num = simple_strtol(vers, &minorp, 0); 594 if (*minorp == '.') { 595 if (num != 4) 596 return -EINVAL; 597 if (kstrtouint(minorp+1, 0, &minor) < 0) 598 return -EINVAL; 599 } 600 601 cmd = sign == '-' ? NFSD_CLEAR : NFSD_SET; 602 switch(num) { 603 case 2: 604 case 3: 605 nfsd_vers(nn, num, cmd); 606 break; 607 case 4: 608 if (*minorp == '.') { 609 if (nfsd_minorversion(nn, minor, cmd) < 0) 610 return -EINVAL; 611 } else if ((cmd == NFSD_SET) != nfsd_vers(nn, num, NFSD_TEST)) { 612 /* 613 * Either we have +4 and no minors are enabled, 614 * or we have -4 and at least one minor is enabled. 615 * In either case, propagate 'cmd' to all minors. 616 */ 617 minor = 0; 618 while (nfsd_minorversion(nn, minor, cmd) >= 0) 619 minor++; 620 } 621 break; 622 default: 623 return -EINVAL; 624 } 625 vers += len + 1; 626 } while ((len = qword_get(&mesg, vers, size)) > 0); 627 /* If all get turned off, turn them back on, as 628 * having no versions is BAD 629 */ 630 nfsd_reset_versions(nn); 631 } 632 633 /* Now write current state into reply buffer */ 634 len = 0; 635 sep = ""; 636 remaining = SIMPLE_TRANSACTION_LIMIT; 637 for (num=2 ; num <= 4 ; num++) { 638 int minor; 639 if (!nfsd_vers(nn, num, NFSD_AVAIL)) 640 continue; 641 642 minor = -1; 643 do { 644 len = nfsd_print_version_support(nn, buf, remaining, 645 sep, num, minor); 646 if (len >= remaining) 647 goto out; 648 remaining -= len; 649 buf += len; 650 tlen += len; 651 minor++; 652 if (len) 653 sep = " "; 654 } while (num == 4 && minor <= NFSD_SUPPORTED_MINOR_VERSION); 655 } 656 out: 657 len = snprintf(buf, remaining, "\n"); 658 if (len >= remaining) 659 return -EINVAL; 660 return tlen + len; 661 } 662 663 /** 664 * write_versions - Set or report the available NFS protocol versions 665 * 666 * Input: 667 * buf: ignored 668 * size: zero 669 * Output: 670 * On success: passed-in buffer filled with '\n'-terminated C 671 * string containing positive or negative integer 672 * values representing the current status of each 673 * protocol version; 674 * return code is the size in bytes of the string 675 * On error: return code is zero or a negative errno value 676 * 677 * OR 678 * 679 * Input: 680 * buf: C string containing whitespace- 681 * separated positive or negative 682 * integer values representing NFS 683 * protocol versions to enable ("+n") 684 * or disable ("-n") 685 * size: non-zero length of C string in @buf 686 * Output: 687 * On success: status of zero or more protocol versions has 688 * been updated; passed-in buffer filled with 689 * '\n'-terminated C string containing positive 690 * or negative integer values representing the 691 * current status of each protocol version; 692 * return code is the size in bytes of the string 693 * On error: return code is zero or a negative errno value 694 */ 695 static ssize_t write_versions(struct file *file, char *buf, size_t size) 696 { 697 ssize_t rv; 698 699 mutex_lock(&nfsd_mutex); 700 rv = __write_versions(file, buf, size); 701 mutex_unlock(&nfsd_mutex); 702 return rv; 703 } 704 705 /* 706 * Zero-length write. Return a list of NFSD's current listener 707 * transports. 708 */ 709 static ssize_t __write_ports_names(char *buf, struct net *net) 710 { 711 struct nfsd_net *nn = net_generic(net, nfsd_net_id); 712 713 if (nn->nfsd_serv == NULL) 714 return 0; 715 return svc_xprt_names(nn->nfsd_serv, buf, SIMPLE_TRANSACTION_LIMIT); 716 } 717 718 /* 719 * A single 'fd' number was written, in which case it must be for 720 * a socket of a supported family/protocol, and we use it as an 721 * nfsd listener. 722 */ 723 static ssize_t __write_ports_addfd(char *buf, struct net *net, const struct cred *cred) 724 { 725 char *mesg = buf; 726 int fd, err; 727 struct nfsd_net *nn = net_generic(net, nfsd_net_id); 728 729 err = get_int(&mesg, &fd); 730 if (err != 0 || fd < 0) 731 return -EINVAL; 732 733 if (svc_alien_sock(net, fd)) { 734 printk(KERN_ERR "%s: socket net is different to NFSd's one\n", __func__); 735 return -EINVAL; 736 } 737 738 err = nfsd_create_serv(net); 739 if (err != 0) 740 return err; 741 742 err = svc_addsock(nn->nfsd_serv, fd, buf, SIMPLE_TRANSACTION_LIMIT, cred); 743 if (err < 0) { 744 nfsd_destroy(net); 745 return err; 746 } 747 748 /* Decrease the count, but don't shut down the service */ 749 nn->nfsd_serv->sv_nrthreads--; 750 return err; 751 } 752 753 /* 754 * A transport listener is added by writing it's transport name and 755 * a port number. 756 */ 757 static ssize_t __write_ports_addxprt(char *buf, struct net *net, const struct cred *cred) 758 { 759 char transport[16]; 760 struct svc_xprt *xprt; 761 int port, err; 762 struct nfsd_net *nn = net_generic(net, nfsd_net_id); 763 764 if (sscanf(buf, "%15s %5u", transport, &port) != 2) 765 return -EINVAL; 766 767 if (port < 1 || port > USHRT_MAX) 768 return -EINVAL; 769 770 err = nfsd_create_serv(net); 771 if (err != 0) 772 return err; 773 774 err = svc_create_xprt(nn->nfsd_serv, transport, net, 775 PF_INET, port, SVC_SOCK_ANONYMOUS, cred); 776 if (err < 0) 777 goto out_err; 778 779 err = svc_create_xprt(nn->nfsd_serv, transport, net, 780 PF_INET6, port, SVC_SOCK_ANONYMOUS, cred); 781 if (err < 0 && err != -EAFNOSUPPORT) 782 goto out_close; 783 784 /* Decrease the count, but don't shut down the service */ 785 nn->nfsd_serv->sv_nrthreads--; 786 return 0; 787 out_close: 788 xprt = svc_find_xprt(nn->nfsd_serv, transport, net, PF_INET, port); 789 if (xprt != NULL) { 790 svc_close_xprt(xprt); 791 svc_xprt_put(xprt); 792 } 793 out_err: 794 nfsd_destroy(net); 795 return err; 796 } 797 798 static ssize_t __write_ports(struct file *file, char *buf, size_t size, 799 struct net *net) 800 { 801 if (size == 0) 802 return __write_ports_names(buf, net); 803 804 if (isdigit(buf[0])) 805 return __write_ports_addfd(buf, net, file->f_cred); 806 807 if (isalpha(buf[0])) 808 return __write_ports_addxprt(buf, net, file->f_cred); 809 810 return -EINVAL; 811 } 812 813 /** 814 * write_ports - Pass a socket file descriptor or transport name to listen on 815 * 816 * Input: 817 * buf: ignored 818 * size: zero 819 * Output: 820 * On success: passed-in buffer filled with a '\n'-terminated C 821 * string containing a whitespace-separated list of 822 * named NFSD listeners; 823 * return code is the size in bytes of the string 824 * On error: return code is zero or a negative errno value 825 * 826 * OR 827 * 828 * Input: 829 * buf: C string containing an unsigned 830 * integer value representing a bound 831 * but unconnected socket that is to be 832 * used as an NFSD listener; listen(3) 833 * must be called for a SOCK_STREAM 834 * socket, otherwise it is ignored 835 * size: non-zero length of C string in @buf 836 * Output: 837 * On success: NFS service is started; 838 * passed-in buffer filled with a '\n'-terminated C 839 * string containing a unique alphanumeric name of 840 * the listener; 841 * return code is the size in bytes of the string 842 * On error: return code is a negative errno value 843 * 844 * OR 845 * 846 * Input: 847 * buf: C string containing a transport 848 * name and an unsigned integer value 849 * representing the port to listen on, 850 * separated by whitespace 851 * size: non-zero length of C string in @buf 852 * Output: 853 * On success: returns zero; NFS service is started 854 * On error: return code is a negative errno value 855 */ 856 static ssize_t write_ports(struct file *file, char *buf, size_t size) 857 { 858 ssize_t rv; 859 860 mutex_lock(&nfsd_mutex); 861 rv = __write_ports(file, buf, size, netns(file)); 862 mutex_unlock(&nfsd_mutex); 863 return rv; 864 } 865 866 867 int nfsd_max_blksize; 868 869 /** 870 * write_maxblksize - Set or report the current NFS blksize 871 * 872 * Input: 873 * buf: ignored 874 * size: zero 875 * 876 * OR 877 * 878 * Input: 879 * buf: C string containing an unsigned 880 * integer value representing the new 881 * NFS blksize 882 * size: non-zero length of C string in @buf 883 * Output: 884 * On success: passed-in buffer filled with '\n'-terminated C string 885 * containing numeric value of the current NFS blksize 886 * setting; 887 * return code is the size in bytes of the string 888 * On error: return code is zero or a negative errno value 889 */ 890 static ssize_t write_maxblksize(struct file *file, char *buf, size_t size) 891 { 892 char *mesg = buf; 893 struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id); 894 895 if (size > 0) { 896 int bsize; 897 int rv = get_int(&mesg, &bsize); 898 if (rv) 899 return rv; 900 /* force bsize into allowed range and 901 * required alignment. 902 */ 903 bsize = max_t(int, bsize, 1024); 904 bsize = min_t(int, bsize, NFSSVC_MAXBLKSIZE); 905 bsize &= ~(1024-1); 906 mutex_lock(&nfsd_mutex); 907 if (nn->nfsd_serv) { 908 mutex_unlock(&nfsd_mutex); 909 return -EBUSY; 910 } 911 nfsd_max_blksize = bsize; 912 mutex_unlock(&nfsd_mutex); 913 } 914 915 return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%d\n", 916 nfsd_max_blksize); 917 } 918 919 /** 920 * write_maxconn - Set or report the current max number of connections 921 * 922 * Input: 923 * buf: ignored 924 * size: zero 925 * OR 926 * 927 * Input: 928 * buf: C string containing an unsigned 929 * integer value representing the new 930 * number of max connections 931 * size: non-zero length of C string in @buf 932 * Output: 933 * On success: passed-in buffer filled with '\n'-terminated C string 934 * containing numeric value of max_connections setting 935 * for this net namespace; 936 * return code is the size in bytes of the string 937 * On error: return code is zero or a negative errno value 938 */ 939 static ssize_t write_maxconn(struct file *file, char *buf, size_t size) 940 { 941 char *mesg = buf; 942 struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id); 943 unsigned int maxconn = nn->max_connections; 944 945 if (size > 0) { 946 int rv = get_uint(&mesg, &maxconn); 947 948 if (rv) 949 return rv; 950 nn->max_connections = maxconn; 951 } 952 953 return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%u\n", maxconn); 954 } 955 956 #ifdef CONFIG_NFSD_V4 957 static ssize_t __nfsd4_write_time(struct file *file, char *buf, size_t size, 958 time_t *time, struct nfsd_net *nn) 959 { 960 char *mesg = buf; 961 int rv, i; 962 963 if (size > 0) { 964 if (nn->nfsd_serv) 965 return -EBUSY; 966 rv = get_int(&mesg, &i); 967 if (rv) 968 return rv; 969 /* 970 * Some sanity checking. We don't have a reason for 971 * these particular numbers, but problems with the 972 * extremes are: 973 * - Too short: the briefest network outage may 974 * cause clients to lose all their locks. Also, 975 * the frequent polling may be wasteful. 976 * - Too long: do you really want reboot recovery 977 * to take more than an hour? Or to make other 978 * clients wait an hour before being able to 979 * revoke a dead client's locks? 980 */ 981 if (i < 10 || i > 3600) 982 return -EINVAL; 983 *time = i; 984 } 985 986 return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%ld\n", *time); 987 } 988 989 static ssize_t nfsd4_write_time(struct file *file, char *buf, size_t size, 990 time_t *time, struct nfsd_net *nn) 991 { 992 ssize_t rv; 993 994 mutex_lock(&nfsd_mutex); 995 rv = __nfsd4_write_time(file, buf, size, time, nn); 996 mutex_unlock(&nfsd_mutex); 997 return rv; 998 } 999 1000 /** 1001 * write_leasetime - Set or report the current NFSv4 lease time 1002 * 1003 * Input: 1004 * buf: ignored 1005 * size: zero 1006 * 1007 * OR 1008 * 1009 * Input: 1010 * buf: C string containing an unsigned 1011 * integer value representing the new 1012 * NFSv4 lease expiry time 1013 * size: non-zero length of C string in @buf 1014 * Output: 1015 * On success: passed-in buffer filled with '\n'-terminated C 1016 * string containing unsigned integer value of the 1017 * current lease expiry time; 1018 * return code is the size in bytes of the string 1019 * On error: return code is zero or a negative errno value 1020 */ 1021 static ssize_t write_leasetime(struct file *file, char *buf, size_t size) 1022 { 1023 struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id); 1024 return nfsd4_write_time(file, buf, size, &nn->nfsd4_lease, nn); 1025 } 1026 1027 /** 1028 * write_gracetime - Set or report current NFSv4 grace period time 1029 * 1030 * As above, but sets the time of the NFSv4 grace period. 1031 * 1032 * Note this should never be set to less than the *previous* 1033 * lease-period time, but we don't try to enforce this. (In the common 1034 * case (a new boot), we don't know what the previous lease time was 1035 * anyway.) 1036 */ 1037 static ssize_t write_gracetime(struct file *file, char *buf, size_t size) 1038 { 1039 struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id); 1040 return nfsd4_write_time(file, buf, size, &nn->nfsd4_grace, nn); 1041 } 1042 1043 static ssize_t __write_recoverydir(struct file *file, char *buf, size_t size, 1044 struct nfsd_net *nn) 1045 { 1046 char *mesg = buf; 1047 char *recdir; 1048 int len, status; 1049 1050 if (size > 0) { 1051 if (nn->nfsd_serv) 1052 return -EBUSY; 1053 if (size > PATH_MAX || buf[size-1] != '\n') 1054 return -EINVAL; 1055 buf[size-1] = 0; 1056 1057 recdir = mesg; 1058 len = qword_get(&mesg, recdir, size); 1059 if (len <= 0) 1060 return -EINVAL; 1061 1062 status = nfs4_reset_recoverydir(recdir); 1063 if (status) 1064 return status; 1065 } 1066 1067 return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%s\n", 1068 nfs4_recoverydir()); 1069 } 1070 1071 /** 1072 * write_recoverydir - Set or report the pathname of the recovery directory 1073 * 1074 * Input: 1075 * buf: ignored 1076 * size: zero 1077 * 1078 * OR 1079 * 1080 * Input: 1081 * buf: C string containing the pathname 1082 * of the directory on a local file 1083 * system containing permanent NFSv4 1084 * recovery data 1085 * size: non-zero length of C string in @buf 1086 * Output: 1087 * On success: passed-in buffer filled with '\n'-terminated C string 1088 * containing the current recovery pathname setting; 1089 * return code is the size in bytes of the string 1090 * On error: return code is zero or a negative errno value 1091 */ 1092 static ssize_t write_recoverydir(struct file *file, char *buf, size_t size) 1093 { 1094 ssize_t rv; 1095 struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id); 1096 1097 mutex_lock(&nfsd_mutex); 1098 rv = __write_recoverydir(file, buf, size, nn); 1099 mutex_unlock(&nfsd_mutex); 1100 return rv; 1101 } 1102 1103 /** 1104 * write_v4_end_grace - release grace period for nfsd's v4.x lock manager 1105 * 1106 * Input: 1107 * buf: ignored 1108 * size: zero 1109 * OR 1110 * 1111 * Input: 1112 * buf: any value 1113 * size: non-zero length of C string in @buf 1114 * Output: 1115 * passed-in buffer filled with "Y" or "N" with a newline 1116 * and NULL-terminated C string. This indicates whether 1117 * the grace period has ended in the current net 1118 * namespace. Return code is the size in bytes of the 1119 * string. Writing a string that starts with 'Y', 'y', or 1120 * '1' to the file will end the grace period for nfsd's v4 1121 * lock manager. 1122 */ 1123 static ssize_t write_v4_end_grace(struct file *file, char *buf, size_t size) 1124 { 1125 struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id); 1126 1127 if (size > 0) { 1128 switch(buf[0]) { 1129 case 'Y': 1130 case 'y': 1131 case '1': 1132 if (!nn->nfsd_serv) 1133 return -EBUSY; 1134 nfsd4_end_grace(nn); 1135 break; 1136 default: 1137 return -EINVAL; 1138 } 1139 } 1140 1141 return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%c\n", 1142 nn->grace_ended ? 'Y' : 'N'); 1143 } 1144 1145 #endif 1146 1147 /*----------------------------------------------------------------------------*/ 1148 /* 1149 * populating the filesystem. 1150 */ 1151 1152 /* Basically copying rpc_get_inode. */ 1153 static struct inode *nfsd_get_inode(struct super_block *sb, umode_t mode) 1154 { 1155 struct inode *inode = new_inode(sb); 1156 if (!inode) 1157 return NULL; 1158 /* Following advice from simple_fill_super documentation: */ 1159 inode->i_ino = iunique(sb, NFSD_MaxReserved); 1160 inode->i_mode = mode; 1161 inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode); 1162 switch (mode & S_IFMT) { 1163 case S_IFDIR: 1164 inode->i_fop = &simple_dir_operations; 1165 inode->i_op = &simple_dir_inode_operations; 1166 inc_nlink(inode); 1167 default: 1168 break; 1169 } 1170 return inode; 1171 } 1172 1173 static int __nfsd_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) 1174 { 1175 struct inode *inode; 1176 1177 inode = nfsd_get_inode(dir->i_sb, mode); 1178 if (!inode) 1179 return -ENOMEM; 1180 d_add(dentry, inode); 1181 inc_nlink(dir); 1182 fsnotify_mkdir(dir, dentry); 1183 return 0; 1184 } 1185 1186 static struct dentry *nfsd_mkdir(struct dentry *parent, struct nfsdfs_client *ncl, char *name) 1187 { 1188 struct inode *dir = parent->d_inode; 1189 struct dentry *dentry; 1190 int ret = -ENOMEM; 1191 1192 inode_lock(dir); 1193 dentry = d_alloc_name(parent, name); 1194 if (!dentry) 1195 goto out_err; 1196 ret = __nfsd_mkdir(d_inode(parent), dentry, S_IFDIR | 0600); 1197 if (ret) 1198 goto out_err; 1199 if (ncl) { 1200 d_inode(dentry)->i_private = ncl; 1201 kref_get(&ncl->cl_ref); 1202 } 1203 out: 1204 inode_unlock(dir); 1205 return dentry; 1206 out_err: 1207 dentry = ERR_PTR(ret); 1208 goto out; 1209 } 1210 1211 static void clear_ncl(struct inode *inode) 1212 { 1213 struct nfsdfs_client *ncl = inode->i_private; 1214 1215 inode->i_private = NULL; 1216 synchronize_rcu(); 1217 kref_put(&ncl->cl_ref, ncl->cl_release); 1218 } 1219 1220 1221 static struct nfsdfs_client *__get_nfsdfs_client(struct inode *inode) 1222 { 1223 struct nfsdfs_client *nc = inode->i_private; 1224 1225 if (nc) 1226 kref_get(&nc->cl_ref); 1227 return nc; 1228 } 1229 1230 struct nfsdfs_client *get_nfsdfs_client(struct inode *inode) 1231 { 1232 struct nfsdfs_client *nc; 1233 1234 rcu_read_lock(); 1235 nc = __get_nfsdfs_client(inode); 1236 rcu_read_unlock(); 1237 return nc; 1238 } 1239 /* from __rpc_unlink */ 1240 static void nfsdfs_remove_file(struct inode *dir, struct dentry *dentry) 1241 { 1242 int ret; 1243 1244 clear_ncl(d_inode(dentry)); 1245 dget(dentry); 1246 ret = simple_unlink(dir, dentry); 1247 d_delete(dentry); 1248 dput(dentry); 1249 WARN_ON_ONCE(ret); 1250 } 1251 1252 static void nfsdfs_remove_files(struct dentry *root) 1253 { 1254 struct dentry *dentry, *tmp; 1255 1256 list_for_each_entry_safe(dentry, tmp, &root->d_subdirs, d_child) { 1257 if (!simple_positive(dentry)) { 1258 WARN_ON_ONCE(1); /* I think this can't happen? */ 1259 continue; 1260 } 1261 nfsdfs_remove_file(d_inode(root), dentry); 1262 } 1263 } 1264 1265 /* XXX: cut'n'paste from simple_fill_super; figure out if we could share 1266 * code instead. */ 1267 static int nfsdfs_create_files(struct dentry *root, 1268 const struct tree_descr *files) 1269 { 1270 struct inode *dir = d_inode(root); 1271 struct inode *inode; 1272 struct dentry *dentry; 1273 int i; 1274 1275 inode_lock(dir); 1276 for (i = 0; files->name && files->name[0]; i++, files++) { 1277 if (!files->name) 1278 continue; 1279 dentry = d_alloc_name(root, files->name); 1280 if (!dentry) 1281 goto out; 1282 inode = nfsd_get_inode(d_inode(root)->i_sb, 1283 S_IFREG | files->mode); 1284 if (!inode) { 1285 dput(dentry); 1286 goto out; 1287 } 1288 inode->i_fop = files->ops; 1289 inode->i_private = __get_nfsdfs_client(dir); 1290 d_add(dentry, inode); 1291 fsnotify_create(dir, dentry); 1292 } 1293 inode_unlock(dir); 1294 return 0; 1295 out: 1296 nfsdfs_remove_files(root); 1297 inode_unlock(dir); 1298 return -ENOMEM; 1299 } 1300 1301 /* on success, returns positive number unique to that client. */ 1302 struct dentry *nfsd_client_mkdir(struct nfsd_net *nn, 1303 struct nfsdfs_client *ncl, u32 id, 1304 const struct tree_descr *files) 1305 { 1306 struct dentry *dentry; 1307 char name[11]; 1308 int ret; 1309 1310 sprintf(name, "%u", id); 1311 1312 dentry = nfsd_mkdir(nn->nfsd_client_dir, ncl, name); 1313 if (IS_ERR(dentry)) /* XXX: tossing errors? */ 1314 return NULL; 1315 ret = nfsdfs_create_files(dentry, files); 1316 if (ret) { 1317 nfsd_client_rmdir(dentry); 1318 return NULL; 1319 } 1320 return dentry; 1321 } 1322 1323 /* Taken from __rpc_rmdir: */ 1324 void nfsd_client_rmdir(struct dentry *dentry) 1325 { 1326 struct inode *dir = d_inode(dentry->d_parent); 1327 struct inode *inode = d_inode(dentry); 1328 int ret; 1329 1330 inode_lock(dir); 1331 nfsdfs_remove_files(dentry); 1332 clear_ncl(inode); 1333 dget(dentry); 1334 ret = simple_rmdir(dir, dentry); 1335 WARN_ON_ONCE(ret); 1336 d_delete(dentry); 1337 inode_unlock(dir); 1338 } 1339 1340 static int nfsd_fill_super(struct super_block * sb, void * data, int silent) 1341 { 1342 struct nfsd_net *nn = net_generic(current->nsproxy->net_ns, 1343 nfsd_net_id); 1344 struct dentry *dentry; 1345 int ret; 1346 1347 static const struct tree_descr nfsd_files[] = { 1348 [NFSD_List] = {"exports", &exports_nfsd_operations, S_IRUGO}, 1349 [NFSD_Export_features] = {"export_features", 1350 &export_features_operations, S_IRUGO}, 1351 [NFSD_FO_UnlockIP] = {"unlock_ip", 1352 &transaction_ops, S_IWUSR|S_IRUSR}, 1353 [NFSD_FO_UnlockFS] = {"unlock_filesystem", 1354 &transaction_ops, S_IWUSR|S_IRUSR}, 1355 [NFSD_Fh] = {"filehandle", &transaction_ops, S_IWUSR|S_IRUSR}, 1356 [NFSD_Threads] = {"threads", &transaction_ops, S_IWUSR|S_IRUSR}, 1357 [NFSD_Pool_Threads] = {"pool_threads", &transaction_ops, S_IWUSR|S_IRUSR}, 1358 [NFSD_Pool_Stats] = {"pool_stats", &pool_stats_operations, S_IRUGO}, 1359 [NFSD_Reply_Cache_Stats] = {"reply_cache_stats", &reply_cache_stats_operations, S_IRUGO}, 1360 [NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR}, 1361 [NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO}, 1362 [NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO}, 1363 [NFSD_MaxConnections] = {"max_connections", &transaction_ops, S_IWUSR|S_IRUGO}, 1364 #if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE) 1365 [NFSD_SupportedEnctypes] = {"supported_krb5_enctypes", &supported_enctypes_ops, S_IRUGO}, 1366 #endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */ 1367 #ifdef CONFIG_NFSD_V4 1368 [NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR}, 1369 [NFSD_Gracetime] = {"nfsv4gracetime", &transaction_ops, S_IWUSR|S_IRUSR}, 1370 [NFSD_RecoveryDir] = {"nfsv4recoverydir", &transaction_ops, S_IWUSR|S_IRUSR}, 1371 [NFSD_V4EndGrace] = {"v4_end_grace", &transaction_ops, S_IWUSR|S_IRUGO}, 1372 #endif 1373 /* last one */ {""} 1374 }; 1375 get_net(sb->s_fs_info); 1376 ret = simple_fill_super(sb, 0x6e667364, nfsd_files); 1377 if (ret) 1378 return ret; 1379 dentry = nfsd_mkdir(sb->s_root, NULL, "clients"); 1380 if (IS_ERR(dentry)) 1381 return PTR_ERR(dentry); 1382 nn->nfsd_client_dir = dentry; 1383 return 0; 1384 1385 } 1386 1387 static struct dentry *nfsd_mount(struct file_system_type *fs_type, 1388 int flags, const char *dev_name, void *data) 1389 { 1390 struct net *net = current->nsproxy->net_ns; 1391 return mount_ns(fs_type, flags, data, net, net->user_ns, nfsd_fill_super); 1392 } 1393 1394 static void nfsd_umount(struct super_block *sb) 1395 { 1396 struct net *net = sb->s_fs_info; 1397 1398 kill_litter_super(sb); 1399 put_net(net); 1400 } 1401 1402 static struct file_system_type nfsd_fs_type = { 1403 .owner = THIS_MODULE, 1404 .name = "nfsd", 1405 .mount = nfsd_mount, 1406 .kill_sb = nfsd_umount, 1407 }; 1408 MODULE_ALIAS_FS("nfsd"); 1409 1410 #ifdef CONFIG_PROC_FS 1411 static int create_proc_exports_entry(void) 1412 { 1413 struct proc_dir_entry *entry; 1414 1415 entry = proc_mkdir("fs/nfs", NULL); 1416 if (!entry) 1417 return -ENOMEM; 1418 entry = proc_create("exports", 0, entry, 1419 &exports_proc_operations); 1420 if (!entry) { 1421 remove_proc_entry("fs/nfs", NULL); 1422 return -ENOMEM; 1423 } 1424 return 0; 1425 } 1426 #else /* CONFIG_PROC_FS */ 1427 static int create_proc_exports_entry(void) 1428 { 1429 return 0; 1430 } 1431 #endif 1432 1433 unsigned int nfsd_net_id; 1434 1435 static __net_init int nfsd_init_net(struct net *net) 1436 { 1437 int retval; 1438 struct vfsmount *mnt; 1439 struct nfsd_net *nn = net_generic(net, nfsd_net_id); 1440 1441 retval = nfsd_export_init(net); 1442 if (retval) 1443 goto out_export_error; 1444 retval = nfsd_idmap_init(net); 1445 if (retval) 1446 goto out_idmap_error; 1447 nn->nfsd_versions = NULL; 1448 nn->nfsd4_minorversions = NULL; 1449 retval = nfsd_reply_cache_init(nn); 1450 if (retval) 1451 goto out_drc_error; 1452 nn->nfsd4_lease = 90; /* default lease time */ 1453 nn->nfsd4_grace = 90; 1454 nn->somebody_reclaimed = false; 1455 nn->track_reclaim_completes = false; 1456 nn->clverifier_counter = prandom_u32(); 1457 nn->clientid_base = prandom_u32(); 1458 nn->clientid_counter = nn->clientid_base + 1; 1459 nn->s2s_cp_cl_id = nn->clientid_counter++; 1460 1461 atomic_set(&nn->ntf_refcnt, 0); 1462 init_waitqueue_head(&nn->ntf_wq); 1463 1464 mnt = vfs_kern_mount(&nfsd_fs_type, SB_KERNMOUNT, "nfsd", NULL); 1465 if (IS_ERR(mnt)) { 1466 retval = PTR_ERR(mnt); 1467 goto out_mount_err; 1468 } 1469 nn->nfsd_mnt = mnt; 1470 return 0; 1471 1472 out_mount_err: 1473 nfsd_reply_cache_shutdown(nn); 1474 out_drc_error: 1475 nfsd_idmap_shutdown(net); 1476 out_idmap_error: 1477 nfsd_export_shutdown(net); 1478 out_export_error: 1479 return retval; 1480 } 1481 1482 static __net_exit void nfsd_exit_net(struct net *net) 1483 { 1484 struct nfsd_net *nn = net_generic(net, nfsd_net_id); 1485 1486 mntput(nn->nfsd_mnt); 1487 nfsd_reply_cache_shutdown(nn); 1488 nfsd_idmap_shutdown(net); 1489 nfsd_export_shutdown(net); 1490 nfsd_netns_free_versions(net_generic(net, nfsd_net_id)); 1491 } 1492 1493 static struct pernet_operations nfsd_net_ops = { 1494 .init = nfsd_init_net, 1495 .exit = nfsd_exit_net, 1496 .id = &nfsd_net_id, 1497 .size = sizeof(struct nfsd_net), 1498 }; 1499 1500 static int __init init_nfsd(void) 1501 { 1502 int retval; 1503 printk(KERN_INFO "Installing knfsd (copyright (C) 1996 okir@monad.swb.de).\n"); 1504 1505 retval = register_pernet_subsys(&nfsd_net_ops); 1506 if (retval < 0) 1507 return retval; 1508 retval = register_cld_notifier(); 1509 if (retval) 1510 goto out_unregister_pernet; 1511 retval = nfsd4_init_slabs(); 1512 if (retval) 1513 goto out_unregister_notifier; 1514 retval = nfsd4_init_pnfs(); 1515 if (retval) 1516 goto out_free_slabs; 1517 nfsd_fault_inject_init(); /* nfsd fault injection controls */ 1518 nfsd_stat_init(); /* Statistics */ 1519 nfsd_lockd_init(); /* lockd->nfsd callbacks */ 1520 retval = create_proc_exports_entry(); 1521 if (retval) 1522 goto out_free_lockd; 1523 retval = register_filesystem(&nfsd_fs_type); 1524 if (retval) 1525 goto out_free_all; 1526 return 0; 1527 out_free_all: 1528 remove_proc_entry("fs/nfs/exports", NULL); 1529 remove_proc_entry("fs/nfs", NULL); 1530 out_free_lockd: 1531 nfsd_lockd_shutdown(); 1532 nfsd_stat_shutdown(); 1533 nfsd_fault_inject_cleanup(); 1534 nfsd4_exit_pnfs(); 1535 out_free_slabs: 1536 nfsd4_free_slabs(); 1537 out_unregister_notifier: 1538 unregister_cld_notifier(); 1539 out_unregister_pernet: 1540 unregister_pernet_subsys(&nfsd_net_ops); 1541 return retval; 1542 } 1543 1544 static void __exit exit_nfsd(void) 1545 { 1546 remove_proc_entry("fs/nfs/exports", NULL); 1547 remove_proc_entry("fs/nfs", NULL); 1548 nfsd_stat_shutdown(); 1549 nfsd_lockd_shutdown(); 1550 nfsd4_free_slabs(); 1551 nfsd4_exit_pnfs(); 1552 nfsd_fault_inject_cleanup(); 1553 unregister_filesystem(&nfsd_fs_type); 1554 unregister_cld_notifier(); 1555 unregister_pernet_subsys(&nfsd_net_ops); 1556 } 1557 1558 MODULE_AUTHOR("Olaf Kirch <okir@monad.swb.de>"); 1559 MODULE_LICENSE("GPL"); 1560 module_init(init_nfsd) 1561 module_exit(exit_nfsd) 1562