Message ID | 1603390423-980205-11-git-send-email-andrey.shinkevich@virtuozzo.com |
---|---|
State | New |
Headers | show |
Series | Apply COR-filter to the block-stream permanently | expand |
22.10.2020 21:13, Andrey Shinkevich wrote: > Add the new member supported_read_flags to the BlockDriverState > structure. It will control the flags set for copy-on-read operations. > Make the block generic layer evaluate supported read flags before they > go to a block driver. > > Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> > Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com> > --- > block/io.c | 12 ++++++++++-- > include/block/block_int.h | 4 ++++ > 2 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/block/io.c b/block/io.c > index 54f0968..78ddf13 100644 > --- a/block/io.c > +++ b/block/io.c > @@ -1392,6 +1392,9 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child, > if (flags & BDRV_REQ_COPY_ON_READ) { > int64_t pnum; > > + /* The flag BDRV_REQ_COPY_ON_READ has reached its addressee */ > + flags &= ~BDRV_REQ_COPY_ON_READ; > + > ret = bdrv_is_allocated(bs, offset, bytes, &pnum); > if (ret < 0) { > goto out; > @@ -1413,9 +1416,13 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child, > goto out; > } > > + if (flags & ~bs->supported_read_flags) { > + abort(); > + } > + So, you decided to be strict with all read-flags passed to driver, not only PREFETCH.. It makes sense. > max_bytes = ROUND_UP(MAX(0, total_bytes - offset), align); > if (bytes <= max_bytes && bytes <= max_transfer) { > - ret = bdrv_driver_preadv(bs, offset, bytes, qiov, qiov_offset, 0); > + ret = bdrv_driver_preadv(bs, offset, bytes, qiov, qiov_offset, flags); > goto out; > } > > @@ -1428,7 +1435,8 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child, > > ret = bdrv_driver_preadv(bs, offset + bytes - bytes_remaining, > num, qiov, > - qiov_offset + bytes - bytes_remaining, 0); > + qiov_offset + bytes - bytes_remaining, > + flags); > max_bytes -= num; > } else { > num = bytes_remaining; > diff --git a/include/block/block_int.h b/include/block/block_int.h > index f782737..474174c 100644 > --- a/include/block/block_int.h > +++ b/include/block/block_int.h > @@ -873,6 +873,10 @@ struct BlockDriverState { > /* I/O Limits */ > BlockLimits bl; > > + /* > + * Flags honored during pread > + */ > + unsigned int supported_read_flags; > /* Flags honored during pwrite (so far: BDRV_REQ_FUA, > * BDRV_REQ_WRITE_UNCHANGED). > * If a driver does not support BDRV_REQ_WRITE_UNCHANGED, those > Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
diff --git a/block/io.c b/block/io.c index 54f0968..78ddf13 100644 --- a/block/io.c +++ b/block/io.c @@ -1392,6 +1392,9 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child, if (flags & BDRV_REQ_COPY_ON_READ) { int64_t pnum; + /* The flag BDRV_REQ_COPY_ON_READ has reached its addressee */ + flags &= ~BDRV_REQ_COPY_ON_READ; + ret = bdrv_is_allocated(bs, offset, bytes, &pnum); if (ret < 0) { goto out; @@ -1413,9 +1416,13 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child, goto out; } + if (flags & ~bs->supported_read_flags) { + abort(); + } + max_bytes = ROUND_UP(MAX(0, total_bytes - offset), align); if (bytes <= max_bytes && bytes <= max_transfer) { - ret = bdrv_driver_preadv(bs, offset, bytes, qiov, qiov_offset, 0); + ret = bdrv_driver_preadv(bs, offset, bytes, qiov, qiov_offset, flags); goto out; } @@ -1428,7 +1435,8 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child, ret = bdrv_driver_preadv(bs, offset + bytes - bytes_remaining, num, qiov, - qiov_offset + bytes - bytes_remaining, 0); + qiov_offset + bytes - bytes_remaining, + flags); max_bytes -= num; } else { num = bytes_remaining; diff --git a/include/block/block_int.h b/include/block/block_int.h index f782737..474174c 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -873,6 +873,10 @@ struct BlockDriverState { /* I/O Limits */ BlockLimits bl; + /* + * Flags honored during pread + */ + unsigned int supported_read_flags; /* Flags honored during pwrite (so far: BDRV_REQ_FUA, * BDRV_REQ_WRITE_UNCHANGED). * If a driver does not support BDRV_REQ_WRITE_UNCHANGED, those
Add the new member supported_read_flags to the BlockDriverState structure. It will control the flags set for copy-on-read operations. Make the block generic layer evaluate supported read flags before they go to a block driver. Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com> --- block/io.c | 12 ++++++++++-- include/block/block_int.h | 4 ++++ 2 files changed, 14 insertions(+), 2 deletions(-)