sg_init_table(payload, 2);
        sg_set_buf(payload, req->iv, 8);
-       scatterwalk_crypto_chain(payload, dst, vdst == req->iv + 8, 2);
+       scatterwalk_crypto_chain(payload, src, vsrc == req->iv + 8, 2);
        assoclen += 8 + req->cryptlen - (enc ? 0 : authsize);
  
 -      sg_init_table(assoc, 2);
 -      sg_set_page(assoc, sg_page(req->assoc), req->assoc->length,
 -                  req->assoc->offset);
 +      if (req->assoc->length == req->assoclen) {
 +              sg_init_table(assoc, 2);
 +              sg_set_page(assoc, sg_page(req->assoc), req->assoc->length,
 +                          req->assoc->offset);
 +      } else {
 +              BUG_ON(req->assoclen > sizeof(rctx->assocbuf));
 +
 +              scatterwalk_map_and_copy(rctx->assocbuf, req->assoc, 0,
 +                                       req->assoclen, 0);
 +
 +              sg_init_table(assoc, 2);
 +              sg_set_buf(assoc, rctx->assocbuf, req->assoclen);
 +      }
        scatterwalk_crypto_chain(assoc, payload, 0, 2);
  
        aead_request_set_tfm(subreq, ctx->child);