Message ID | 20190905182132.3563-5-eblake@redhat.com |
---|---|
State | New |
Headers | show |
Series | [PULL,1/9] nbd: Advertise multi-conn for shared read-only connections | expand |
Many thanks Andrey On 05/09/2019 21:21, Eric Blake wrote: > From: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com> > > Revert the commit 118f99442d 'block/io.c: fix for the allocation failure' > and use better error handling for file systems that do not support > fallocate() for an unaligned byte range. Allow falling back to pwrite > in case fallocate() returns EINVAL. > > Suggested-by: Kevin Wolf <kwolf@redhat.com> > Suggested-by: Eric Blake <eblake@redhat.com> > Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com> > Reviewed-by: Eric Blake <eblake@redhat.com> > Reviewed-by: Denis V. Lunev <den@openvz.org> > Message-Id: <1566913973-15490-1-git-send-email-andrey.shinkevich@virtuozzo.com> > Signed-off-by: Eric Blake <eblake@redhat.com> > --- > block/io.c | 2 +- > block/file-posix.c | 7 +++++++ > 2 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/block/io.c b/block/io.c > index 0fa10831edb7..16a598fd0857 100644 > --- a/block/io.c > +++ b/block/io.c > @@ -1746,7 +1746,7 @@ static int coroutine_fn bdrv_co_do_pwrite_zeroes(BlockDriverState *bs, > assert(!bs->supported_zero_flags); > } > > - if (ret < 0 && !(flags & BDRV_REQ_NO_FALLBACK)) { > + if (ret == -ENOTSUP && !(flags & BDRV_REQ_NO_FALLBACK)) { > /* Fall back to bounce buffer if write zeroes is unsupported */ > BdrvRequestFlags write_flags = flags & ~BDRV_REQ_ZERO_WRITE; > > diff --git a/block/file-posix.c b/block/file-posix.c > index 71f168ee2f13..87c5a4ccbdc8 100644 > --- a/block/file-posix.c > +++ b/block/file-posix.c > @@ -1588,6 +1588,13 @@ static int handle_aiocb_write_zeroes(void *opaque) > if (s->has_write_zeroes) { > int ret = do_fallocate(s->fd, FALLOC_FL_ZERO_RANGE, > aiocb->aio_offset, aiocb->aio_nbytes); > + if (ret == -EINVAL) { > + /* > + * Allow falling back to pwrite for file systems that > + * do not support fallocate() for an unaligned byte range. > + */ > + return -ENOTSUP; > + } > if (ret == 0 || ret != -ENOTSUP) { > return ret; > } >
diff --git a/block/io.c b/block/io.c index 0fa10831edb7..16a598fd0857 100644 --- a/block/io.c +++ b/block/io.c @@ -1746,7 +1746,7 @@ static int coroutine_fn bdrv_co_do_pwrite_zeroes(BlockDriverState *bs, assert(!bs->supported_zero_flags); } - if (ret < 0 && !(flags & BDRV_REQ_NO_FALLBACK)) { + if (ret == -ENOTSUP && !(flags & BDRV_REQ_NO_FALLBACK)) { /* Fall back to bounce buffer if write zeroes is unsupported */ BdrvRequestFlags write_flags = flags & ~BDRV_REQ_ZERO_WRITE; diff --git a/block/file-posix.c b/block/file-posix.c index 71f168ee2f13..87c5a4ccbdc8 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -1588,6 +1588,13 @@ static int handle_aiocb_write_zeroes(void *opaque) if (s->has_write_zeroes) { int ret = do_fallocate(s->fd, FALLOC_FL_ZERO_RANGE, aiocb->aio_offset, aiocb->aio_nbytes); + if (ret == -EINVAL) { + /* + * Allow falling back to pwrite for file systems that + * do not support fallocate() for an unaligned byte range. + */ + return -ENOTSUP; + } if (ret == 0 || ret != -ENOTSUP) { return ret; }