On 10/14/2017 08:01 PM, Eric Blake wrote: > From: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> > > Split out nbd_request_simple_option to be reused for structured reply > option. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> > Signed-off-by: Eric Blake <ebl...@redhat.com> >
> +static int nbd_request_simple_option(QIOChannel *ioc, int opt, Error **errp) > +{ > + nbd_opt_reply reply; > + > + if (nbd_send_option_request(ioc, opt, 0, NULL, errp) < 0) { > + return -1; > + } > + > + if (nbd_receive_option_reply(ioc, opt, &reply, errp) < 0) { > + return -1; > + } > + > + if (reply.length != 0) { > + error_setg(errp, "Option %d ('%s') response length is %" PRIu32 > + " (it should be zero)", opt, nbd_opt_lookup(opt), > + reply.length); > + nbd_send_opt_abort(ioc); > + return -1; > + } > + > + if (reply.type == NBD_REP_ERR_UNSUP) { > + return 0; > + } Oops, these two conditions are swapped. A non-zero reply length is perfectly acceptable if the server is sending NBD_REP_ERR_UNSUP with an error message (as is the case with old qemu server, new qemu client). We can only enforce non-zero length... > + > + if (reply.type != NBD_REP_ACK) { > + error_setg(errp, "Server rejected request for option %d (%s) " > + "with reply %" PRIx32 " (%s)", opt, nbd_opt_lookup(opt), > + reply.type, nbd_rep_lookup(reply.type)); > + nbd_send_opt_abort(ioc); > + return -1; > + } > + ...here, after we know we got an ACK. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
signature.asc
Description: OpenPGP digital signature