}
 EXPORT_SYMBOL_GPL(memcpy_to_sglist);
 
+void memcpy_sglist(struct scatterlist *dst, struct scatterlist *src,
+                  unsigned int nbytes)
+{
+       struct scatter_walk swalk;
+       struct scatter_walk dwalk;
+
+       if (unlikely(nbytes == 0)) /* in case sg == NULL */
+               return;
+
+       scatterwalk_start(&swalk, src);
+       scatterwalk_start(&dwalk, dst);
+
+       do {
+               unsigned int slen, dlen;
+               unsigned int len;
+
+               slen = scatterwalk_next(&swalk, nbytes);
+               dlen = scatterwalk_next(&dwalk, nbytes);
+               len = min(slen, dlen);
+               memcpy(dwalk.addr, swalk.addr, len);
+               scatterwalk_done_dst(&dwalk, len);
+               scatterwalk_done_src(&swalk, len);
+               nbytes -= len;
+       } while (nbytes);
+}
+EXPORT_SYMBOL_GPL(memcpy_sglist);
+
 struct scatterlist *scatterwalk_ffwd(struct scatterlist dst[2],
                                     struct scatterlist *src,
                                     unsigned int len)
 
 void memcpy_to_sglist(struct scatterlist *sg, unsigned int start,
                      const void *buf, unsigned int nbytes);
 
+void memcpy_sglist(struct scatterlist *dst, struct scatterlist *src,
+                  unsigned int nbytes);
+
 /* In new code, please use memcpy_{from,to}_sglist() directly instead. */
 static inline void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg,
                                            unsigned int start,