aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/client.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-07-31 21:45:44 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-07-31 21:45:44 -0400
commit6dbb35b0a74b44b2a48a5373d48074c5aa69fdf5 (patch)
tree4afb5eec521659e19c9d2343c2431054a082eb06 /fs/nfs/client.c
parentfd37ce34bd512f2b1a503f82abf8768da556a955 (diff)
parentad0fcd4eb68059de02e1766948263c71b8a5b1dc (diff)
Merge tag 'nfs-for-3.6-2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull second wave of NFS client updates from Trond Myklebust: - Patches from Bryan to allow splitting of the NFSv2/v3/v4 code into separate modules. - Fix Oopses in the NFSv4 idmapper - Fix a deadlock whereby rpciod tries to allocate a new socket and ends up recursing into the NFS code due to memory reclaim. - Increase the number of permitted callback connections. * tag 'nfs-for-3.6-2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: nfs: explicitly reject LOCK_MAND flock() requests nfs: increase number of permitted callback connections. SUNRPC: return negative value in case rpcbind client creation error NFS: Convert v4 into a module NFS: Convert v3 into a module NFS: Convert v2 into a module NFS: Keep module parameters in the generic NFS client NFS: Split out remaining NFS v4 inode functions NFS: Pass super operations and xattr handlers in the nfs_subversion NFS: Only initialize the ACL client in the v3 case NFS: Create a try_mount rpc op NFS: Remove the NFS v4 xdev mount function NFS: Add version registering framework NFS: Fix a number of bugs in the idmapper nfs: skip commit in releasepage if we're freeing memory for fs-related reasons sunrpc: clarify comments on rpc_make_runnable pnfsblock: bail out partial page IO
Diffstat (limited to 'fs/nfs/client.c')
-rw-r--r--fs/nfs/client.c191
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
58static DECLARE_WAIT_QUEUE_HEAD(nfs_client_active_wq); 59static DECLARE_WAIT_QUEUE_HEAD(nfs_client_active_wq);
60static DEFINE_SPINLOCK(nfs_version_lock);
61static DEFINE_MUTEX(nfs_version_mutex);
62static LIST_HEAD(nfs_versions);
59 63
60/* 64/*
61 * RPC cruft for NFS 65 * RPC cruft for NFS
62 */ 66 */
63static const struct rpc_version *nfs_version[5] = { 67static 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
75const struct rpc_program nfs_program = { 73const 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
86static 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) {
90static struct rpc_stat nfsacl_rpcstat = { &nfsacl_program }; 92 if (nfs->rpc_ops->version == version) {
91static const struct rpc_version *nfsacl_version[] = { 93 spin_unlock(&nfs_version_lock);
92 [3] = &nfsacl_version3, 94 return nfs;
93}; 95 }
96 };
94 97
95const 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, 102struct 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
118void put_nfs_version(struct nfs_subversion *nfs)
119{
120 module_put(nfs->owner);
121}
122
123void 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}
132EXPORT_SYMBOL_GPL(register_nfs_version);
133
134void 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}
143EXPORT_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
147error_cleanup: 191error_cleanup:
192 put_nfs_version(clp->cl_nfs_mod);
148 kfree(clp); 193 kfree(clp);
149error_0: 194error_0:
150 return ERR_PTR(err); 195 return ERR_PTR(err);
151} 196}
197EXPORT_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 */
155void nfs_cleanup_cb_ident_idr(struct net *net) 201void 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}
260EXPORT_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}
375EXPORT_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}
442EXPORT_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}
517EXPORT_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}
528EXPORT_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}
570EXPORT_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}
610EXPORT_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
612static 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
627out_noacl:
628 server->caps &= ~NFS_CAP_ACLS;
629}
630#else
631static 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 */
641int nfs_init_server_rpcclient(struct nfs_server *server, 665int 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}
697EXPORT_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}
737EXPORT_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 */
716static int nfs_init_server(struct nfs_server *server, 742static 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}
924EXPORT_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}
941EXPORT_SYMBOL_GPL(nfs_server_copy_userdata);
930 942
931void nfs_server_insert_lists(struct nfs_server *server) 943void 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}
955EXPORT_SYMBOL_GPL(nfs_server_insert_lists);
943 956
944static void nfs_server_remove_lists(struct nfs_server *server) 957static 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}
1015EXPORT_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}
1044EXPORT_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 */
1035struct nfs_server *nfs_create_server(const struct nfs_parsed_mount_data *data, 1050struct 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}
1112EXPORT_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}
1182EXPORT_SYMBOL_GPL(nfs_clone_server);
1168 1183
1169void nfs_clients_init(struct net *net) 1184void 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);