Since Linux 5.10, write zeros to a multipath device using
ioctl(fd, BLKZEROOUT, range) with cache none or directsync return -EBUSY
permanently.
Similar to handle_aiocb_write_zeroes_unmap, handle_aiocb_write_zeroes_block
allow -EBUSY and -EINVAL errors during ioctl(fd, BLKZEROOUT, range).
Reference commit in Linux 5.10:
Although it will be fixed in 5.12, I think it's good to avoid similar problem in the future.
Signed-off-by: ChangLimin <changlm@chinatelecom.cn>
---
block/file-posix.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/block/file-posix.c b/block/file-posix.c
index 05079b40ca..4e132db929 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -1629,8 +1629,13 @@ static ssize_t handle_aiocb_write_zeroes_block(RawPosixAIOData *aiocb)
} while (errno == EINTR);
ret = translate_err(-errno);
- if (ret == -ENOTSUP) {
- s->has_write_zeroes = false;
+ switch (ret) {
+ case -ENOTSUP:
+ s->has_write_zeroes = false; /* fall through */
+ case -EINVAL:
+ case -EBUSY:
+ return -ENOTSUP;
+ break;
}
}
#endif
--
2.27.0