From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53017) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YQgOO-0002hC-5e for qemu-devel@nongnu.org; Wed, 25 Feb 2015 13:09:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YQgOL-0001j3-06 for qemu-devel@nongnu.org; Wed, 25 Feb 2015 13:09:04 -0500 From: Max Reitz Date: Wed, 25 Feb 2015 13:08:26 -0500 Message-Id: <1424887718-10800-14-git-send-email-mreitz@redhat.com> In-Reply-To: <1424887718-10800-1-git-send-email-mreitz@redhat.com> References: <1424887718-10800-1-git-send-email-mreitz@redhat.com> Subject: [Qemu-devel] [PATCH 13/25] nbd: Enforce sector alignment List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-block@nongnu.org Cc: Kevin Wolf , Paolo Bonzini , qemu-devel@nongnu.org, Stefan Hajnoczi , Max Reitz Operations on NBDs must be aligned to BDRV_SECTOR_SIZE. Enforce this. Signed-off-by: Max Reitz --- nbd.c | 21 +++++++++++++++++++++ qemu-nbd.c | 4 ++++ 2 files changed, 25 insertions(+) diff --git a/nbd.c b/nbd.c index 1cd7757..5764fd1 100644 --- a/nbd.c +++ b/nbd.c @@ -990,6 +990,13 @@ NBDExport *nbd_export_new(BlockBackend *blk, off_t dev_offset, off_t size, { NBDEjectNotifier *n; NBDExport *exp = g_malloc0(sizeof(NBDExport)); + + if (dev_offset % BDRV_SECTOR_SIZE) { + error_setg(errp, "NBD export offset must be a multiple of %i", + (int)BDRV_SECTOR_SIZE); + goto fail; + } + exp->refcount = 1; QTAILQ_INIT(&exp->clients); exp->blk = blk; @@ -1257,6 +1264,20 @@ static void nbd_trip(void *opaque) goto invalid_request; } + if (command == NBD_CMD_READ || + command == NBD_CMD_WRITE || + command == NBD_CMD_TRIM) + { + if (request.from % BDRV_SECTOR_SIZE) { + goto invalid_request; + } + assert(!((request.from + exp->dev_offset) % BDRV_SECTOR_SIZE)); + + if (request.len % BDRV_SECTOR_SIZE) { + goto invalid_request; + } + } + switch (command) { case NBD_CMD_READ: TRACE("Request type is READ"); diff --git a/qemu-nbd.c b/qemu-nbd.c index 511857e..cc13664 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -535,6 +535,10 @@ int main(int argc, char **argv) if (errno) { err(EXIT_FAILURE, "Invalid offset `%s'", optarg); } + if (dev_offset % BDRV_SECTOR_SIZE) { + errx(EXIT_FAILURE, "Offset must be a multiple of %i", + (int)BDRV_SECTOR_SIZE); + } break; case 'l': if (strstart(optarg, SNAPSHOT_OPT_BASE, NULL)) { -- 2.1.0