diff options
Diffstat (limited to 'net/sunrpc/svcauth_unix.c')
| -rw-r--r-- | net/sunrpc/svcauth_unix.c | 17 | 
1 files changed, 13 insertions, 4 deletions
| diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c index 983c5891cb56..4246363cb095 100644 --- a/net/sunrpc/svcauth_unix.c +++ b/net/sunrpc/svcauth_unix.c @@ -416,14 +416,23 @@ static int unix_gid_hash(kuid_t uid)  	return hash_long(from_kuid(&init_user_ns, uid), GID_HASHBITS);  } -static void unix_gid_put(struct kref *kref) +static void unix_gid_free(struct rcu_head *rcu)  { -	struct cache_head *item = container_of(kref, struct cache_head, ref); -	struct unix_gid *ug = container_of(item, struct unix_gid, h); +	struct unix_gid *ug = container_of(rcu, struct unix_gid, rcu); +	struct cache_head *item = &ug->h; +  	if (test_bit(CACHE_VALID, &item->flags) &&  	    !test_bit(CACHE_NEGATIVE, &item->flags))  		put_group_info(ug->gi); -	kfree_rcu(ug, rcu); +	kfree(ug); +} + +static void unix_gid_put(struct kref *kref) +{ +	struct cache_head *item = container_of(kref, struct cache_head, ref); +	struct unix_gid *ug = container_of(item, struct unix_gid, h); + +	call_rcu(&ug->rcu, unix_gid_free);  }  static int unix_gid_match(struct cache_head *corig, struct cache_head *cnew) |