It will be used to stop retrying NBD requests on mirror cancel. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- include/block/block.h | 3 +++ include/block/block_int.h | 9 +++++++++ block/io.c | 11 +++++++++++ 3 files changed, 23 insertions(+)
diff --git a/include/block/block.h b/include/block/block.h index c9d7c58765..3990ee3677 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -836,4 +836,7 @@ int coroutine_fn bdrv_co_copy_range(BdrvChild *src, uint64_t src_offset, BdrvChild *dst, uint64_t dst_offset, uint64_t bytes, BdrvRequestFlags read_flags, BdrvRequestFlags write_flags); + +void bdrv_cancel_in_flight(BlockDriverState *bs); + #endif diff --git a/include/block/block_int.h b/include/block/block_int.h index 95d9333be1..07a87ce5e7 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -344,6 +344,15 @@ struct BlockDriver { bool want_zero, int64_t offset, int64_t bytes, int64_t *pnum, int64_t *map, BlockDriverState **file); + /* + * This informs the driver that we are not more interested in in-flight + * requests results, so don't waste the time if possible. + * + * The example usage is to not wait for nbd target nodedreconnect timeout on + * job-cancel. + */ + void (*bdrv_cancel_in_flight)(BlockDriverState *bs); + /* * Invalidate any cached meta-data. */ diff --git a/block/io.c b/block/io.c index ec5e152bb7..5dcb6433f9 100644 --- a/block/io.c +++ b/block/io.c @@ -3288,3 +3288,14 @@ out: return ret; } + +void bdrv_cancel_in_flight(BlockDriverState *bs) +{ + if (!bs || !bs->drv) { + return; + } + + if (bs->drv->bdrv_cancel_in_flight) { + bs->drv->bdrv_cancel_in_flight(bs); + } +} -- 2.21.3