On Mon, 7 Feb 2022, Nitesh Shetty wrote:

> +                             goto retry;
> +                     return PTR_ERR(bio);
> +             }
> +
> +             bio->bi_iter.bi_sector = sector >> SECTOR_SHIFT;
> +             bio->bi_opf = op;
> +             bio_set_dev(bio, bdev);
> @@ -346,6 +463,8 @@ int blkdev_issue_copy(struct block_device *src_bdev, int 
> nr,
>  
>       if (blk_check_copy_offload(src_q, dest_q))
>               ret = blk_copy_offload(src_bdev, nr, rlist, dest_bdev, 
> gfp_mask);
> +     else
> +             ret = blk_copy_emulate(src_bdev, nr, rlist, dest_bdev, 
> gfp_mask);
>  
>       return ret;
>  }

The emulation is not reliable because a device mapper device may be 
reconfigured and it may lose the copy capability between the calls to 
blk_check_copy_offload and blk_copy_offload.

You should call blk_copy_emulate if blk_copy_offload returns an error.

Mikulas

--
dm-devel mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to