Message ID | 1520849818-6915-7-git-send-email-anton.nefedov@virtuozzo.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 12/3/2018 1:16 PM, Anton Nefedov wrote: > Current write_zeroes implementation is good enough to satisfy this flag too > > Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com> > Reviewed-by: Alberto Garcia <berto@igalia.com> > Reviewed-by: Max Reitz <mreitz@redhat.com> strictly speaking this patch differs from v8 as well (rebase required an extra change, see below) so perhaps I should have stripped the review tags too > --- > block/file-posix.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/block/file-posix.c b/block/file-posix.c > index 7f2cc63..2136df9 100644 > --- a/block/file-posix.c > +++ b/block/file-posix.c > @@ -560,7 +560,10 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, > } > if (S_ISREG(st.st_mode)) { > s->discard_zeroes = true; > +#ifdef CONFIG_FALLOCATE > s->has_fallocate = true; > + bs->supported_zero_flags |= BDRV_REQ_ALLOCATE; > +#endif > } > if (S_ISBLK(st.st_mode)) { > #ifdef BLKDISCARDZEROES > @@ -595,10 +598,11 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, > #ifdef CONFIG_XFS > if (platform_test_xfs_fd(s->fd)) { > s->is_xfs = true; > + bs->supported_zero_flags |= BDRV_REQ_ALLOCATE; > } > #endif > > - bs->supported_zero_flags = s->discard_zeroes ? BDRV_REQ_MAY_UNMAP : 0; > + bs->supported_zero_flags |= s->discard_zeroes ? BDRV_REQ_MAY_UNMAP : 0; > ret = 0; (this change is new in v9) > fail: > if (filename && (bdrv_flags & BDRV_O_TEMPORARY)) { > @@ -1416,6 +1420,10 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb) > } > s->has_fallocate = false; > } > + > + if (!s->has_fallocate) { > + aiocb->bs->supported_zero_flags &= ~BDRV_REQ_ALLOCATE; > + } > #endif > > return -ENOTSUP; >
diff --git a/block/file-posix.c b/block/file-posix.c index 7f2cc63..2136df9 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -560,7 +560,10 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, } if (S_ISREG(st.st_mode)) { s->discard_zeroes = true; +#ifdef CONFIG_FALLOCATE s->has_fallocate = true; + bs->supported_zero_flags |= BDRV_REQ_ALLOCATE; +#endif } if (S_ISBLK(st.st_mode)) { #ifdef BLKDISCARDZEROES @@ -595,10 +598,11 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, #ifdef CONFIG_XFS if (platform_test_xfs_fd(s->fd)) { s->is_xfs = true; + bs->supported_zero_flags |= BDRV_REQ_ALLOCATE; } #endif - bs->supported_zero_flags = s->discard_zeroes ? BDRV_REQ_MAY_UNMAP : 0; + bs->supported_zero_flags |= s->discard_zeroes ? BDRV_REQ_MAY_UNMAP : 0; ret = 0; fail: if (filename && (bdrv_flags & BDRV_O_TEMPORARY)) { @@ -1416,6 +1420,10 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb) } s->has_fallocate = false; } + + if (!s->has_fallocate) { + aiocb->bs->supported_zero_flags &= ~BDRV_REQ_ALLOCATE; + } #endif return -ENOTSUP;