diff options
Diffstat (limited to 'fs/nfs/dns_resolve.c')
-rw-r--r-- | fs/nfs/dns_resolve.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/fs/nfs/dns_resolve.c b/fs/nfs/dns_resolve.c index 9aea78ab86ac..200eb67c95d9 100644 --- a/fs/nfs/dns_resolve.c +++ b/fs/nfs/dns_resolve.c | |||
@@ -40,6 +40,7 @@ ssize_t nfs_dns_resolve_name(struct net *net, char *name, size_t namelen, | |||
40 | #include <linux/sunrpc/clnt.h> | 40 | #include <linux/sunrpc/clnt.h> |
41 | #include <linux/sunrpc/cache.h> | 41 | #include <linux/sunrpc/cache.h> |
42 | #include <linux/sunrpc/svcauth.h> | 42 | #include <linux/sunrpc/svcauth.h> |
43 | #include <linux/sunrpc/rpc_pipe_fs.h> | ||
43 | 44 | ||
44 | #include "dns_resolve.h" | 45 | #include "dns_resolve.h" |
45 | #include "cache_lib.h" | 46 | #include "cache_lib.h" |
@@ -400,12 +401,47 @@ void nfs_dns_resolver_cache_destroy(struct net *net) | |||
400 | kfree(cd); | 401 | kfree(cd); |
401 | } | 402 | } |
402 | 403 | ||
404 | static int rpc_pipefs_event(struct notifier_block *nb, unsigned long event, | ||
405 | void *ptr) | ||
406 | { | ||
407 | struct super_block *sb = ptr; | ||
408 | struct net *net = sb->s_fs_info; | ||
409 | struct nfs_net *nn = net_generic(net, nfs_net_id); | ||
410 | struct cache_detail *cd = nn->nfs_dns_resolve; | ||
411 | int ret = 0; | ||
412 | |||
413 | if (cd == NULL) | ||
414 | return 0; | ||
415 | |||
416 | if (!try_module_get(THIS_MODULE)) | ||
417 | return 0; | ||
418 | |||
419 | switch (event) { | ||
420 | case RPC_PIPEFS_MOUNT: | ||
421 | ret = nfs_cache_register_sb(sb, cd); | ||
422 | break; | ||
423 | case RPC_PIPEFS_UMOUNT: | ||
424 | nfs_cache_unregister_sb(sb, cd); | ||
425 | break; | ||
426 | default: | ||
427 | ret = -ENOTSUPP; | ||
428 | break; | ||
429 | } | ||
430 | module_put(THIS_MODULE); | ||
431 | return ret; | ||
432 | } | ||
433 | |||
434 | static struct notifier_block nfs_dns_resolver_block = { | ||
435 | .notifier_call = rpc_pipefs_event, | ||
436 | }; | ||
437 | |||
403 | int nfs_dns_resolver_init(void) | 438 | int nfs_dns_resolver_init(void) |
404 | { | 439 | { |
405 | return 0; | 440 | return rpc_pipefs_notifier_register(&nfs_dns_resolver_block); |
406 | } | 441 | } |
407 | 442 | ||
408 | void nfs_dns_resolver_destroy(void) | 443 | void nfs_dns_resolver_destroy(void) |
409 | { | 444 | { |
445 | rpc_pipefs_notifier_unregister(&nfs_dns_resolver_block); | ||
410 | } | 446 | } |
411 | #endif | 447 | #endif |