diff options
author | Manuel Bentele | 2019-08-21 22:43:10 +0200 |
---|---|---|
committer | Manuel Bentele | 2019-08-21 22:43:10 +0200 |
commit | b8d5a22f065d6b7513316be349ab24a1e05de574 (patch) | |
tree | 262f9cbc384cfaa1c5b0d944d7cb69b4a6b380a8 | |
parent | block: loop: fix backward compatibility for loop_info structure (diff) | |
download | kernel-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.c | 10 | ||||
-rw-r--r-- | drivers/block/loop/loop_file_fmt_raw.c | 37 |
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); |