From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:38390) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SrACz-00078P-JZ for qemu-devel@nongnu.org; Tue, 17 Jul 2012 12:01:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SrACt-0005nc-5S for qemu-devel@nongnu.org; Tue, 17 Jul 2012 12:01:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:22477) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SrACs-0005nU-U7 for qemu-devel@nongnu.org; Tue, 17 Jul 2012 12:01:03 -0400 From: Kevin Wolf Date: Tue, 17 Jul 2012 18:00:09 +0200 Message-Id: <1342540838-9027-13-git-send-email-kwolf@redhat.com> In-Reply-To: <1342540838-9027-1-git-send-email-kwolf@redhat.com> References: <1342540838-9027-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 12/41] hd-geometry: Clean up confusing use of prior translation hint List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Markus Armbruster When hd_geometry_guess() picks a geometry, it also picks the appropriate translation, but only when the prior translation hint is BIOS_ATA_TRANSLATION_AUTO. Looks wrong, because such a prior translation would be passed to the BIOS whether it's suitable for the geometry or not. Fortunately, that can't happen. There are just two ways for the translation hint to get set to something other than BIOS_ATA_TRANSLATION_AUTO: drive_init() on behalf of -drive trans=..., and hd_geometry_guess(). Both set it only when they also set a valid geometry hint, i.e. one with a non-zero number of cylinders. Since hd_geometry_guess() returns right away when it finds a valid geometry hint, translation can only be BIOS_ATA_TRANSLATION_AUTO in the remainder of the function. Assert this, and simplify accordingly. Signed-off-by: Markus Armbruster Signed-off-by: Kevin Wolf --- hw/hd-geometry.c | 17 +++++++---------- 1 files changed, 7 insertions(+), 10 deletions(-) diff --git a/hw/hd-geometry.c b/hw/hd-geometry.c index fb849a3..241aed9 100644 --- a/hw/hd-geometry.c +++ b/hw/hd-geometry.c @@ -132,6 +132,8 @@ void hd_geometry_guess(BlockDriverState *bs, return; } + assert(translation == BIOS_ATA_TRANSLATION_AUTO); + if (guess_disk_lchs(bs, &cylinders, &heads, &secs) < 0) { /* no LCHS guess: use a standard physical disk geometry */ guess_chs_for_size(bs, pcyls, pheads, psecs); @@ -140,12 +142,10 @@ void hd_geometry_guess(BlockDriverState *bs, translation was active, so a standard physical disk geometry is OK */ guess_chs_for_size(bs, pcyls, pheads, psecs); - if (translation == BIOS_ATA_TRANSLATION_AUTO) { - bdrv_set_translation_hint(bs, - *pcyls * *pheads <= 131072 - ? BIOS_ATA_TRANSLATION_LARGE - : BIOS_ATA_TRANSLATION_LBA); - } + bdrv_set_translation_hint(bs, + *pcyls * *pheads <= 131072 + ? BIOS_ATA_TRANSLATION_LARGE + : BIOS_ATA_TRANSLATION_LBA); } else { /* LCHS guess with heads <= 16: use as physical geometry */ *pcyls = cylinders; @@ -153,10 +153,7 @@ void hd_geometry_guess(BlockDriverState *bs, *psecs = secs; /* disable any translation to be in sync with the logical geometry */ - if (translation == BIOS_ATA_TRANSLATION_AUTO) { - bdrv_set_translation_hint(bs, - BIOS_ATA_TRANSLATION_NONE); - } + bdrv_set_translation_hint(bs, BIOS_ATA_TRANSLATION_NONE); } bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs); trace_hd_geometry_guess(bs, *pcyls, *pheads, *psecs, translation); -- 1.7.6.5