diff options
-rw-r--r-- | crypto/af_alg.c | 35 | ||||
-rw-r--r-- | include/crypto/if_alg.h | 8 |
2 files changed, 8 insertions, 35 deletions
diff --git a/crypto/af_alg.c b/crypto/af_alg.c index 1971f3ccb09a..eeb2fb239934 100644 --- a/crypto/af_alg.c +++ b/crypto/af_alg.c @@ -125,23 +125,6 @@ int af_alg_release(struct socket *sock) } EXPORT_SYMBOL_GPL(af_alg_release); -void af_alg_release_parent(struct sock *sk) -{ - struct alg_sock *ask = alg_sk(sk); - bool last; - - sk = ask->parent; - ask = alg_sk(sk); - - lock_sock(sk); - last = !--ask->refcnt; - release_sock(sk); - - if (last) - sock_put(sk); -} -EXPORT_SYMBOL_GPL(af_alg_release_parent); - static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) { struct sock *sk = sock->sk; @@ -149,7 +132,6 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) struct sockaddr_alg *sa = (void *)uaddr; const struct af_alg_type *type; void *private; - int err; if (sock->state == SS_CONNECTED) return -EINVAL; @@ -175,22 +157,16 @@ static int alg_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) return PTR_ERR(private); } - err = -EBUSY; lock_sock(sk); - if (ask->refcnt) - goto unlock; swap(ask->type, type); swap(ask->private, private); - err = 0; - -unlock: release_sock(sk); alg_do_release(type, private); - return err; + return 0; } static int alg_setkey(struct sock *sk, char __user *ukey, @@ -223,15 +199,11 @@ static int alg_setsockopt(struct socket *sock, int level, int optname, struct sock *sk = sock->sk; struct alg_sock *ask = alg_sk(sk); const struct af_alg_type *type; - int err = -EBUSY; + int err = -ENOPROTOOPT; lock_sock(sk); - if (ask->refcnt) - goto unlock; - type = ask->type; - err = -ENOPROTOOPT; if (level != SOL_ALG || !type) goto unlock; @@ -280,8 +252,7 @@ int af_alg_accept(struct sock *sk, struct socket *newsock) sk2->sk_family = PF_ALG; - if (!ask->refcnt++) - sock_hold(sk); + sock_hold(sk); alg_sk(sk2)->parent = sk; alg_sk(sk2)->type = type; diff --git a/include/crypto/if_alg.h b/include/crypto/if_alg.h index 2f38daaab3d7..d61c11170213 100644 --- a/include/crypto/if_alg.h +++ b/include/crypto/if_alg.h @@ -30,8 +30,6 @@ struct alg_sock { struct sock *parent; - unsigned int refcnt; - const struct af_alg_type *type; void *private; }; @@ -66,7 +64,6 @@ int af_alg_register_type(const struct af_alg_type *type); int af_alg_unregister_type(const struct af_alg_type *type); int af_alg_release(struct socket *sock); -void af_alg_release_parent(struct sock *sk); int af_alg_accept(struct sock *sk, struct socket *newsock); int af_alg_make_sg(struct af_alg_sgl *sgl, void __user *addr, int len, @@ -83,6 +80,11 @@ static inline struct alg_sock *alg_sk(struct sock *sk) return (struct alg_sock *)sk; } +static inline void af_alg_release_parent(struct sock *sk) +{ + sock_put(alg_sk(sk)->parent); +} + static inline void af_alg_init_completion(struct af_alg_completion *completion) { init_completion(&completion->completion); |