Commit 25b1d45a authored by Changpeng Liu's avatar Changpeng Liu Committed by Michael S. Tsirkin
Browse files

vhost-blk: turn on pre-defined RO feature bit



Read only feature shouldn't be negotiable, because if the
backend device reported Read only feature supported, QEMU
host driver shouldn't change backend's RO attribute. While
here, also enable the vhost-user-blk test utility to test
RO feature.

Signed-off-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent cab27afa
Loading
Loading
Loading
Loading
+35 −13
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ typedef struct VubDev {
    VugDev parent;
    int blk_fd;
    struct virtio_blk_config blkcfg;
    bool enable_ro;
    char *blk_name;
    GMainLoop *loop;
} VubDev;
@@ -301,7 +302,14 @@ static void vub_queue_set_started(VuDev *vu_dev, int idx, bool started)
static uint64_t
vub_get_features(VuDev *dev)
{
    return 1ull << VIRTIO_BLK_F_SIZE_MAX |
    uint64_t features;
    VugDev *gdev;
    VubDev *vdev_blk;

    gdev = container_of(dev, VugDev, parent);
    vdev_blk = container_of(gdev, VubDev, parent);

    features = 1ull << VIRTIO_BLK_F_SIZE_MAX |
               1ull << VIRTIO_BLK_F_SEG_MAX |
               1ull << VIRTIO_BLK_F_TOPOLOGY |
               1ull << VIRTIO_BLK_F_BLK_SIZE |
@@ -309,6 +317,12 @@ vub_get_features(VuDev *dev)
               1ull << VIRTIO_BLK_F_CONFIG_WCE |
               1ull << VIRTIO_F_VERSION_1 |
               1ull << VHOST_USER_F_PROTOCOL_FEATURES;

    if (vdev_blk->enable_ro) {
        features |= 1ull << VIRTIO_BLK_F_RO;
    }

    return features;
}

static uint64_t
@@ -476,6 +490,7 @@ vub_new(char *blk_file)
        vub_free(vdev_blk);
        return NULL;
    }
    vdev_blk->enable_ro = false;
    vdev_blk->blkcfg.wce = 0;
    vdev_blk->blk_name = blk_file;

@@ -490,10 +505,11 @@ int main(int argc, char **argv)
    int opt;
    char *unix_socket = NULL;
    char *blk_file = NULL;
    bool enable_ro = false;
    int lsock = -1, csock = -1;
    VubDev *vdev_blk = NULL;

    while ((opt = getopt(argc, argv, "b:s:h")) != -1) {
    while ((opt = getopt(argc, argv, "b:rs:h")) != -1) {
        switch (opt) {
        case 'b':
            blk_file = g_strdup(optarg);
@@ -501,17 +517,20 @@ int main(int argc, char **argv)
        case 's':
            unix_socket = g_strdup(optarg);
            break;
        case 'r':
            enable_ro = true;
            break;
        case 'h':
        default:
            printf("Usage: %s [-b block device or file, -s UNIX domain socket]"
                   " | [ -h ]\n", argv[0]);
            printf("Usage: %s [ -b block device or file, -s UNIX domain socket"
                   " | -r Enable read-only ] | [ -h ]\n", argv[0]);
            return 0;
        }
    }

    if (!unix_socket || !blk_file) {
        printf("Usage: %s [-b block device or file, -s UNIX domain socket] |"
               " [ -h ]\n", argv[0]);
        printf("Usage: %s [ -b block device or file, -s UNIX domain socket"
               " | -r Enable read-only ] | [ -h ]\n", argv[0]);
        return -1;
    }

@@ -530,6 +549,9 @@ int main(int argc, char **argv)
    if (!vdev_blk) {
        goto err;
    }
    if (enable_ro) {
        vdev_blk->enable_ro = true;
    }

    vug_init(&vdev_blk->parent, csock, vub_panic_cb, &vub_iface);

+1 −4
Original line number Diff line number Diff line
@@ -203,13 +203,11 @@ static uint64_t vhost_user_blk_get_features(VirtIODevice *vdev,
    virtio_add_feature(&features, VIRTIO_BLK_F_TOPOLOGY);
    virtio_add_feature(&features, VIRTIO_BLK_F_BLK_SIZE);
    virtio_add_feature(&features, VIRTIO_BLK_F_FLUSH);
    virtio_add_feature(&features, VIRTIO_BLK_F_RO);

    if (s->config_wce) {
        virtio_add_feature(&features, VIRTIO_BLK_F_CONFIG_WCE);
    }
    if (s->config_ro) {
        virtio_add_feature(&features, VIRTIO_BLK_F_RO);
    }
    if (s->num_queues > 1) {
        virtio_add_feature(&features, VIRTIO_BLK_F_MQ);
    }
@@ -339,7 +337,6 @@ static Property vhost_user_blk_properties[] = {
    DEFINE_PROP_UINT16("num-queues", VHostUserBlk, num_queues, 1),
    DEFINE_PROP_UINT32("queue-size", VHostUserBlk, queue_size, 128),
    DEFINE_PROP_BIT("config-wce", VHostUserBlk, config_wce, 0, true),
    DEFINE_PROP_BIT("config-ro", VHostUserBlk, config_ro, 0, false),
    DEFINE_PROP_END_OF_LIST(),
};

+0 −1
Original line number Diff line number Diff line
@@ -35,7 +35,6 @@ typedef struct VHostUserBlk {
    uint16_t num_queues;
    uint32_t queue_size;
    uint32_t config_wce;
    uint32_t config_ro;
    struct vhost_dev dev;
    VhostUserState *vhost_user;
} VHostUserBlk;