summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crypto/af_alg.c35
-rw-r--r--include/crypto/if_alg.h8
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);