int err;
        unsigned long flags;
        struct scatterlist outhdr, iv_sg, status_sg, **sgs;
-       int i;
        u64 dst_len;
        unsigned int num_out = 0, num_in = 0;
        int sg_total;
        uint8_t *iv;
+       struct scatterlist *sg;
 
        src_nents = sg_nents_for_len(req->src, req->cryptlen);
+       if (src_nents < 0) {
+               pr_err("Invalid number of src SG.\n");
+               return src_nents;
+       }
+
        dst_nents = sg_nents(req->dst);
 
        pr_debug("virtio_crypto: Number of sgs (src_nents: %d, dst_nents: %d)\n",
        vc_sym_req->iv = iv;
 
        /* Source data */
-       for (i = 0; i < src_nents; i++)
-               sgs[num_out++] = &req->src[i];
+       for (sg = req->src; src_nents; sg = sg_next(sg), src_nents--)
+               sgs[num_out++] = sg;
 
        /* Destination data */
-       for (i = 0; i < dst_nents; i++)
-               sgs[num_out + num_in++] = &req->dst[i];
+       for (sg = req->dst; sg; sg = sg_next(sg))
+               sgs[num_out + num_in++] = sg;
 
        /* Status */
        sg_init_one(&status_sg, &vc_req->status, sizeof(vc_req->status));