diff options
Diffstat (limited to 'crypto/af_alg.c')
| -rw-r--r-- | crypto/af_alg.c | 44 | 
1 files changed, 23 insertions, 21 deletions
diff --git a/crypto/af_alg.c b/crypto/af_alg.c index 85cea9de324a..35d4dcea381f 100644 --- a/crypto/af_alg.c +++ b/crypto/af_alg.c @@ -664,7 +664,7 @@ void af_alg_free_areq_sgls(struct af_alg_async_req *areq)  	unsigned int i;  	list_for_each_entry_safe(rsgl, tmp, &areq->rsgl_list, list) { -		ctx->rcvused -= rsgl->sg_num_bytes; +		atomic_sub(rsgl->sg_num_bytes, &ctx->rcvused);  		af_alg_free_sg(&rsgl->sgl);  		list_del(&rsgl->list);  		if (rsgl != &areq->first_rsgl) @@ -672,14 +672,15 @@ void af_alg_free_areq_sgls(struct af_alg_async_req *areq)  	}  	tsgl = areq->tsgl; -	for_each_sg(tsgl, sg, areq->tsgl_entries, i) { -		if (!sg_page(sg)) -			continue; -		put_page(sg_page(sg)); -	} +	if (tsgl) { +		for_each_sg(tsgl, sg, areq->tsgl_entries, i) { +			if (!sg_page(sg)) +				continue; +			put_page(sg_page(sg)); +		} -	if (areq->tsgl && areq->tsgl_entries)  		sock_kfree_s(sk, tsgl, areq->tsgl_entries * sizeof(*tsgl)); +	}  }  EXPORT_SYMBOL_GPL(af_alg_free_areq_sgls); @@ -1021,6 +1022,18 @@ unlock:  EXPORT_SYMBOL_GPL(af_alg_sendpage);  /** + * af_alg_free_resources - release resources required for crypto request + */ +void af_alg_free_resources(struct af_alg_async_req *areq) +{ +	struct sock *sk = areq->sk; + +	af_alg_free_areq_sgls(areq); +	sock_kfree_s(sk, areq, areq->areqlen); +} +EXPORT_SYMBOL_GPL(af_alg_free_resources); + +/**   * af_alg_async_cb - AIO callback handler   *   * This handler cleans up the struct af_alg_async_req upon completion of the @@ -1036,18 +1049,13 @@ void af_alg_async_cb(struct crypto_async_request *_req, int err)  	struct kiocb *iocb = areq->iocb;  	unsigned int resultlen; -	lock_sock(sk); -  	/* Buffer size written by crypto operation. */  	resultlen = areq->outlen; -	af_alg_free_areq_sgls(areq); -	sock_kfree_s(sk, areq, areq->areqlen); -	__sock_put(sk); +	af_alg_free_resources(areq); +	sock_put(sk);  	iocb->ki_complete(iocb, err ? err : resultlen, 0); - -	release_sock(sk);  }  EXPORT_SYMBOL_GPL(af_alg_async_cb); @@ -1130,12 +1138,6 @@ int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags,  		if (!af_alg_readable(sk))  			break; -		if (!ctx->used) { -			err = af_alg_wait_for_data(sk, flags); -			if (err) -				return err; -		} -  		seglen = min_t(size_t, (maxsize - len),  			       msg_data_left(msg)); @@ -1161,7 +1163,7 @@ int af_alg_get_rsgl(struct sock *sk, struct msghdr *msg, int flags,  		areq->last_rsgl = rsgl;  		len += err; -		ctx->rcvused += err; +		atomic_add(err, &ctx->rcvused);  		rsgl->sg_num_bytes = err;  		iov_iter_advance(&msg->msg_iter, err);  	}  |