summaryrefslogtreecommitdiffstats
path: root/qemu/blockdev-nbd.c
diff options
context:
space:
mode:
authorRajithaY <rajithax.yerrumsetty@intel.com>2017-04-25 03:31:15 -0700
committerRajitha Yerrumchetty <rajithax.yerrumsetty@intel.com>2017-05-22 06:48:08 +0000
commitbb756eebdac6fd24e8919e2c43f7d2c8c4091f59 (patch)
treeca11e03542edf2d8f631efeca5e1626d211107e3 /qemu/blockdev-nbd.c
parenta14b48d18a9ed03ec191cf16b162206998a895ce (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.c199
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;
-}