From: Alberto Garcia <[email protected]> Commit a362b19a39 ("hw/sd/sdcard: Fix size check for backing block image") accidentally moved the blk_set_dev_ops() call into the new 'if (blk_size >= 0)' block in sd_realize().
Because of that, if a drive is attached without a medium then the condition is false (blk_size == -ENOMEDIUM) and blk_set_dev_ops() is never called, so the drive is registered as having non-removable media: $QEMU -device sd-card,drive=sdcard0 -drive if=none,id=sdcard0 (qemu) change sdcard0 sd-card.qcow2 Error: Device 'sdcard0' is not removable This patch moves the blk_set_perm() and blk_set_dev_ops() calls outside of the 'if (blk_size >= 0)' block so the device ops and permissions are registered when a drive is attached. Cc: [email protected] Fixes: a362b19a39 ("hw/sd/sdcard: Fix size check for backing block image") Signed-off-by: Alberto Garcia <[email protected]> Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Message-ID: <[email protected]> Signed-off-by: Philippe Mathieu-Daudé <[email protected]> --- hw/sd/sd.c | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 674ca09b49f..b1b3b1226a7 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -3100,7 +3100,6 @@ static void sd_blk_size_error(SDState *sd, int64_t blk_size, static void sd_realize(DeviceState *dev, Error **errp) { SDState *sd = SDMMC_COMMON(dev); - int64_t blk_size = -ENOMEDIUM; int ret; switch (sd->spec_version) { @@ -3118,32 +3117,32 @@ static void sd_realize(DeviceState *dev, Error **errp) return; } - blk_size = blk_getlength(sd->blk); - } - if (blk_size >= 0) { - blk_size -= sd->boot_part_size * 2 + sd->rpmb_part_size; - if (blk_size > SDSC_MAX_CAPACITY) { - if (sd_is_emmc(sd) && - !QEMU_IS_ALIGNED(blk_size, 1 << HWBLOCK_SHIFT)) { - int64_t blk_size_aligned = - ((blk_size >> HWBLOCK_SHIFT) + 1) << HWBLOCK_SHIFT; - sd_blk_size_error(sd, blk_size, blk_size_aligned, - "multiples of 512", errp); + int64_t blk_size = blk_getlength(sd->blk); + if (blk_size >= 0) { + blk_size -= sd->boot_part_size * 2 + sd->rpmb_part_size; + if (blk_size > SDSC_MAX_CAPACITY) { + if (sd_is_emmc(sd) && + !QEMU_IS_ALIGNED(blk_size, 1 << HWBLOCK_SHIFT)) { + int64_t blk_size_aligned = + ((blk_size >> HWBLOCK_SHIFT) + 1) << HWBLOCK_SHIFT; + sd_blk_size_error(sd, blk_size, blk_size_aligned, + "multiples of 512", errp); + return; + } else if (!sd_is_emmc(sd) && + !QEMU_IS_ALIGNED(blk_size, 512 * KiB)) { + int64_t blk_size_aligned = ((blk_size >> 19) + 1) << 19; + sd_blk_size_error(sd, blk_size, blk_size_aligned, + "multiples of 512K", errp); + return; + } + } else if (blk_size > 0 && !is_power_of_2(blk_size)) { + sd_blk_size_error(sd, blk_size, pow2ceil(blk_size), + "a power of 2", errp); return; - } else if (!sd_is_emmc(sd) && - !QEMU_IS_ALIGNED(blk_size, 512 * KiB)) { - int64_t blk_size_aligned = ((blk_size >> 19) + 1) << 19; - sd_blk_size_error(sd, blk_size, blk_size_aligned, - "multiples of 512K", errp); + } else if (blk_size < 0) { + error_setg(errp, "eMMC image smaller than boot partitions"); return; } - } else if (blk_size > 0 && !is_power_of_2(blk_size)) { - sd_blk_size_error(sd, blk_size, pow2ceil(blk_size), "a power of 2", - errp); - return; - } else if (blk_size < 0) { - error_setg(errp, "eMMC image smaller than boot partitions"); - return; } ret = blk_set_perm(sd->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE, -- 2.53.0
