From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=40156 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PrYup-00031o-8W for qemu-devel@nongnu.org; Mon, 21 Feb 2011 11:47:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PrYui-00075R-Dn for qemu-devel@nongnu.org; Mon, 21 Feb 2011 11:47:09 -0500 Received: from mx1.redhat.com ([209.132.183.28]:6642) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PrYui-00075J-5q for qemu-devel@nongnu.org; Mon, 21 Feb 2011 11:47:08 -0500 Message-ID: <4D629771.2090702@redhat.com> Date: Mon, 21 Feb 2011 17:48:49 +0100 From: Kevin Wolf MIME-Version: 1.0 References: <1298033729-17945-1-git-send-email-nick@bytemark.co.uk> <1298033729-17945-3-git-send-email-nick@bytemark.co.uk> <4D6261B2.4060108@redhat.com> <1298305909.17006.111.camel@desk4.office.bytemark.co.uk> In-Reply-To: <1298305909.17006.111.camel@desk4.office.bytemark.co.uk> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 3/3] block/nbd: Make the NBD block device use the AIO interface List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Nicholas Thomas Cc: stefanha@gmail.com, qemu-devel@nongnu.org Am 21.02.2011 17:31, schrieb Nicholas Thomas: > Hi again, > > Thanks for looking through the patches. I'm just going through and > making the suggested changes now. I've also got qemu-nbd and block/nbd.c > working over IPv6 :) - hopefully I'll be able to provide patches in a > couple of days. Just a few questions about some of the changes... > > Canceled requests: >>> + >>> + >>> +static void nbd_aio_cancel(BlockDriverAIOCB *blockacb) >>> +{ >>> + NBDAIOCB *acb = (NBDAIOCB *)blockacb; >>> + >>> + /* >>> + * We cannot cancel the requests which are already sent to >>> + * the servers, so we just complete the request with -EIO here. >>> + */ >>> + acb->common.cb(acb->common.opaque, -EIO); >>> + acb->canceled = 1; >>> +} >> >> I think you need to check for acb->canceled before you write to the >> associated buffer when receiving the reply for a read request. The >> buffer might not exist any more after the request is cancelled. > > I "borrowed" this code from block/sheepdog.c (along with a fair few > other bits ;) ) - which doesn't seem to do any special checking for > cancelled write requests. So if there is a potential SIGSEGV here, I > guess sheepdog is also vulnerable. Right, now that you mention it, I seem to remember this from Sheepdog. I think I had a discussion with Stefan and he convinced me that we could get away with it in Sheepdog because of some condition that Sheepdog meets. Not sure any more what that condition was and if it applies to NBD. Was it that Sheepdog has a bounce buffer for all requests? > Presumably, in aio_read_response, I'd need to allocate a buffer of the > appropriate size, read the data from the socket, then deallocate the > buffer? Or would fsetpos(fd, ftell(fd)+data_len) be sufficient? I don't think that fseek works with sockets, so you'd probably need to read into a temporary buffer, yes. > qemu-io doesn't seem to have any provisions for testing this particular > code path - can you think of any tests I could run to ensure > correctness? I've no idea under what situations an IO request might be > cancelled. aio_cancel is hard to implement and hard to test, and I would be surprised if any format more complex than raw got it completely right... >>> +static BlockDriverAIOCB *nbd_aio_readv(BlockDriverState *bs, >>> + int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, >>> + BlockDriverCompletionFunc *cb, void *opaque) >>> +{ >>> [...] >>> + for (i = 0; i < qiov->niov; i++) { >>> + memset(qiov->iov[i].iov_base, 0, qiov->iov[i].iov_len); >>> + } >> >> qemu_iovec_memset? >> >> What is this even for? Aren't these zeros overwritten anyway? > > Again, present in sheepdog - but it does seem to work fine without it. > I'll remove it from NBD. Maybe Sheepdog reads only partially from the server if blocks are unallocated or something. Kevin