diff options
| author | Ingo Molnar <mingo@kernel.org> | 2018-12-03 13:42:17 +0300 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2018-12-03 13:42:17 +0300 | 
| commit | 5f675231e456cb599b283f8361f01cf34b0617df (patch) | |
| tree | afb2bdfd6fdbb18336146f41ba7659120a5ff9d2 /net/sunrpc/svcauth_unix.c | |
| parent | 3e184501083c38fa091f640acb13af17a21fd228 (diff) | |
| parent | 2595646791c319cadfdbf271563aac97d0843dc7 (diff) | |
| download | linux-5f675231e456cb599b283f8361f01cf34b0617df.tar.xz | |
Merge tag 'v4.20-rc5' into sched/core, to pick up fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'net/sunrpc/svcauth_unix.c')
| -rw-r--r-- | net/sunrpc/svcauth_unix.c | 24 | 
1 files changed, 16 insertions, 8 deletions
diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c index af7f28fb8102..fb9041b92f72 100644 --- a/net/sunrpc/svcauth_unix.c +++ b/net/sunrpc/svcauth_unix.c @@ -37,20 +37,26 @@ struct unix_domain {  extern struct auth_ops svcauth_null;  extern struct auth_ops svcauth_unix; -static void svcauth_unix_domain_release(struct auth_domain *dom) +static void svcauth_unix_domain_release_rcu(struct rcu_head *head)  { +	struct auth_domain *dom = container_of(head, struct auth_domain, rcu_head);  	struct unix_domain *ud = container_of(dom, struct unix_domain, h);  	kfree(dom->name);  	kfree(ud);  } +static void svcauth_unix_domain_release(struct auth_domain *dom) +{ +	call_rcu(&dom->rcu_head, svcauth_unix_domain_release_rcu); +} +  struct auth_domain *unix_domain_find(char *name)  {  	struct auth_domain *rv;  	struct unix_domain *new = NULL; -	rv = auth_domain_lookup(name, NULL); +	rv = auth_domain_find(name);  	while(1) {  		if (rv) {  			if (new && rv != &new->h) @@ -91,6 +97,7 @@ struct ip_map {  	char			m_class[8]; /* e.g. "nfsd" */  	struct in6_addr		m_addr;  	struct unix_domain	*m_client; +	struct rcu_head		m_rcu;  };  static void ip_map_put(struct kref *kref) @@ -101,7 +108,7 @@ static void ip_map_put(struct kref *kref)  	if (test_bit(CACHE_VALID, &item->flags) &&  	    !test_bit(CACHE_NEGATIVE, &item->flags))  		auth_domain_put(&im->m_client->h); -	kfree(im); +	kfree_rcu(im, m_rcu);  }  static inline int hash_ip6(const struct in6_addr *ip) @@ -280,9 +287,9 @@ static struct ip_map *__ip_map_lookup(struct cache_detail *cd, char *class,  	strcpy(ip.m_class, class);  	ip.m_addr = *addr; -	ch = sunrpc_cache_lookup(cd, &ip.h, -				 hash_str(class, IP_HASHBITS) ^ -				 hash_ip6(addr)); +	ch = sunrpc_cache_lookup_rcu(cd, &ip.h, +				     hash_str(class, IP_HASHBITS) ^ +				     hash_ip6(addr));  	if (ch)  		return container_of(ch, struct ip_map, h); @@ -412,6 +419,7 @@ struct unix_gid {  	struct cache_head	h;  	kuid_t			uid;  	struct group_info	*gi; +	struct rcu_head		rcu;  };  static int unix_gid_hash(kuid_t uid) @@ -426,7 +434,7 @@ static void unix_gid_put(struct kref *kref)  	if (test_bit(CACHE_VALID, &item->flags) &&  	    !test_bit(CACHE_NEGATIVE, &item->flags))  		put_group_info(ug->gi); -	kfree(ug); +	kfree_rcu(ug, rcu);  }  static int unix_gid_match(struct cache_head *corig, struct cache_head *cnew) @@ -619,7 +627,7 @@ static struct unix_gid *unix_gid_lookup(struct cache_detail *cd, kuid_t uid)  	struct cache_head *ch;  	ug.uid = uid; -	ch = sunrpc_cache_lookup(cd, &ug.h, unix_gid_hash(uid)); +	ch = sunrpc_cache_lookup_rcu(cd, &ug.h, unix_gid_hash(uid));  	if (ch)  		return container_of(ch, struct unix_gid, h);  	else  | 
