Merge tag 'zonefs-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal...
[sfrench/cifs-2.6.git] / block / bio.c
index 496867b51609f7a9dbca22f333fc66ab09fc249a..d24420ed1c4c6f20b80bc043cdf0378afcb43668 100644 (file)
@@ -250,6 +250,7 @@ void bio_init(struct bio *bio, struct block_device *bdev, struct bio_vec *table,
        bio->bi_opf = opf;
        bio->bi_flags = 0;
        bio->bi_ioprio = 0;
+       bio->bi_write_hint = 0;
        bio->bi_status = 0;
        bio->bi_iter.bi_sector = 0;
        bio->bi_iter.bi_size = 0;
@@ -814,6 +815,7 @@ static int __bio_clone(struct bio *bio, struct bio *bio_src, gfp_t gfp)
 {
        bio_set_flag(bio, BIO_CLONED);
        bio->bi_ioprio = bio_src->bi_ioprio;
+       bio->bi_write_hint = bio_src->bi_write_hint;
        bio->bi_iter = bio_src->bi_iter;
 
        if (bio->bi_bdev) {
@@ -1153,7 +1155,7 @@ void __bio_release_pages(struct bio *bio, bool mark_dirty)
 
        bio_for_each_folio_all(fi, bio) {
                struct page *page;
-               size_t done = 0;
+               size_t nr_pages;
 
                if (mark_dirty) {
                        folio_lock(fi.folio);
@@ -1161,10 +1163,11 @@ void __bio_release_pages(struct bio *bio, bool mark_dirty)
                        folio_unlock(fi.folio);
                }
                page = folio_page(fi.folio, fi.offset / PAGE_SIZE);
+               nr_pages = (fi.offset + fi.length - 1) / PAGE_SIZE -
+                          fi.offset / PAGE_SIZE + 1;
                do {
                        bio_release_page(bio, page++);
-                       done += PAGE_SIZE;
-               } while (done < fi.length);
+               } while (--nr_pages != 0);
        }
 }
 EXPORT_SYMBOL_GPL(__bio_release_pages);