diff options
Diffstat (limited to 'fs/nfs/dns_resolve.c')
| -rw-r--r-- | fs/nfs/dns_resolve.c | 67 |
1 files changed, 28 insertions, 39 deletions
diff --git a/fs/nfs/dns_resolve.c b/fs/nfs/dns_resolve.c index ca4b11ec87a2..945527092295 100644 --- a/fs/nfs/dns_resolve.c +++ b/fs/nfs/dns_resolve.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 12 | #include <linux/sunrpc/clnt.h> | 12 | #include <linux/sunrpc/clnt.h> |
| 13 | #include <linux/sunrpc/addr.h> | ||
| 13 | #include <linux/dns_resolver.h> | 14 | #include <linux/dns_resolver.h> |
| 14 | #include "dns_resolve.h" | 15 | #include "dns_resolve.h" |
| 15 | 16 | ||
| @@ -42,6 +43,7 @@ EXPORT_SYMBOL_GPL(nfs_dns_resolve_name); | |||
| 42 | #include <linux/seq_file.h> | 43 | #include <linux/seq_file.h> |
| 43 | #include <linux/inet.h> | 44 | #include <linux/inet.h> |
| 44 | #include <linux/sunrpc/clnt.h> | 45 | #include <linux/sunrpc/clnt.h> |
| 46 | #include <linux/sunrpc/addr.h> | ||
| 45 | #include <linux/sunrpc/cache.h> | 47 | #include <linux/sunrpc/cache.h> |
| 46 | #include <linux/sunrpc/svcauth.h> | 48 | #include <linux/sunrpc/svcauth.h> |
| 47 | #include <linux/sunrpc/rpc_pipe_fs.h> | 49 | #include <linux/sunrpc/rpc_pipe_fs.h> |
| @@ -142,7 +144,7 @@ static int nfs_dns_upcall(struct cache_detail *cd, | |||
| 142 | 144 | ||
| 143 | ret = nfs_cache_upcall(cd, key->hostname); | 145 | ret = nfs_cache_upcall(cd, key->hostname); |
| 144 | if (ret) | 146 | if (ret) |
| 145 | ret = sunrpc_cache_pipe_upcall(cd, ch, nfs_dns_request); | 147 | ret = sunrpc_cache_pipe_upcall(cd, ch); |
| 146 | return ret; | 148 | return ret; |
| 147 | } | 149 | } |
| 148 | 150 | ||
| @@ -351,60 +353,47 @@ ssize_t nfs_dns_resolve_name(struct net *net, char *name, | |||
| 351 | } | 353 | } |
| 352 | EXPORT_SYMBOL_GPL(nfs_dns_resolve_name); | 354 | EXPORT_SYMBOL_GPL(nfs_dns_resolve_name); |
| 353 | 355 | ||
| 356 | static struct cache_detail nfs_dns_resolve_template = { | ||
| 357 | .owner = THIS_MODULE, | ||
| 358 | .hash_size = NFS_DNS_HASHTBL_SIZE, | ||
| 359 | .name = "dns_resolve", | ||
| 360 | .cache_put = nfs_dns_ent_put, | ||
| 361 | .cache_upcall = nfs_dns_upcall, | ||
| 362 | .cache_request = nfs_dns_request, | ||
| 363 | .cache_parse = nfs_dns_parse, | ||
| 364 | .cache_show = nfs_dns_show, | ||
| 365 | .match = nfs_dns_match, | ||
| 366 | .init = nfs_dns_ent_init, | ||
| 367 | .update = nfs_dns_ent_update, | ||
| 368 | .alloc = nfs_dns_ent_alloc, | ||
| 369 | }; | ||
| 370 | |||
| 371 | |||
| 354 | int nfs_dns_resolver_cache_init(struct net *net) | 372 | int nfs_dns_resolver_cache_init(struct net *net) |
| 355 | { | 373 | { |
| 356 | int err = -ENOMEM; | 374 | int err; |
| 357 | struct nfs_net *nn = net_generic(net, nfs_net_id); | 375 | struct nfs_net *nn = net_generic(net, nfs_net_id); |
| 358 | struct cache_detail *cd; | ||
| 359 | struct cache_head **tbl; | ||
| 360 | 376 | ||
| 361 | cd = kzalloc(sizeof(struct cache_detail), GFP_KERNEL); | 377 | nn->nfs_dns_resolve = cache_create_net(&nfs_dns_resolve_template, net); |
| 362 | if (cd == NULL) | 378 | if (IS_ERR(nn->nfs_dns_resolve)) |
| 363 | goto err_cd; | 379 | return PTR_ERR(nn->nfs_dns_resolve); |
| 364 | 380 | ||
| 365 | tbl = kzalloc(NFS_DNS_HASHTBL_SIZE * sizeof(struct cache_head *), | 381 | err = nfs_cache_register_net(net, nn->nfs_dns_resolve); |
| 366 | GFP_KERNEL); | ||
| 367 | if (tbl == NULL) | ||
| 368 | goto err_tbl; | ||
| 369 | |||
| 370 | cd->owner = THIS_MODULE, | ||
| 371 | cd->hash_size = NFS_DNS_HASHTBL_SIZE, | ||
| 372 | cd->hash_table = tbl, | ||
| 373 | cd->name = "dns_resolve", | ||
| 374 | cd->cache_put = nfs_dns_ent_put, | ||
| 375 | cd->cache_upcall = nfs_dns_upcall, | ||
| 376 | cd->cache_parse = nfs_dns_parse, | ||
| 377 | cd->cache_show = nfs_dns_show, | ||
| 378 | cd->match = nfs_dns_match, | ||
| 379 | cd->init = nfs_dns_ent_init, | ||
| 380 | cd->update = nfs_dns_ent_update, | ||
| 381 | cd->alloc = nfs_dns_ent_alloc, | ||
| 382 | |||
| 383 | nfs_cache_init(cd); | ||
| 384 | err = nfs_cache_register_net(net, cd); | ||
| 385 | if (err) | 382 | if (err) |
| 386 | goto err_reg; | 383 | goto err_reg; |
| 387 | nn->nfs_dns_resolve = cd; | ||
| 388 | return 0; | 384 | return 0; |
| 389 | 385 | ||
| 390 | err_reg: | 386 | err_reg: |
| 391 | nfs_cache_destroy(cd); | 387 | cache_destroy_net(nn->nfs_dns_resolve, net); |
| 392 | kfree(cd->hash_table); | ||
| 393 | err_tbl: | ||
| 394 | kfree(cd); | ||
| 395 | err_cd: | ||
| 396 | return err; | 388 | return err; |
| 397 | } | 389 | } |
| 398 | 390 | ||
| 399 | void nfs_dns_resolver_cache_destroy(struct net *net) | 391 | void nfs_dns_resolver_cache_destroy(struct net *net) |
| 400 | { | 392 | { |
| 401 | struct nfs_net *nn = net_generic(net, nfs_net_id); | 393 | struct nfs_net *nn = net_generic(net, nfs_net_id); |
| 402 | struct cache_detail *cd = nn->nfs_dns_resolve; | ||
| 403 | 394 | ||
| 404 | nfs_cache_unregister_net(net, cd); | 395 | nfs_cache_unregister_net(net, nn->nfs_dns_resolve); |
| 405 | nfs_cache_destroy(cd); | 396 | cache_destroy_net(nn->nfs_dns_resolve, net); |
| 406 | kfree(cd->hash_table); | ||
| 407 | kfree(cd); | ||
| 408 | } | 397 | } |
| 409 | 398 | ||
| 410 | static int rpc_pipefs_event(struct notifier_block *nb, unsigned long event, | 399 | static int rpc_pipefs_event(struct notifier_block *nb, unsigned long event, |
