hw/nand: reject read-only drives

also gracefully fail on nand_device_init() for unsupported block
size instead of aborting.

Signed-off-by: Juha Riihimäki <juha.riihimaki@nokia.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Andrzej Zaborowski <andrew.zaborowski@intel.com>
This commit is contained in:
Juha Riihimäki 2011-10-20 14:53:34 +02:00 committed by Andrzej Zaborowski
parent b2887c43ee
commit 3fc3abf7ec

View File

@ -19,6 +19,7 @@
# include "flash.h" # include "flash.h"
# include "blockdev.h" # include "blockdev.h"
# include "sysbus.h" # include "sysbus.h"
#include "qemu-error.h"
# define NAND_CMD_READ0 0x00 # define NAND_CMD_READ0 0x00
# define NAND_CMD_READ1 0x01 # define NAND_CMD_READ1 0x01
@ -384,18 +385,23 @@ static int nand_device_init(SysBusDevice *dev)
nand_init_2048(s); nand_init_2048(s);
break; break;
default: default:
hw_error("%s: Unsupported NAND block size.\n", __func__); error_report("Unsupported NAND block size");
return -1;
} }
pagesize = 1 << s->oob_shift; pagesize = 1 << s->oob_shift;
s->mem_oob = 1; s->mem_oob = 1;
if (s->bdrv && bdrv_getlength(s->bdrv) >= if (s->bdrv) {
(s->pages << s->page_shift) + (s->pages << s->oob_shift)) { if (bdrv_is_read_only(s->bdrv)) {
pagesize = 0; error_report("Can't use a read-only drive");
s->mem_oob = 0; return -1;
} }
if (bdrv_getlength(s->bdrv) >=
if (!s->bdrv) { (s->pages << s->page_shift) + (s->pages << s->oob_shift)) {
pagesize = 0;
s->mem_oob = 0;
}
} else {
pagesize += 1 << s->page_shift; pagesize += 1 << s->page_shift;
} }
if (pagesize) { if (pagesize) {