diff options
Diffstat (limited to 'fs/nfs/client.c')
-rw-r--r-- | fs/nfs/client.c | 191 |
1 files changed, 103 insertions, 88 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 65afa382c5e3..9fc0d9dfc91b 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -51,25 +51,23 @@ | |||
51 | #include "internal.h" | 51 | #include "internal.h" |
52 | #include "fscache.h" | 52 | #include "fscache.h" |
53 | #include "pnfs.h" | 53 | #include "pnfs.h" |
54 | #include "nfs.h" | ||
54 | #include "netns.h" | 55 | #include "netns.h" |
55 | 56 | ||
56 | #define NFSDBG_FACILITY NFSDBG_CLIENT | 57 | #define NFSDBG_FACILITY NFSDBG_CLIENT |
57 | 58 | ||
58 | static DECLARE_WAIT_QUEUE_HEAD(nfs_client_active_wq); | 59 | static DECLARE_WAIT_QUEUE_HEAD(nfs_client_active_wq); |
60 | static DEFINE_SPINLOCK(nfs_version_lock); | ||
61 | static DEFINE_MUTEX(nfs_version_mutex); | ||
62 | static LIST_HEAD(nfs_versions); | ||
59 | 63 | ||
60 | /* | 64 | /* |
61 | * RPC cruft for NFS | 65 | * RPC cruft for NFS |
62 | */ | 66 | */ |
63 | static const struct rpc_version *nfs_version[5] = { | 67 | static const struct rpc_version *nfs_version[5] = { |
64 | #ifdef CONFIG_NFS_V2 | 68 | [2] = NULL, |
65 | [2] = &nfs_version2, | 69 | [3] = NULL, |
66 | #endif | 70 | [4] = NULL, |
67 | #ifdef CONFIG_NFS_V3 | ||
68 | [3] = &nfs_version3, | ||
69 | #endif | ||
70 | #ifdef CONFIG_NFS_V4 | ||
71 | [4] = &nfs_version4, | ||
72 | #endif | ||
73 | }; | 71 | }; |
74 | 72 | ||
75 | const struct rpc_program nfs_program = { | 73 | const struct rpc_program nfs_program = { |
@@ -85,21 +83,64 @@ struct rpc_stat nfs_rpcstat = { | |||
85 | .program = &nfs_program | 83 | .program = &nfs_program |
86 | }; | 84 | }; |
87 | 85 | ||
86 | static struct nfs_subversion *find_nfs_version(unsigned int version) | ||
87 | { | ||
88 | struct nfs_subversion *nfs; | ||
89 | spin_lock(&nfs_version_lock); | ||
88 | 90 | ||
89 | #ifdef CONFIG_NFS_V3_ACL | 91 | list_for_each_entry(nfs, &nfs_versions, list) { |
90 | static struct rpc_stat nfsacl_rpcstat = { &nfsacl_program }; | 92 | if (nfs->rpc_ops->version == version) { |
91 | static const struct rpc_version *nfsacl_version[] = { | 93 | spin_unlock(&nfs_version_lock); |
92 | [3] = &nfsacl_version3, | 94 | return nfs; |
93 | }; | 95 | } |
96 | }; | ||
94 | 97 | ||
95 | const struct rpc_program nfsacl_program = { | 98 | spin_unlock(&nfs_version_lock); |
96 | .name = "nfsacl", | 99 | return ERR_PTR(-EPROTONOSUPPORT);; |
97 | .number = NFS_ACL_PROGRAM, | 100 | } |
98 | .nrvers = ARRAY_SIZE(nfsacl_version), | 101 | |
99 | .version = nfsacl_version, | 102 | struct nfs_subversion *get_nfs_version(unsigned int version) |
100 | .stats = &nfsacl_rpcstat, | 103 | { |
101 | }; | 104 | struct nfs_subversion *nfs = find_nfs_version(version); |
102 | #endif /* CONFIG_NFS_V3_ACL */ | 105 | |
106 | if (IS_ERR(nfs)) { | ||
107 | mutex_lock(&nfs_version_mutex); | ||
108 | request_module("nfs%d", version); | ||
109 | nfs = find_nfs_version(version); | ||
110 | mutex_unlock(&nfs_version_mutex); | ||
111 | } | ||
112 | |||
113 | if (!IS_ERR(nfs)) | ||
114 | try_module_get(nfs->owner); | ||
115 | return nfs; | ||
116 | } | ||
117 | |||
118 | void put_nfs_version(struct nfs_subversion *nfs) | ||
119 | { | ||
120 | module_put(nfs->owner); | ||
121 | } | ||
122 | |||
123 | void register_nfs_version(struct nfs_subversion *nfs) | ||
124 | { | ||
125 | spin_lock(&nfs_version_lock); | ||
126 | |||
127 | list_add(&nfs->list, &nfs_versions); | ||
128 | nfs_version[nfs->rpc_ops->version] = nfs->rpc_vers; | ||
129 | |||
130 | spin_unlock(&nfs_version_lock); | ||
131 | } | ||
132 | EXPORT_SYMBOL_GPL(register_nfs_version); | ||
133 | |||
134 | void unregister_nfs_version(struct nfs_subversion *nfs) | ||
135 | { | ||
136 | spin_lock(&nfs_version_lock); | ||
137 | |||
138 | nfs_version[nfs->rpc_ops->version] = NULL; | ||
139 | list_del(&nfs->list); | ||
140 | |||
141 | spin_unlock(&nfs_version_lock); | ||
142 | } | ||
143 | EXPORT_SYMBOL_GPL(unregister_nfs_version); | ||
103 | 144 | ||
104 | /* | 145 | /* |
105 | * Allocate a shared client record | 146 | * Allocate a shared client record |
@@ -116,7 +157,10 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init) | |||
116 | if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) | 157 | if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) |
117 | goto error_0; | 158 | goto error_0; |
118 | 159 | ||
119 | clp->rpc_ops = cl_init->rpc_ops; | 160 | clp->cl_nfs_mod = cl_init->nfs_mod; |
161 | try_module_get(clp->cl_nfs_mod->owner); | ||
162 | |||
163 | clp->rpc_ops = clp->cl_nfs_mod->rpc_ops; | ||
120 | 164 | ||
121 | atomic_set(&clp->cl_count, 1); | 165 | atomic_set(&clp->cl_count, 1); |
122 | clp->cl_cons_state = NFS_CS_INITING; | 166 | clp->cl_cons_state = NFS_CS_INITING; |
@@ -145,12 +189,14 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init) | |||
145 | return clp; | 189 | return clp; |
146 | 190 | ||
147 | error_cleanup: | 191 | error_cleanup: |
192 | put_nfs_version(clp->cl_nfs_mod); | ||
148 | kfree(clp); | 193 | kfree(clp); |
149 | error_0: | 194 | error_0: |
150 | return ERR_PTR(err); | 195 | return ERR_PTR(err); |
151 | } | 196 | } |
197 | EXPORT_SYMBOL_GPL(nfs_alloc_client); | ||
152 | 198 | ||
153 | #ifdef CONFIG_NFS_V4 | 199 | #if IS_ENABLED(CONFIG_NFS_V4) |
154 | /* idr_remove_all is not needed as all id's are removed by nfs_put_client */ | 200 | /* idr_remove_all is not needed as all id's are removed by nfs_put_client */ |
155 | void nfs_cleanup_cb_ident_idr(struct net *net) | 201 | void nfs_cleanup_cb_ident_idr(struct net *net) |
156 | { | 202 | { |
@@ -205,11 +251,13 @@ void nfs_free_client(struct nfs_client *clp) | |||
205 | put_rpccred(clp->cl_machine_cred); | 251 | put_rpccred(clp->cl_machine_cred); |
206 | 252 | ||
207 | put_net(clp->cl_net); | 253 | put_net(clp->cl_net); |
254 | put_nfs_version(clp->cl_nfs_mod); | ||
208 | kfree(clp->cl_hostname); | 255 | kfree(clp->cl_hostname); |
209 | kfree(clp); | 256 | kfree(clp); |
210 | 257 | ||
211 | dprintk("<-- nfs_free_client()\n"); | 258 | dprintk("<-- nfs_free_client()\n"); |
212 | } | 259 | } |
260 | EXPORT_SYMBOL_GPL(nfs_free_client); | ||
213 | 261 | ||
214 | /* | 262 | /* |
215 | * Release a reference to a shared client record | 263 | * Release a reference to a shared client record |
@@ -324,6 +372,7 @@ int nfs_sockaddr_match_ipaddr(const struct sockaddr *sa1, | |||
324 | } | 372 | } |
325 | return 0; | 373 | return 0; |
326 | } | 374 | } |
375 | EXPORT_SYMBOL_GPL(nfs_sockaddr_match_ipaddr); | ||
327 | #endif /* CONFIG_NFS_V4_1 */ | 376 | #endif /* CONFIG_NFS_V4_1 */ |
328 | 377 | ||
329 | /* | 378 | /* |
@@ -362,7 +411,7 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat | |||
362 | continue; | 411 | continue; |
363 | 412 | ||
364 | /* Different NFS versions cannot share the same nfs_client */ | 413 | /* Different NFS versions cannot share the same nfs_client */ |
365 | if (clp->rpc_ops != data->rpc_ops) | 414 | if (clp->rpc_ops != data->nfs_mod->rpc_ops) |
366 | continue; | 415 | continue; |
367 | 416 | ||
368 | if (clp->cl_proto != data->proto) | 417 | if (clp->cl_proto != data->proto) |
@@ -390,6 +439,7 @@ int nfs_wait_client_init_complete(const struct nfs_client *clp) | |||
390 | return wait_event_killable(nfs_client_active_wq, | 439 | return wait_event_killable(nfs_client_active_wq, |
391 | nfs_client_init_is_complete(clp)); | 440 | nfs_client_init_is_complete(clp)); |
392 | } | 441 | } |
442 | EXPORT_SYMBOL_GPL(nfs_wait_client_init_complete); | ||
393 | 443 | ||
394 | /* | 444 | /* |
395 | * Found an existing client. Make sure it's ready before returning. | 445 | * Found an existing client. Make sure it's ready before returning. |
@@ -431,9 +481,10 @@ nfs_get_client(const struct nfs_client_initdata *cl_init, | |||
431 | { | 481 | { |
432 | struct nfs_client *clp, *new = NULL; | 482 | struct nfs_client *clp, *new = NULL; |
433 | struct nfs_net *nn = net_generic(cl_init->net, nfs_net_id); | 483 | struct nfs_net *nn = net_generic(cl_init->net, nfs_net_id); |
484 | const struct nfs_rpc_ops *rpc_ops = cl_init->nfs_mod->rpc_ops; | ||
434 | 485 | ||
435 | dprintk("--> nfs_get_client(%s,v%u)\n", | 486 | dprintk("--> nfs_get_client(%s,v%u)\n", |
436 | cl_init->hostname ?: "", cl_init->rpc_ops->version); | 487 | cl_init->hostname ?: "", rpc_ops->version); |
437 | 488 | ||
438 | /* see if the client already exists */ | 489 | /* see if the client already exists */ |
439 | do { | 490 | do { |
@@ -450,20 +501,20 @@ nfs_get_client(const struct nfs_client_initdata *cl_init, | |||
450 | list_add(&new->cl_share_link, &nn->nfs_client_list); | 501 | list_add(&new->cl_share_link, &nn->nfs_client_list); |
451 | spin_unlock(&nn->nfs_client_lock); | 502 | spin_unlock(&nn->nfs_client_lock); |
452 | new->cl_flags = cl_init->init_flags; | 503 | new->cl_flags = cl_init->init_flags; |
453 | return cl_init->rpc_ops->init_client(new, | 504 | return rpc_ops->init_client(new, timeparms, ip_addr, |
454 | timeparms, ip_addr, | 505 | authflavour); |
455 | authflavour); | ||
456 | } | 506 | } |
457 | 507 | ||
458 | spin_unlock(&nn->nfs_client_lock); | 508 | spin_unlock(&nn->nfs_client_lock); |
459 | 509 | ||
460 | new = cl_init->rpc_ops->alloc_client(cl_init); | 510 | new = rpc_ops->alloc_client(cl_init); |
461 | } while (!IS_ERR(new)); | 511 | } while (!IS_ERR(new)); |
462 | 512 | ||
463 | dprintk("<-- nfs_get_client() Failed to find %s (%ld)\n", | 513 | dprintk("<-- nfs_get_client() Failed to find %s (%ld)\n", |
464 | cl_init->hostname ?: "", PTR_ERR(new)); | 514 | cl_init->hostname ?: "", PTR_ERR(new)); |
465 | return new; | 515 | return new; |
466 | } | 516 | } |
517 | EXPORT_SYMBOL_GPL(nfs_get_client); | ||
467 | 518 | ||
468 | /* | 519 | /* |
469 | * Mark a server as ready or failed | 520 | * Mark a server as ready or failed |
@@ -474,6 +525,7 @@ void nfs_mark_client_ready(struct nfs_client *clp, int state) | |||
474 | clp->cl_cons_state = state; | 525 | clp->cl_cons_state = state; |
475 | wake_up_all(&nfs_client_active_wq); | 526 | wake_up_all(&nfs_client_active_wq); |
476 | } | 527 | } |
528 | EXPORT_SYMBOL_GPL(nfs_mark_client_ready); | ||
477 | 529 | ||
478 | /* | 530 | /* |
479 | * Initialise the timeout values for a connection | 531 | * Initialise the timeout values for a connection |
@@ -515,6 +567,7 @@ void nfs_init_timeout_values(struct rpc_timeout *to, int proto, | |||
515 | BUG(); | 567 | BUG(); |
516 | } | 568 | } |
517 | } | 569 | } |
570 | EXPORT_SYMBOL_GPL(nfs_init_timeout_values); | ||
518 | 571 | ||
519 | /* | 572 | /* |
520 | * Create an RPC client handle | 573 | * Create an RPC client handle |
@@ -554,6 +607,7 @@ int nfs_create_rpc_client(struct nfs_client *clp, | |||
554 | clp->cl_rpcclient = clnt; | 607 | clp->cl_rpcclient = clnt; |
555 | return 0; | 608 | return 0; |
556 | } | 609 | } |
610 | EXPORT_SYMBOL_GPL(nfs_create_rpc_client); | ||
557 | 611 | ||
558 | /* | 612 | /* |
559 | * Version 2 or 3 client destruction | 613 | * Version 2 or 3 client destruction |
@@ -606,36 +660,6 @@ static int nfs_start_lockd(struct nfs_server *server) | |||
606 | } | 660 | } |
607 | 661 | ||
608 | /* | 662 | /* |
609 | * Initialise an NFSv3 ACL client connection | ||
610 | */ | ||
611 | #ifdef CONFIG_NFS_V3_ACL | ||
612 | static void nfs_init_server_aclclient(struct nfs_server *server) | ||
613 | { | ||
614 | if (server->nfs_client->rpc_ops->version != 3) | ||
615 | goto out_noacl; | ||
616 | if (server->flags & NFS_MOUNT_NOACL) | ||
617 | goto out_noacl; | ||
618 | |||
619 | server->client_acl = rpc_bind_new_program(server->client, &nfsacl_program, 3); | ||
620 | if (IS_ERR(server->client_acl)) | ||
621 | goto out_noacl; | ||
622 | |||
623 | /* No errors! Assume that Sun nfsacls are supported */ | ||
624 | server->caps |= NFS_CAP_ACLS; | ||
625 | return; | ||
626 | |||
627 | out_noacl: | ||
628 | server->caps &= ~NFS_CAP_ACLS; | ||
629 | } | ||
630 | #else | ||
631 | static inline void nfs_init_server_aclclient(struct nfs_server *server) | ||
632 | { | ||
633 | server->flags &= ~NFS_MOUNT_NOACL; | ||
634 | server->caps &= ~NFS_CAP_ACLS; | ||
635 | } | ||
636 | #endif | ||
637 | |||
638 | /* | ||
639 | * Create a general RPC client | 663 | * Create a general RPC client |
640 | */ | 664 | */ |
641 | int nfs_init_server_rpcclient(struct nfs_server *server, | 665 | int nfs_init_server_rpcclient(struct nfs_server *server, |
@@ -670,6 +694,7 @@ int nfs_init_server_rpcclient(struct nfs_server *server, | |||
670 | 694 | ||
671 | return 0; | 695 | return 0; |
672 | } | 696 | } |
697 | EXPORT_SYMBOL_GPL(nfs_init_server_rpcclient); | ||
673 | 698 | ||
674 | /** | 699 | /** |
675 | * nfs_init_client - Initialise an NFS2 or NFS3 client | 700 | * nfs_init_client - Initialise an NFS2 or NFS3 client |
@@ -709,18 +734,20 @@ error: | |||
709 | dprintk("<-- nfs_init_client() = xerror %d\n", error); | 734 | dprintk("<-- nfs_init_client() = xerror %d\n", error); |
710 | return ERR_PTR(error); | 735 | return ERR_PTR(error); |
711 | } | 736 | } |
737 | EXPORT_SYMBOL_GPL(nfs_init_client); | ||
712 | 738 | ||
713 | /* | 739 | /* |
714 | * Create a version 2 or 3 client | 740 | * Create a version 2 or 3 client |
715 | */ | 741 | */ |
716 | static int nfs_init_server(struct nfs_server *server, | 742 | static int nfs_init_server(struct nfs_server *server, |
717 | const struct nfs_parsed_mount_data *data) | 743 | const struct nfs_parsed_mount_data *data, |
744 | struct nfs_subversion *nfs_mod) | ||
718 | { | 745 | { |
719 | struct nfs_client_initdata cl_init = { | 746 | struct nfs_client_initdata cl_init = { |
720 | .hostname = data->nfs_server.hostname, | 747 | .hostname = data->nfs_server.hostname, |
721 | .addr = (const struct sockaddr *)&data->nfs_server.address, | 748 | .addr = (const struct sockaddr *)&data->nfs_server.address, |
722 | .addrlen = data->nfs_server.addrlen, | 749 | .addrlen = data->nfs_server.addrlen, |
723 | .rpc_ops = NULL, | 750 | .nfs_mod = nfs_mod, |
724 | .proto = data->nfs_server.protocol, | 751 | .proto = data->nfs_server.protocol, |
725 | .net = data->net, | 752 | .net = data->net, |
726 | }; | 753 | }; |
@@ -730,21 +757,6 @@ static int nfs_init_server(struct nfs_server *server, | |||
730 | 757 | ||
731 | dprintk("--> nfs_init_server()\n"); | 758 | dprintk("--> nfs_init_server()\n"); |
732 | 759 | ||
733 | switch (data->version) { | ||
734 | #ifdef CONFIG_NFS_V2 | ||
735 | case 2: | ||
736 | cl_init.rpc_ops = &nfs_v2_clientops; | ||
737 | break; | ||
738 | #endif | ||
739 | #ifdef CONFIG_NFS_V3 | ||
740 | case 3: | ||
741 | cl_init.rpc_ops = &nfs_v3_clientops; | ||
742 | break; | ||
743 | #endif | ||
744 | default: | ||
745 | return -EPROTONOSUPPORT; | ||
746 | } | ||
747 | |||
748 | nfs_init_timeout_values(&timeparms, data->nfs_server.protocol, | 760 | nfs_init_timeout_values(&timeparms, data->nfs_server.protocol, |
749 | data->timeo, data->retrans); | 761 | data->timeo, data->retrans); |
750 | if (data->flags & NFS_MOUNT_NORESVPORT) | 762 | if (data->flags & NFS_MOUNT_NORESVPORT) |
@@ -798,8 +810,6 @@ static int nfs_init_server(struct nfs_server *server, | |||
798 | server->mountd_protocol = data->mount_server.protocol; | 810 | server->mountd_protocol = data->mount_server.protocol; |
799 | 811 | ||
800 | server->namelen = data->namlen; | 812 | server->namelen = data->namlen; |
801 | /* Create a client RPC handle for the NFSv3 ACL management interface */ | ||
802 | nfs_init_server_aclclient(server); | ||
803 | dprintk("<-- nfs_init_server() = 0 [new %p]\n", clp); | 813 | dprintk("<-- nfs_init_server() = 0 [new %p]\n", clp); |
804 | return 0; | 814 | return 0; |
805 | 815 | ||
@@ -911,6 +921,7 @@ out_error: | |||
911 | dprintk("nfs_probe_fsinfo: error = %d\n", -error); | 921 | dprintk("nfs_probe_fsinfo: error = %d\n", -error); |
912 | return error; | 922 | return error; |
913 | } | 923 | } |
924 | EXPORT_SYMBOL_GPL(nfs_probe_fsinfo); | ||
914 | 925 | ||
915 | /* | 926 | /* |
916 | * Copy useful information when duplicating a server record | 927 | * Copy useful information when duplicating a server record |
@@ -927,6 +938,7 @@ void nfs_server_copy_userdata(struct nfs_server *target, struct nfs_server *sour | |||
927 | target->caps = source->caps; | 938 | target->caps = source->caps; |
928 | target->options = source->options; | 939 | target->options = source->options; |
929 | } | 940 | } |
941 | EXPORT_SYMBOL_GPL(nfs_server_copy_userdata); | ||
930 | 942 | ||
931 | void nfs_server_insert_lists(struct nfs_server *server) | 943 | void nfs_server_insert_lists(struct nfs_server *server) |
932 | { | 944 | { |
@@ -940,6 +952,7 @@ void nfs_server_insert_lists(struct nfs_server *server) | |||
940 | spin_unlock(&nn->nfs_client_lock); | 952 | spin_unlock(&nn->nfs_client_lock); |
941 | 953 | ||
942 | } | 954 | } |
955 | EXPORT_SYMBOL_GPL(nfs_server_insert_lists); | ||
943 | 956 | ||
944 | static void nfs_server_remove_lists(struct nfs_server *server) | 957 | static void nfs_server_remove_lists(struct nfs_server *server) |
945 | { | 958 | { |
@@ -999,6 +1012,7 @@ struct nfs_server *nfs_alloc_server(void) | |||
999 | 1012 | ||
1000 | return server; | 1013 | return server; |
1001 | } | 1014 | } |
1015 | EXPORT_SYMBOL_GPL(nfs_alloc_server); | ||
1002 | 1016 | ||
1003 | /* | 1017 | /* |
1004 | * Free up a server record | 1018 | * Free up a server record |
@@ -1027,13 +1041,14 @@ void nfs_free_server(struct nfs_server *server) | |||
1027 | nfs_release_automount_timer(); | 1041 | nfs_release_automount_timer(); |
1028 | dprintk("<-- nfs_free_server()\n"); | 1042 | dprintk("<-- nfs_free_server()\n"); |
1029 | } | 1043 | } |
1044 | EXPORT_SYMBOL_GPL(nfs_free_server); | ||
1030 | 1045 | ||
1031 | /* | 1046 | /* |
1032 | * Create a version 2 or 3 volume record | 1047 | * Create a version 2 or 3 volume record |
1033 | * - keyed on server and FSID | 1048 | * - keyed on server and FSID |
1034 | */ | 1049 | */ |
1035 | struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, | 1050 | struct nfs_server *nfs_create_server(struct nfs_mount_info *mount_info, |
1036 | struct nfs_fh *mntfh) | 1051 | struct nfs_subversion *nfs_mod) |
1037 | { | 1052 | { |
1038 | struct nfs_server *server; | 1053 | struct nfs_server *server; |
1039 | struct nfs_fattr *fattr; | 1054 | struct nfs_fattr *fattr; |
@@ -1049,7 +1064,7 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, | |||
1049 | goto error; | 1064 | goto error; |
1050 | 1065 | ||
1051 | /* Get a client representation */ | 1066 | /* Get a client representation */ |
1052 | error = nfs_init_server(server, data); | 1067 | error = nfs_init_server(server, mount_info->parsed, nfs_mod); |
1053 | if (error < 0) | 1068 | if (error < 0) |
1054 | goto error; | 1069 | goto error; |
1055 | 1070 | ||
@@ -1058,13 +1073,13 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, | |||
1058 | BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops); | 1073 | BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops); |
1059 | 1074 | ||
1060 | /* Probe the root fh to retrieve its FSID */ | 1075 | /* Probe the root fh to retrieve its FSID */ |
1061 | error = nfs_probe_fsinfo(server, mntfh, fattr); | 1076 | error = nfs_probe_fsinfo(server, mount_info->mntfh, fattr); |
1062 | if (error < 0) | 1077 | if (error < 0) |
1063 | goto error; | 1078 | goto error; |
1064 | if (server->nfs_client->rpc_ops->version == 3) { | 1079 | if (server->nfs_client->rpc_ops->version == 3) { |
1065 | if (server->namelen == 0 || server->namelen > NFS3_MAXNAMLEN) | 1080 | if (server->namelen == 0 || server->namelen > NFS3_MAXNAMLEN) |
1066 | server->namelen = NFS3_MAXNAMLEN; | 1081 | server->namelen = NFS3_MAXNAMLEN; |
1067 | if (!(data->flags & NFS_MOUNT_NORDIRPLUS)) | 1082 | if (!(mount_info->parsed->flags & NFS_MOUNT_NORDIRPLUS)) |
1068 | server->caps |= NFS_CAP_READDIRPLUS; | 1083 | server->caps |= NFS_CAP_READDIRPLUS; |
1069 | } else { | 1084 | } else { |
1070 | if (server->namelen == 0 || server->namelen > NFS2_MAXNAMLEN) | 1085 | if (server->namelen == 0 || server->namelen > NFS2_MAXNAMLEN) |
@@ -1072,7 +1087,7 @@ struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, | |||
1072 | } | 1087 | } |
1073 | 1088 | ||
1074 | if (!(fattr->valid & NFS_ATTR_FATTR)) { | 1089 | if (!(fattr->valid & NFS_ATTR_FATTR)) { |
1075 | error = server->nfs_client->rpc_ops->getattr(server, mntfh, fattr); | 1090 | error = nfs_mod->rpc_ops->getattr(server, mount_info->mntfh, fattr); |
1076 | if (error < 0) { | 1091 | if (error < 0) { |
1077 | dprintk("nfs_create_server: getattr error = %d\n", -error); | 1092 | dprintk("nfs_create_server: getattr error = %d\n", -error); |
1078 | goto error; | 1093 | goto error; |
@@ -1094,6 +1109,7 @@ error: | |||
1094 | nfs_free_server(server); | 1109 | nfs_free_server(server); |
1095 | return ERR_PTR(error); | 1110 | return ERR_PTR(error); |
1096 | } | 1111 | } |
1112 | EXPORT_SYMBOL_GPL(nfs_create_server); | ||
1097 | 1113 | ||
1098 | /* | 1114 | /* |
1099 | * Clone an NFS2, NFS3 or NFS4 server record | 1115 | * Clone an NFS2, NFS3 or NFS4 server record |
@@ -1133,8 +1149,6 @@ struct nfs_server *nfs_clone_server(struct nfs_server *source, | |||
1133 | flavor); | 1149 | flavor); |
1134 | if (error < 0) | 1150 | if (error < 0) |
1135 | goto out_free_server; | 1151 | goto out_free_server; |
1136 | if (!IS_ERR(source->client_acl)) | ||
1137 | nfs_init_server_aclclient(server); | ||
1138 | 1152 | ||
1139 | /* probe the filesystem info for this server filesystem */ | 1153 | /* probe the filesystem info for this server filesystem */ |
1140 | error = nfs_probe_fsinfo(server, fh, fattr_fsinfo); | 1154 | error = nfs_probe_fsinfo(server, fh, fattr_fsinfo); |
@@ -1165,6 +1179,7 @@ out_free_server: | |||
1165 | dprintk("<-- nfs_clone_server() = error %d\n", error); | 1179 | dprintk("<-- nfs_clone_server() = error %d\n", error); |
1166 | return ERR_PTR(error); | 1180 | return ERR_PTR(error); |
1167 | } | 1181 | } |
1182 | EXPORT_SYMBOL_GPL(nfs_clone_server); | ||
1168 | 1183 | ||
1169 | void nfs_clients_init(struct net *net) | 1184 | void nfs_clients_init(struct net *net) |
1170 | { | 1185 | { |
@@ -1172,7 +1187,7 @@ void nfs_clients_init(struct net *net) | |||
1172 | 1187 | ||
1173 | INIT_LIST_HEAD(&nn->nfs_client_list); | 1188 | INIT_LIST_HEAD(&nn->nfs_client_list); |
1174 | INIT_LIST_HEAD(&nn->nfs_volume_list); | 1189 | INIT_LIST_HEAD(&nn->nfs_volume_list); |
1175 | #ifdef CONFIG_NFS_V4 | 1190 | #if IS_ENABLED(CONFIG_NFS_V4) |
1176 | idr_init(&nn->cb_ident_idr); | 1191 | idr_init(&nn->cb_ident_idr); |
1177 | #endif | 1192 | #endif |
1178 | spin_lock_init(&nn->nfs_client_lock); | 1193 | spin_lock_init(&nn->nfs_client_lock); |