* [Qemu-devel] PATCH: Control over drive open modes for backing file @ 2008-07-31 11:31 Daniel P. Berrange 2008-07-31 12:15 ` Jamie Lokier ` (2 more replies) 0 siblings, 3 replies; 21+ messages in thread From: Daniel P. Berrange @ 2008-07-31 11:31 UTC (permalink / raw) To: qemu-devel The current block driver code will attempt to open a file backing a drive for read/write with O_RDWR first, and if that fails, fallback to opening it readonly with O_RDONLY. So if you set file permissions to readonly on the underlying drive backing store, QEMU will fallback to opening it read only, and discard any writes. Xen has a concept of a read-only disks in its configuration format, and thus it would be desirable to have an explicit option to request that a drive operate read-only, regardless of whether underlying file permissions allow write access or not. We'd like to support this in libvirt too for QEMU/KVM guests. Finally, in some cases it is desirable to see the failure if the disk can't be opened read-write, rather than falling back to read only mode - many guests will be more or less inoperable if their root filesystem is read-only so there's little point booting. The current block.h file did already have flags defined #define BDRV_O_RDONLY 0x0000 #define BDRV_O_RDWR 0x0002 #define BDRV_O_ACCESS 0x0003 However the bdrv_open2() method was treating a 'flags' value of 0, as being effectively RDWR, and nearly all callers pass in 0 even when they expect to get a writable file, so the O_RDONLY flag was useless as is. So this patch does a couple of things: - Change the access flags to be #define BDRV_O_RDONLY 0x0001 /* Force read-only */ #define BDRV_O_WRONLY 0x0002 /* Force writeable, no fallback */ #define BDRV_O_RDWR 0x0003 /* Try writeable, fallback to read-only */ - Change all callers of bdrv_open/open2/file_open to pass the correct access flags they desire instead of 0. - Adds a new option to the '-drive' command line parameter to specify how the file should be opened, and any fallback mode=rw - try to open read-write first, and fallback to read-only if getting EACCESS. This is the default, and matches current behaviour. mode=wo - try to open read-write and exit if this fails. mode=ro - try to open read-only and exit if this fails - Extends the monitor 'change' command to allow an optional mode to be specified, again defaulting to current behaviour. Takes the same values as the 'mode' param Signed-off-by: Daniel P. Berrange <berrange@redhat.com> This is against SVN revision 4975, but will likely conflict with the other patch currently being discussed onlist wrt to qcow encryption and passwords. I can trivially rebase it if required. Daniel Index: block-raw-win32.c =================================================================== --- block-raw-win32.c (revision 4975) +++ block-raw-win32.c (working copy) @@ -90,7 +90,7 @@ s->type = FTYPE_FILE; - if ((flags & BDRV_O_ACCESS) == O_RDWR) { + if (flags & BDRV_O_WRONLY) { access_flags = GENERIC_READ | GENERIC_WRITE; } else { access_flags = GENERIC_READ; @@ -463,7 +463,7 @@ } s->type = find_device_type(bs, filename); - if ((flags & BDRV_O_ACCESS) == O_RDWR) { + if (flags & BDRV_O_WRONLY) { access_flags = GENERIC_READ | GENERIC_WRITE; } else { access_flags = GENERIC_READ; Index: vl.c =================================================================== --- vl.c (revision 4975) +++ vl.c (working copy) @@ -5399,11 +5399,12 @@ int max_devs; int index; int cache; + int mode = BDRV_O_RDWR; /* Default to writable, with fallback to readonly for back-compat */ int bdrv_flags; char *str = arg->opt; char *params[] = { "bus", "unit", "if", "index", "cyls", "heads", "secs", "trans", "media", "snapshot", "file", - "cache", "format", NULL }; + "cache", "format", "mode", NULL }; if (check_params(buf, sizeof(buf), params, str) < 0) { fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n", @@ -5585,6 +5586,14 @@ } } + if (get_param_value(buf, sizeof(buf), "mode", str)) { + if (strcmp(buf, "ro") == 0) + mode = BDRV_O_RDONLY; + else if (strcmp(buf, "wo") == 0) + mode = BDRV_O_WRONLY; + } + + if (arg->file == NULL) get_param_value(file, sizeof(file), "file", str); else @@ -5682,7 +5691,7 @@ } if (!file[0]) return 0; - bdrv_flags = 0; + bdrv_flags = mode; if (snapshot) bdrv_flags |= BDRV_O_SNAPSHOT; if (!cache) @@ -7605,7 +7614,7 @@ "-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n" "-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n" " [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n" - " [,cache=on|off][,format=f]\n" + " [,cache=on|off][,format=f][,mode=ro|wo|rw]\n" " use 'file' as a drive image\n" "-mtdblock file use 'file' as on-board Flash memory image\n" "-sd file use 'file' as SecureDigital card image\n" Index: block-raw-posix.c =================================================================== --- block-raw-posix.c (revision 4975) +++ block-raw-posix.c (working copy) @@ -103,7 +103,7 @@ s->lseek_err_cnt = 0; open_flags = O_BINARY; - if ((flags & BDRV_O_ACCESS) == O_RDWR) { + if (flags & BDRV_O_WRONLY) { open_flags |= O_RDWR; } else { open_flags |= O_RDONLY; @@ -896,7 +896,7 @@ } #endif open_flags = O_BINARY; - if ((flags & BDRV_O_ACCESS) == O_RDWR) { + if (flags & BDRV_O_WRONLY) { open_flags |= O_RDWR; } else { open_flags |= O_RDONLY; Index: qemu-nbd.c =================================================================== --- qemu-nbd.c (revision 4975) +++ qemu-nbd.c (working copy) @@ -332,6 +332,11 @@ if (bs == NULL) return 1; + if (readonly) + flags |= BDRV_O_RDONLY; + else + flags |= BDRV_O_RDWR; + if (bdrv_open(bs, argv[optind], flags) == -1) return 1; Index: qemu-doc.texi =================================================================== --- qemu-doc.texi (revision 4975) +++ qemu-doc.texi (working copy) @@ -268,6 +268,10 @@ @var{snapshot} is "on" or "off" and allows to enable snapshot for given drive (see @option{-snapshot}). @item cache=@var{cache} @var{cache} is "on" or "off" and allows to disable host cache to access data. +@item mode=@var{mode} +@var{mode} is "rw" to open the file read-write, falling back to read-only on failure, +"wo" to open the file read-write, with no fallback or "ro" to open the file read-only. +The default is "rw". @item format=@var{format} Specify which disk @var{format} will be used rather than detecting the format. Can be used to specifiy format=raw to avoid interpreting Index: monitor.c =================================================================== --- monitor.c (revision 4975) +++ monitor.c (working copy) @@ -396,11 +396,19 @@ eject_device(bs, force); } -static void do_change_block(const char *device, const char *filename, const char *fmt) +static void do_change_block(const char *device, const char *filename, const char *fmt, const char *mode) { BlockDriverState *bs; BlockDriver *drv = NULL; + int flags = BDRV_O_RDWR; + if (mode) { + if (strcmp(mode, "ro") == 0) + flags = BDRV_O_RDONLY; + else if (strcmp(mode, "wo") == 0) + flags = BDRV_O_WRONLY; + } + bs = bdrv_find(device); if (!bs) { term_printf("device not found\n"); @@ -415,7 +423,7 @@ } if (eject_device(bs, 0) < 0) return; - bdrv_open2(bs, filename, 0, drv); + bdrv_open2(bs, filename, flags, drv); qemu_key_check(bs, filename); } @@ -434,12 +442,12 @@ } } -static void do_change(const char *device, const char *target, const char *fmt) +static void do_change(const char *device, const char *target, const char *fmt, const char *mode) { if (strcmp(device, "vnc") == 0) { do_change_vnc(target); } else { - do_change_block(device, target, fmt); + do_change_block(device, target, fmt, mode); } } @@ -1374,8 +1382,8 @@ "", "quit the emulator" }, { "eject", "-fB", do_eject, "[-f] device", "eject a removable medium (use -f to force it)" }, - { "change", "BFs?", do_change, - "device filename [format]", "change a removable medium, optional format" }, + { "change", "BFs?s?", do_change, + "device filename [format] [mode]", "change a removable medium, optional format and mode" }, { "screendump", "F", do_screen_dump, "filename", "save screen into PPM image 'filename'" }, { "logfile", "F", do_logfile, Index: block.c =================================================================== --- block.c (revision 4975) +++ block.c (working copy) @@ -348,7 +348,7 @@ if (!bs1) { return -ENOMEM; } - if (bdrv_open(bs1, filename, 0) < 0) { + if (bdrv_open(bs1, filename, BDRV_O_RDWR) < 0) { bdrv_delete(bs1); return -1; } @@ -381,15 +381,20 @@ bs->opaque = qemu_mallocz(drv->instance_size); 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 O_WRONLY and O_RDONLY are set, try read-write and fallback + * to readonly + * If only O_WRONLY is set, then try read-write with no fallback + * If only O_RDONLY is set, then try read-only with no fallback + */ if (!(flags & BDRV_O_FILE)) - open_flags = BDRV_O_RDWR | (flags & BDRV_O_DIRECT); + open_flags = (flags & (BDRV_O_DIRECT | BDRV_O_RDWR)); else open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT); ret = drv->bdrv_open(bs, filename, open_flags); - if (ret == -EACCES && !(flags & BDRV_O_FILE)) { - ret = drv->bdrv_open(bs, filename, BDRV_O_RDONLY); + if (ret == -EACCES && !(flags & BDRV_O_FILE) && + ((flags & BDRV_O_RDWR) == BDRV_O_RDWR)) { + open_flags = (flags & (BDRV_O_DIRECT | BDRV_O_RDONLY)); + ret = drv->bdrv_open(bs, filename, open_flags); bs->read_only = 1; } if (ret < 0) { @@ -416,7 +421,7 @@ } path_combine(backing_filename, sizeof(backing_filename), filename, bs->backing_file); - if (bdrv_open(bs->backing_hd, backing_filename, 0) < 0) + if (bdrv_open(bs->backing_hd, backing_filename, flags & BDRV_O_RDWR) < 0) goto fail; } Index: block.h =================================================================== --- block.h (revision 4975) +++ block.h (working copy) @@ -36,9 +36,9 @@ uint64_t vm_clock_nsec; /* VM clock relative to boot */ } QEMUSnapshotInfo; -#define BDRV_O_RDONLY 0x0000 -#define BDRV_O_RDWR 0x0002 -#define BDRV_O_ACCESS 0x0003 +#define BDRV_O_RDONLY 0x0001 /* Force read-only */ +#define BDRV_O_WRONLY 0x0002 /* Force writeable, no fallback */ +#define BDRV_O_RDWR 0x0003 /* Try writeable, fallback to read-only */ #define BDRV_O_CREAT 0x0004 /* create an empty file */ #define BDRV_O_SNAPSHOT 0x0008 /* open the file read only and save writes in a snapshot */ #define BDRV_O_FILE 0x0010 /* open as a raw file (do not try to Index: hw/usb-msd.c =================================================================== --- hw/usb-msd.c (revision 4975) +++ hw/usb-msd.c (working copy) @@ -523,7 +523,7 @@ return NULL; bdrv = bdrv_new("usb"); - if (bdrv_open(bdrv, filename, 0) < 0) + if (bdrv_open(bdrv, filename, BDRV_O_RDWR) < 0) goto fail; if (qemu_key_check(bdrv, filename)) goto fail; Index: qemu-img.c =================================================================== --- qemu-img.c (revision 4975) +++ qemu-img.c (working copy) @@ -186,7 +186,7 @@ } else { drv = NULL; } - if (bdrv_open2(bs, filename, 0, drv) < 0) { + if (bdrv_open2(bs, filename, BDRV_O_RDWR, drv) < 0) { error("Could not open '%s'", filename); } if (bdrv_is_encrypted(bs)) { @@ -317,7 +317,7 @@ } else { drv = NULL; } - if (bdrv_open2(bs, filename, 0, drv) < 0) { + if (bdrv_open2(bs, filename, BDRV_O_RDWR, drv) < 0) { error("Could not open '%s'", filename); } ret = bdrv_commit(bs); @@ -691,7 +691,7 @@ } else { drv = NULL; } - if (bdrv_open2(bs, filename, 0, drv) < 0) { + if (bdrv_open2(bs, filename, BDRV_O_RDWR, drv) < 0) { error("Could not open '%s'", filename); } bdrv_get_format(bs, fmt_name, sizeof(fmt_name)); -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 11:31 [Qemu-devel] PATCH: Control over drive open modes for backing file Daniel P. Berrange @ 2008-07-31 12:15 ` Jamie Lokier 2008-07-31 13:08 ` Daniel P. Berrange 2008-07-31 13:34 ` Daniel P. Berrange 2008-07-31 18:26 ` Anthony Liguori 2 siblings, 1 reply; 21+ messages in thread From: Jamie Lokier @ 2008-07-31 12:15 UTC (permalink / raw) To: Daniel P. Berrange, qemu-devel Daniel P. Berrange wrote: > - Adds a new option to the '-drive' command line parameter to specify > how the file should be opened, and any fallback I would like to open the main file read-write, but the backing file read-only, as the backing file is shared among many images. Can your options choose that? The monitor 'commit' command implies that the (first) backing file is opened writable, if the main file is. -- Jamie ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 12:15 ` Jamie Lokier @ 2008-07-31 13:08 ` Daniel P. Berrange 0 siblings, 0 replies; 21+ messages in thread From: Daniel P. Berrange @ 2008-07-31 13:08 UTC (permalink / raw) To: Jamie Lokier; +Cc: qemu-devel On Thu, Jul 31, 2008 at 01:15:37PM +0100, Jamie Lokier wrote: > Daniel P. Berrange wrote: > > - Adds a new option to the '-drive' command line parameter to specify > > how the file should be opened, and any fallback > > I would like to open the main file read-write, but the backing file > read-only, as the backing file is shared among many images. > > Can your options choose that? No, you'd need to add further options for that - the existing code opens the backing files with same mode as the primary files, and my change maintains that behaviour. Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 11:31 [Qemu-devel] PATCH: Control over drive open modes for backing file Daniel P. Berrange 2008-07-31 12:15 ` Jamie Lokier @ 2008-07-31 13:34 ` Daniel P. Berrange 2008-07-31 13:46 ` Paul Brook 2008-07-31 18:26 ` Anthony Liguori 2 siblings, 1 reply; 21+ messages in thread From: Daniel P. Berrange @ 2008-07-31 13:34 UTC (permalink / raw) To: qemu-devel On Thu, Jul 31, 2008 at 12:31:20PM +0100, Daniel P. Berrange wrote: > The current block driver code will attempt to open a file backing a drive > for read/write with O_RDWR first, and if that fails, fallback to opening > it readonly with O_RDONLY. So if you set file permissions to readonly on > the underlying drive backing store, QEMU will fallback to opening it read > only, and discard any writes. > > Xen has a concept of a read-only disks in its configuration format, and > thus it would be desirable to have an explicit option to request that a > drive operate read-only, regardless of whether underlying file permissions > allow write access or not. We'd like to support this in libvirt too for > QEMU/KVM guests. Finally, in some cases it is desirable to see the failure > if the disk can't be opened read-write, rather than falling back to read > only mode - many guests will be more or less inoperable if their root > filesystem is read-only so there's little point booting. > > The current block.h file did already have flags defined > > #define BDRV_O_RDONLY 0x0000 > #define BDRV_O_RDWR 0x0002 > #define BDRV_O_ACCESS 0x0003 > > However the bdrv_open2() method was treating a 'flags' value of 0, as being > effectively RDWR, and nearly all callers pass in 0 even when they expect > to get a writable file, so the O_RDONLY flag was useless as is. > > So this patch does a couple of things: > > - Change the access flags to be > > #define BDRV_O_RDONLY 0x0001 /* Force read-only */ > #define BDRV_O_WRONLY 0x0002 /* Force writeable, no fallback */ > #define BDRV_O_RDWR 0x0003 /* Try writeable, fallback to read-only */ > > - Change all callers of bdrv_open/open2/file_open to pass the correct > access flags they desire instead of 0. > > - Adds a new option to the '-drive' command line parameter to specify > how the file should be opened, and any fallback > > mode=rw - try to open read-write first, and fallback to read-only > if getting EACCESS. This is the default, and matches > current behaviour. > mode=wo - try to open read-write and exit if this fails. > mode=ro - try to open read-only and exit if this fails > > - Extends the monitor 'change' command to allow an optional mode to > be specified, again defaulting to current behaviour. Takes the same > values as the 'mode' param > > Signed-off-by: Daniel P. Berrange <berrange@redhat.com> > > This is against SVN revision 4975, but will likely conflict with the > other patch currently being discussed onlist wrt to qcow encryption > and passwords. I can trivially rebase it if required. There was a minor bug in the previous version - I opened readonly, but failed to set the internal read_only flag on the block device so 'info block' reported wrong data. This corrects that flaw: Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Regards, Daniel Index: block-raw-win32.c =================================================================== --- block-raw-win32.c (revision 4975) +++ block-raw-win32.c (working copy) @@ -90,7 +90,7 @@ s->type = FTYPE_FILE; - if ((flags & BDRV_O_ACCESS) == O_RDWR) { + if (flags & BDRV_O_WRONLY) { access_flags = GENERIC_READ | GENERIC_WRITE; } else { access_flags = GENERIC_READ; @@ -463,7 +463,7 @@ } s->type = find_device_type(bs, filename); - if ((flags & BDRV_O_ACCESS) == O_RDWR) { + if (flags & BDRV_O_WRONLY) { access_flags = GENERIC_READ | GENERIC_WRITE; } else { access_flags = GENERIC_READ; Index: vl.c =================================================================== --- vl.c (revision 4975) +++ vl.c (working copy) @@ -5399,11 +5399,12 @@ int max_devs; int index; int cache; + int mode = BDRV_O_RDWR; /* Default to writable, with fallback to readonly for back-compat */ int bdrv_flags; char *str = arg->opt; char *params[] = { "bus", "unit", "if", "index", "cyls", "heads", "secs", "trans", "media", "snapshot", "file", - "cache", "format", NULL }; + "cache", "format", "mode", NULL }; if (check_params(buf, sizeof(buf), params, str) < 0) { fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n", @@ -5585,6 +5586,14 @@ } } + if (get_param_value(buf, sizeof(buf), "mode", str)) { + if (strcmp(buf, "ro") == 0) + mode = BDRV_O_RDONLY; + else if (strcmp(buf, "wo") == 0) + mode = BDRV_O_WRONLY; + } + + if (arg->file == NULL) get_param_value(file, sizeof(file), "file", str); else @@ -5682,7 +5691,7 @@ } if (!file[0]) return 0; - bdrv_flags = 0; + bdrv_flags = mode; if (snapshot) bdrv_flags |= BDRV_O_SNAPSHOT; if (!cache) @@ -7605,7 +7614,7 @@ "-cdrom file use 'file' as IDE cdrom image (cdrom is ide1 master)\n" "-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n" " [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n" - " [,cache=on|off][,format=f]\n" + " [,cache=on|off][,format=f][,mode=ro|wo|rw]\n" " use 'file' as a drive image\n" "-mtdblock file use 'file' as on-board Flash memory image\n" "-sd file use 'file' as SecureDigital card image\n" Index: block-raw-posix.c =================================================================== --- block-raw-posix.c (revision 4975) +++ block-raw-posix.c (working copy) @@ -103,7 +103,7 @@ s->lseek_err_cnt = 0; open_flags = O_BINARY; - if ((flags & BDRV_O_ACCESS) == O_RDWR) { + if (flags & BDRV_O_WRONLY) { open_flags |= O_RDWR; } else { open_flags |= O_RDONLY; @@ -896,7 +896,7 @@ } #endif open_flags = O_BINARY; - if ((flags & BDRV_O_ACCESS) == O_RDWR) { + if (flags & BDRV_O_WRONLY) { open_flags |= O_RDWR; } else { open_flags |= O_RDONLY; Index: qemu-nbd.c =================================================================== --- qemu-nbd.c (revision 4975) +++ qemu-nbd.c (working copy) @@ -332,6 +332,11 @@ if (bs == NULL) return 1; + if (readonly) + flags |= BDRV_O_RDONLY; + else + flags |= BDRV_O_RDWR; + if (bdrv_open(bs, argv[optind], flags) == -1) return 1; Index: qemu-doc.texi =================================================================== --- qemu-doc.texi (revision 4975) +++ qemu-doc.texi (working copy) @@ -268,6 +268,10 @@ @var{snapshot} is "on" or "off" and allows to enable snapshot for given drive (see @option{-snapshot}). @item cache=@var{cache} @var{cache} is "on" or "off" and allows to disable host cache to access data. +@item mode=@var{mode} +@var{mode} is "rw" to open the file read-write, falling back to read-only on failure, +"wo" to open the file read-write, with no fallback or "ro" to open the file read-only. +The default is "rw". @item format=@var{format} Specify which disk @var{format} will be used rather than detecting the format. Can be used to specifiy format=raw to avoid interpreting Index: monitor.c =================================================================== --- monitor.c (revision 4975) +++ monitor.c (working copy) @@ -396,11 +396,19 @@ eject_device(bs, force); } -static void do_change_block(const char *device, const char *filename, const char *fmt) +static void do_change_block(const char *device, const char *filename, const char *fmt, const char *mode) { BlockDriverState *bs; BlockDriver *drv = NULL; + int flags = BDRV_O_RDWR; + if (mode) { + if (strcmp(mode, "ro") == 0) + flags = BDRV_O_RDONLY; + else if (strcmp(mode, "wo") == 0) + flags = BDRV_O_WRONLY; + } + bs = bdrv_find(device); if (!bs) { term_printf("device not found\n"); @@ -415,7 +423,7 @@ } if (eject_device(bs, 0) < 0) return; - bdrv_open2(bs, filename, 0, drv); + bdrv_open2(bs, filename, flags, drv); qemu_key_check(bs, filename); } @@ -434,12 +442,12 @@ } } -static void do_change(const char *device, const char *target, const char *fmt) +static void do_change(const char *device, const char *target, const char *fmt, const char *mode) { if (strcmp(device, "vnc") == 0) { do_change_vnc(target); } else { - do_change_block(device, target, fmt); + do_change_block(device, target, fmt, mode); } } @@ -1374,8 +1382,8 @@ "", "quit the emulator" }, { "eject", "-fB", do_eject, "[-f] device", "eject a removable medium (use -f to force it)" }, - { "change", "BFs?", do_change, - "device filename [format]", "change a removable medium, optional format" }, + { "change", "BFs?s?", do_change, + "device filename [format] [mode]", "change a removable medium, optional format and mode" }, { "screendump", "F", do_screen_dump, "filename", "save screen into PPM image 'filename'" }, { "logfile", "F", do_logfile, Index: block.c =================================================================== --- block.c (revision 4975) +++ block.c (working copy) @@ -348,7 +348,7 @@ if (!bs1) { return -ENOMEM; } - if (bdrv_open(bs1, filename, 0) < 0) { + if (bdrv_open(bs1, filename, BDRV_O_RDWR) < 0) { bdrv_delete(bs1); return -1; } @@ -381,16 +381,23 @@ bs->opaque = qemu_mallocz(drv->instance_size); 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 O_WRONLY and O_RDONLY are set, try read-write and fallback + * to readonly + * If only O_WRONLY is set, then try read-write with no fallback + * If only O_RDONLY is set, then try read-only with no fallback + */ if (!(flags & BDRV_O_FILE)) - open_flags = BDRV_O_RDWR | (flags & BDRV_O_DIRECT); + open_flags = (flags & (BDRV_O_DIRECT | BDRV_O_RDWR)); else open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT); ret = drv->bdrv_open(bs, filename, open_flags); - if (ret == -EACCES && !(flags & BDRV_O_FILE)) { - ret = drv->bdrv_open(bs, filename, BDRV_O_RDONLY); + if (ret == 0 && ((flags & BDRV_O_RDWR) == BDRV_O_RDONLY)) bs->read_only = 1; + if (ret == -EACCES && !(flags & BDRV_O_FILE) && + ((flags & BDRV_O_RDWR) == BDRV_O_RDWR)) { + open_flags = (flags & (BDRV_O_DIRECT | BDRV_O_RDONLY)); + ret = drv->bdrv_open(bs, filename, open_flags); + bs->read_only = 1; } if (ret < 0) { qemu_free(bs->opaque); @@ -416,7 +423,7 @@ } path_combine(backing_filename, sizeof(backing_filename), filename, bs->backing_file); - if (bdrv_open(bs->backing_hd, backing_filename, 0) < 0) + if (bdrv_open(bs->backing_hd, backing_filename, flags & BDRV_O_RDWR) < 0) goto fail; } Index: block.h =================================================================== --- block.h (revision 4975) +++ block.h (working copy) @@ -36,9 +36,9 @@ uint64_t vm_clock_nsec; /* VM clock relative to boot */ } QEMUSnapshotInfo; -#define BDRV_O_RDONLY 0x0000 -#define BDRV_O_RDWR 0x0002 -#define BDRV_O_ACCESS 0x0003 +#define BDRV_O_RDONLY 0x0001 /* Force read-only */ +#define BDRV_O_WRONLY 0x0002 /* Force writeable, no fallback */ +#define BDRV_O_RDWR 0x0003 /* Try writeable, fallback to read-only */ #define BDRV_O_CREAT 0x0004 /* create an empty file */ #define BDRV_O_SNAPSHOT 0x0008 /* open the file read only and save writes in a snapshot */ #define BDRV_O_FILE 0x0010 /* open as a raw file (do not try to Index: hw/usb-msd.c =================================================================== --- hw/usb-msd.c (revision 4975) +++ hw/usb-msd.c (working copy) @@ -523,7 +523,7 @@ return NULL; bdrv = bdrv_new("usb"); - if (bdrv_open(bdrv, filename, 0) < 0) + if (bdrv_open(bdrv, filename, BDRV_O_RDWR) < 0) goto fail; if (qemu_key_check(bdrv, filename)) goto fail; Index: qemu-img.c =================================================================== --- qemu-img.c (revision 4975) +++ qemu-img.c (working copy) @@ -186,7 +186,7 @@ } else { drv = NULL; } - if (bdrv_open2(bs, filename, 0, drv) < 0) { + if (bdrv_open2(bs, filename, BDRV_O_RDWR, drv) < 0) { error("Could not open '%s'", filename); } if (bdrv_is_encrypted(bs)) { @@ -317,7 +317,7 @@ } else { drv = NULL; } - if (bdrv_open2(bs, filename, 0, drv) < 0) { + if (bdrv_open2(bs, filename, BDRV_O_RDWR, drv) < 0) { error("Could not open '%s'", filename); } ret = bdrv_commit(bs); @@ -691,7 +691,7 @@ } else { drv = NULL; } - if (bdrv_open2(bs, filename, 0, drv) < 0) { + if (bdrv_open2(bs, filename, BDRV_O_RDWR, drv) < 0) { error("Could not open '%s'", filename); } bdrv_get_format(bs, fmt_name, sizeof(fmt_name)); -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 13:34 ` Daniel P. Berrange @ 2008-07-31 13:46 ` Paul Brook 2008-07-31 13:55 ` Daniel P. Berrange 2008-07-31 14:58 ` Chris Wedgwood 0 siblings, 2 replies; 21+ messages in thread From: Paul Brook @ 2008-07-31 13:46 UTC (permalink / raw) To: qemu-devel, Daniel P. Berrange > +#define BDRV_O_RDONLY 0x0001 /* Force read-only */ > +#define BDRV_O_WRONLY 0x0002 /* Force writeable, no fallback */ > +#define BDRV_O_RDWR 0x0003 /* Try writeable, fallback to read-only > */ This is IMHO really misleading. Normal O_* are not bitflags. The code uses these as bitflags sometimes, which means your descriptions are contradictory. Paul ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 13:46 ` Paul Brook @ 2008-07-31 13:55 ` Daniel P. Berrange 2008-07-31 15:05 ` Blue Swirl 2008-07-31 14:58 ` Chris Wedgwood 1 sibling, 1 reply; 21+ messages in thread From: Daniel P. Berrange @ 2008-07-31 13:55 UTC (permalink / raw) To: Paul Brook; +Cc: qemu-devel On Thu, Jul 31, 2008 at 02:46:55PM +0100, Paul Brook wrote: > > +#define BDRV_O_RDONLY 0x0001 /* Force read-only */ > > +#define BDRV_O_WRONLY 0x0002 /* Force writeable, no fallback */ > > +#define BDRV_O_RDWR 0x0003 /* Try writeable, fallback to read-only > > */ > > This is IMHO really misleading. Normal O_* are not bitflags. The code uses > these as bitflags sometimes, which means your descriptions are contradictory. One alternative approach I considered would be to not have an explicit flag for writable, and instead have a flag to explicitly indicate that fallback to read-only shouldn't be attempted. #define BDRV_O_RDONLY 0x0001 #define BDRV_O_NO_RO_FALLBACK 0x0002 This would probably make the patch smaller because I won't need to update all the callers which assume flags of '0' gives a writable file, falling back to RO. Other suggestions welcome too... Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 13:55 ` Daniel P. Berrange @ 2008-07-31 15:05 ` Blue Swirl 2008-07-31 16:01 ` Jamie Lokier 0 siblings, 1 reply; 21+ messages in thread From: Blue Swirl @ 2008-07-31 15:05 UTC (permalink / raw) To: Daniel P. Berrange, qemu-devel; +Cc: Paul Brook On 7/31/08, Daniel P. Berrange <berrange@redhat.com> wrote: > On Thu, Jul 31, 2008 at 02:46:55PM +0100, Paul Brook wrote: > > > +#define BDRV_O_RDONLY 0x0001 /* Force read-only */ > > > +#define BDRV_O_WRONLY 0x0002 /* Force writeable, no fallback */ > > > +#define BDRV_O_RDWR 0x0003 /* Try writeable, fallback to read-only > > > */ > > > > This is IMHO really misleading. Normal O_* are not bitflags. The code uses > > these as bitflags sometimes, which means your descriptions are contradictory. > > > One alternative approach I considered would be to not have an explicit > flag for writable, and instead have a flag to explicitly indicate that > fallback to read-only shouldn't be attempted. > > > #define BDRV_O_RDONLY 0x0001 > > #define BDRV_O_NO_RO_FALLBACK 0x0002 > > This would probably make the patch smaller because I won't need to update > all the callers which assume flags of '0' gives a writable file, falling > back to RO. > > Other suggestions welcome too... Write-only should mean that only writing is allowed, read access should not be needed. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 15:05 ` Blue Swirl @ 2008-07-31 16:01 ` Jamie Lokier 2008-07-31 16:10 ` Daniel P. Berrange 2008-07-31 18:07 ` Blue Swirl 0 siblings, 2 replies; 21+ messages in thread From: Jamie Lokier @ 2008-07-31 16:01 UTC (permalink / raw) To: qemu-devel; +Cc: Paul Brook Blue Swirl wrote: > On 7/31/08, Daniel P. Berrange <berrange@redhat.com> wrote: > > On Thu, Jul 31, 2008 at 02:46:55PM +0100, Paul Brook wrote: > > > > +#define BDRV_O_RDONLY 0x0001 /* Force read-only */ > > > > +#define BDRV_O_WRONLY 0x0002 /* Force writeable, no fallback */ > > > > +#define BDRV_O_RDWR 0x0003 /* Try writeable, fallback to read-only > > > > */ > > > > > > This is IMHO really misleading. Normal O_* are not bitflags. The code uses > > > these as bitflags sometimes, which means your descriptions are contradictory. > > > > > > One alternative approach I considered would be to not have an explicit > > flag for writable, and instead have a flag to explicitly indicate that > > fallback to read-only shouldn't be attempted. > > > > > > #define BDRV_O_RDONLY 0x0001 > > > > #define BDRV_O_NO_RO_FALLBACK 0x0002 > > > > This would probably make the patch smaller because I won't need to update > > all the callers which assume flags of '0' gives a writable file, falling > > back to RO. > > > > Other suggestions welcome too... > > Write-only should mean that only writing is allowed, read access > should not be needed. You can't write to most formats unless you can read the metadata. Flat is the exception, but WRONLY doesn't seem particularly useful. Whereas read-only floppy images, for example, resemble real hardware. I would suggest: read-only, read-write, and try-write (traditional behaviour). Or maybe get rid of the last one. -- Jamie ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 16:01 ` Jamie Lokier @ 2008-07-31 16:10 ` Daniel P. Berrange 2008-07-31 18:07 ` Blue Swirl 1 sibling, 0 replies; 21+ messages in thread From: Daniel P. Berrange @ 2008-07-31 16:10 UTC (permalink / raw) To: Jamie Lokier; +Cc: qemu-devel, Paul Brook On Thu, Jul 31, 2008 at 05:01:13PM +0100, Jamie Lokier wrote: > Blue Swirl wrote: > > On 7/31/08, Daniel P. Berrange <berrange@redhat.com> wrote: > > > On Thu, Jul 31, 2008 at 02:46:55PM +0100, Paul Brook wrote: > > > > > +#define BDRV_O_RDONLY 0x0001 /* Force read-only */ > > > > > +#define BDRV_O_WRONLY 0x0002 /* Force writeable, no fallback */ > > > > > +#define BDRV_O_RDWR 0x0003 /* Try writeable, fallback to read-only > > > > > */ > > > > > > > > This is IMHO really misleading. Normal O_* are not bitflags. The code uses > > > > these as bitflags sometimes, which means your descriptions are contradictory. > > > > > > > > > One alternative approach I considered would be to not have an explicit > > > flag for writable, and instead have a flag to explicitly indicate that > > > fallback to read-only shouldn't be attempted. > > > > > > > > > #define BDRV_O_RDONLY 0x0001 > > > > > > #define BDRV_O_NO_RO_FALLBACK 0x0002 > > > > > > This would probably make the patch smaller because I won't need to update > > > all the callers which assume flags of '0' gives a writable file, falling > > > back to RO. > > > > > > Other suggestions welcome too... > > > > Write-only should mean that only writing is allowed, read access > > should not be needed. > > You can't write to most formats unless you can read the metadata. > Flat is the exception, but WRONLY doesn't seem particularly useful. > > Whereas read-only floppy images, for example, resemble real hardware. > > I would suggest: read-only, read-write, and try-write (traditional behaviour). Functionally, that's what the implementation actually does - its just bad flag naming that's confusing things here. Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 16:01 ` Jamie Lokier 2008-07-31 16:10 ` Daniel P. Berrange @ 2008-07-31 18:07 ` Blue Swirl 1 sibling, 0 replies; 21+ messages in thread From: Blue Swirl @ 2008-07-31 18:07 UTC (permalink / raw) To: qemu-devel; +Cc: Paul Brook On 7/31/08, Jamie Lokier <jamie@shareable.org> wrote: > Blue Swirl wrote: > > On 7/31/08, Daniel P. Berrange <berrange@redhat.com> wrote: > > > On Thu, Jul 31, 2008 at 02:46:55PM +0100, Paul Brook wrote: > > > > > +#define BDRV_O_RDONLY 0x0001 /* Force read-only */ > > > > > +#define BDRV_O_WRONLY 0x0002 /* Force writeable, no fallback */ > > > > > +#define BDRV_O_RDWR 0x0003 /* Try writeable, fallback to read-only > > > > > */ > > > > > > > > This is IMHO really misleading. Normal O_* are not bitflags. The code uses > > > > these as bitflags sometimes, which means your descriptions are contradictory. > > > > > > > > > One alternative approach I considered would be to not have an explicit > > > flag for writable, and instead have a flag to explicitly indicate that > > > fallback to read-only shouldn't be attempted. > > > > > > > > > #define BDRV_O_RDONLY 0x0001 > > > > > > #define BDRV_O_NO_RO_FALLBACK 0x0002 > > > > > > This would probably make the patch smaller because I won't need to update > > > all the callers which assume flags of '0' gives a writable file, falling > > > back to RO. > > > > > > Other suggestions welcome too... > > > > Write-only should mean that only writing is allowed, read access > > should not be needed. > > > You can't write to most formats unless you can read the metadata. > Flat is the exception, but WRONLY doesn't seem particularly useful. I also could not think of any use cases of write-only, but maybe write-only+append could be used for system logs. Presenting this through block device layers could be difficult, maybe a tape device with non-working seek? Not very useful even then. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 13:46 ` Paul Brook 2008-07-31 13:55 ` Daniel P. Berrange @ 2008-07-31 14:58 ` Chris Wedgwood 1 sibling, 0 replies; 21+ messages in thread From: Chris Wedgwood @ 2008-07-31 14:58 UTC (permalink / raw) To: qemu-devel On Thu, Jul 31, 2008 at 02:46:55PM +0100, Paul Brook wrote: > > +#define BDRV_O_RDONLY ? ? ?0x0001 /* Force read-only */ > > +#define BDRV_O_WRONLY ? ? ?0x0002 /* Force writeable, no fallback */ > > +#define BDRV_O_RDWR ? ? ? ?0x0003 /* Try writeable, fallback to read-only > > */ > > This is IMHO really misleading. Normal O_* are not bitflags. The code uses > these as bitflags sometimes, which means your descriptions are contradictory. Also the names aren't very intuitive, since BDRV_O_WRONLY really is read-write not write-only. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 11:31 [Qemu-devel] PATCH: Control over drive open modes for backing file Daniel P. Berrange 2008-07-31 12:15 ` Jamie Lokier 2008-07-31 13:34 ` Daniel P. Berrange @ 2008-07-31 18:26 ` Anthony Liguori 2008-07-31 18:59 ` Jamie Lokier 2008-08-01 9:18 ` Daniel P. Berrange 2 siblings, 2 replies; 21+ messages in thread From: Anthony Liguori @ 2008-07-31 18:26 UTC (permalink / raw) To: Daniel P. Berrange, qemu-devel Daniel P. Berrange wrote: > The current block driver code will attempt to open a file backing a drive > for read/write with O_RDWR first, and if that fails, fallback to opening > it readonly with O_RDONLY. So if you set file permissions to readonly on > the underlying drive backing store, QEMU will fallback to opening it read > only, and discard any writes. > I'm not sure I agree that this patch is really that useful to an actual user. I think we'll eventually need a read-only flag as paravirtual devices do support read-only block devices. Let's consider a scenario: A user has multiple block devices including a secondary device that is read-only to the guest. With qcow2 and today's behavior, savevm will just work. With your patch, it will not work. This is a scenario where just because the block device cannot be written to, we still would want to write to the metadata of the image. So while I think it's valid to have a "read-only disk" exposed to the guest, I don't think the user should have anything to do with how we open the file. Is there some specific circumstance you are trying to support? Regards, Anthony Liguori > Xen has a concept of a read-only disks in its configuration format, and > thus it would be desirable to have an explicit option to request that a > drive operate read-only, regardless of whether underlying file permissions > allow write access or not. We'd like to support this in libvirt too for > QEMU/KVM guests. Finally, in some cases it is desirable to see the failure > if the disk can't be opened read-write, rather than falling back to read > only mode - many guests will be more or less inoperable if their root > filesystem is read-only so there's little point booting. > > The current block.h file did already have flags defined > > #define BDRV_O_RDONLY 0x0000 > #define BDRV_O_RDWR 0x0002 > #define BDRV_O_ACCESS 0x0003 > > However the bdrv_open2() method was treating a 'flags' value of 0, as being > effectively RDWR, and nearly all callers pass in 0 even when they expect > to get a writable file, so the O_RDONLY flag was useless as is. > > So this patch does a couple of things: > > ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 18:26 ` Anthony Liguori @ 2008-07-31 18:59 ` Jamie Lokier 2008-07-31 19:37 ` Anthony Liguori 2008-08-01 9:18 ` Daniel P. Berrange 1 sibling, 1 reply; 21+ messages in thread From: Jamie Lokier @ 2008-07-31 18:59 UTC (permalink / raw) To: qemu-devel Anthony Liguori wrote: > So while I think it's valid to have a "read-only disk" exposed to the > guest, I don't think the user should have anything to do with how we > open the file. All good points. My concern (and it may be different to others) is when I branch an image using a qcow2 with backing qcow (perhaps more than two deep). The backing image is sometimes shared with other branches. E.g. I might have a full install of an OS, and then have a branch where I install software package A, and another branch with software package B. Both share the same base image. In these, it's very important that I don't accidentally modify the base image. E.g. if I foolishly entered the 'commit' monitor command in VM A, I'd *corrupt* the disk of VM B. So it would be nice to open the base image read-only. (Microsoft have a similar description in their documentation on 'disk image differencing for maintaining test systems' for Virtual PC). Now savevm snapshots (as opposed to -snapshot) confuse this picture. Can I arbitrarily branch off different snapshots within a single qcow2 file? Can I delete the 'base' snapshots safely? Most important: what happens if I have snapshots in a qcow2 file which has a base file, and I type 'commit'? Does it corrupt all the snapshots, effectively? I find the snapshot facility a bit unclear as to what _exactly_ it does to be honest, and am therefore wary of it. Thanks, -- Jamie ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 18:59 ` Jamie Lokier @ 2008-07-31 19:37 ` Anthony Liguori 2008-08-01 7:46 ` Jamie Lokier 0 siblings, 1 reply; 21+ messages in thread From: Anthony Liguori @ 2008-07-31 19:37 UTC (permalink / raw) To: qemu-devel Jamie Lokier wrote: > Anthony Liguori wrote: > >> So while I think it's valid to have a "read-only disk" exposed to the >> guest, I don't think the user should have anything to do with how we >> open the file. >> > > All good points. > > My concern (and it may be different to others) is when I branch an > image using a qcow2 with backing qcow (perhaps more than two deep). > > The backing image is sometimes shared with other branches. > > E.g. I might have a full install of an OS, and then have a branch > where I install software package A, and another branch with software > package B. Both share the same base image. > > In these, it's very important that I don't accidentally modify the > base image. E.g. if I foolishly entered the 'commit' monitor command > in VM A, I'd *corrupt* the disk of VM B. > Introducing an option to keep you from misusing another option is a little silly. You're just as likely to forget to use the first option as you are to "accidentally" issue a commit. If you want to protect yourself, chmod the base image. Then you have nothing to worry about. > So it would be nice to open the base image read-only. > > (Microsoft have a similar description in their documentation on 'disk > image differencing for maintaining test systems' for Virtual PC). > > Now savevm snapshots (as opposed to -snapshot) confuse this picture. > > Can I arbitrarily branch off different snapshots within a single qcow2 > file? Can I delete the 'base' snapshots safely? Most important: what > happens if I have snapshots in a qcow2 file which has a base file, and > I type 'commit'? Does it corrupt all the snapshots, effectively? > snapshots are linear, not branching. And they are only every saved/loaded from the highest level qcow2 file. Regards, Anthony Liguori > I find the snapshot facility a bit unclear as to what _exactly_ it > does to be honest, and am therefore wary of it. > > Thanks, > -- Jamie > > > ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 19:37 ` Anthony Liguori @ 2008-08-01 7:46 ` Jamie Lokier 2008-08-01 15:14 ` Anthony Liguori 0 siblings, 1 reply; 21+ messages in thread From: Jamie Lokier @ 2008-08-01 7:46 UTC (permalink / raw) To: qemu-devel Anthony Liguori wrote: > >Can I arbitrarily branch off different snapshots within a single qcow2 > >file? Can I delete the 'base' snapshots safely? Most important: what > >happens if I have snapshots in a qcow2 file which has a base file, and > >I type 'commit'? Does it corrupt all the snapshots, effectively? > > snapshots are linear, not branching. And they are only every > saved/loaded from the highest level qcow2 file. So if I understand that right, the 'commit' command (to write to the base image) _will_ corrupt all the snapshots since they depend on the base image and it just changed?? -- Jamie ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-08-01 7:46 ` Jamie Lokier @ 2008-08-01 15:14 ` Anthony Liguori 0 siblings, 0 replies; 21+ messages in thread From: Anthony Liguori @ 2008-08-01 15:14 UTC (permalink / raw) To: qemu-devel Jamie Lokier wrote: > Anthony Liguori wrote: > >>> Can I arbitrarily branch off different snapshots within a single qcow2 >>> file? Can I delete the 'base' snapshots safely? Most important: what >>> happens if I have snapshots in a qcow2 file which has a base file, and >>> I type 'commit'? Does it corrupt all the snapshots, effectively? >>> >> snapshots are linear, not branching. And they are only every >> saved/loaded from the highest level qcow2 file. >> > > So if I understand that right, the 'commit' command (to write to the > base image) _will_ corrupt all the snapshots since they depend on the > base image and it just changed?? > Yes, so don't do that. BTW, commit is a pretty useless command IMHO. If you use it to save a snapshot of a disk image while the OS has it mounted, you're not getting a very good backup. Regards, Anthony Liguori Regards, Anthony Liguori > -- Jamie > > > ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-07-31 18:26 ` Anthony Liguori 2008-07-31 18:59 ` Jamie Lokier @ 2008-08-01 9:18 ` Daniel P. Berrange 2008-08-01 14:48 ` Anthony Liguori 1 sibling, 1 reply; 21+ messages in thread From: Daniel P. Berrange @ 2008-08-01 9:18 UTC (permalink / raw) To: Anthony Liguori; +Cc: qemu-devel On Thu, Jul 31, 2008 at 01:26:17PM -0500, Anthony Liguori wrote: > Daniel P. Berrange wrote: > >The current block driver code will attempt to open a file backing a drive > >for read/write with O_RDWR first, and if that fails, fallback to opening > >it readonly with O_RDONLY. So if you set file permissions to readonly on > >the underlying drive backing store, QEMU will fallback to opening it read > >only, and discard any writes. > > > > I'm not sure I agree that this patch is really that useful to an actual > user. I think we'll eventually need a read-only flag as paravirtual > devices do support read-only block devices. Let's consider a scenario: > > A user has multiple block devices including a secondary device that is > read-only to the guest. With qcow2 and today's behavior, savevm will > just work. With your patch, it will not work. > > This is a scenario where just because the block device cannot be written > to, we still would want to write to the metadata of the image. Sure, the admin of the guest has the option to make it read only or not depending on whether they need to use this capability. > So while I think it's valid to have a "read-only disk" exposed to the > guest, I don't think the user should have anything to do with how we > open the file. > > Is there some specific circumstance you are trying to support? The scenario is that the admin wants to assign a read only disk to the virtual machine - typically the same disk to multiple machines - and thus want to guarentee that no one VM can write to it, since bad things happen if you do that with non-cluster filesystems. Controlling this based on the underlying permissions of the file backing the drive is not practical. Things like udev happy set permissions on devices in /dev/ behind your back, so you'd have to edit the horrible udev config files to make /dev/sdXX readonly. It is a far simpler task to simply add ,mode=ro to the QEMU command line for -drive to accomplish this, than finding the obscure file to edit to make the underling file have read only permissions Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-08-01 9:18 ` Daniel P. Berrange @ 2008-08-01 14:48 ` Anthony Liguori 2008-08-01 16:47 ` Ian Jackson 0 siblings, 1 reply; 21+ messages in thread From: Anthony Liguori @ 2008-08-01 14:48 UTC (permalink / raw) To: Daniel P. Berrange; +Cc: qemu-devel Daniel P. Berrange wrote: > On Thu, Jul 31, 2008 at 01:26:17PM -0500, Anthony Liguori wrote: > >> So while I think it's valid to have a "read-only disk" exposed to the >> guest, I don't think the user should have anything to do with how we >> open the file. >> >> Is there some specific circumstance you are trying to support? >> > > The scenario is that the admin wants to assign a read only disk to the > virtual machine - typically the same disk to multiple machines - and > thus want to guarentee that no one VM can write to it, since bad things > happen if you do that with non-cluster filesystems. > > Controlling this based on the underlying permissions of the file backing > the drive is not practical. Things like udev happy set permissions on > devices in /dev/ behind your back, so you'd have to edit the horrible udev > config files to make /dev/sdXX readonly. It is a far simpler task to > simply add ,mode=ro to the QEMU command line for -drive to accomplish > this, than finding the obscure file to edit to make the underling file > have read only permissions > Right, but my point is that ,mode=ro does not have to force QEMU to open the file O_RDONLY. It simply needs to prevent writes from happening. But it's important to be able to expose this property to the guest, so ,mode=ro should not be allowed for disks that do not support exposing their read-only-ness to the guest. Regards, Anthony Liguori > Daniel > ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-08-01 14:48 ` Anthony Liguori @ 2008-08-01 16:47 ` Ian Jackson 2008-08-01 17:09 ` Anthony Liguori 2008-08-01 17:10 ` Jamie Lokier 0 siblings, 2 replies; 21+ messages in thread From: Ian Jackson @ 2008-08-01 16:47 UTC (permalink / raw) To: qemu-devel Anthony Liguori writes ("Re: [Qemu-devel] PATCH: Control over drive open modes for backing file"): > Right, but my point is that ,mode=ro does not have to force QEMU to open > the file O_RDONLY. It simply needs to prevent writes from happening. Well, yes, but actually it's probably most reliable to do it that way. Given that this is a security feature we want to avoid accidentally `missing' a case. So we should definitely open the underlying file(s) O_RDONLY. If we do that then the guest definitely won't be able to write as if it manages to persuade qemu to try qemu will just get an error. This is fine I think, if we can expose the read-only status to the guest. > But it's important to be able to expose this property to the guest, so > ,mode=ro should not be allowed for disks that do not support exposing > their read-only-ness to the guest. I agree that it would be an unusual thing to do, to expose a ro disk in a way that doesn't support advertising the ro flag. But I think it should still be possible perhaps with some kind of force option. Ian. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-08-01 16:47 ` Ian Jackson @ 2008-08-01 17:09 ` Anthony Liguori 2008-08-01 17:10 ` Jamie Lokier 1 sibling, 0 replies; 21+ messages in thread From: Anthony Liguori @ 2008-08-01 17:09 UTC (permalink / raw) To: qemu-devel@nongnu.org Ian Jackson wrote: > Anthony Liguori writes ("Re: [Qemu-devel] PATCH: Control over drive open modes for backing file"): > >> Right, but my point is that ,mode=ro does not have to force QEMU to open >> the file O_RDONLY. It simply needs to prevent writes from happening. >> > > Well, yes, but actually it's probably most reliable to do it that way. > Given that this is a security feature we want to avoid accidentally > `missing' a case. So we should definitely open the underlying file(s) > O_RDONLY. > That is an implementation detail, and should be dependent on the underlying file format. For instance, I completely agree that this should be the behaviour for raw images. I don't agree that this should be the behaviour with qcow2 though. FWIW, this isn't a major security improvement. It's pretty darn easy to audit the single calling location where a file can be written to :-) > If we do that then the guest definitely won't be able to write as if > it manages to persuade qemu to try qemu will just get an error. This > is fine I think, if we can expose the read-only status to the guest. > > >> But it's important to be able to expose this property to the guest, so >> ,mode=ro should not be allowed for disks that do not support exposing >> their read-only-ness to the guest. >> > > I agree that it would be an unusual thing to do, to expose a ro disk > in a way that doesn't support advertising the ro flag. But I think it > should still be possible perhaps with some kind of force option. > There's no good reason to do this and it's just going to result in confusing users. You can approximate the same functionality by using ,snapshot=on while giving the guest predictable behaviour. Regards, Anthony Liguori > Ian. > > > ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] PATCH: Control over drive open modes for backing file 2008-08-01 16:47 ` Ian Jackson 2008-08-01 17:09 ` Anthony Liguori @ 2008-08-01 17:10 ` Jamie Lokier 1 sibling, 0 replies; 21+ messages in thread From: Jamie Lokier @ 2008-08-01 17:10 UTC (permalink / raw) To: qemu-devel Ian Jackson wrote: > > Right, but my point is that ,mode=ro does not have to force QEMU to open > > the file O_RDONLY. It simply needs to prevent writes from happening. > > Well, yes, but actually it's probably most reliable to do it that way. > Given that this is a security feature we want to avoid accidentally > `missing' a case. So we should definitely open the underlying file(s) > O_RDONLY. Also, the point about qcow2 metadata. If you have multiple QEMU instances using the same qcow2 image, it is not acceptable to have them both trying to write qcow2 metadata - unless they are interlocked in some way (as fas as I know they're not). Personally I use 'chattr +i' on such files. But it's not very userspace friendy, e.g. for VM management scripts run by other people. You need root access to do 'chattr +i'. > If we do that then the guest definitely won't be able to write as if > it manages to persuade qemu to try qemu will just get an error. This > is fine I think, if we can expose the read-only status to the guest. > > > But it's important to be able to expose this property to the guest, so > > ,mode=ro should not be allowed for disks that do not support exposing > > their read-only-ness to the guest. > > I agree that it would be an unusual thing to do, to expose a ro disk > in a way that doesn't support advertising the ro flag. But I think it > should still be possible perhaps with some kind of force option. I would think for environments where a single image is launched many times, e.g. 'start OS foo and tell it to run my test program', it's important that the *file* be open read-only regardless of what the guest can see. In that usage, -snapshot or creating an explicit qcow2 derived file would be appropriate. But it's still important that the base file is opened read-only, and that 'commit' to it is forbidden. -- Jamie ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2008-08-01 17:10 UTC | newest] Thread overview: 21+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-07-31 11:31 [Qemu-devel] PATCH: Control over drive open modes for backing file Daniel P. Berrange 2008-07-31 12:15 ` Jamie Lokier 2008-07-31 13:08 ` Daniel P. Berrange 2008-07-31 13:34 ` Daniel P. Berrange 2008-07-31 13:46 ` Paul Brook 2008-07-31 13:55 ` Daniel P. Berrange 2008-07-31 15:05 ` Blue Swirl 2008-07-31 16:01 ` Jamie Lokier 2008-07-31 16:10 ` Daniel P. Berrange 2008-07-31 18:07 ` Blue Swirl 2008-07-31 14:58 ` Chris Wedgwood 2008-07-31 18:26 ` Anthony Liguori 2008-07-31 18:59 ` Jamie Lokier 2008-07-31 19:37 ` Anthony Liguori 2008-08-01 7:46 ` Jamie Lokier 2008-08-01 15:14 ` Anthony Liguori 2008-08-01 9:18 ` Daniel P. Berrange 2008-08-01 14:48 ` Anthony Liguori 2008-08-01 16:47 ` Ian Jackson 2008-08-01 17:09 ` Anthony Liguori 2008-08-01 17:10 ` Jamie Lokier
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).