+static unsigned int crypt_slow(const struct cipher_desc *desc,
+ struct scatter_walk *in,
+ struct scatter_walk *out, unsigned int bsize)
+{
+ unsigned long alignmask = crypto_tfm_alg_alignmask(desc->tfm);
+ u8 buffer[bsize * 2 + alignmask];
+ u8 *src = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
+ u8 *dst = src + bsize;
+
+ scatterwalk_copychunks(src, in, bsize, 0);
+ desc->prfn(desc, dst, src, bsize);
+ scatterwalk_copychunks(dst, out, bsize, 1);
+
+ return bsize;
+}
+
+static inline unsigned int crypt_fast(const struct cipher_desc *desc,
+ struct scatter_walk *in,
+ struct scatter_walk *out,
+ unsigned int nbytes, u8 *tmp)
+{
+ u8 *src, *dst;
+ u8 *real_src, *real_dst;
+
+ real_src = scatterwalk_map(in, 0);
+ real_dst = scatterwalk_map(out, 1);
+
+ src = real_src;
+ dst = scatterwalk_samebuf(in, out) ? src : real_dst;
+
+ if (tmp) {
+ memcpy(tmp, src, nbytes);
+ src = tmp;
+ dst = tmp;
+ }
+
+ nbytes = desc->prfn(desc, dst, src, nbytes);
+
+ if (tmp)
+ memcpy(real_dst, tmp, nbytes);
+
+ scatterwalk_unmap(real_src, 0);
+ scatterwalk_unmap(real_dst, 1);
+
+ scatterwalk_advance(in, nbytes);
+ scatterwalk_advance(out, nbytes);
+
+ return nbytes;
+}