On Tue, 07/19 17:45, Paolo Bonzini wrote: > > > On 19/07/2016 17:28, Eric Blake wrote: > >> If I'm reading the NBD proto.md correctly, this is not enough if > >> NBD_CMD_FLAG_NO_HOLE is specified. We probably need to use a zeroed buffer > >> with > >> blk_pwrite, or pass a new flag (BDRV_RED_NO_HOLE) to blk_pwrite_zeroes to > >> enforce the bdrv_driver_pwritev() branch in bdrv_co_do_pwrite_zeroes(). > > I agree with Eric's interpretation. It's a bit weird to have the > direction inverted, but I'm not sure I see the ambiguity. Can you explain?
Write zeroes _means_ "punch hole" on a raw file. In block/raw-posix.c:handle_aiocb_write_zeroes(): > #ifdef CONFIG_FALLOCATE_PUNCH_HOLE > if (s->has_discard && s->has_fallocate) { > int ret = do_fallocate(s->fd, > FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, > aiocb->aio_offset, aiocb->aio_nbytes); > if (ret == 0) { > ret = do_fallocate(s->fd, 0, aiocb->aio_offset, > aiocb->aio_nbytes); > if (ret == 0 || ret != -ENOTSUP) { > return ret; > } > s->has_fallocate = false; > } else if (ret != -ENOTSUP) { > return ret; > } else { > s->has_discard = false; > } > } > #endif And unmap is translated to "punch hole", too. In block/raw-posix.c:handle_aiocb_discard(): > #ifdef CONFIG_FALLOCATE_PUNCH_HOLE > ret = do_fallocate(s->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, > aiocb->aio_offset, aiocb->aio_nbytes); > #endif So I agree that NBD_CMD_FLAG_NO_HOLE is a poorly named flag, because there is always going to be a hole event if it's set. Fam