Commit 4e9e4323 authored by Kevin Wolf's avatar Kevin Wolf
Browse files

backup: Use real permissions in backup block job



The backup block job doesn't have very complicated requirements: It
needs to read from the source and write to the target, but it's fine
with either side being changed. The only restriction is that we can't
resize the image because the job uses a cached value.

qemu-iotests 055 needs to be changed because it used a target which was
already attached to a virtio-blk device. The permission system correctly
forbids this (virtio-blk can't accept another writer with its default
share-rw=off).

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Acked-by: default avatarFam Zheng <famz@redhat.com>
parent d3f06759
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -618,15 +618,20 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
        goto error;
    }

    /* FIXME Use real permissions */
    job = block_job_create(job_id, &backup_job_driver, bs, 0, BLK_PERM_ALL,
    /* job->common.len is fixed, so we can't allow resize */
    job = block_job_create(job_id, &backup_job_driver, bs,
                           BLK_PERM_CONSISTENT_READ,
                           BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE |
                           BLK_PERM_WRITE_UNCHANGED | BLK_PERM_GRAPH_MOD,
                           speed, creation_flags, cb, opaque, errp);
    if (!job) {
        goto error;
    }

    /* FIXME Use real permissions */
    job->target = blk_new(0, BLK_PERM_ALL);
    /* The target must match the source in size, so no resize here either */
    job->target = blk_new(BLK_PERM_WRITE,
                          BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE |
                          BLK_PERM_WRITE_UNCHANGED | BLK_PERM_GRAPH_MOD);
    ret = blk_insert_bs(job->target, target, errp);
    if (ret < 0) {
        goto error;
@@ -657,7 +662,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
        job->cluster_size = MAX(BACKUP_CLUSTER_SIZE_DEFAULT, bdi.cluster_size);
    }

    /* FIXME Use real permissions */
    /* Required permissions are already taken with target's blk_new() */
    block_job_add_bdrv(&job->common, "target", target, 0, BLK_PERM_ALL,
                       &error_abort);
    job->common.len = len;
+7 −4
Original line number Diff line number Diff line
@@ -48,7 +48,8 @@ class TestSingleDrive(iotests.QMPTestCase):
    def setUp(self):
        qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(image_len))

        self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img)
        self.vm = iotests.VM().add_drive(test_img)
        self.vm.add_drive(blockdev_target_img, interface="none")
        if iotests.qemu_default_machine == 'pc':
            self.vm.add_drive(None, 'media=cdrom', 'ide')
        self.vm.launch()
@@ -164,7 +165,8 @@ class TestSetSpeed(iotests.QMPTestCase):
    def setUp(self):
        qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(image_len))

        self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img)
        self.vm = iotests.VM().add_drive(test_img)
        self.vm.add_drive(blockdev_target_img, interface="none")
        self.vm.launch()

    def tearDown(self):
@@ -247,7 +249,8 @@ class TestSingleTransaction(iotests.QMPTestCase):
    def setUp(self):
        qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(image_len))

        self.vm = iotests.VM().add_drive(test_img).add_drive(blockdev_target_img)
        self.vm = iotests.VM().add_drive(test_img)
        self.vm.add_drive(blockdev_target_img, interface="none")
        if iotests.qemu_default_machine == 'pc':
            self.vm.add_drive(None, 'media=cdrom', 'ide')
        self.vm.launch()
@@ -460,7 +463,7 @@ class TestDriveCompression(iotests.QMPTestCase):

        qemu_img('create', '-f', fmt, blockdev_target_img,
                 str(TestDriveCompression.image_len), *args)
        self.vm.add_drive(blockdev_target_img, format=fmt)
        self.vm.add_drive(blockdev_target_img, format=fmt, interface="none")

        self.vm.launch()