diff options
author | RajithaY <rajithax.yerrumsetty@intel.com> | 2017-04-25 03:31:15 -0700 |
---|---|---|
committer | Rajitha Yerrumchetty <rajithax.yerrumsetty@intel.com> | 2017-05-22 06:48:08 +0000 |
commit | bb756eebdac6fd24e8919e2c43f7d2c8c4091f59 (patch) | |
tree | ca11e03542edf2d8f631efeca5e1626d211107e3 /qemu/blockdev-nbd.c | |
parent | a14b48d18a9ed03ec191cf16b162206998a895ce (diff) |
Adding qemu as a submodule of KVMFORNFV
This Patch includes the changes to add qemu as a submodule to
kvmfornfv repo and make use of the updated latest qemu for the
execution of all testcase
Change-Id: I1280af507a857675c7f81d30c95255635667bdd7
Signed-off-by:RajithaY<rajithax.yerrumsetty@intel.com>
Diffstat (limited to 'qemu/blockdev-nbd.c')
-rw-r--r-- | qemu/blockdev-nbd.c | 199 |
1 files changed, 0 insertions, 199 deletions
diff --git a/qemu/blockdev-nbd.c b/qemu/blockdev-nbd.c deleted file mode 100644 index 12cae0ea7..000000000 --- a/qemu/blockdev-nbd.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Serving QEMU block devices via NBD - * - * Copyright (c) 2012 Red Hat, Inc. - * - * Author: Paolo Bonzini <pbonzini@redhat.com> - * - * This work is licensed under the terms of the GNU GPL, version 2 or - * later. See the COPYING file in the top-level directory. - */ - -#include "qemu/osdep.h" -#include "sysemu/blockdev.h" -#include "sysemu/block-backend.h" -#include "hw/block/block.h" -#include "qapi/qmp/qerror.h" -#include "sysemu/sysemu.h" -#include "qmp-commands.h" -#include "trace.h" -#include "block/nbd.h" -#include "io/channel-socket.h" - -typedef struct NBDServerData { - QIOChannelSocket *listen_ioc; - int watch; - QCryptoTLSCreds *tlscreds; -} NBDServerData; - -static NBDServerData *nbd_server; - - -static gboolean nbd_accept(QIOChannel *ioc, GIOCondition condition, - gpointer opaque) -{ - QIOChannelSocket *cioc; - - if (!nbd_server) { - return FALSE; - } - - cioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc), - NULL); - if (!cioc) { - return TRUE; - } - - nbd_client_new(NULL, cioc, - nbd_server->tlscreds, NULL, - nbd_client_put); - object_unref(OBJECT(cioc)); - return TRUE; -} - - -static void nbd_server_free(NBDServerData *server) -{ - if (!server) { - return; - } - - if (server->watch != -1) { - g_source_remove(server->watch); - } - object_unref(OBJECT(server->listen_ioc)); - if (server->tlscreds) { - object_unref(OBJECT(server->tlscreds)); - } - - g_free(server); -} - -static QCryptoTLSCreds *nbd_get_tls_creds(const char *id, Error **errp) -{ - Object *obj; - QCryptoTLSCreds *creds; - - obj = object_resolve_path_component( - object_get_objects_root(), id); - if (!obj) { - error_setg(errp, "No TLS credentials with id '%s'", - id); - return NULL; - } - creds = (QCryptoTLSCreds *) - object_dynamic_cast(obj, TYPE_QCRYPTO_TLS_CREDS); - if (!creds) { - error_setg(errp, "Object with id '%s' is not TLS credentials", - id); - return NULL; - } - - if (creds->endpoint != QCRYPTO_TLS_CREDS_ENDPOINT_SERVER) { - error_setg(errp, - "Expecting TLS credentials with a server endpoint"); - return NULL; - } - object_ref(obj); - return creds; -} - - -void qmp_nbd_server_start(SocketAddress *addr, - bool has_tls_creds, const char *tls_creds, - Error **errp) -{ - if (nbd_server) { - error_setg(errp, "NBD server already running"); - return; - } - - nbd_server = g_new0(NBDServerData, 1); - nbd_server->watch = -1; - nbd_server->listen_ioc = qio_channel_socket_new(); - if (qio_channel_socket_listen_sync( - nbd_server->listen_ioc, addr, errp) < 0) { - goto error; - } - - if (has_tls_creds) { - nbd_server->tlscreds = nbd_get_tls_creds(tls_creds, errp); - if (!nbd_server->tlscreds) { - goto error; - } - - if (addr->type != SOCKET_ADDRESS_KIND_INET) { - error_setg(errp, "TLS is only supported with IPv4/IPv6"); - goto error; - } - } - - nbd_server->watch = qio_channel_add_watch( - QIO_CHANNEL(nbd_server->listen_ioc), - G_IO_IN, - nbd_accept, - NULL, - NULL); - - return; - - error: - nbd_server_free(nbd_server); - nbd_server = NULL; -} - -void qmp_nbd_server_add(const char *device, bool has_writable, bool writable, - Error **errp) -{ - BlockBackend *blk; - NBDExport *exp; - - if (!nbd_server) { - error_setg(errp, "NBD server not running"); - return; - } - - if (nbd_export_find(device)) { - error_setg(errp, "NBD server already exporting device '%s'", device); - return; - } - - blk = blk_by_name(device); - if (!blk) { - error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND, - "Device '%s' not found", device); - return; - } - if (!blk_is_inserted(blk)) { - error_setg(errp, QERR_DEVICE_HAS_NO_MEDIUM, device); - return; - } - - if (!has_writable) { - writable = false; - } - if (blk_is_read_only(blk)) { - writable = false; - } - - exp = nbd_export_new(blk, 0, -1, writable ? 0 : NBD_FLAG_READ_ONLY, NULL, - errp); - if (!exp) { - return; - } - - nbd_export_set_name(exp, device); - - /* The list of named exports has a strong reference to this export now and - * our only way of accessing it is through nbd_export_find(), so we can drop - * the strong reference that is @exp. */ - nbd_export_put(exp); -} - -void qmp_nbd_server_stop(Error **errp) -{ - nbd_export_close_all(); - - nbd_server_free(nbd_server); - nbd_server = NULL; -} |