aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/nfs_idmap.h
diff options
context:
space:
mode:
authorStanislav Kinsbursky <skinsbursky@parallels.com>2012-01-10 07:13:19 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-01-31 18:20:27 -0500
commiteee17325f1dfbe004f1475743bab9e3d050d00f5 (patch)
treeca48905e04e88658cff7d1a745a12ac3c04cfd77 /include/linux/nfs_idmap.h
parent4929d1d33fdbe8385cdd49ccd23563e9ff247ff8 (diff)
NFS: idmap PipeFS notifier introduced
v2: 1) Added "nfs_idmap_init" and "nfs_idmap_quit" definitions for kernels built without CONFIG_NFS_V4 option set. This patch subscribes NFS clients to RPC pipefs notifications. Idmap notifier is registering on NFS module load. This notifier callback is responsible for creation/destruction of PipeFS idmap pipe dentry for NFS4 clients. Since ipdmap pipe is created in rpc client pipefs directory, we have make sure, that this directory has been created already. IOW RPC client notifier callback has been called already. To achive this, PipeFS notifier priorities has been introduced (RPC clients notifier priority is greater than NFS idmap one). But this approach gives another problem: unlink for RPC client directory will be called before NFS idmap pipe unlink on UMOUNT event and will fail, because directory is not empty. The solution, introduced in this patch, is to try to remove client directory once again after idmap pipe was unlinked. This looks like ugly hack, so probably it should be replaced in some more elegant way. Note that no locking required in notifier callback because PipeFS superblock pointer is passed as an argument from it's creation or destruction routine and thus we can be sure about it's validity. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'include/linux/nfs_idmap.h')
-rw-r--r--include/linux/nfs_idmap.h21
1 files changed, 11 insertions, 10 deletions
diff --git a/include/linux/nfs_idmap.h b/include/linux/nfs_idmap.h
index 308c18877018..3c9eeb7da646 100644
--- a/include/linux/nfs_idmap.h
+++ b/include/linux/nfs_idmap.h
@@ -69,31 +69,32 @@ struct nfs_server;
69struct nfs_fattr; 69struct nfs_fattr;
70struct nfs4_string; 70struct nfs4_string;
71 71
72#ifdef CONFIG_NFS_USE_NEW_IDMAPPER 72#ifdef CONFIG_NFS_V4
73
74int nfs_idmap_init(void); 73int nfs_idmap_init(void);
75void nfs_idmap_quit(void); 74void nfs_idmap_quit(void);
76 75#else
77static inline int nfs_idmap_new(struct nfs_client *clp) 76static inline int nfs_idmap_init(void)
78{ 77{
79 return 0; 78 return 0;
80} 79}
81 80
82static inline void nfs_idmap_delete(struct nfs_client *clp) 81static inline void nfs_idmap_quit(void)
83{ 82{}
84} 83#endif
85 84
86#else /* CONFIG_NFS_USE_NEW_IDMAPPER not set */ 85#ifdef CONFIG_NFS_USE_NEW_IDMAPPER
87 86
88static inline int nfs_idmap_init(void) 87static inline int nfs_idmap_new(struct nfs_client *clp)
89{ 88{
90 return 0; 89 return 0;
91} 90}
92 91
93static inline void nfs_idmap_quit(void) 92static inline void nfs_idmap_delete(struct nfs_client *clp)
94{ 93{
95} 94}
96 95
96#else /* CONFIG_NFS_USE_NEW_IDMAPPER not set */
97
97int nfs_idmap_new(struct nfs_client *); 98int nfs_idmap_new(struct nfs_client *);
98void nfs_idmap_delete(struct nfs_client *); 99void nfs_idmap_delete(struct nfs_client *);
99 100