summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Bentele2019-08-21 22:43:10 +0200
committerManuel Bentele2019-08-21 22:43:10 +0200
commitb8d5a22f065d6b7513316be349ab24a1e05de574 (patch)
tree262f9cbc384cfaa1c5b0d944d7cb69b4a6b380a8
parentblock: loop: fix backward compatibility for loop_info structure (diff)
downloadkernel-qcow2-linux-b8d5a22f065d6b7513316be349ab24a1e05de574.tar.gz
kernel-qcow2-linux-b8d5a22f065d6b7513316be349ab24a1e05de574.tar.xz
kernel-qcow2-linux-b8d5a22f065d6b7513316be349ab24a1e05de574.zip
block: loop: fix problems for backward compatibility with Linux 4.19.y
The changes replace macros or symbols that are only available first in Linux kernel 4.20.y or later. Signed-off-by: Manuel Bentele <development@manuel-bentele.de>
-rw-r--r--drivers/block/loop/loop_file_fmt_qcow_main.c10
-rw-r--r--drivers/block/loop/loop_file_fmt_raw.c37
2 files changed, 14 insertions, 33 deletions
diff --git a/drivers/block/loop/loop_file_fmt_qcow_main.c b/drivers/block/loop/loop_file_fmt_qcow_main.c
index 4a1fb5bf346d..d3e456f80803 100644
--- a/drivers/block/loop/loop_file_fmt_qcow_main.c
+++ b/drivers/block/loop/loop_file_fmt_qcow_main.c
@@ -133,16 +133,6 @@ static inline loff_t __qcow_file_fmt_rq_get_pos(struct loop_file_fmt *lo_fmt,
return ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
}
-static inline void __qcow_file_fmt_iov_iter_bvec(struct iov_iter *i,
- unsigned int direction,
- const struct bio_vec *bvec,
- unsigned long nr_segs,
- size_t count)
-{
- iov_iter_bvec(i, direction, bvec, nr_segs, count);
- i->type |= ITER_BVEC_FLAG_NO_REF;
-}
-
static int __qcow_file_fmt_compression_init(struct loop_file_fmt *lo_fmt)
{
struct loop_file_fmt_qcow_data *qcow_data = lo_fmt->private_data;
diff --git a/drivers/block/loop/loop_file_fmt_raw.c b/drivers/block/loop/loop_file_fmt_raw.c
index d3c8743de5d2..1920dcf675fd 100644
--- a/drivers/block/loop/loop_file_fmt_raw.c
+++ b/drivers/block/loop/loop_file_fmt_raw.c
@@ -29,16 +29,6 @@ static inline loff_t __raw_file_fmt_rq_get_pos(struct loop_file_fmt *lo_fmt,
return ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
}
-static inline void __raw_file_fmt_iov_iter_bvec(struct iov_iter *i,
- unsigned int direction,
- const struct bio_vec *bvec,
- unsigned long nr_segs,
- size_t count)
-{
- iov_iter_bvec(i, direction, bvec, nr_segs, count);
- i->type |= ITER_BVEC_FLAG_NO_REF;
-}
-
/* transfer function for DEPRECATED cryptoloop support */
static inline int __raw_file_fmt_do_transfer(struct loop_file_fmt *lo_fmt,
int cmd,
@@ -88,7 +78,7 @@ static int raw_file_fmt_read_transfer(struct loop_file_fmt *lo_fmt,
b.bv_offset = 0;
b.bv_len = bvec.bv_len;
- __raw_file_fmt_iov_iter_bvec(&i, READ, &b, 1, b.bv_len);
+ iov_iter_bvec(&i, ITER_BVEC, &b, 1, b.bv_len);
len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
if (len < 0) {
ret = len;
@@ -135,7 +125,7 @@ static int raw_file_fmt_read(struct loop_file_fmt *lo_fmt,
pos = __raw_file_fmt_rq_get_pos(lo_fmt, rq);
rq_for_each_segment(bvec, rq, iter) {
- __raw_file_fmt_iov_iter_bvec(&i, READ, &bvec, 1, bvec.bv_len);
+ iov_iter_bvec(&i, ITER_BVEC, &bvec, 1, bvec.bv_len);
len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
if (len < 0)
return len;
@@ -181,15 +171,13 @@ static int __raw_file_fmt_rw_aio(struct loop_file_fmt *lo_fmt,
bool rw)
{
struct iov_iter iter;
- struct req_iterator rq_iter;
struct bio_vec *bvec;
struct bio *bio = rq->bio;
struct file *file;
- struct bio_vec tmp;
struct loop_device *lo;
struct loop_cmd *cmd;
unsigned int offset;
- int nr_bvec = 0;
+ int segments = 0;
int ret;
loff_t pos;
@@ -198,12 +186,13 @@ static int __raw_file_fmt_rw_aio(struct loop_file_fmt *lo_fmt,
cmd = blk_mq_rq_to_pdu(rq);
pos = __raw_file_fmt_rq_get_pos(lo_fmt, rq);
- rq_for_each_bvec(tmp, rq, rq_iter)
- nr_bvec++;
-
if (rq->bio != rq->biotail) {
+ struct req_iterator iter;
+ struct bio_vec tmp;
- bvec = kmalloc_array(nr_bvec, sizeof(struct bio_vec),
+ __rq_for_each_bio(bio, rq)
+ segments += bio_segments(bio);
+ bvec = kmalloc_array(segments, sizeof(struct bio_vec),
GFP_NOIO);
if (!bvec)
return -EIO;
@@ -212,10 +201,10 @@ static int __raw_file_fmt_rw_aio(struct loop_file_fmt *lo_fmt,
/*
* The bios of the request may be started from the middle of
* the 'bvec' because of bio splitting, so we can't directly
- * copy bio->bi_iov_vec to new bvec. The rq_for_each_bvec
+ * copy bio->bi_iov_vec to new bvec. The rq_for_each_segment
* API will take care of all details for us.
*/
- rq_for_each_bvec(tmp, rq, rq_iter) {
+ rq_for_each_segment(tmp, rq, iter) {
*bvec = tmp;
bvec++;
}
@@ -229,10 +218,12 @@ static int __raw_file_fmt_rw_aio(struct loop_file_fmt *lo_fmt,
*/
offset = bio->bi_iter.bi_bvec_done;
bvec = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter);
+ segments = bio_segments(bio);
}
atomic_set(&cmd->ref, 2);
- __raw_file_fmt_iov_iter_bvec(&iter, rw, bvec, nr_bvec, blk_rq_bytes(rq));
+ iov_iter_bvec(&iter, ITER_BVEC | rw, bvec,
+ segments, blk_rq_bytes(rq));
iter.iov_offset = offset;
cmd->iocb.ki_pos = pos;
@@ -269,7 +260,7 @@ static int __raw_file_fmt_write_bvec(struct file *file,
struct iov_iter i;
ssize_t bw;
- __raw_file_fmt_iov_iter_bvec(&i, WRITE, bvec, 1, bvec->bv_len);
+ iov_iter_bvec(&i, ITER_BVEC | WRITE, bvec, 1, bvec->bv_len);
file_start_write(file);
bw = vfs_iter_write(file, &i, ppos, 0);