diff options
| -rw-r--r-- | fs/nfs/idmap.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c index b5c6d8eb7e03..d4db3b6f4b8e 100644 --- a/fs/nfs/idmap.c +++ b/fs/nfs/idmap.c | |||
| @@ -553,23 +553,41 @@ static int __rpc_pipefs_event(struct nfs_client *clp, unsigned long event, | |||
| 553 | return err; | 553 | return err; |
| 554 | } | 554 | } |
| 555 | 555 | ||
| 556 | static int rpc_pipefs_event(struct notifier_block *nb, unsigned long event, | 556 | static struct nfs_client *nfs_get_client_for_event(struct net *net, int event) |
| 557 | void *ptr) | ||
| 558 | { | 557 | { |
| 559 | struct super_block *sb = ptr; | 558 | struct nfs_net *nn = net_generic(net, nfs_net_id); |
| 560 | struct nfs_net *nn = net_generic(sb->s_fs_info, nfs_net_id); | 559 | struct dentry *cl_dentry; |
| 561 | struct nfs_client *clp; | 560 | struct nfs_client *clp; |
| 562 | int error = 0; | ||
| 563 | 561 | ||
| 564 | spin_lock(&nn->nfs_client_lock); | 562 | spin_lock(&nn->nfs_client_lock); |
| 565 | list_for_each_entry(clp, &nn->nfs_client_list, cl_share_link) { | 563 | list_for_each_entry(clp, &nn->nfs_client_list, cl_share_link) { |
| 566 | if (clp->rpc_ops != &nfs_v4_clientops) | 564 | if (clp->rpc_ops != &nfs_v4_clientops) |
| 567 | continue; | 565 | continue; |
| 566 | cl_dentry = clp->cl_idmap->idmap_pipe->dentry; | ||
| 567 | if (((event == RPC_PIPEFS_MOUNT) && cl_dentry) || | ||
| 568 | ((event == RPC_PIPEFS_UMOUNT) && !cl_dentry)) | ||
| 569 | continue; | ||
| 570 | atomic_inc(&clp->cl_count); | ||
| 571 | spin_unlock(&nn->nfs_client_lock); | ||
| 572 | return clp; | ||
| 573 | } | ||
| 574 | spin_unlock(&nn->nfs_client_lock); | ||
| 575 | return NULL; | ||
| 576 | } | ||
| 577 | |||
| 578 | static int rpc_pipefs_event(struct notifier_block *nb, unsigned long event, | ||
| 579 | void *ptr) | ||
| 580 | { | ||
| 581 | struct super_block *sb = ptr; | ||
| 582 | struct nfs_client *clp; | ||
| 583 | int error = 0; | ||
| 584 | |||
| 585 | while ((clp = nfs_get_client_for_event(sb->s_fs_info, event))) { | ||
| 568 | error = __rpc_pipefs_event(clp, event, sb); | 586 | error = __rpc_pipefs_event(clp, event, sb); |
| 587 | nfs_put_client(clp); | ||
| 569 | if (error) | 588 | if (error) |
| 570 | break; | 589 | break; |
| 571 | } | 590 | } |
| 572 | spin_unlock(&nn->nfs_client_lock); | ||
| 573 | return error; | 591 | return error; |
| 574 | } | 592 | } |
| 575 | 593 | ||
