qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-block] [PATCH 13/25] nbd: Enforce sector alignment


From: Max Reitz
Subject: [Qemu-block] [PATCH 13/25] nbd: Enforce sector alignment
Date: Wed, 25 Feb 2015 13:08:26 -0500

Operations on NBDs must be aligned to BDRV_SECTOR_SIZE. Enforce this.

Signed-off-by: Max Reitz <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]