Consoliate aead_count_tsgl, skcipher_count_tsgl ==> af_alg_count_tsgl

Signed-off-by: Stephan Mueller <smuel...@chronox.de>
---
 crypto/af_alg.c         | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
 crypto/algif_aead.c     | 53 ++++---------------------------------------------
 crypto/algif_skcipher.c | 30 ++--------------------------
 include/crypto/if_alg.h |  1 +
 4 files changed, 59 insertions(+), 77 deletions(-)

diff --git a/crypto/af_alg.c b/crypto/af_alg.c
index 87138c4b5a0f..861167fc12f7 100644
--- a/crypto/af_alg.c
+++ b/crypto/af_alg.c
@@ -544,6 +544,58 @@ int af_alg_alloc_tsgl(struct sock *sk)
 }
 EXPORT_SYMBOL_GPL(af_alg_alloc_tsgl);
 
+/**
+ * aead_count_tsgl - Count number of TX SG entries
+ *
+ * The counting starts from the beginning of the SGL to @bytes. If
+ * an offset is provided, the counting of the SG entries starts at the offset.
+ *
+ * @sk socket of connection to user space
+ * @bytes Count the number of SG entries holding given number of bytes.
+ * @offset Start the counting of SG entries from the given offset.
+ * @return Number of TX SG entries found given the constraints
+ */
+unsigned int af_alg_count_tsgl(struct sock *sk, size_t bytes, size_t offset)
+{
+       struct alg_sock *ask = alg_sk(sk);
+       struct af_alg_ctx *ctx = ask->private;
+       struct af_alg_tsgl *sgl, *tmp;
+       unsigned int i;
+       unsigned int sgl_count = 0;
+
+       if (!bytes)
+               return 0;
+
+       list_for_each_entry_safe(sgl, tmp, &ctx->tsgl_list, list) {
+               struct scatterlist *sg = sgl->sg;
+
+               for (i = 0; i < sgl->cur; i++) {
+                       size_t bytes_count;
+
+                       /* Skip offset */
+                       if (offset >= sg[i].length) {
+                               offset -= sg[i].length;
+                               bytes -= sg[i].length;
+                               continue;
+                       }
+
+                       bytes_count = sg[i].length - offset;
+
+                       offset = 0;
+                       sgl_count++;
+
+                       /* If we have seen requested number of bytes, stop */
+                       if (bytes_count >= bytes)
+                               return sgl_count;
+
+                       bytes -= bytes_count;
+               }
+       }
+
+       return sgl_count;
+}
+EXPORT_SYMBOL_GPL(af_alg_count_tsgl);
+
 static int __init af_alg_init(void)
 {
        int err = proto_register(&alg_proto, 0);
diff --git a/crypto/algif_aead.c b/crypto/algif_aead.c
index a722df95e55c..78651b26aa77 100644
--- a/crypto/algif_aead.c
+++ b/crypto/algif_aead.c
@@ -65,58 +65,13 @@ static inline bool aead_sufficient_data(struct sock *sk)
 }
 
 /**
- * Count number of SG entries from the beginning of the SGL to @bytes. If
- * an offset is provided, the counting of the SG entries starts at the offset.
- */
-static unsigned int aead_count_tsgl(struct sock *sk, size_t bytes,
-                                   size_t offset)
-{
-       struct alg_sock *ask = alg_sk(sk);
-       struct af_alg_ctx *ctx = ask->private;
-       struct af_alg_tsgl *sgl, *tmp;
-       unsigned int i;
-       unsigned int sgl_count = 0;
-
-       if (!bytes)
-               return 0;
-
-       list_for_each_entry_safe(sgl, tmp, &ctx->tsgl_list, list) {
-               struct scatterlist *sg = sgl->sg;
-
-               for (i = 0; i < sgl->cur; i++) {
-                       size_t bytes_count;
-
-                       /* Skip offset */
-                       if (offset >= sg[i].length) {
-                               offset -= sg[i].length;
-                               bytes -= sg[i].length;
-                               continue;
-                       }
-
-                       bytes_count = sg[i].length - offset;
-
-                       offset = 0;
-                       sgl_count++;
-
-                       /* If we have seen requested number of bytes, stop */
-                       if (bytes_count >= bytes)
-                               return sgl_count;
-
-                       bytes -= bytes_count;
-               }
-       }
-
-       return sgl_count;
-}
-
-/**
  * Release the specified buffers from TX SGL pointed to by ctx->tsgl_list for
  * @used bytes.
  *
  * If @dst is non-null, reassign the pages to dst. The caller must release
  * the pages. If @dst_offset is given only reassign the pages to @dst starting
  * at the @dst_offset (byte). The caller must ensure that @dst is large
- * enough (e.g. by using aead_count_tsgl with the same offset).
+ * enough (e.g. by using af_alg_count_tsgl with the same offset).
  */
 static void aead_pull_tsgl(struct sock *sk, size_t used,
                           struct scatterlist *dst, size_t dst_offset)
@@ -140,7 +95,7 @@ static void aead_pull_tsgl(struct sock *sk, size_t used,
                                continue;
 
                        /*
-                        * Assumption: caller created aead_count_tsgl(len)
+                        * Assumption: caller created af_alg_count_tsgl(len)
                         * SG entries in dst.
                         */
                        if (dst) {
@@ -724,8 +679,8 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr 
*msg,
                        goto free;
 
                /* Create TX SGL for tag and chain it to RX SGL. */
-               areq->tsgl_entries = aead_count_tsgl(sk, processed,
-                                                    processed - as);
+               areq->tsgl_entries = af_alg_count_tsgl(sk, processed,
+                                                      processed - as);
                if (!areq->tsgl_entries)
                        areq->tsgl_entries = 1;
                areq->tsgl = sock_kmalloc(sk, sizeof(*areq->tsgl) *
diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c
index d511f665a190..8e086d9f7b71 100644
--- a/crypto/algif_skcipher.c
+++ b/crypto/algif_skcipher.c
@@ -44,32 +44,6 @@ struct skcipher_tfm {
        bool has_key;
 };
 
-static unsigned int skcipher_count_tsgl(struct sock *sk, size_t bytes)
-{
-       struct alg_sock *ask = alg_sk(sk);
-       struct af_alg_ctx *ctx = ask->private;
-       struct af_alg_tsgl *sgl, *tmp;
-       unsigned int i;
-       unsigned int sgl_count = 0;
-
-       if (!bytes)
-               return 0;
-
-       list_for_each_entry_safe(sgl, tmp, &ctx->tsgl_list, list) {
-               struct scatterlist *sg = sgl->sg;
-
-               for (i = 0; i < sgl->cur; i++) {
-                       sgl_count++;
-                       if (sg[i].length >= bytes)
-                               return sgl_count;
-
-                       bytes -= sg[i].length;
-               }
-       }
-
-       return sgl_count;
-}
-
 static void skcipher_pull_tsgl(struct sock *sk, size_t used,
                               struct scatterlist *dst)
 {
@@ -92,7 +66,7 @@ static void skcipher_pull_tsgl(struct sock *sk, size_t used,
                                continue;
 
                        /*
-                        * Assumption: caller created skcipher_count_tsgl(len)
+                        * Assumption: caller created af_alg_count_tsgl(len)
                         * SG entries in dst.
                         */
                        if (dst)
@@ -543,7 +517,7 @@ static int _skcipher_recvmsg(struct socket *sock, struct 
msghdr *msg,
         * Create a per request TX SGL for this request which tracks the
         * SG entries from the global TX SGL.
         */
-       areq->tsgl_entries = skcipher_count_tsgl(sk, len);
+       areq->tsgl_entries = af_alg_count_tsgl(sk, len, 0);
        if (!areq->tsgl_entries)
                areq->tsgl_entries = 1;
        areq->tsgl = sock_kmalloc(sk, sizeof(*areq->tsgl) * areq->tsgl_entries,
diff --git a/include/crypto/if_alg.h b/include/crypto/if_alg.h
index cfebf65303c7..3029cf4f2890 100644
--- a/include/crypto/if_alg.h
+++ b/include/crypto/if_alg.h
@@ -241,5 +241,6 @@ static inline bool af_alg_readable(struct sock *sk)
 }
 
 int af_alg_alloc_tsgl(struct sock *sk);
+unsigned int af_alg_count_tsgl(struct sock *sk, size_t bytes, size_t offset);
 
 #endif /* _CRYPTO_IF_ALG_H */
-- 
2.13.3


Reply via email to