Commit 4516fc0454e7ffe2f369e80045b23c2b32155004
Committed by
J. Bruce Fields
1 parent
e9dc122166
Exists in
master
and in
7 other branches
sunrpc: add routine for comparing addresses
lockd needs these sort of routines, as does the NFSv4 callback code. Move lockd's routines into common code and rename them so that they can be used by others. Signed-off-by: Jeff Layton <jlayton@redhat.com> Acked-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Showing 6 changed files with 53 additions and 48 deletions Side-by-side Diff
fs/lockd/clntlock.c
... | ... | @@ -166,7 +166,7 @@ |
166 | 166 | */ |
167 | 167 | if (fl_blocked->fl_u.nfs_fl.owner->pid != lock->svid) |
168 | 168 | continue; |
169 | - if (!nlm_cmp_addr(nlm_addr(block->b_host), addr)) | |
169 | + if (!rpc_cmp_addr(nlm_addr(block->b_host), addr)) | |
170 | 170 | continue; |
171 | 171 | if (nfs_compare_fh(NFS_FH(fl_blocked->fl_file->f_path.dentry->d_inode) ,fh) != 0) |
172 | 172 | continue; |
fs/lockd/host.c
... | ... | @@ -111,7 +111,7 @@ |
111 | 111 | */ |
112 | 112 | chain = &nlm_hosts[nlm_hash_address(ni->sap)]; |
113 | 113 | hlist_for_each_entry(host, pos, chain, h_hash) { |
114 | - if (!nlm_cmp_addr(nlm_addr(host), ni->sap)) | |
114 | + if (!rpc_cmp_addr(nlm_addr(host), ni->sap)) | |
115 | 115 | continue; |
116 | 116 | |
117 | 117 | /* See if we have an NSM handle for this client */ |
... | ... | @@ -125,7 +125,7 @@ |
125 | 125 | if (host->h_server != ni->server) |
126 | 126 | continue; |
127 | 127 | if (ni->server && |
128 | - !nlm_cmp_addr(nlm_srcaddr(host), ni->src_sap)) | |
128 | + !rpc_cmp_addr(nlm_srcaddr(host), ni->src_sap)) | |
129 | 129 | continue; |
130 | 130 | |
131 | 131 | /* Move to head of hash chain. */ |
fs/lockd/mon.c
fs/lockd/svcsubs.c
include/linux/lockd/lockd.h
... | ... | @@ -338,49 +338,6 @@ |
338 | 338 | } |
339 | 339 | } |
340 | 340 | |
341 | -static inline int __nlm_cmp_addr4(const struct sockaddr *sap1, | |
342 | - const struct sockaddr *sap2) | |
343 | -{ | |
344 | - const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sap1; | |
345 | - const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sap2; | |
346 | - return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr; | |
347 | -} | |
348 | - | |
349 | -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | |
350 | -static inline int __nlm_cmp_addr6(const struct sockaddr *sap1, | |
351 | - const struct sockaddr *sap2) | |
352 | -{ | |
353 | - const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1; | |
354 | - const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2; | |
355 | - return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr); | |
356 | -} | |
357 | -#else /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ | |
358 | -static inline int __nlm_cmp_addr6(const struct sockaddr *sap1, | |
359 | - const struct sockaddr *sap2) | |
360 | -{ | |
361 | - return 0; | |
362 | -} | |
363 | -#endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ | |
364 | - | |
365 | -/* | |
366 | - * Compare two host addresses | |
367 | - * | |
368 | - * Return TRUE if the addresses are the same; otherwise FALSE. | |
369 | - */ | |
370 | -static inline int nlm_cmp_addr(const struct sockaddr *sap1, | |
371 | - const struct sockaddr *sap2) | |
372 | -{ | |
373 | - if (sap1->sa_family == sap2->sa_family) { | |
374 | - switch (sap1->sa_family) { | |
375 | - case AF_INET: | |
376 | - return __nlm_cmp_addr4(sap1, sap2); | |
377 | - case AF_INET6: | |
378 | - return __nlm_cmp_addr6(sap1, sap2); | |
379 | - } | |
380 | - } | |
381 | - return 0; | |
382 | -} | |
383 | - | |
384 | 341 | /* |
385 | 342 | * Compare two NLM locks. |
386 | 343 | * When the second lock is of type F_UNLCK, this acts like a wildcard. |
include/linux/sunrpc/clnt.h
... | ... | @@ -22,6 +22,7 @@ |
22 | 22 | #include <linux/sunrpc/timer.h> |
23 | 23 | #include <asm/signal.h> |
24 | 24 | #include <linux/path.h> |
25 | +#include <net/ipv6.h> | |
25 | 26 | |
26 | 27 | struct rpc_inode; |
27 | 28 | |
... | ... | @@ -187,6 +188,53 @@ |
187 | 188 | |
188 | 189 | #define IPV6_SCOPE_DELIMITER '%' |
189 | 190 | #define IPV6_SCOPE_ID_LEN sizeof("%nnnnnnnnnn") |
191 | + | |
192 | +static inline bool __rpc_cmp_addr4(const struct sockaddr *sap1, | |
193 | + const struct sockaddr *sap2) | |
194 | +{ | |
195 | + const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sap1; | |
196 | + const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sap2; | |
197 | + | |
198 | + return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr; | |
199 | +} | |
200 | + | |
201 | +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | |
202 | +static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, | |
203 | + const struct sockaddr *sap2) | |
204 | +{ | |
205 | + const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1; | |
206 | + const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2; | |
207 | + return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr); | |
208 | +} | |
209 | +#else /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ | |
210 | +static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1, | |
211 | + const struct sockaddr *sap2) | |
212 | +{ | |
213 | + return false; | |
214 | +} | |
215 | +#endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ | |
216 | + | |
217 | +/** | |
218 | + * rpc_cmp_addr - compare the address portion of two sockaddrs. | |
219 | + * @sap1: first sockaddr | |
220 | + * @sap2: second sockaddr | |
221 | + * | |
222 | + * Just compares the family and address portion. Ignores port, scope, etc. | |
223 | + * Returns true if the addrs are equal, false if they aren't. | |
224 | + */ | |
225 | +static inline bool rpc_cmp_addr(const struct sockaddr *sap1, | |
226 | + const struct sockaddr *sap2) | |
227 | +{ | |
228 | + if (sap1->sa_family == sap2->sa_family) { | |
229 | + switch (sap1->sa_family) { | |
230 | + case AF_INET: | |
231 | + return __rpc_cmp_addr4(sap1, sap2); | |
232 | + case AF_INET6: | |
233 | + return __rpc_cmp_addr6(sap1, sap2); | |
234 | + } | |
235 | + } | |
236 | + return false; | |
237 | +} | |
190 | 238 | |
191 | 239 | #endif /* __KERNEL__ */ |
192 | 240 | #endif /* _LINUX_SUNRPC_CLNT_H */ |