diff -ur lin_tape-3.0.8.orig/lower.c lin_tape-3.0.8/lower.c --- lin_tape-3.0.8.orig/lower.c 2016-03-15 23:39:12.000000000 +0100 +++ lin_tape-3.0.8/lower.c 2016-06-19 13:16:12.828653141 +0200 @@ -471,6 +471,21 @@ } else if (pfo_cmd->source == PFO_SOURCE_SG || pfo_cmd->source == PFO_SOURCE_IOCTL) { if (pfo_cmd->iov_count) { +#if LINUX_VERSION_CODE > KERNEL_VERSION(3,19,0) + struct iovec *iov = NULL; + struct iov_iter i; + err = import_iovec(write, pfo_cmd->buffer, pfo_cmd->iov_count, 0, &iov, &i); + if (err < 0) + return err; + iov_iter_truncate(&i, pfo_cmd->bufflen); + + err = blk_rq_map_user_iov(sdev->request_queue, + rq, + pfo_cmd->mdata, + &i, + GFP_ATOMIC); + kfree(iov); +#else err = blk_rq_map_user_iov(sdev->request_queue, rq, pfo_cmd->mdata, @@ -478,6 +493,7 @@ pfo_cmd->iov_count, pfo_cmd->bufflen, GFP_KERNEL); +#endif } else { err = blk_rq_map_user(sdev->request_queue, rq, diff -ur lin_tape-3.0.8.orig/sgmp.c lin_tape-3.0.8/sgmp.c --- lin_tape-3.0.8.orig/sgmp.c 2016-06-19 13:15:52.000000000 +0200 +++ lin_tape-3.0.8/sgmp.c 2016-06-19 13:16:12.828653141 +0200 @@ -77,6 +77,7 @@ #else #include #endif +#include #include "scsi.h" #include @@ -2029,7 +2029,12 @@ } if (iov_count) { +#if LINUX_VERSION_CODE > KERNEL_VERSION(3,19,0) + int size = sizeof(struct iovec) * iov_count; + struct iov_iter i; +#else int len, size = sizeof(struct sg_iovec) * iov_count; +#endif struct iovec *iov; #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,32) iov = memdup_user(hp->dxferp, size); @@ -2046,6 +2051,13 @@ } #endif +#if LINUX_VERSION_CODE > KERNEL_VERSION(3,19,0) + iov_iter_init(&i, rw, iov, iov_count, + min_t(size_t, hp->dxfer_len, + iov_length(iov, iov_count))); + + res = blk_rq_map_user_iov(q, rq, md, &i, GFP_ATOMIC); +#else len = iov_length(iov, iov_count); if (hp->dxfer_len < len) { iov_count = iov_shorten(iov, iov_count, hp->dxfer_len); @@ -2055,6 +2067,7 @@ res = blk_rq_map_user_iov(q, rq, md, (struct sg_iovec *)iov, iov_count, len, GFP_ATOMIC); +#endif kfree(iov); } else res = blk_rq_map_user(q, rq, md, hp->dxferp,