Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-drm-fsl-dcu.git] / crypto / algif_skcipher.c
index 38a6757e3cccdbfbff707870e09ad59e153925d3..0c8a1e5ccadf7d1ca16d9da3bd1042e3ff724177 100644 (file)
@@ -434,67 +434,58 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock,
                &ctx->req));
        struct skcipher_sg_list *sgl;
        struct scatterlist *sg;
-       unsigned long iovlen;
-       const struct iovec *iov;
        int err = -EAGAIN;
        int used;
        long copied = 0;
 
        lock_sock(sk);
-       for (iov = msg->msg_iter.iov, iovlen = msg->msg_iter.nr_segs; iovlen > 0;
-            iovlen--, iov++) {
-               unsigned long seglen = iov->iov_len;
-               char __user *from = iov->iov_base;
-
-               while (seglen) {
-                       sgl = list_first_entry(&ctx->tsgl,
-                                              struct skcipher_sg_list, list);
-                       sg = sgl->sg;
-
-                       while (!sg->length)
-                               sg++;
-
-                       if (!ctx->used) {
-                               err = skcipher_wait_for_data(sk, flags);
-                               if (err)
-                                       goto unlock;
-                       }
+       while (iov_iter_count(&msg->msg_iter)) {
+               sgl = list_first_entry(&ctx->tsgl,
+                                      struct skcipher_sg_list, list);
+               sg = sgl->sg;
 
-                       used = min_t(unsigned long, ctx->used, seglen);
+               while (!sg->length)
+                       sg++;
 
-                       used = af_alg_make_sg(&ctx->rsgl, from, used, 1);
-                       err = used;
-                       if (err < 0)
+               if (!ctx->used) {
+                       err = skcipher_wait_for_data(sk, flags);
+                       if (err)
                                goto unlock;
+               }
+
+               used = min_t(unsigned long, ctx->used, iov_iter_count(&msg->msg_iter));
+
+               used = af_alg_make_sg(&ctx->rsgl, &msg->msg_iter, used);
+               err = used;
+               if (err < 0)
+                       goto unlock;
 
-                       if (ctx->more || used < ctx->used)
-                               used -= used % bs;
+               if (ctx->more || used < ctx->used)
+                       used -= used % bs;
 
-                       err = -EINVAL;
-                       if (!used)
-                               goto free;
+               err = -EINVAL;
+               if (!used)
+                       goto free;
 
-                       ablkcipher_request_set_crypt(&ctx->req, sg,
-                                                    ctx->rsgl.sg, used,
-                                                    ctx->iv);
+               ablkcipher_request_set_crypt(&ctx->req, sg,
+                                            ctx->rsgl.sg, used,
+                                            ctx->iv);
 
-                       err = af_alg_wait_for_completion(
+               err = af_alg_wait_for_completion(
                                ctx->enc ?
                                        crypto_ablkcipher_encrypt(&ctx->req) :
                                        crypto_ablkcipher_decrypt(&ctx->req),
                                &ctx->completion);
 
 free:
-                       af_alg_free_sg(&ctx->rsgl);
+               af_alg_free_sg(&ctx->rsgl);
 
-                       if (err)
-                               goto unlock;
+               if (err)
+                       goto unlock;
 
-                       copied += used;
-                       from += used;
-                       seglen -= used;
-                       skcipher_pull_sgl(sk, used);
-               }
+               copied += used;
+               skcipher_pull_sgl(sk, used);
+               iov_iter_advance(&msg->msg_iter, used);
        }
 
        err = 0;