return lbn;
}
+static void do_io_remap_device(struct dedup_config *dc, struct bio *bio)
+{
+ bio->bi_bdev = dc->data_dev->bdev;
+ generic_make_request(bio);
+}
+
static void do_io(struct dedup_config *dc, struct bio *bio, uint64_t pbn)
{
int offset;
offset = sector_div(bio->bi_iter.bi_sector, dc->sectors_per_block);
bio->bi_iter.bi_sector = (sector_t)pbn * dc->sectors_per_block + offset;
- bio->bi_bdev = dc->data_dev->bdev;
-
- generic_make_request(bio);
+ do_io_remap_device(dc, bio);
}
static int handle_read(struct dedup_config *dc, struct bio *bio)
{
int r;
+ if (bio->bi_rw & (REQ_FLUSH | REQ_FUA) && !bio_sectors(bio)) {
+ r = dc->mdops->flush_meta(dc->bmd);
+ if (r == 0)
+ dc->writes_after_flush = 0;
+ do_io_remap_device(dc, bio);
+ return;
+ }
+
switch (bio_data_dir(bio)) {
case READ:
r = handle_read(dc, bio);
if (r)
goto bad_kvstore_init;
+ ti->num_flush_bios = 1;
+ ti->flush_supported = true;
+
ti->private = dc;
return 0;