1 /* client.c: NFS client sharing and management code 2 * 3 * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 9 * 2 of the License, or (at your option) any later version. 10 */ 11 12 13 #include <linux/module.h> 14 #include <linux/init.h> 15 #include <linux/sched.h> 16 #include <linux/time.h> 17 #include <linux/kernel.h> 18 #include <linux/mm.h> 19 #include <linux/string.h> 20 #include <linux/stat.h> 21 #include <linux/errno.h> 22 #include <linux/unistd.h> 23 #include <linux/sunrpc/clnt.h> 24 #include <linux/sunrpc/stats.h> 25 #include <linux/sunrpc/metrics.h> 26 #include <linux/sunrpc/xprtsock.h> 27 #include <linux/sunrpc/xprtrdma.h> 28 #include <linux/nfs_fs.h> 29 #include <linux/nfs_mount.h> 30 #include <linux/nfs4_mount.h> 31 #include <linux/lockd/bind.h> 32 #include <linux/seq_file.h> 33 #include <linux/mount.h> 34 #include <linux/nfs_idmap.h> 35 #include <linux/vfs.h> 36 #include <linux/inet.h> 37 #include <linux/in6.h> 38 #include <linux/slab.h> 39 #include <linux/idr.h> 40 #include <net/ipv6.h> 41 #include <linux/nfs_xdr.h> 42 #include <linux/sunrpc/bc_xprt.h> 43 #include <linux/nsproxy.h> 44 #include <linux/pid_namespace.h> 45 46 47 #include "nfs4_fs.h" 48 #include "callback.h" 49 #include "delegation.h" 50 #include "iostat.h" 51 #include "internal.h" 52 #include "fscache.h" 53 #include "pnfs.h" 54 #include "netns.h" 55 56 #define NFSDBG_FACILITY NFSDBG_CLIENT 57 58 static DECLARE_WAIT_QUEUE_HEAD(nfs_client_active_wq); 59 #ifdef CONFIG_NFS_V4 60 61 /* 62 * Get a unique NFSv4.0 callback identifier which will be used 63 * by the V4.0 callback service to lookup the nfs_client struct 64 */ 65 static int nfs_get_cb_ident_idr(struct nfs_client *clp, int minorversion) 66 { 67 int ret = 0; 68 struct nfs_net *nn = net_generic(clp->net, nfs_net_id); 69 70 if (clp->rpc_ops->version != 4 || minorversion != 0) 71 return ret; 72 retry: 73 if (!idr_pre_get(&nn->cb_ident_idr, GFP_KERNEL)) 74 return -ENOMEM; 75 spin_lock(&nn->nfs_client_lock); 76 ret = idr_get_new(&nn->cb_ident_idr, clp, &clp->cl_cb_ident); 77 spin_unlock(&nn->nfs_client_lock); 78 if (ret == -EAGAIN) 79 goto retry; 80 return ret; 81 } 82 #endif /* CONFIG_NFS_V4 */ 83 84 /* 85 * Turn off NFSv4 uid/gid mapping when using AUTH_SYS 86 */ 87 static bool nfs4_disable_idmapping = true; 88 89 /* 90 * RPC cruft for NFS 91 */ 92 static const struct rpc_version *nfs_version[5] = { 93 [2] = &nfs_version2, 94 #ifdef CONFIG_NFS_V3 95 [3] = &nfs_version3, 96 #endif 97 #ifdef CONFIG_NFS_V4 98 [4] = &nfs_version4, 99 #endif 100 }; 101 102 const struct rpc_program nfs_program = { 103 .name = "nfs", 104 .number = NFS_PROGRAM, 105 .nrvers = ARRAY_SIZE(nfs_version), 106 .version = nfs_version, 107 .stats = &nfs_rpcstat, 108 .pipe_dir_name = NFS_PIPE_DIRNAME, 109 }; 110 111 struct rpc_stat nfs_rpcstat = { 112 .program = &nfs_program 113 }; 114 115 116 #ifdef CONFIG_NFS_V3_ACL 117 static struct rpc_stat nfsacl_rpcstat = { &nfsacl_program }; 118 static const struct rpc_version *nfsacl_version[] = { 119 [3] = &nfsacl_version3, 120 }; 121 122 const struct rpc_program nfsacl_program = { 123 .name = "nfsacl", 124 .number = NFS_ACL_PROGRAM, 125 .nrvers = ARRAY_SIZE(nfsacl_version), 126 .version = nfsacl_version, 127 .stats = &nfsacl_rpcstat, 128 }; 129 #endif /* CONFIG_NFS_V3_ACL */ 130 131 struct nfs_client_initdata { 132 const char *hostname; 133 const struct sockaddr *addr; 134 size_t addrlen; 135 const struct nfs_rpc_ops *rpc_ops; 136 int proto; 137 u32 minorversion; 138 struct net *net; 139 }; 140 141 /* 142 * Allocate a shared client record 143 * 144 * Since these are allocated/deallocated very rarely, we don't 145 * bother putting them in a slab cache... 146 */ 147 static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init) 148 { 149 struct nfs_client *clp; 150 struct rpc_cred *cred; 151 int err = -ENOMEM; 152 153 if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) 154 goto error_0; 155 156 clp->rpc_ops = cl_init->rpc_ops; 157 158 atomic_set(&clp->cl_count, 1); 159 clp->cl_cons_state = NFS_CS_INITING; 160 161 memcpy(&clp->cl_addr, cl_init->addr, cl_init->addrlen); 162 clp->cl_addrlen = cl_init->addrlen; 163 164 if (cl_init->hostname) { 165 err = -ENOMEM; 166 clp->cl_hostname = kstrdup(cl_init->hostname, GFP_KERNEL); 167 if (!clp->cl_hostname) 168 goto error_cleanup; 169 } 170 171 INIT_LIST_HEAD(&clp->cl_superblocks); 172 clp->cl_rpcclient = ERR_PTR(-EINVAL); 173 174 clp->cl_proto = cl_init->proto; 175 clp->net = get_net(cl_init->net); 176 177 #ifdef CONFIG_NFS_V4 178 err = nfs_get_cb_ident_idr(clp, cl_init->minorversion); 179 if (err) 180 goto error_cleanup; 181 182 spin_lock_init(&clp->cl_lock); 183 INIT_DELAYED_WORK(&clp->cl_renewd, nfs4_renew_state); 184 rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS client"); 185 clp->cl_boot_time = CURRENT_TIME; 186 clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED; 187 clp->cl_minorversion = cl_init->minorversion; 188 clp->cl_mvops = nfs_v4_minor_ops[cl_init->minorversion]; 189 #endif 190 cred = rpc_lookup_machine_cred("*"); 191 if (!IS_ERR(cred)) 192 clp->cl_machine_cred = cred; 193 nfs_fscache_get_client_cookie(clp); 194 195 return clp; 196 197 error_cleanup: 198 kfree(clp); 199 error_0: 200 return ERR_PTR(err); 201 } 202 203 #ifdef CONFIG_NFS_V4 204 #ifdef CONFIG_NFS_V4_1 205 static void nfs4_shutdown_session(struct nfs_client *clp) 206 { 207 if (nfs4_has_session(clp)) { 208 nfs4_deviceid_purge_client(clp); 209 nfs4_destroy_session(clp->cl_session); 210 } 211 212 } 213 #else /* CONFIG_NFS_V4_1 */ 214 static void nfs4_shutdown_session(struct nfs_client *clp) 215 { 216 } 217 #endif /* CONFIG_NFS_V4_1 */ 218 219 /* 220 * Destroy the NFS4 callback service 221 */ 222 static void nfs4_destroy_callback(struct nfs_client *clp) 223 { 224 if (__test_and_clear_bit(NFS_CS_CALLBACK, &clp->cl_res_state)) 225 nfs_callback_down(clp->cl_mvops->minor_version); 226 } 227 228 static void nfs4_shutdown_client(struct nfs_client *clp) 229 { 230 if (__test_and_clear_bit(NFS_CS_RENEWD, &clp->cl_res_state)) 231 nfs4_kill_renewd(clp); 232 nfs4_shutdown_session(clp); 233 nfs4_destroy_callback(clp); 234 if (__test_and_clear_bit(NFS_CS_IDMAP, &clp->cl_res_state)) 235 nfs_idmap_delete(clp); 236 237 rpc_destroy_wait_queue(&clp->cl_rpcwaitq); 238 } 239 240 /* idr_remove_all is not needed as all id's are removed by nfs_put_client */ 241 void nfs_cleanup_cb_ident_idr(struct net *net) 242 { 243 struct nfs_net *nn = net_generic(net, nfs_net_id); 244 245 idr_destroy(&nn->cb_ident_idr); 246 } 247 248 /* nfs_client_lock held */ 249 static void nfs_cb_idr_remove_locked(struct nfs_client *clp) 250 { 251 struct nfs_net *nn = net_generic(clp->net, nfs_net_id); 252 253 if (clp->cl_cb_ident) 254 idr_remove(&nn->cb_ident_idr, clp->cl_cb_ident); 255 } 256 257 static void pnfs_init_server(struct nfs_server *server) 258 { 259 rpc_init_wait_queue(&server->roc_rpcwaitq, "pNFS ROC"); 260 } 261 262 static void nfs4_destroy_server(struct nfs_server *server) 263 { 264 nfs4_purge_state_owners(server); 265 } 266 267 #else 268 static void nfs4_shutdown_client(struct nfs_client *clp) 269 { 270 } 271 272 void nfs_cleanup_cb_ident_idr(struct net *net) 273 { 274 } 275 276 static void nfs_cb_idr_remove_locked(struct nfs_client *clp) 277 { 278 } 279 280 static void pnfs_init_server(struct nfs_server *server) 281 { 282 } 283 284 #endif /* CONFIG_NFS_V4 */ 285 286 /* 287 * Destroy a shared client record 288 */ 289 static void nfs_free_client(struct nfs_client *clp) 290 { 291 dprintk("--> nfs_free_client(%u)\n", clp->rpc_ops->version); 292 293 nfs4_shutdown_client(clp); 294 295 nfs_fscache_release_client_cookie(clp); 296 297 /* -EIO all pending I/O */ 298 if (!IS_ERR(clp->cl_rpcclient)) 299 rpc_shutdown_client(clp->cl_rpcclient); 300 301 if (clp->cl_machine_cred != NULL) 302 put_rpccred(clp->cl_machine_cred); 303 304 put_net(clp->net); 305 kfree(clp->cl_hostname); 306 kfree(clp->server_scope); 307 kfree(clp->impl_id); 308 kfree(clp); 309 310 dprintk("<-- nfs_free_client()\n"); 311 } 312 313 /* 314 * Release a reference to a shared client record 315 */ 316 void nfs_put_client(struct nfs_client *clp) 317 { 318 struct nfs_net *nn; 319 320 if (!clp) 321 return; 322 323 dprintk("--> nfs_put_client({%d})\n", atomic_read(&clp->cl_count)); 324 nn = net_generic(clp->net, nfs_net_id); 325 326 if (atomic_dec_and_lock(&clp->cl_count, &nn->nfs_client_lock)) { 327 list_del(&clp->cl_share_link); 328 nfs_cb_idr_remove_locked(clp); 329 spin_unlock(&nn->nfs_client_lock); 330 331 BUG_ON(!list_empty(&clp->cl_superblocks)); 332 333 nfs_free_client(clp); 334 } 335 } 336 EXPORT_SYMBOL_GPL(nfs_put_client); 337 338 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 339 /* 340 * Test if two ip6 socket addresses refer to the same socket by 341 * comparing relevant fields. The padding bytes specifically, are not 342 * compared. sin6_flowinfo is not compared because it only affects QoS 343 * and sin6_scope_id is only compared if the address is "link local" 344 * because "link local" addresses need only be unique to a specific 345 * link. Conversely, ordinary unicast addresses might have different 346 * sin6_scope_id. 347 * 348 * The caller should ensure both socket addresses are AF_INET6. 349 */ 350 static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1, 351 const struct sockaddr *sa2) 352 { 353 const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1; 354 const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2; 355 356 if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr)) 357 return 0; 358 else if (ipv6_addr_type(&sin1->sin6_addr) & IPV6_ADDR_LINKLOCAL) 359 return sin1->sin6_scope_id == sin2->sin6_scope_id; 360 361 return 1; 362 } 363 #else /* !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE) */ 364 static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1, 365 const struct sockaddr *sa2) 366 { 367 return 0; 368 } 369 #endif 370 371 /* 372 * Test if two ip4 socket addresses refer to the same socket, by 373 * comparing relevant fields. The padding bytes specifically, are 374 * not compared. 375 * 376 * The caller should ensure both socket addresses are AF_INET. 377 */ 378 static int nfs_sockaddr_match_ipaddr4(const struct sockaddr *sa1, 379 const struct sockaddr *sa2) 380 { 381 const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sa1; 382 const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sa2; 383 384 return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr; 385 } 386 387 static int nfs_sockaddr_cmp_ip6(const struct sockaddr *sa1, 388 const struct sockaddr *sa2) 389 { 390 const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1; 391 const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2; 392 393 return nfs_sockaddr_match_ipaddr6(sa1, sa2) && 394 (sin1->sin6_port == sin2->sin6_port); 395 } 396 397 static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1, 398 const struct sockaddr *sa2) 399 { 400 const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sa1; 401 const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sa2; 402 403 return nfs_sockaddr_match_ipaddr4(sa1, sa2) && 404 (sin1->sin_port == sin2->sin_port); 405 } 406 407 #if defined(CONFIG_NFS_V4_1) 408 /* 409 * Test if two socket addresses represent the same actual socket, 410 * by comparing (only) relevant fields, excluding the port number. 411 */ 412 static int nfs_sockaddr_match_ipaddr(const struct sockaddr *sa1, 413 const struct sockaddr *sa2) 414 { 415 if (sa1->sa_family != sa2->sa_family) 416 return 0; 417 418 switch (sa1->sa_family) { 419 case AF_INET: 420 return nfs_sockaddr_match_ipaddr4(sa1, sa2); 421 case AF_INET6: 422 return nfs_sockaddr_match_ipaddr6(sa1, sa2); 423 } 424 return 0; 425 } 426 #endif /* CONFIG_NFS_V4_1 */ 427 428 /* 429 * Test if two socket addresses represent the same actual socket, 430 * by comparing (only) relevant fields, including the port number. 431 */ 432 static int nfs_sockaddr_cmp(const struct sockaddr *sa1, 433 const struct sockaddr *sa2) 434 { 435 if (sa1->sa_family != sa2->sa_family) 436 return 0; 437 438 switch (sa1->sa_family) { 439 case AF_INET: 440 return nfs_sockaddr_cmp_ip4(sa1, sa2); 441 case AF_INET6: 442 return nfs_sockaddr_cmp_ip6(sa1, sa2); 443 } 444 return 0; 445 } 446 447 #if defined(CONFIG_NFS_V4_1) 448 /* Common match routine for v4.0 and v4.1 callback services */ 449 static bool nfs4_cb_match_client(const struct sockaddr *addr, 450 struct nfs_client *clp, u32 minorversion) 451 { 452 struct sockaddr *clap = (struct sockaddr *)&clp->cl_addr; 453 454 /* Don't match clients that failed to initialise */ 455 if (!(clp->cl_cons_state == NFS_CS_READY || 456 clp->cl_cons_state == NFS_CS_SESSION_INITING)) 457 return false; 458 459 /* Match the version and minorversion */ 460 if (clp->rpc_ops->version != 4 || 461 clp->cl_minorversion != minorversion) 462 return false; 463 464 /* Match only the IP address, not the port number */ 465 if (!nfs_sockaddr_match_ipaddr(addr, clap)) 466 return false; 467 468 return true; 469 } 470 #endif /* CONFIG_NFS_V4_1 */ 471 472 /* 473 * Find an nfs_client on the list that matches the initialisation data 474 * that is supplied. 475 */ 476 static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *data) 477 { 478 struct nfs_client *clp; 479 const struct sockaddr *sap = data->addr; 480 struct nfs_net *nn = net_generic(data->net, nfs_net_id); 481 482 list_for_each_entry(clp, &nn->nfs_client_list, cl_share_link) { 483 const struct sockaddr *clap = (struct sockaddr *)&clp->cl_addr; 484 /* Don't match clients that failed to initialise properly */ 485 if (clp->cl_cons_state < 0) 486 continue; 487 488 /* Different NFS versions cannot share the same nfs_client */ 489 if (clp->rpc_ops != data->rpc_ops) 490 continue; 491 492 if (clp->cl_proto != data->proto) 493 continue; 494 /* Match nfsv4 minorversion */ 495 if (clp->cl_minorversion != data->minorversion) 496 continue; 497 /* Match the full socket address */ 498 if (!nfs_sockaddr_cmp(sap, clap)) 499 continue; 500 501 atomic_inc(&clp->cl_count); 502 return clp; 503 } 504 return NULL; 505 } 506 507 /* 508 * Look up a client by IP address and protocol version 509 * - creates a new record if one doesn't yet exist 510 */ 511 static struct nfs_client * 512 nfs_get_client(const struct nfs_client_initdata *cl_init, 513 const struct rpc_timeout *timeparms, 514 const char *ip_addr, 515 rpc_authflavor_t authflavour, 516 int noresvport) 517 { 518 struct nfs_client *clp, *new = NULL; 519 int error; 520 struct nfs_net *nn = net_generic(cl_init->net, nfs_net_id); 521 522 dprintk("--> nfs_get_client(%s,v%u)\n", 523 cl_init->hostname ?: "", cl_init->rpc_ops->version); 524 525 /* see if the client already exists */ 526 do { 527 spin_lock(&nn->nfs_client_lock); 528 529 clp = nfs_match_client(cl_init); 530 if (clp) 531 goto found_client; 532 if (new) 533 goto install_client; 534 535 spin_unlock(&nn->nfs_client_lock); 536 537 new = nfs_alloc_client(cl_init); 538 } while (!IS_ERR(new)); 539 540 dprintk("--> nfs_get_client() = %ld [failed]\n", PTR_ERR(new)); 541 return new; 542 543 /* install a new client and return with it unready */ 544 install_client: 545 clp = new; 546 list_add(&clp->cl_share_link, &nn->nfs_client_list); 547 spin_unlock(&nn->nfs_client_lock); 548 549 error = cl_init->rpc_ops->init_client(clp, timeparms, ip_addr, 550 authflavour, noresvport); 551 if (error < 0) { 552 nfs_put_client(clp); 553 return ERR_PTR(error); 554 } 555 dprintk("--> nfs_get_client() = %p [new]\n", clp); 556 return clp; 557 558 /* found an existing client 559 * - make sure it's ready before returning 560 */ 561 found_client: 562 spin_unlock(&nn->nfs_client_lock); 563 564 if (new) 565 nfs_free_client(new); 566 567 error = wait_event_killable(nfs_client_active_wq, 568 clp->cl_cons_state < NFS_CS_INITING); 569 if (error < 0) { 570 nfs_put_client(clp); 571 return ERR_PTR(-ERESTARTSYS); 572 } 573 574 if (clp->cl_cons_state < NFS_CS_READY) { 575 error = clp->cl_cons_state; 576 nfs_put_client(clp); 577 return ERR_PTR(error); 578 } 579 580 BUG_ON(clp->cl_cons_state != NFS_CS_READY); 581 582 dprintk("--> nfs_get_client() = %p [share]\n", clp); 583 return clp; 584 } 585 586 /* 587 * Mark a server as ready or failed 588 */ 589 void nfs_mark_client_ready(struct nfs_client *clp, int state) 590 { 591 clp->cl_cons_state = state; 592 wake_up_all(&nfs_client_active_wq); 593 } 594 595 /* 596 * With sessions, the client is not marked ready until after a 597 * successful EXCHANGE_ID and CREATE_SESSION. 598 * 599 * Map errors cl_cons_state errors to EPROTONOSUPPORT to indicate 600 * other versions of NFS can be tried. 601 */ 602 int nfs4_check_client_ready(struct nfs_client *clp) 603 { 604 if (!nfs4_has_session(clp)) 605 return 0; 606 if (clp->cl_cons_state < NFS_CS_READY) 607 return -EPROTONOSUPPORT; 608 return 0; 609 } 610 611 /* 612 * Initialise the timeout values for a connection 613 */ 614 static void nfs_init_timeout_values(struct rpc_timeout *to, int proto, 615 unsigned int timeo, unsigned int retrans) 616 { 617 to->to_initval = timeo * HZ / 10; 618 to->to_retries = retrans; 619 620 switch (proto) { 621 case XPRT_TRANSPORT_TCP: 622 case XPRT_TRANSPORT_RDMA: 623 if (to->to_retries == 0) 624 to->to_retries = NFS_DEF_TCP_RETRANS; 625 if (to->to_initval == 0) 626 to->to_initval = NFS_DEF_TCP_TIMEO * HZ / 10; 627 if (to->to_initval > NFS_MAX_TCP_TIMEOUT) 628 to->to_initval = NFS_MAX_TCP_TIMEOUT; 629 to->to_increment = to->to_initval; 630 to->to_maxval = to->to_initval + (to->to_increment * to->to_retries); 631 if (to->to_maxval > NFS_MAX_TCP_TIMEOUT) 632 to->to_maxval = NFS_MAX_TCP_TIMEOUT; 633 if (to->to_maxval < to->to_initval) 634 to->to_maxval = to->to_initval; 635 to->to_exponential = 0; 636 break; 637 case XPRT_TRANSPORT_UDP: 638 if (to->to_retries == 0) 639 to->to_retries = NFS_DEF_UDP_RETRANS; 640 if (!to->to_initval) 641 to->to_initval = NFS_DEF_UDP_TIMEO * HZ / 10; 642 if (to->to_initval > NFS_MAX_UDP_TIMEOUT) 643 to->to_initval = NFS_MAX_UDP_TIMEOUT; 644 to->to_maxval = NFS_MAX_UDP_TIMEOUT; 645 to->to_exponential = 1; 646 break; 647 default: 648 BUG(); 649 } 650 } 651 652 /* 653 * Create an RPC client handle 654 */ 655 static int nfs_create_rpc_client(struct nfs_client *clp, 656 const struct rpc_timeout *timeparms, 657 rpc_authflavor_t flavor, 658 int discrtry, int noresvport) 659 { 660 struct rpc_clnt *clnt = NULL; 661 struct rpc_create_args args = { 662 .net = clp->net, 663 .protocol = clp->cl_proto, 664 .address = (struct sockaddr *)&clp->cl_addr, 665 .addrsize = clp->cl_addrlen, 666 .timeout = timeparms, 667 .servername = clp->cl_hostname, 668 .program = &nfs_program, 669 .version = clp->rpc_ops->version, 670 .authflavor = flavor, 671 }; 672 673 if (discrtry) 674 args.flags |= RPC_CLNT_CREATE_DISCRTRY; 675 if (noresvport) 676 args.flags |= RPC_CLNT_CREATE_NONPRIVPORT; 677 678 if (!IS_ERR(clp->cl_rpcclient)) 679 return 0; 680 681 clnt = rpc_create(&args); 682 if (IS_ERR(clnt)) { 683 dprintk("%s: cannot create RPC client. Error = %ld\n", 684 __func__, PTR_ERR(clnt)); 685 return PTR_ERR(clnt); 686 } 687 688 clp->cl_rpcclient = clnt; 689 return 0; 690 } 691 692 /* 693 * Version 2 or 3 client destruction 694 */ 695 static void nfs_destroy_server(struct nfs_server *server) 696 { 697 if (!(server->flags & NFS_MOUNT_LOCAL_FLOCK) || 698 !(server->flags & NFS_MOUNT_LOCAL_FCNTL)) 699 nlmclnt_done(server->nlm_host); 700 } 701 702 /* 703 * Version 2 or 3 lockd setup 704 */ 705 static int nfs_start_lockd(struct nfs_server *server) 706 { 707 struct nlm_host *host; 708 struct nfs_client *clp = server->nfs_client; 709 struct nlmclnt_initdata nlm_init = { 710 .hostname = clp->cl_hostname, 711 .address = (struct sockaddr *)&clp->cl_addr, 712 .addrlen = clp->cl_addrlen, 713 .nfs_version = clp->rpc_ops->version, 714 .noresvport = server->flags & NFS_MOUNT_NORESVPORT ? 715 1 : 0, 716 .net = clp->net, 717 }; 718 719 if (nlm_init.nfs_version > 3) 720 return 0; 721 if ((server->flags & NFS_MOUNT_LOCAL_FLOCK) && 722 (server->flags & NFS_MOUNT_LOCAL_FCNTL)) 723 return 0; 724 725 switch (clp->cl_proto) { 726 default: 727 nlm_init.protocol = IPPROTO_TCP; 728 break; 729 case XPRT_TRANSPORT_UDP: 730 nlm_init.protocol = IPPROTO_UDP; 731 } 732 733 host = nlmclnt_init(&nlm_init); 734 if (IS_ERR(host)) 735 return PTR_ERR(host); 736 737 server->nlm_host = host; 738 server->destroy = nfs_destroy_server; 739 return 0; 740 } 741 742 /* 743 * Initialise an NFSv3 ACL client connection 744 */ 745 #ifdef CONFIG_NFS_V3_ACL 746 static void nfs_init_server_aclclient(struct nfs_server *server) 747 { 748 if (server->nfs_client->rpc_ops->version != 3) 749 goto out_noacl; 750 if (server->flags & NFS_MOUNT_NOACL) 751 goto out_noacl; 752 753 server->client_acl = rpc_bind_new_program(server->client, &nfsacl_program, 3); 754 if (IS_ERR(server->client_acl)) 755 goto out_noacl; 756 757 /* No errors! Assume that Sun nfsacls are supported */ 758 server->caps |= NFS_CAP_ACLS; 759 return; 760 761 out_noacl: 762 server->caps &= ~NFS_CAP_ACLS; 763 } 764 #else 765 static inline void nfs_init_server_aclclient(struct nfs_server *server) 766 { 767 server->flags &= ~NFS_MOUNT_NOACL; 768 server->caps &= ~NFS_CAP_ACLS; 769 } 770 #endif 771 772 /* 773 * Create a general RPC client 774 */ 775 static int nfs_init_server_rpcclient(struct nfs_server *server, 776 const struct rpc_timeout *timeo, 777 rpc_authflavor_t pseudoflavour) 778 { 779 struct nfs_client *clp = server->nfs_client; 780 781 server->client = rpc_clone_client(clp->cl_rpcclient); 782 if (IS_ERR(server->client)) { 783 dprintk("%s: couldn't create rpc_client!\n", __func__); 784 return PTR_ERR(server->client); 785 } 786 787 memcpy(&server->client->cl_timeout_default, 788 timeo, 789 sizeof(server->client->cl_timeout_default)); 790 server->client->cl_timeout = &server->client->cl_timeout_default; 791 792 if (pseudoflavour != clp->cl_rpcclient->cl_auth->au_flavor) { 793 struct rpc_auth *auth; 794 795 auth = rpcauth_create(pseudoflavour, server->client); 796 if (IS_ERR(auth)) { 797 dprintk("%s: couldn't create credcache!\n", __func__); 798 return PTR_ERR(auth); 799 } 800 } 801 server->client->cl_softrtry = 0; 802 if (server->flags & NFS_MOUNT_SOFT) 803 server->client->cl_softrtry = 1; 804 805 return 0; 806 } 807 808 /* 809 * Initialise an NFS2 or NFS3 client 810 */ 811 int nfs_init_client(struct nfs_client *clp, const struct rpc_timeout *timeparms, 812 const char *ip_addr, rpc_authflavor_t authflavour, 813 int noresvport) 814 { 815 int error; 816 817 if (clp->cl_cons_state == NFS_CS_READY) { 818 /* the client is already initialised */ 819 dprintk("<-- nfs_init_client() = 0 [already %p]\n", clp); 820 return 0; 821 } 822 823 /* 824 * Create a client RPC handle for doing FSSTAT with UNIX auth only 825 * - RFC 2623, sec 2.3.2 826 */ 827 error = nfs_create_rpc_client(clp, timeparms, RPC_AUTH_UNIX, 828 0, noresvport); 829 if (error < 0) 830 goto error; 831 nfs_mark_client_ready(clp, NFS_CS_READY); 832 return 0; 833 834 error: 835 nfs_mark_client_ready(clp, error); 836 dprintk("<-- nfs_init_client() = xerror %d\n", error); 837 return error; 838 } 839 840 /* 841 * Create a version 2 or 3 client 842 */ 843 static int nfs_init_server(struct nfs_server *server, 844 const struct nfs_parsed_mount_data *data) 845 { 846 struct nfs_client_initdata cl_init = { 847 .hostname = data->nfs_server.hostname, 848 .addr = (const struct sockaddr *)&data->nfs_server.address, 849 .addrlen = data->nfs_server.addrlen, 850 .rpc_ops = &nfs_v2_clientops, 851 .proto = data->nfs_server.protocol, 852 .net = data->net, 853 }; 854 struct rpc_timeout timeparms; 855 struct nfs_client *clp; 856 int error; 857 858 dprintk("--> nfs_init_server()\n"); 859 860 #ifdef CONFIG_NFS_V3 861 if (data->version == 3) 862 cl_init.rpc_ops = &nfs_v3_clientops; 863 #endif 864 865 nfs_init_timeout_values(&timeparms, data->nfs_server.protocol, 866 data->timeo, data->retrans); 867 868 /* Allocate or find a client reference we can use */ 869 clp = nfs_get_client(&cl_init, &timeparms, NULL, RPC_AUTH_UNIX, 870 data->flags & NFS_MOUNT_NORESVPORT); 871 if (IS_ERR(clp)) { 872 dprintk("<-- nfs_init_server() = error %ld\n", PTR_ERR(clp)); 873 return PTR_ERR(clp); 874 } 875 876 server->nfs_client = clp; 877 878 /* Initialise the client representation from the mount data */ 879 server->flags = data->flags; 880 server->options = data->options; 881 server->caps |= NFS_CAP_HARDLINKS|NFS_CAP_SYMLINKS|NFS_CAP_FILEID| 882 NFS_CAP_MODE|NFS_CAP_NLINK|NFS_CAP_OWNER|NFS_CAP_OWNER_GROUP| 883 NFS_CAP_ATIME|NFS_CAP_CTIME|NFS_CAP_MTIME; 884 885 if (data->rsize) 886 server->rsize = nfs_block_size(data->rsize, NULL); 887 if (data->wsize) 888 server->wsize = nfs_block_size(data->wsize, NULL); 889 890 server->acregmin = data->acregmin * HZ; 891 server->acregmax = data->acregmax * HZ; 892 server->acdirmin = data->acdirmin * HZ; 893 server->acdirmax = data->acdirmax * HZ; 894 895 /* Start lockd here, before we might error out */ 896 error = nfs_start_lockd(server); 897 if (error < 0) 898 goto error; 899 900 server->port = data->nfs_server.port; 901 902 error = nfs_init_server_rpcclient(server, &timeparms, data->auth_flavors[0]); 903 if (error < 0) 904 goto error; 905 906 /* Preserve the values of mount_server-related mount options */ 907 if (data->mount_server.addrlen) { 908 memcpy(&server->mountd_address, &data->mount_server.address, 909 data->mount_server.addrlen); 910 server->mountd_addrlen = data->mount_server.addrlen; 911 } 912 server->mountd_version = data->mount_server.version; 913 server->mountd_port = data->mount_server.port; 914 server->mountd_protocol = data->mount_server.protocol; 915 916 server->namelen = data->namlen; 917 /* Create a client RPC handle for the NFSv3 ACL management interface */ 918 nfs_init_server_aclclient(server); 919 dprintk("<-- nfs_init_server() = 0 [new %p]\n", clp); 920 return 0; 921 922 error: 923 server->nfs_client = NULL; 924 nfs_put_client(clp); 925 dprintk("<-- nfs_init_server() = xerror %d\n", error); 926 return error; 927 } 928 929 /* 930 * Load up the server record from information gained in an fsinfo record 931 */ 932 static void nfs_server_set_fsinfo(struct nfs_server *server, 933 struct nfs_fh *mntfh, 934 struct nfs_fsinfo *fsinfo) 935 { 936 unsigned long max_rpc_payload; 937 938 /* Work out a lot of parameters */ 939 if (server->rsize == 0) 940 server->rsize = nfs_block_size(fsinfo->rtpref, NULL); 941 if (server->wsize == 0) 942 server->wsize = nfs_block_size(fsinfo->wtpref, NULL); 943 944 if (fsinfo->rtmax >= 512 && server->rsize > fsinfo->rtmax) 945 server->rsize = nfs_block_size(fsinfo->rtmax, NULL); 946 if (fsinfo->wtmax >= 512 && server->wsize > fsinfo->wtmax) 947 server->wsize = nfs_block_size(fsinfo->wtmax, NULL); 948 949 max_rpc_payload = nfs_block_size(rpc_max_payload(server->client), NULL); 950 if (server->rsize > max_rpc_payload) 951 server->rsize = max_rpc_payload; 952 if (server->rsize > NFS_MAX_FILE_IO_SIZE) 953 server->rsize = NFS_MAX_FILE_IO_SIZE; 954 server->rpages = (server->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; 955 956 server->backing_dev_info.name = "nfs"; 957 server->backing_dev_info.ra_pages = server->rpages * NFS_MAX_READAHEAD; 958 959 if (server->wsize > max_rpc_payload) 960 server->wsize = max_rpc_payload; 961 if (server->wsize > NFS_MAX_FILE_IO_SIZE) 962 server->wsize = NFS_MAX_FILE_IO_SIZE; 963 server->wpages = (server->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; 964 server->pnfs_blksize = fsinfo->blksize; 965 set_pnfs_layoutdriver(server, mntfh, fsinfo->layouttype); 966 967 server->wtmult = nfs_block_bits(fsinfo->wtmult, NULL); 968 969 server->dtsize = nfs_block_size(fsinfo->dtpref, NULL); 970 if (server->dtsize > PAGE_CACHE_SIZE * NFS_MAX_READDIR_PAGES) 971 server->dtsize = PAGE_CACHE_SIZE * NFS_MAX_READDIR_PAGES; 972 if (server->dtsize > server->rsize) 973 server->dtsize = server->rsize; 974 975 if (server->flags & NFS_MOUNT_NOAC) { 976 server->acregmin = server->acregmax = 0; 977 server->acdirmin = server->acdirmax = 0; 978 } 979 980 server->maxfilesize = fsinfo->maxfilesize; 981 982 server->time_delta = fsinfo->time_delta; 983 984 /* We're airborne Set socket buffersize */ 985 rpc_setbufsize(server->client, server->wsize + 100, server->rsize + 100); 986 } 987 988 /* 989 * Probe filesystem information, including the FSID on v2/v3 990 */ 991 static int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, struct nfs_fattr *fattr) 992 { 993 struct nfs_fsinfo fsinfo; 994 struct nfs_client *clp = server->nfs_client; 995 int error; 996 997 dprintk("--> nfs_probe_fsinfo()\n"); 998 999 if (clp->rpc_ops->set_capabilities != NULL) { 1000 error = clp->rpc_ops->set_capabilities(server, mntfh); 1001 if (error < 0) 1002 goto out_error; 1003 } 1004 1005 fsinfo.fattr = fattr; 1006 fsinfo.layouttype = 0; 1007 error = clp->rpc_ops->fsinfo(server, mntfh, &fsinfo); 1008 if (error < 0) 1009 goto out_error; 1010 1011 nfs_server_set_fsinfo(server, mntfh, &fsinfo); 1012 1013 /* Get some general file system info */ 1014 if (server->namelen == 0) { 1015 struct nfs_pathconf pathinfo; 1016 1017 pathinfo.fattr = fattr; 1018 nfs_fattr_init(fattr); 1019 1020 if (clp->rpc_ops->pathconf(server, mntfh, &pathinfo) >= 0) 1021 server->namelen = pathinfo.max_namelen; 1022 } 1023 1024 dprintk("<-- nfs_probe_fsinfo() = 0\n"); 1025 return 0; 1026 1027 out_error: 1028 dprintk("nfs_probe_fsinfo: error = %d\n", -error); 1029 return error; 1030 } 1031 1032 /* 1033 * Copy useful information when duplicating a server record 1034 */ 1035 static void nfs_server_copy_userdata(struct nfs_server *target, struct nfs_server *source) 1036 { 1037 target->flags = source->flags; 1038 target->rsize = source->rsize; 1039 target->wsize = source->wsize; 1040 target->acregmin = source->acregmin; 1041 target->acregmax = source->acregmax; 1042 target->acdirmin = source->acdirmin; 1043 target->acdirmax = source->acdirmax; 1044 target->caps = source->caps; 1045 target->options = source->options; 1046 } 1047 1048 static void nfs_server_insert_lists(struct nfs_server *server) 1049 { 1050 struct nfs_client *clp = server->nfs_client; 1051 struct nfs_net *nn = net_generic(clp->net, nfs_net_id); 1052 1053 spin_lock(&nn->nfs_client_lock); 1054 list_add_tail_rcu(&server->client_link, &clp->cl_superblocks); 1055 list_add_tail(&server->master_link, &nn->nfs_volume_list); 1056 clear_bit(NFS_CS_STOP_RENEW, &clp->cl_res_state); 1057 spin_unlock(&nn->nfs_client_lock); 1058 1059 } 1060 1061 static void nfs_server_remove_lists(struct nfs_server *server) 1062 { 1063 struct nfs_client *clp = server->nfs_client; 1064 struct nfs_net *nn; 1065 1066 if (clp == NULL) 1067 return; 1068 nn = net_generic(clp->net, nfs_net_id); 1069 spin_lock(&nn->nfs_client_lock); 1070 list_del_rcu(&server->client_link); 1071 if (list_empty(&clp->cl_superblocks)) 1072 set_bit(NFS_CS_STOP_RENEW, &clp->cl_res_state); 1073 list_del(&server->master_link); 1074 spin_unlock(&nn->nfs_client_lock); 1075 1076 synchronize_rcu(); 1077 } 1078 1079 /* 1080 * Allocate and initialise a server record 1081 */ 1082 static struct nfs_server *nfs_alloc_server(void) 1083 { 1084 struct nfs_server *server; 1085 1086 server = kzalloc(sizeof(struct nfs_server), GFP_KERNEL); 1087 if (!server) 1088 return NULL; 1089 1090 server->client = server->client_acl = ERR_PTR(-EINVAL); 1091 1092 /* Zero out the NFS state stuff */ 1093 INIT_LIST_HEAD(&server->client_link); 1094 INIT_LIST_HEAD(&server->master_link); 1095 INIT_LIST_HEAD(&server->delegations); 1096 INIT_LIST_HEAD(&server->layouts); 1097 INIT_LIST_HEAD(&server->state_owners_lru); 1098 1099 atomic_set(&server->active, 0); 1100 1101 server->io_stats = nfs_alloc_iostats(); 1102 if (!server->io_stats) { 1103 kfree(server); 1104 return NULL; 1105 } 1106 1107 if (bdi_init(&server->backing_dev_info)) { 1108 nfs_free_iostats(server->io_stats); 1109 kfree(server); 1110 return NULL; 1111 } 1112 1113 ida_init(&server->openowner_id); 1114 ida_init(&server->lockowner_id); 1115 pnfs_init_server(server); 1116 1117 return server; 1118 } 1119 1120 /* 1121 * Free up a server record 1122 */ 1123 void nfs_free_server(struct nfs_server *server) 1124 { 1125 dprintk("--> nfs_free_server()\n"); 1126 1127 nfs_server_remove_lists(server); 1128 unset_pnfs_layoutdriver(server); 1129 1130 if (server->destroy != NULL) 1131 server->destroy(server); 1132 1133 if (!IS_ERR(server->client_acl)) 1134 rpc_shutdown_client(server->client_acl); 1135 if (!IS_ERR(server->client)) 1136 rpc_shutdown_client(server->client); 1137 1138 nfs_put_client(server->nfs_client); 1139 1140 ida_destroy(&server->lockowner_id); 1141 ida_destroy(&server->openowner_id); 1142 nfs_free_iostats(server->io_stats); 1143 bdi_destroy(&server->backing_dev_info); 1144 kfree(server); 1145 nfs_release_automount_timer(); 1146 dprintk("<-- nfs_free_server()\n"); 1147 } 1148 1149 /* 1150 * Create a version 2 or 3 volume record 1151 * - keyed on server and FSID 1152 */ 1153 struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, 1154 struct nfs_fh *mntfh) 1155 { 1156 struct nfs_server *server; 1157 struct nfs_fattr *fattr; 1158 int error; 1159 1160 server = nfs_alloc_server(); 1161 if (!server) 1162 return ERR_PTR(-ENOMEM); 1163 1164 error = -ENOMEM; 1165 fattr = nfs_alloc_fattr(); 1166 if (fattr == NULL) 1167 goto error; 1168 1169 /* Get a client representation */ 1170 error = nfs_init_server(server, data); 1171 if (error < 0) 1172 goto error; 1173 1174 BUG_ON(!server->nfs_client); 1175 BUG_ON(!server->nfs_client->rpc_ops); 1176 BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops); 1177 1178 /* Probe the root fh to retrieve its FSID */ 1179 error = nfs_probe_fsinfo(server, mntfh, fattr); 1180 if (error < 0) 1181 goto error; 1182 if (server->nfs_client->rpc_ops->version == 3) { 1183 if (server->namelen == 0 || server->namelen > NFS3_MAXNAMLEN) 1184 server->namelen = NFS3_MAXNAMLEN; 1185 if (!(data->flags & NFS_MOUNT_NORDIRPLUS)) 1186 server->caps |= NFS_CAP_READDIRPLUS; 1187 } else { 1188 if (server->namelen == 0 || server->namelen > NFS2_MAXNAMLEN) 1189 server->namelen = NFS2_MAXNAMLEN; 1190 } 1191 1192 if (!(fattr->valid & NFS_ATTR_FATTR)) { 1193 error = server->nfs_client->rpc_ops->getattr(server, mntfh, fattr); 1194 if (error < 0) { 1195 dprintk("nfs_create_server: getattr error = %d\n", -error); 1196 goto error; 1197 } 1198 } 1199 memcpy(&server->fsid, &fattr->fsid, sizeof(server->fsid)); 1200 1201 dprintk("Server FSID: %llx:%llx\n", 1202 (unsigned long long) server->fsid.major, 1203 (unsigned long long) server->fsid.minor); 1204 1205 nfs_server_insert_lists(server); 1206 server->mount_time = jiffies; 1207 nfs_free_fattr(fattr); 1208 return server; 1209 1210 error: 1211 nfs_free_fattr(fattr); 1212 nfs_free_server(server); 1213 return ERR_PTR(error); 1214 } 1215 1216 #ifdef CONFIG_NFS_V4 1217 /* 1218 * NFSv4.0 callback thread helper 1219 * 1220 * Find a client by callback identifier 1221 */ 1222 struct nfs_client * 1223 nfs4_find_client_ident(struct net *net, int cb_ident) 1224 { 1225 struct nfs_client *clp; 1226 struct nfs_net *nn = net_generic(net, nfs_net_id); 1227 1228 spin_lock(&nn->nfs_client_lock); 1229 clp = idr_find(&nn->cb_ident_idr, cb_ident); 1230 if (clp) 1231 atomic_inc(&clp->cl_count); 1232 spin_unlock(&nn->nfs_client_lock); 1233 return clp; 1234 } 1235 1236 #if defined(CONFIG_NFS_V4_1) 1237 /* 1238 * NFSv4.1 callback thread helper 1239 * For CB_COMPOUND calls, find a client by IP address, protocol version, 1240 * minorversion, and sessionID 1241 * 1242 * Returns NULL if no such client 1243 */ 1244 struct nfs_client * 1245 nfs4_find_client_sessionid(struct net *net, const struct sockaddr *addr, 1246 struct nfs4_sessionid *sid) 1247 { 1248 struct nfs_client *clp; 1249 struct nfs_net *nn = net_generic(net, nfs_net_id); 1250 1251 spin_lock(&nn->nfs_client_lock); 1252 list_for_each_entry(clp, &nn->nfs_client_list, cl_share_link) { 1253 if (nfs4_cb_match_client(addr, clp, 1) == false) 1254 continue; 1255 1256 if (!nfs4_has_session(clp)) 1257 continue; 1258 1259 /* Match sessionid*/ 1260 if (memcmp(clp->cl_session->sess_id.data, 1261 sid->data, NFS4_MAX_SESSIONID_LEN) != 0) 1262 continue; 1263 1264 atomic_inc(&clp->cl_count); 1265 spin_unlock(&nn->nfs_client_lock); 1266 return clp; 1267 } 1268 spin_unlock(&nn->nfs_client_lock); 1269 return NULL; 1270 } 1271 1272 #else /* CONFIG_NFS_V4_1 */ 1273 1274 struct nfs_client * 1275 nfs4_find_client_sessionid(struct net *net, const struct sockaddr *addr, 1276 struct nfs4_sessionid *sid) 1277 { 1278 return NULL; 1279 } 1280 #endif /* CONFIG_NFS_V4_1 */ 1281 1282 /* 1283 * Initialize the NFS4 callback service 1284 */ 1285 static int nfs4_init_callback(struct nfs_client *clp) 1286 { 1287 int error; 1288 1289 if (clp->rpc_ops->version == 4) { 1290 struct rpc_xprt *xprt; 1291 1292 xprt = rcu_dereference_raw(clp->cl_rpcclient->cl_xprt); 1293 1294 if (nfs4_has_session(clp)) { 1295 error = xprt_setup_backchannel(xprt, 1296 NFS41_BC_MIN_CALLBACKS); 1297 if (error < 0) 1298 return error; 1299 } 1300 1301 error = nfs_callback_up(clp->cl_mvops->minor_version, xprt); 1302 if (error < 0) { 1303 dprintk("%s: failed to start callback. Error = %d\n", 1304 __func__, error); 1305 return error; 1306 } 1307 __set_bit(NFS_CS_CALLBACK, &clp->cl_res_state); 1308 } 1309 return 0; 1310 } 1311 1312 /* 1313 * Initialize the minor version specific parts of an NFS4 client record 1314 */ 1315 static int nfs4_init_client_minor_version(struct nfs_client *clp) 1316 { 1317 #if defined(CONFIG_NFS_V4_1) 1318 if (clp->cl_mvops->minor_version) { 1319 struct nfs4_session *session = NULL; 1320 /* 1321 * Create the session and mark it expired. 1322 * When a SEQUENCE operation encounters the expired session 1323 * it will do session recovery to initialize it. 1324 */ 1325 session = nfs4_alloc_session(clp); 1326 if (!session) 1327 return -ENOMEM; 1328 1329 clp->cl_session = session; 1330 /* 1331 * The create session reply races with the server back 1332 * channel probe. Mark the client NFS_CS_SESSION_INITING 1333 * so that the client back channel can find the 1334 * nfs_client struct 1335 */ 1336 clp->cl_cons_state = NFS_CS_SESSION_INITING; 1337 } 1338 #endif /* CONFIG_NFS_V4_1 */ 1339 1340 return nfs4_init_callback(clp); 1341 } 1342 1343 /* 1344 * Initialise an NFS4 client record 1345 */ 1346 int nfs4_init_client(struct nfs_client *clp, 1347 const struct rpc_timeout *timeparms, 1348 const char *ip_addr, 1349 rpc_authflavor_t authflavour, 1350 int noresvport) 1351 { 1352 char buf[INET6_ADDRSTRLEN + 1]; 1353 int error; 1354 1355 if (clp->cl_cons_state == NFS_CS_READY) { 1356 /* the client is initialised already */ 1357 dprintk("<-- nfs4_init_client() = 0 [already %p]\n", clp); 1358 return 0; 1359 } 1360 1361 /* Check NFS protocol revision and initialize RPC op vector */ 1362 clp->rpc_ops = &nfs_v4_clientops; 1363 1364 error = nfs_create_rpc_client(clp, timeparms, authflavour, 1365 1, noresvport); 1366 if (error < 0) 1367 goto error; 1368 1369 /* If no clientaddr= option was specified, find a usable cb address */ 1370 if (ip_addr == NULL) { 1371 struct sockaddr_storage cb_addr; 1372 struct sockaddr *sap = (struct sockaddr *)&cb_addr; 1373 1374 error = rpc_localaddr(clp->cl_rpcclient, sap, sizeof(cb_addr)); 1375 if (error < 0) 1376 goto error; 1377 error = rpc_ntop(sap, buf, sizeof(buf)); 1378 if (error < 0) 1379 goto error; 1380 ip_addr = (const char *)buf; 1381 } 1382 strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr)); 1383 1384 error = nfs_idmap_new(clp); 1385 if (error < 0) { 1386 dprintk("%s: failed to create idmapper. Error = %d\n", 1387 __func__, error); 1388 goto error; 1389 } 1390 __set_bit(NFS_CS_IDMAP, &clp->cl_res_state); 1391 1392 error = nfs4_init_client_minor_version(clp); 1393 if (error < 0) 1394 goto error; 1395 1396 if (!nfs4_has_session(clp)) 1397 nfs_mark_client_ready(clp, NFS_CS_READY); 1398 return 0; 1399 1400 error: 1401 nfs_mark_client_ready(clp, error); 1402 dprintk("<-- nfs4_init_client() = xerror %d\n", error); 1403 return error; 1404 } 1405 1406 /* 1407 * Set up an NFS4 client 1408 */ 1409 static int nfs4_set_client(struct nfs_server *server, 1410 const char *hostname, 1411 const struct sockaddr *addr, 1412 const size_t addrlen, 1413 const char *ip_addr, 1414 rpc_authflavor_t authflavour, 1415 int proto, const struct rpc_timeout *timeparms, 1416 u32 minorversion, struct net *net) 1417 { 1418 struct nfs_client_initdata cl_init = { 1419 .hostname = hostname, 1420 .addr = addr, 1421 .addrlen = addrlen, 1422 .rpc_ops = &nfs_v4_clientops, 1423 .proto = proto, 1424 .minorversion = minorversion, 1425 .net = net, 1426 }; 1427 struct nfs_client *clp; 1428 int error; 1429 1430 dprintk("--> nfs4_set_client()\n"); 1431 1432 /* Allocate or find a client reference we can use */ 1433 clp = nfs_get_client(&cl_init, timeparms, ip_addr, authflavour, 1434 server->flags & NFS_MOUNT_NORESVPORT); 1435 if (IS_ERR(clp)) { 1436 error = PTR_ERR(clp); 1437 goto error; 1438 } 1439 1440 /* 1441 * Query for the lease time on clientid setup or renewal 1442 * 1443 * Note that this will be set on nfs_clients that were created 1444 * only for the DS role and did not set this bit, but now will 1445 * serve a dual role. 1446 */ 1447 set_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state); 1448 1449 server->nfs_client = clp; 1450 dprintk("<-- nfs4_set_client() = 0 [new %p]\n", clp); 1451 return 0; 1452 error: 1453 dprintk("<-- nfs4_set_client() = xerror %d\n", error); 1454 return error; 1455 } 1456 1457 /* 1458 * Set up a pNFS Data Server client. 1459 * 1460 * Return any existing nfs_client that matches server address,port,version 1461 * and minorversion. 1462 * 1463 * For a new nfs_client, use a soft mount (default), a low retrans and a 1464 * low timeout interval so that if a connection is lost, we retry through 1465 * the MDS. 1466 */ 1467 struct nfs_client *nfs4_set_ds_client(struct nfs_client* mds_clp, 1468 const struct sockaddr *ds_addr, 1469 int ds_addrlen, int ds_proto) 1470 { 1471 struct nfs_client_initdata cl_init = { 1472 .addr = ds_addr, 1473 .addrlen = ds_addrlen, 1474 .rpc_ops = &nfs_v4_clientops, 1475 .proto = ds_proto, 1476 .minorversion = mds_clp->cl_minorversion, 1477 .net = mds_clp->net, 1478 }; 1479 struct rpc_timeout ds_timeout = { 1480 .to_initval = 15 * HZ, 1481 .to_maxval = 15 * HZ, 1482 .to_retries = 1, 1483 .to_exponential = 1, 1484 }; 1485 struct nfs_client *clp; 1486 1487 /* 1488 * Set an authflavor equual to the MDS value. Use the MDS nfs_client 1489 * cl_ipaddr so as to use the same EXCHANGE_ID co_ownerid as the MDS 1490 * (section 13.1 RFC 5661). 1491 */ 1492 clp = nfs_get_client(&cl_init, &ds_timeout, mds_clp->cl_ipaddr, 1493 mds_clp->cl_rpcclient->cl_auth->au_flavor, 0); 1494 1495 dprintk("<-- %s %p\n", __func__, clp); 1496 return clp; 1497 } 1498 EXPORT_SYMBOL_GPL(nfs4_set_ds_client); 1499 1500 /* 1501 * Session has been established, and the client marked ready. 1502 * Set the mount rsize and wsize with negotiated fore channel 1503 * attributes which will be bound checked in nfs_server_set_fsinfo. 1504 */ 1505 static void nfs4_session_set_rwsize(struct nfs_server *server) 1506 { 1507 #ifdef CONFIG_NFS_V4_1 1508 struct nfs4_session *sess; 1509 u32 server_resp_sz; 1510 u32 server_rqst_sz; 1511 1512 if (!nfs4_has_session(server->nfs_client)) 1513 return; 1514 sess = server->nfs_client->cl_session; 1515 server_resp_sz = sess->fc_attrs.max_resp_sz - nfs41_maxread_overhead; 1516 server_rqst_sz = sess->fc_attrs.max_rqst_sz - nfs41_maxwrite_overhead; 1517 1518 if (server->rsize > server_resp_sz) 1519 server->rsize = server_resp_sz; 1520 if (server->wsize > server_rqst_sz) 1521 server->wsize = server_rqst_sz; 1522 #endif /* CONFIG_NFS_V4_1 */ 1523 } 1524 1525 static int nfs4_server_common_setup(struct nfs_server *server, 1526 struct nfs_fh *mntfh) 1527 { 1528 struct nfs_fattr *fattr; 1529 int error; 1530 1531 BUG_ON(!server->nfs_client); 1532 BUG_ON(!server->nfs_client->rpc_ops); 1533 BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops); 1534 1535 /* data servers support only a subset of NFSv4.1 */ 1536 if (is_ds_only_client(server->nfs_client)) 1537 return -EPROTONOSUPPORT; 1538 1539 fattr = nfs_alloc_fattr(); 1540 if (fattr == NULL) 1541 return -ENOMEM; 1542 1543 /* We must ensure the session is initialised first */ 1544 error = nfs4_init_session(server); 1545 if (error < 0) 1546 goto out; 1547 1548 /* Probe the root fh to retrieve its FSID and filehandle */ 1549 error = nfs4_get_rootfh(server, mntfh); 1550 if (error < 0) 1551 goto out; 1552 1553 dprintk("Server FSID: %llx:%llx\n", 1554 (unsigned long long) server->fsid.major, 1555 (unsigned long long) server->fsid.minor); 1556 dprintk("Mount FH: %d\n", mntfh->size); 1557 1558 nfs4_session_set_rwsize(server); 1559 1560 error = nfs_probe_fsinfo(server, mntfh, fattr); 1561 if (error < 0) 1562 goto out; 1563 1564 if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN) 1565 server->namelen = NFS4_MAXNAMLEN; 1566 1567 nfs_server_insert_lists(server); 1568 server->mount_time = jiffies; 1569 server->destroy = nfs4_destroy_server; 1570 out: 1571 nfs_free_fattr(fattr); 1572 return error; 1573 } 1574 1575 /* 1576 * Create a version 4 volume record 1577 */ 1578 static int nfs4_init_server(struct nfs_server *server, 1579 const struct nfs_parsed_mount_data *data) 1580 { 1581 struct rpc_timeout timeparms; 1582 int error; 1583 1584 dprintk("--> nfs4_init_server()\n"); 1585 1586 nfs_init_timeout_values(&timeparms, data->nfs_server.protocol, 1587 data->timeo, data->retrans); 1588 1589 /* Initialise the client representation from the mount data */ 1590 server->flags = data->flags; 1591 server->caps |= NFS_CAP_ATOMIC_OPEN|NFS_CAP_CHANGE_ATTR|NFS_CAP_POSIX_LOCK; 1592 if (!(data->flags & NFS_MOUNT_NORDIRPLUS)) 1593 server->caps |= NFS_CAP_READDIRPLUS; 1594 server->options = data->options; 1595 1596 /* Get a client record */ 1597 error = nfs4_set_client(server, 1598 data->nfs_server.hostname, 1599 (const struct sockaddr *)&data->nfs_server.address, 1600 data->nfs_server.addrlen, 1601 data->client_address, 1602 data->auth_flavors[0], 1603 data->nfs_server.protocol, 1604 &timeparms, 1605 data->minorversion, 1606 data->net); 1607 if (error < 0) 1608 goto error; 1609 1610 /* 1611 * Don't use NFS uid/gid mapping if we're using AUTH_SYS or lower 1612 * authentication. 1613 */ 1614 if (nfs4_disable_idmapping && data->auth_flavors[0] == RPC_AUTH_UNIX) 1615 server->caps |= NFS_CAP_UIDGID_NOMAP; 1616 1617 if (data->rsize) 1618 server->rsize = nfs_block_size(data->rsize, NULL); 1619 if (data->wsize) 1620 server->wsize = nfs_block_size(data->wsize, NULL); 1621 1622 server->acregmin = data->acregmin * HZ; 1623 server->acregmax = data->acregmax * HZ; 1624 server->acdirmin = data->acdirmin * HZ; 1625 server->acdirmax = data->acdirmax * HZ; 1626 1627 server->port = data->nfs_server.port; 1628 1629 error = nfs_init_server_rpcclient(server, &timeparms, data->auth_flavors[0]); 1630 1631 error: 1632 /* Done */ 1633 dprintk("<-- nfs4_init_server() = %d\n", error); 1634 return error; 1635 } 1636 1637 /* 1638 * Create a version 4 volume record 1639 * - keyed on server and FSID 1640 */ 1641 struct nfs_server *nfs4_create_server(const struct nfs_parsed_mount_data *data, 1642 struct nfs_fh *mntfh) 1643 { 1644 struct nfs_server *server; 1645 int error; 1646 1647 dprintk("--> nfs4_create_server()\n"); 1648 1649 server = nfs_alloc_server(); 1650 if (!server) 1651 return ERR_PTR(-ENOMEM); 1652 1653 /* set up the general RPC client */ 1654 error = nfs4_init_server(server, data); 1655 if (error < 0) 1656 goto error; 1657 1658 error = nfs4_server_common_setup(server, mntfh); 1659 if (error < 0) 1660 goto error; 1661 1662 dprintk("<-- nfs4_create_server() = %p\n", server); 1663 return server; 1664 1665 error: 1666 nfs_free_server(server); 1667 dprintk("<-- nfs4_create_server() = error %d\n", error); 1668 return ERR_PTR(error); 1669 } 1670 1671 /* 1672 * Create an NFS4 referral server record 1673 */ 1674 struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, 1675 struct nfs_fh *mntfh) 1676 { 1677 struct nfs_client *parent_client; 1678 struct nfs_server *server, *parent_server; 1679 int error; 1680 1681 dprintk("--> nfs4_create_referral_server()\n"); 1682 1683 server = nfs_alloc_server(); 1684 if (!server) 1685 return ERR_PTR(-ENOMEM); 1686 1687 parent_server = NFS_SB(data->sb); 1688 parent_client = parent_server->nfs_client; 1689 1690 /* Initialise the client representation from the parent server */ 1691 nfs_server_copy_userdata(server, parent_server); 1692 server->caps |= NFS_CAP_ATOMIC_OPEN|NFS_CAP_CHANGE_ATTR; 1693 1694 /* Get a client representation. 1695 * Note: NFSv4 always uses TCP, */ 1696 error = nfs4_set_client(server, data->hostname, 1697 data->addr, 1698 data->addrlen, 1699 parent_client->cl_ipaddr, 1700 data->authflavor, 1701 rpc_protocol(parent_server->client), 1702 parent_server->client->cl_timeout, 1703 parent_client->cl_mvops->minor_version, 1704 parent_client->net); 1705 if (error < 0) 1706 goto error; 1707 1708 error = nfs_init_server_rpcclient(server, parent_server->client->cl_timeout, data->authflavor); 1709 if (error < 0) 1710 goto error; 1711 1712 error = nfs4_server_common_setup(server, mntfh); 1713 if (error < 0) 1714 goto error; 1715 1716 dprintk("<-- nfs_create_referral_server() = %p\n", server); 1717 return server; 1718 1719 error: 1720 nfs_free_server(server); 1721 dprintk("<-- nfs4_create_referral_server() = error %d\n", error); 1722 return ERR_PTR(error); 1723 } 1724 1725 #endif /* CONFIG_NFS_V4 */ 1726 1727 /* 1728 * Clone an NFS2, NFS3 or NFS4 server record 1729 */ 1730 struct nfs_server *nfs_clone_server(struct nfs_server *source, 1731 struct nfs_fh *fh, 1732 struct nfs_fattr *fattr, 1733 rpc_authflavor_t flavor) 1734 { 1735 struct nfs_server *server; 1736 struct nfs_fattr *fattr_fsinfo; 1737 int error; 1738 1739 dprintk("--> nfs_clone_server(,%llx:%llx,)\n", 1740 (unsigned long long) fattr->fsid.major, 1741 (unsigned long long) fattr->fsid.minor); 1742 1743 server = nfs_alloc_server(); 1744 if (!server) 1745 return ERR_PTR(-ENOMEM); 1746 1747 error = -ENOMEM; 1748 fattr_fsinfo = nfs_alloc_fattr(); 1749 if (fattr_fsinfo == NULL) 1750 goto out_free_server; 1751 1752 /* Copy data from the source */ 1753 server->nfs_client = source->nfs_client; 1754 server->destroy = source->destroy; 1755 atomic_inc(&server->nfs_client->cl_count); 1756 nfs_server_copy_userdata(server, source); 1757 1758 server->fsid = fattr->fsid; 1759 1760 error = nfs_init_server_rpcclient(server, 1761 source->client->cl_timeout, 1762 flavor); 1763 if (error < 0) 1764 goto out_free_server; 1765 if (!IS_ERR(source->client_acl)) 1766 nfs_init_server_aclclient(server); 1767 1768 /* probe the filesystem info for this server filesystem */ 1769 error = nfs_probe_fsinfo(server, fh, fattr_fsinfo); 1770 if (error < 0) 1771 goto out_free_server; 1772 1773 if (server->namelen == 0 || server->namelen > NFS4_MAXNAMLEN) 1774 server->namelen = NFS4_MAXNAMLEN; 1775 1776 dprintk("Cloned FSID: %llx:%llx\n", 1777 (unsigned long long) server->fsid.major, 1778 (unsigned long long) server->fsid.minor); 1779 1780 error = nfs_start_lockd(server); 1781 if (error < 0) 1782 goto out_free_server; 1783 1784 nfs_server_insert_lists(server); 1785 server->mount_time = jiffies; 1786 1787 nfs_free_fattr(fattr_fsinfo); 1788 dprintk("<-- nfs_clone_server() = %p\n", server); 1789 return server; 1790 1791 out_free_server: 1792 nfs_free_fattr(fattr_fsinfo); 1793 nfs_free_server(server); 1794 dprintk("<-- nfs_clone_server() = error %d\n", error); 1795 return ERR_PTR(error); 1796 } 1797 1798 void nfs_clients_init(struct net *net) 1799 { 1800 struct nfs_net *nn = net_generic(net, nfs_net_id); 1801 1802 INIT_LIST_HEAD(&nn->nfs_client_list); 1803 INIT_LIST_HEAD(&nn->nfs_volume_list); 1804 #ifdef CONFIG_NFS_V4 1805 idr_init(&nn->cb_ident_idr); 1806 #endif 1807 spin_lock_init(&nn->nfs_client_lock); 1808 } 1809 1810 #ifdef CONFIG_PROC_FS 1811 static struct proc_dir_entry *proc_fs_nfs; 1812 1813 static int nfs_server_list_open(struct inode *inode, struct file *file); 1814 static void *nfs_server_list_start(struct seq_file *p, loff_t *pos); 1815 static void *nfs_server_list_next(struct seq_file *p, void *v, loff_t *pos); 1816 static void nfs_server_list_stop(struct seq_file *p, void *v); 1817 static int nfs_server_list_show(struct seq_file *m, void *v); 1818 1819 static const struct seq_operations nfs_server_list_ops = { 1820 .start = nfs_server_list_start, 1821 .next = nfs_server_list_next, 1822 .stop = nfs_server_list_stop, 1823 .show = nfs_server_list_show, 1824 }; 1825 1826 static const struct file_operations nfs_server_list_fops = { 1827 .open = nfs_server_list_open, 1828 .read = seq_read, 1829 .llseek = seq_lseek, 1830 .release = seq_release, 1831 .owner = THIS_MODULE, 1832 }; 1833 1834 static int nfs_volume_list_open(struct inode *inode, struct file *file); 1835 static void *nfs_volume_list_start(struct seq_file *p, loff_t *pos); 1836 static void *nfs_volume_list_next(struct seq_file *p, void *v, loff_t *pos); 1837 static void nfs_volume_list_stop(struct seq_file *p, void *v); 1838 static int nfs_volume_list_show(struct seq_file *m, void *v); 1839 1840 static const struct seq_operations nfs_volume_list_ops = { 1841 .start = nfs_volume_list_start, 1842 .next = nfs_volume_list_next, 1843 .stop = nfs_volume_list_stop, 1844 .show = nfs_volume_list_show, 1845 }; 1846 1847 static const struct file_operations nfs_volume_list_fops = { 1848 .open = nfs_volume_list_open, 1849 .read = seq_read, 1850 .llseek = seq_lseek, 1851 .release = seq_release, 1852 .owner = THIS_MODULE, 1853 }; 1854 1855 /* 1856 * open "/proc/fs/nfsfs/servers" which provides a summary of servers with which 1857 * we're dealing 1858 */ 1859 static int nfs_server_list_open(struct inode *inode, struct file *file) 1860 { 1861 struct seq_file *m; 1862 int ret; 1863 struct pid_namespace *pid_ns = file->f_dentry->d_sb->s_fs_info; 1864 struct net *net = pid_ns->child_reaper->nsproxy->net_ns; 1865 1866 ret = seq_open(file, &nfs_server_list_ops); 1867 if (ret < 0) 1868 return ret; 1869 1870 m = file->private_data; 1871 m->private = net; 1872 1873 return 0; 1874 } 1875 1876 /* 1877 * set up the iterator to start reading from the server list and return the first item 1878 */ 1879 static void *nfs_server_list_start(struct seq_file *m, loff_t *_pos) 1880 { 1881 struct nfs_net *nn = net_generic(m->private, nfs_net_id); 1882 1883 /* lock the list against modification */ 1884 spin_lock(&nn->nfs_client_lock); 1885 return seq_list_start_head(&nn->nfs_client_list, *_pos); 1886 } 1887 1888 /* 1889 * move to next server 1890 */ 1891 static void *nfs_server_list_next(struct seq_file *p, void *v, loff_t *pos) 1892 { 1893 struct nfs_net *nn = net_generic(p->private, nfs_net_id); 1894 1895 return seq_list_next(v, &nn->nfs_client_list, pos); 1896 } 1897 1898 /* 1899 * clean up after reading from the transports list 1900 */ 1901 static void nfs_server_list_stop(struct seq_file *p, void *v) 1902 { 1903 struct nfs_net *nn = net_generic(p->private, nfs_net_id); 1904 1905 spin_unlock(&nn->nfs_client_lock); 1906 } 1907 1908 /* 1909 * display a header line followed by a load of call lines 1910 */ 1911 static int nfs_server_list_show(struct seq_file *m, void *v) 1912 { 1913 struct nfs_client *clp; 1914 struct nfs_net *nn = net_generic(m->private, nfs_net_id); 1915 1916 /* display header on line 1 */ 1917 if (v == &nn->nfs_client_list) { 1918 seq_puts(m, "NV SERVER PORT USE HOSTNAME\n"); 1919 return 0; 1920 } 1921 1922 /* display one transport per line on subsequent lines */ 1923 clp = list_entry(v, struct nfs_client, cl_share_link); 1924 1925 /* Check if the client is initialized */ 1926 if (clp->cl_cons_state != NFS_CS_READY) 1927 return 0; 1928 1929 rcu_read_lock(); 1930 seq_printf(m, "v%u %s %s %3d %s\n", 1931 clp->rpc_ops->version, 1932 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_ADDR), 1933 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_PORT), 1934 atomic_read(&clp->cl_count), 1935 clp->cl_hostname); 1936 rcu_read_unlock(); 1937 1938 return 0; 1939 } 1940 1941 /* 1942 * open "/proc/fs/nfsfs/volumes" which provides a summary of extant volumes 1943 */ 1944 static int nfs_volume_list_open(struct inode *inode, struct file *file) 1945 { 1946 struct seq_file *m; 1947 int ret; 1948 struct pid_namespace *pid_ns = file->f_dentry->d_sb->s_fs_info; 1949 struct net *net = pid_ns->child_reaper->nsproxy->net_ns; 1950 1951 ret = seq_open(file, &nfs_volume_list_ops); 1952 if (ret < 0) 1953 return ret; 1954 1955 m = file->private_data; 1956 m->private = net; 1957 1958 return 0; 1959 } 1960 1961 /* 1962 * set up the iterator to start reading from the volume list and return the first item 1963 */ 1964 static void *nfs_volume_list_start(struct seq_file *m, loff_t *_pos) 1965 { 1966 struct nfs_net *nn = net_generic(m->private, nfs_net_id); 1967 1968 /* lock the list against modification */ 1969 spin_lock(&nn->nfs_client_lock); 1970 return seq_list_start_head(&nn->nfs_volume_list, *_pos); 1971 } 1972 1973 /* 1974 * move to next volume 1975 */ 1976 static void *nfs_volume_list_next(struct seq_file *p, void *v, loff_t *pos) 1977 { 1978 struct nfs_net *nn = net_generic(p->private, nfs_net_id); 1979 1980 return seq_list_next(v, &nn->nfs_volume_list, pos); 1981 } 1982 1983 /* 1984 * clean up after reading from the transports list 1985 */ 1986 static void nfs_volume_list_stop(struct seq_file *p, void *v) 1987 { 1988 struct nfs_net *nn = net_generic(p->private, nfs_net_id); 1989 1990 spin_unlock(&nn->nfs_client_lock); 1991 } 1992 1993 /* 1994 * display a header line followed by a load of call lines 1995 */ 1996 static int nfs_volume_list_show(struct seq_file *m, void *v) 1997 { 1998 struct nfs_server *server; 1999 struct nfs_client *clp; 2000 char dev[8], fsid[17]; 2001 struct nfs_net *nn = net_generic(m->private, nfs_net_id); 2002 2003 /* display header on line 1 */ 2004 if (v == &nn->nfs_volume_list) { 2005 seq_puts(m, "NV SERVER PORT DEV FSID FSC\n"); 2006 return 0; 2007 } 2008 /* display one transport per line on subsequent lines */ 2009 server = list_entry(v, struct nfs_server, master_link); 2010 clp = server->nfs_client; 2011 2012 snprintf(dev, 8, "%u:%u", 2013 MAJOR(server->s_dev), MINOR(server->s_dev)); 2014 2015 snprintf(fsid, 17, "%llx:%llx", 2016 (unsigned long long) server->fsid.major, 2017 (unsigned long long) server->fsid.minor); 2018 2019 rcu_read_lock(); 2020 seq_printf(m, "v%u %s %s %-7s %-17s %s\n", 2021 clp->rpc_ops->version, 2022 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_ADDR), 2023 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_PORT), 2024 dev, 2025 fsid, 2026 nfs_server_fscache_state(server)); 2027 rcu_read_unlock(); 2028 2029 return 0; 2030 } 2031 2032 /* 2033 * initialise the /proc/fs/nfsfs/ directory 2034 */ 2035 int __init nfs_fs_proc_init(void) 2036 { 2037 struct proc_dir_entry *p; 2038 2039 proc_fs_nfs = proc_mkdir("fs/nfsfs", NULL); 2040 if (!proc_fs_nfs) 2041 goto error_0; 2042 2043 /* a file of servers with which we're dealing */ 2044 p = proc_create("servers", S_IFREG|S_IRUGO, 2045 proc_fs_nfs, &nfs_server_list_fops); 2046 if (!p) 2047 goto error_1; 2048 2049 /* a file of volumes that we have mounted */ 2050 p = proc_create("volumes", S_IFREG|S_IRUGO, 2051 proc_fs_nfs, &nfs_volume_list_fops); 2052 if (!p) 2053 goto error_2; 2054 return 0; 2055 2056 error_2: 2057 remove_proc_entry("servers", proc_fs_nfs); 2058 error_1: 2059 remove_proc_entry("fs/nfsfs", NULL); 2060 error_0: 2061 return -ENOMEM; 2062 } 2063 2064 /* 2065 * clean up the /proc/fs/nfsfs/ directory 2066 */ 2067 void nfs_fs_proc_exit(void) 2068 { 2069 remove_proc_entry("volumes", proc_fs_nfs); 2070 remove_proc_entry("servers", proc_fs_nfs); 2071 remove_proc_entry("fs/nfsfs", NULL); 2072 } 2073 2074 #endif /* CONFIG_PROC_FS */ 2075 2076 module_param(nfs4_disable_idmapping, bool, 0644); 2077 MODULE_PARM_DESC(nfs4_disable_idmapping, 2078 "Turn off NFSv4 idmapping when using 'sec=sys'"); 2079