On (23/04/04 17:05), Christoph Hellwig wrote: > +static void zram_bio_read(struct zram *zram, struct bio *bio) > { > - int ret; > + struct bvec_iter iter; > + struct bio_vec bv; > + unsigned long start_time; > > - if (!op_is_write(op)) { > - ret = zram_bvec_read(zram, bvec, index, offset, bio); > - if (unlikely(ret < 0)) { > + start_time = bio_start_io_acct(bio); > + bio_for_each_segment(bv, bio, iter) { > + u32 index = iter.bi_sector >> SECTORS_PER_PAGE_SHIFT; > + u32 offset = (iter.bi_sector & (SECTORS_PER_PAGE - 1)) << > + SECTOR_SHIFT; > + > + if (zram_bvec_read(zram, &bv, index, offset, bio) < 0) { > atomic64_inc(&zram->stats.failed_writes); ->failed_reads > - return ret; > - } > - flush_dcache_page(bvec->bv_page); > - } else { > - ret = zram_bvec_write(zram, bvec, index, offset, bio); > - if (unlikely(ret < 0)) { > - atomic64_inc(&zram->stats.failed_reads); > - return ret; > + bio->bi_status = BLK_STS_IOERR; > + break; > } > - } > + flush_dcache_page(bv.bv_page); > > - zram_slot_lock(zram, index); > - zram_accessed(zram, index); > - zram_slot_unlock(zram, index); > - return 0; > + zram_slot_lock(zram, index); > + zram_accessed(zram, index); > + zram_slot_unlock(zram, index); > + } > + bio_end_io_acct(bio, start_time); > + bio_endio(bio); > } > > -static void __zram_make_request(struct zram *zram, struct bio *bio) > +static void zram_bio_write(struct zram *zram, struct bio *bio) > { > struct bvec_iter iter; > struct bio_vec bv; > @@ -1970,11 +1966,15 @@ static void __zram_make_request(struct zram *zram, struct bio *bio) > u32 offset = (iter.bi_sector & (SECTORS_PER_PAGE - 1)) << > SECTOR_SHIFT; > > - if (zram_bvec_rw(zram, &bv, index, offset, bio_op(bio), > - bio) < 0) { > + if (zram_bvec_write(zram, &bv, index, offset, bio) < 0) { > + atomic64_inc(&zram->stats.failed_reads); ->failed_writes > bio->bi_status = BLK_STS_IOERR; > break; > } > + > + zram_slot_lock(zram, index); > + zram_accessed(zram, index); > + zram_slot_unlock(zram, index); > } > bio_end_io_acct(bio, start_time); > bio_endio(bio); > @@ -1989,8 +1989,10 @@ static void zram_submit_bio(struct bio *bio) > > switch (bio_op(bio)) { > case REQ_OP_READ: > + zram_bio_read(zram, bio); > + break; > case REQ_OP_WRITE: > - __zram_make_request(zram, bio); > + zram_bio_write(zram, bio); > break; > case REQ_OP_DISCARD: > case REQ_OP_WRITE_ZEROES: > -- > 2.39.2 >