aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/mini-os/blkfront.c5
-rw-r--r--extras/mini-os/include/blkfront.h2
-rw-r--r--extras/mini-os/kernel.c11
-rw-r--r--tools/ioemu/block-vbd.c3
4 files changed, 17 insertions, 4 deletions
diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c
index f5cf19cbe5..3a6c22aceb 100644
--- a/extras/mini-os/blkfront.c
+++ b/extras/mini-os/blkfront.c
@@ -70,7 +70,7 @@ void blkfront_handler(evtchn_port_t port, struct pt_regs *regs, void *data)
wake_up(&blkfront_queue);
}
-struct blkfront_dev *init_blkfront(char *nodename, uint64_t *sectors, unsigned *sector_size, int *mode)
+struct blkfront_dev *init_blkfront(char *nodename, uint64_t *sectors, unsigned *sector_size, int *mode, int *info)
{
xenbus_transaction_t xbt;
char* err;
@@ -176,6 +176,9 @@ done:
xenbus_unwatch_path(XBT_NIL, path);
+ snprintf(path, sizeof(path), "%s/info", dev->backend);
+ *info = xenbus_read_integer(path);
+
snprintf(path, sizeof(path), "%s/sectors", dev->backend);
// FIXME: read_integer returns an int, so disk size limited to 1TB for now
*sectors = dev->sectors = xenbus_read_integer(path);
diff --git a/extras/mini-os/include/blkfront.h b/extras/mini-os/include/blkfront.h
index 034c793ff6..687f8434dc 100644
--- a/extras/mini-os/include/blkfront.h
+++ b/extras/mini-os/include/blkfront.h
@@ -15,7 +15,7 @@ struct blkfront_aiocb
void (*aio_cb)(struct blkfront_aiocb *aiocb, int ret);
};
-struct blkfront_dev *init_blkfront(char *nodename, uint64_t *sectors, unsigned *sector_size, int *mode);
+struct blkfront_dev *init_blkfront(char *nodename, uint64_t *sectors, unsigned *sector_size, int *mode, int *info);
#ifdef HAVE_LIBC
int blkfront_open(struct blkfront_dev *dev);
#endif
diff --git a/extras/mini-os/kernel.c b/extras/mini-os/kernel.c
index a9074fdcf6..96535e5ec7 100644
--- a/extras/mini-os/kernel.c
+++ b/extras/mini-os/kernel.c
@@ -207,10 +207,19 @@ static void blk_write_sector(uint64_t sector)
static void blkfront_thread(void *p)
{
time_t lasttime = 0;
- blk_dev = init_blkfront(NULL, &blk_sectors, &blk_sector_size, &blk_mode);
+ int blk_info;
+
+ blk_dev = init_blkfront(NULL, &blk_sectors, &blk_sector_size, &blk_mode, &blk_info);
if (!blk_dev)
return;
+ if (blk_info & VDISK_CDROM)
+ printk("Block device is a CDROM\n");
+ if (blk_info & VDISK_REMOVABLE)
+ printk("Block device is removable\n");
+ if (blk_info & VDISK_READONLY)
+ printk("Block device is read-only\n");
+
#ifdef BLKTEST_WRITE
if (blk_mode == O_RDWR) {
blk_write_sector(0);
diff --git a/tools/ioemu/block-vbd.c b/tools/ioemu/block-vbd.c
index b8ad91692e..53c62484a5 100644
--- a/tools/ioemu/block-vbd.c
+++ b/tools/ioemu/block-vbd.c
@@ -51,6 +51,7 @@ typedef struct BDRVVbdState {
int fd;
int type;
int mode;
+ int info;
uint64_t sectors;
unsigned sector_size;
QEMU_LIST_ENTRY(BDRVVbdState) list;
@@ -80,7 +81,7 @@ static int vbd_open(BlockDriverState *bs, const char *filename, int flags)
//handy to test posix access
//return -EIO;
- s->dev = init_blkfront((char *) filename, &s->sectors, &s->sector_size, &s->mode);
+ s->dev = init_blkfront((char *) filename, &s->sectors, &s->sector_size, &s->mode, &s->info);
if (!s->dev)
return -EIO;