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