aboutsummaryrefslogtreecommitdiff
path: root/blockdev.c
diff options
context:
space:
mode:
authorMax Reitz <mreitz@redhat.com>2015-11-11 04:49:44 +0100
committerKevin Wolf <kwolf@redhat.com>2015-11-11 16:23:34 +0100
commit39ff43d9e1f42b1d829a955e546cddab87ac0626 (patch)
tree40a4f937d8fe47ab085bf7950253c348a941e3d2 /blockdev.c
parent1068674927a08cb9f535946abe2f91529b13160c (diff)
blockdev: read-only-mode for blockdev-change-medium
Add an option to qmp_blockdev_change_medium() which allows changing the read-only status of the block device whose medium is changed. Some drives do not have a inherently fixed read-only status; for instance, floppy disks can be set read-only or writable independently of the drive. Some users may find it useful to be able to therefore change the read-only status of a block device when changing the medium. Signed-off-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'blockdev.c')
-rw-r--r--blockdev.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/blockdev.c b/blockdev.c
index b3a958c4aa..34f6e5bbb0 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -2145,6 +2145,8 @@ void qmp_blockdev_insert_medium(const char *device, const char *node_name,
void qmp_blockdev_change_medium(const char *device, const char *filename,
bool has_format, const char *format,
+ bool has_read_only,
+ BlockdevChangeReadOnlyMode read_only,
Error **errp)
{
BlockBackend *blk;
@@ -2166,6 +2168,26 @@ void qmp_blockdev_change_medium(const char *device, const char *filename,
bdrv_flags = blk_get_open_flags_from_root_state(blk);
+ if (!has_read_only) {
+ read_only = BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN;
+ }
+
+ switch (read_only) {
+ case BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN:
+ break;
+
+ case BLOCKDEV_CHANGE_READ_ONLY_MODE_READ_ONLY:
+ bdrv_flags &= ~BDRV_O_RDWR;
+ break;
+
+ case BLOCKDEV_CHANGE_READ_ONLY_MODE_READ_WRITE:
+ bdrv_flags |= BDRV_O_RDWR;
+ break;
+
+ default:
+ abort();
+ }
+
if (has_format) {
options = qdict_new();
qdict_put(options, "driver", qstring_from_str(format));