[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] enforce read only on disks
Hi all, currently even if you specify 'r' for a disk on your VM config file, qemu tries to open the file O_RDWR first. This patch enforces that a disk with mode = 'r' on xenstore is actually opened O_RDONLY. Regards, Stefano Stabellini Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> diff -r d2ff8a90436e block-raw-posix.c --- a/block-raw-posix.c Tue Dec 16 16:03:12 2008 +0000 +++ b/block-raw-posix.c Mon Jan 05 17:16:34 2009 +0000 @@ -133,7 +133,6 @@ open_flags |= O_RDWR; } else { open_flags |= O_RDONLY; - bs->read_only = 1; } if (flags & BDRV_O_CREAT) open_flags |= O_CREAT | O_TRUNC; diff -r d2ff8a90436e block.c --- a/block.c Tue Dec 16 16:03:12 2008 +0000 +++ b/block.c Mon Jan 05 17:16:34 2009 +0000 @@ -376,7 +376,6 @@ char tmp_filename[PATH_MAX]; char backing_filename[PATH_MAX]; - bs->read_only = 0; bs->is_temporary = 0; bs->encrypted = 0; @@ -444,12 +443,14 @@ bs->total_sectors = 0; /* driver will set if it does not do getlength */ if (bs->opaque == NULL && drv->instance_size > 0) return -1; - /* Note: for compatibility, we open disk image files as RDWR, and - RDONLY as fallback */ if (!(flags & BDRV_O_FILE)) - open_flags = BDRV_O_RDWR | (flags & BDRV_O_CACHE_MASK); + open_flags = flags & BDRV_O_CACHE_MASK; else open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT); + if (bs->read_only) + open_flags &= ~BDRV_O_RDWR; + else + open_flags |= BDRV_O_RDWR; ret = drv->bdrv_open(bs, filename, open_flags); if ((ret == -EACCES || ret == -EPERM) && !(flags & BDRV_O_FILE)) { ret = drv->bdrv_open(bs, filename, open_flags & ~BDRV_O_RDWR); @@ -867,6 +868,11 @@ int bdrv_is_read_only(BlockDriverState *bs) { return bs->read_only; +} + +void bdrv_set_read_only(BlockDriverState *bs) +{ + bs->read_only = 1; } int bdrv_is_sg(BlockDriverState *bs) diff -r d2ff8a90436e block.h --- a/block.h Tue Dec 16 16:03:12 2008 +0000 +++ b/block.h Mon Jan 05 17:16:34 2009 +0000 @@ -125,6 +125,7 @@ int bdrv_get_translation_hint(BlockDriverState *bs); int bdrv_is_removable(BlockDriverState *bs); int bdrv_is_read_only(BlockDriverState *bs); +void bdrv_set_read_only(BlockDriverState *bs); int bdrv_is_sg(BlockDriverState *bs); int bdrv_is_inserted(BlockDriverState *bs); int bdrv_media_changed(BlockDriverState *bs); diff -r d2ff8a90436e xenstore.c --- a/xenstore.c Tue Dec 16 16:03:12 2008 +0000 +++ b/xenstore.c Mon Jan 05 17:16:34 2009 +0000 @@ -297,7 +297,7 @@ char **e_danger = NULL; char *buf = NULL; char *fpath = NULL, *bpath = NULL, - *dev = NULL, *params = NULL, *drv = NULL; + *dev = NULL, *params = NULL, *mode = NULL, *drv = NULL; int i, any_hdN = 0, ret; unsigned int len, num, hd_index, pci_devid = 0; BlockDriverState *bs; @@ -413,6 +413,11 @@ params = newparams; format = &bdrv_raw; } + free(mode); + if (pasprintf(&buf, "%s/mode", bpath) == -1) + mode = NULL; + else + mode = xs_read(xsh, XBT_NULL, buf, &len); #if 0 /* Phantom VBDs are disabled because the use of paths @@ -454,6 +459,9 @@ if (pasprintf(&buf, "%s/params", bpath) != -1) xs_watch(xsh, buf, dev); } + + if (mode && strchr(mode, 'w') == NULL) + bdrv_set_read_only(bs); /* open device now if media present */ #ifdef CONFIG_STUBDOM @@ -571,6 +579,7 @@ } out: + free(mode); free(danger_type); free(params); free(dev); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |