virtio-blk-dataplane: Improve error reporting
Return an Error so that it can be propagated later. Tested-by: Stefan Hajnoczi <stefanha@redhat.com> Acked-by: Stefan Hajnoczi <stefanha@redhat.com> [AF: Rebased] Signed-off-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									06a1307379
								
							
						
					
					
						commit
						3ffeeef735
					
				@ -380,8 +380,9 @@ static void start_data_plane_bh(void *opaque)
 | 
			
		||||
                       s, QEMU_THREAD_JOINABLE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *blk,
 | 
			
		||||
                                  VirtIOBlockDataPlane **dataplane)
 | 
			
		||||
void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *blk,
 | 
			
		||||
                                  VirtIOBlockDataPlane **dataplane,
 | 
			
		||||
                                  Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    VirtIOBlockDataPlane *s;
 | 
			
		||||
    int fd;
 | 
			
		||||
@ -389,33 +390,35 @@ bool virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *blk,
 | 
			
		||||
    *dataplane = NULL;
 | 
			
		||||
 | 
			
		||||
    if (!blk->data_plane) {
 | 
			
		||||
        return true;
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (blk->scsi) {
 | 
			
		||||
        error_report("device is incompatible with x-data-plane, use scsi=off");
 | 
			
		||||
        return false;
 | 
			
		||||
        error_setg(errp,
 | 
			
		||||
                   "device is incompatible with x-data-plane, use scsi=off");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (blk->config_wce) {
 | 
			
		||||
        error_report("device is incompatible with x-data-plane, "
 | 
			
		||||
                     "use config-wce=off");
 | 
			
		||||
        return false;
 | 
			
		||||
        error_setg(errp, "device is incompatible with x-data-plane, "
 | 
			
		||||
                         "use config-wce=off");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* If dataplane is (re-)enabled while the guest is running there could be
 | 
			
		||||
     * block jobs that can conflict.
 | 
			
		||||
     */
 | 
			
		||||
    if (bdrv_in_use(blk->conf.bs)) {
 | 
			
		||||
        error_report("cannot start dataplane thread while device is in use");
 | 
			
		||||
        return false;
 | 
			
		||||
        error_setg(errp,
 | 
			
		||||
                   "cannot start dataplane thread while device is in use");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fd = raw_get_aio_fd(blk->conf.bs);
 | 
			
		||||
    if (fd < 0) {
 | 
			
		||||
        error_report("drive is incompatible with x-data-plane, "
 | 
			
		||||
                     "use format=raw,cache=none,aio=native");
 | 
			
		||||
        return false;
 | 
			
		||||
        error_setg(errp, "drive is incompatible with x-data-plane, "
 | 
			
		||||
                         "use format=raw,cache=none,aio=native");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    s = g_new0(VirtIOBlockDataPlane, 1);
 | 
			
		||||
@ -427,7 +430,6 @@ bool virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *blk,
 | 
			
		||||
    bdrv_set_in_use(blk->conf.bs, 1);
 | 
			
		||||
 | 
			
		||||
    *dataplane = s;
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void virtio_blk_data_plane_destroy(VirtIOBlockDataPlane *s)
 | 
			
		||||
 | 
			
		||||
@ -19,8 +19,9 @@
 | 
			
		||||
 | 
			
		||||
typedef struct VirtIOBlockDataPlane VirtIOBlockDataPlane;
 | 
			
		||||
 | 
			
		||||
bool virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *blk,
 | 
			
		||||
                                  VirtIOBlockDataPlane **dataplane);
 | 
			
		||||
void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *blk,
 | 
			
		||||
                                  VirtIOBlockDataPlane **dataplane,
 | 
			
		||||
                                  Error **errp);
 | 
			
		||||
void virtio_blk_data_plane_destroy(VirtIOBlockDataPlane *s);
 | 
			
		||||
void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s);
 | 
			
		||||
void virtio_blk_data_plane_stop(VirtIOBlockDataPlane *s);
 | 
			
		||||
 | 
			
		||||
@ -657,6 +657,7 @@ static void virtio_blk_migration_state_changed(Notifier *notifier, void *data)
 | 
			
		||||
    VirtIOBlock *s = container_of(notifier, VirtIOBlock,
 | 
			
		||||
                                  migration_state_notifier);
 | 
			
		||||
    MigrationState *mig = data;
 | 
			
		||||
    Error *err = NULL;
 | 
			
		||||
 | 
			
		||||
    if (migration_in_setup(mig)) {
 | 
			
		||||
        if (!s->dataplane) {
 | 
			
		||||
@ -671,7 +672,11 @@ static void virtio_blk_migration_state_changed(Notifier *notifier, void *data)
 | 
			
		||||
        }
 | 
			
		||||
        bdrv_drain_all(); /* complete in-flight non-dataplane requests */
 | 
			
		||||
        virtio_blk_data_plane_create(VIRTIO_DEVICE(s), &s->blk,
 | 
			
		||||
                                     &s->dataplane);
 | 
			
		||||
                                     &s->dataplane, &err);
 | 
			
		||||
        if (err != NULL) {
 | 
			
		||||
            error_report("%s", error_get_pretty(err));
 | 
			
		||||
            error_free(err);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_VIRTIO_BLK_DATA_PLANE */
 | 
			
		||||
@ -681,6 +686,9 @@ static int virtio_blk_device_init(VirtIODevice *vdev)
 | 
			
		||||
    DeviceState *qdev = DEVICE(vdev);
 | 
			
		||||
    VirtIOBlock *s = VIRTIO_BLK(vdev);
 | 
			
		||||
    VirtIOBlkConf *blk = &(s->blk);
 | 
			
		||||
#ifdef CONFIG_VIRTIO_BLK_DATA_PLANE
 | 
			
		||||
    Error *err = NULL;
 | 
			
		||||
#endif
 | 
			
		||||
    static int virtio_blk_id;
 | 
			
		||||
 | 
			
		||||
    if (!blk->conf.bs) {
 | 
			
		||||
@ -708,7 +716,10 @@ static int virtio_blk_device_init(VirtIODevice *vdev)
 | 
			
		||||
 | 
			
		||||
    s->vq = virtio_add_queue(vdev, 128, virtio_blk_handle_output);
 | 
			
		||||
#ifdef CONFIG_VIRTIO_BLK_DATA_PLANE
 | 
			
		||||
    if (!virtio_blk_data_plane_create(vdev, blk, &s->dataplane)) {
 | 
			
		||||
    virtio_blk_data_plane_create(vdev, blk, &s->dataplane, &err);
 | 
			
		||||
    if (err != NULL) {
 | 
			
		||||
        error_report("%s", error_get_pretty(err));
 | 
			
		||||
        error_free(err);
 | 
			
		||||
        virtio_cleanup(vdev);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user