9ae3a8
From e6e48f3e4e46ec72d85cfa663425ec820d438f5b Mon Sep 17 00:00:00 2001
9ae3a8
From: Kevin Wolf <kwolf@redhat.com>
9ae3a8
Date: Wed, 12 Aug 2015 14:18:40 +0200
9ae3a8
Subject: [PATCH 2/2] ide: Check validity of logical block size
9ae3a8
9ae3a8
Message-id: <1439389120-20473-2-git-send-email-kwolf@redhat.com>
9ae3a8
Patchwork-id: 67519
9ae3a8
O-Subject: [RHEL-7.2 qemu-kvm PATCH] ide: Check validity of logical block size
9ae3a8
Bugzilla: 1134670
9ae3a8
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
9ae3a8
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
9ae3a8
Our IDE emulation can't handle logical block sizes other than 512. Check
9ae3a8
for it.
9ae3a8
9ae3a8
The original assumption was that other values would silently be ignored
9ae3a8
(which is bad enough), but it's not quite true: The physical block size
9ae3a8
is exposed in IDENTIFY DEVICE as a multiple of the logical block size.
9ae3a8
Setting a logical block size therefore also corrupts the physical block
9ae3a8
size (4096/4096 doesn't silently downgrade to 4096/512, but 512/512).
9ae3a8
9ae3a8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
Reviewed-by: Markus Armbruster <armbru@redhat.com>
9ae3a8
Reviewed-by: John Snow <jsnow@redhat.com>
9ae3a8
(cherry picked from commit d20051856cd2fa8f10fed2d2a0b2751de5f7b20d)
9ae3a8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 hw/ide/qdev.c | 5 +++++
9ae3a8
 1 file changed, 5 insertions(+)
9ae3a8
9ae3a8
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
9ae3a8
index 1d84e15..44f36c3 100644
9ae3a8
--- a/hw/ide/qdev.c
9ae3a8
+++ b/hw/ide/qdev.c
9ae3a8
@@ -159,6 +159,11 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind)
9ae3a8
         return -1;
9ae3a8
     }
9ae3a8
 
9ae3a8
+    if (dev->conf.logical_block_size != 512) {
9ae3a8
+        error_report("logical_block_size must be 512 for IDE");
9ae3a8
+        return -1;
9ae3a8
+    }
9ae3a8
+
9ae3a8
     blkconf_serial(&dev->conf, &dev->serial);
9ae3a8
     if (kind != IDE_CD
9ae3a8
         && blkconf_geometry(&dev->conf, &dev->chs_trans, 65536, 16, 255) < 0) {
9ae3a8
-- 
9ae3a8
1.8.3.1
9ae3a8