}
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;
struct sockaddr_alg *sa = (void *)uaddr;
const struct af_alg_type *type;
void *private;
- int err;
if (sock->state == SS_CONNECTED)
return -EINVAL;
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,
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;
sk2->sk_family = PF_ALG;
- if (!ask->refcnt++)
- sock_hold(sk);
+ sock_hold(sk);
alg_sk(sk2)->parent = sk;
alg_sk(sk2)->type = type;
struct sock *parent;
- unsigned int refcnt;
-
const struct af_alg_type *type;
void *private;
};
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,
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);