On 02/01/22 20:44, Eric Blake wrote:
 These are the trivial patches modeled after Nir's commit
7ba6ef67,
 fixing further places that fail to check *error during callbacks. 
I find these interfaces very difficult to use.
https://libguestfs.org/nbd_aio_block_status.3.html
We have two callbacks here, each takes a *error, and I have zero idea of
the order the callbacks are supposed to be called in.
The last paragraph of the commit message speaks about this, and the code
updates seem to suggest some ordering, but I'm still unsure.
... In fact, I'm now uncertain whether ignoring "err" in virt-v2v's
"lib/utils.ml", function "get_disk_allocated", is safe. It's a
"sync"
(not aio) nbd_block_status() call, but the documentation
<
https://libguestfs.org/nbd_block_status.3.html> says:
"On entry to the callback, the error parameter contains the errno value
of any previously detected error."
So what should we do then, in "get_disk_allocated"? Return -1
immediately? And if we do so, what is that going to mean for
"NBD.block_status"? Will it raise an exception?
Thanks,
Laszlo
 nbdcopy still has a bigger bug in that it is NOT properly checking
for
 *error in the pread/pwrite completion handlers, but fixing that
 gracefully (rather than just quitting the process immediately, as we
 can do in the examples), requires more invasive patches which I will
 be posting separately for review, while the ones posted here are
 trivial enough that I'm pushing them now (commits 23bcea4a..1373d423).
 
 I also audited other uses of completion callbacks:
 - in tests, closure-lifetimes, errors, server-death, and
   shutdown-flags are all safe (either the callback returns 0 and the
   code later calls nbd_aio_command_completed, or we are explicitly
   testing aspects of completion callbacks)
 - in fuse/operations.c, the completion callback returns 0 and calls
   nbd_aio_command_completed later
 - in examples/strict-structured-reads.c, the completion callback
   properly checks *error
 
 I also checked that nbdkit's nbd plugin properly checks *error.
 
 Eric Blake (4):
   examples: aio-connect-read.c: Fix error handling
   examples: glib-main-loop: don't strand commands when gsource
     disappears
   examples: glib-main-loop: Fix error handling
   copy: Ignore extents if we encountered earlier error
 
  examples/aio-connect-read.c |  7 +++++++
  examples/glib-main-loop.c   | 14 ++++++++++++--
  copy/nbd-ops.c              |  4 ++--
  3 files changed, 21 insertions(+), 4 deletions(-)