static int inside_daemon = 0;
struct private_data {
+ virMutex lock;
+
int sock; /* Socket. */
int watch; /* File handle watch */
pid_t pid; /* PID of tunnel process */
};
+static void remoteDriverLock(struct private_data *driver)
+{
+ virMutexLock(&driver->lock);
+}
+
+static void remoteDriverUnlock(struct private_data *driver)
+{
+ virMutexUnlock(&driver->lock);
+}
+
static int call (virConnectPtr conn, struct private_data *priv,
int flags, int proc_nr,
xdrproc_t args_filter, char *args,
return VIR_DRV_OPEN_ERROR;
}
+ if (virMutexInit(&priv->lock) < 0) {
+ error(conn, VIR_ERR_INTERNAL_ERROR,
+ _("cannot initialize mutex"));
+ VIR_FREE(priv);
+ return VIR_DRV_OPEN_ERROR;
+ }
+ remoteDriverLock(priv);
+ priv->localUses = 1;
+
if (flags & VIR_CONNECT_RO)
rflags |= VIR_DRV_OPEN_REMOTE_RO;
ret = doRemoteOpen(conn, priv, auth, rflags);
if (ret != VIR_DRV_OPEN_SUCCESS) {
conn->privateData = NULL;
+ remoteDriverUnlock(priv);
VIR_FREE(priv);
} else {
conn->privateData = priv;
+ remoteDriverUnlock(priv);
}
return ret;
}
static int
remoteClose (virConnectPtr conn)
{
- int ret;
+ int ret = 0;
struct private_data *priv = conn->privateData;
- ret = doRemoteClose(conn, priv);
- VIR_FREE (priv);
- conn->privateData = NULL;
+ remoteDriverLock(priv);
+ priv->localUses--;
+ if (!priv->localUses) {
+ ret = doRemoteClose(conn, priv);
+ conn->privateData = NULL;
+ remoteDriverUnlock(priv);
+ virMutexDestroy(&priv->lock);
+ VIR_FREE (priv);
+ }
+ if (priv)
+ remoteDriverUnlock(priv);
return ret;
}
remote_supports_feature_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
/* VIR_DRV_FEATURE_REMOTE* features are handled directly. */
if (feature == VIR_DRV_FEATURE_REMOTE) {
rv = 1;
rv = ret.supported;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_get_type_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
/* Cached? */
if (priv->type) {
rv = priv->type;
rv = priv->type = ret.type;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_get_version_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_GET_VERSION,
(xdrproc_t) xdr_void, (char *) NULL,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_get_hostname_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_GET_HOSTNAME,
(xdrproc_t) xdr_void, (char *) NULL,
rv = ret.hostname;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_get_max_vcpus_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
args.type = type == NULL ? NULL : (char **) &type;
if (call (conn, priv, 0, REMOTE_PROC_GET_MAX_VCPUS,
rv = ret.max_vcpus;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_node_get_info_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_NODE_GET_INFO,
(xdrproc_t) xdr_void, (char *) NULL,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_get_capabilities_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_GET_CAPABILITIES,
(xdrproc_t) xdr_void, (char *) NULL,
rv = ret.capabilities;
done:
+ remoteDriverUnlock(priv);
return rv;
}
int i;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
if (maxCells > REMOTE_NODE_MAX_CELLS) {
errorf (conn, VIR_ERR_RPC,
_("too many NUMA cells: %d > %d"),
rv = ret.freeMems.freeMems_len;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_node_get_free_memory_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_NODE_GET_FREE_MEMORY,
(xdrproc_t) xdr_void, NULL,
rv = ret.freeMem;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_list_domains_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
if (maxids > REMOTE_DOMAIN_ID_LIST_MAX) {
errorf (conn, VIR_ERR_RPC,
_("too many remote domain IDs: %d > %d"),
xdr_free ((xdrproc_t) xdr_remote_list_domains_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_num_of_domains_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_NUM_OF_DOMAINS,
(xdrproc_t) xdr_void, (char *) NULL,
rv = ret.num;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_create_xml_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
args.xml_desc = (char *) xmlDesc;
args.flags = flags;
xdr_free ((xdrproc_t) &xdr_remote_domain_create_xml_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return dom;
}
remote_domain_lookup_by_id_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
args.id = id;
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_domain_lookup_by_id_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return dom;
}
remote_domain_lookup_by_uuid_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
memcpy (args.uuid, uuid, VIR_UUID_BUFLEN);
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_domain_lookup_by_uuid_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return dom;
}
remote_domain_lookup_by_name_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
args.name = (char *) name;
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_domain_lookup_by_name_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return dom;
}
remote_domain_suspend_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_SUSPEND,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_resume_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_RESUME,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_shutdown_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_SHUTDOWN,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_reboot_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.flags = flags;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_destroy_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_DESTROY,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_get_os_type_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
memset (&ret, 0, sizeof ret);
rv = ret.type;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_get_max_memory_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
memset (&ret, 0, sizeof ret);
rv = ret.memory;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_set_max_memory_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.memory = memory;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_set_memory_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.memory = memory;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_get_info_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
memset (&ret, 0, sizeof ret);
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_save_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.to = (char *) to;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_restore_args args;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
args.from = (char *) from;
if (call (conn, priv, 0, REMOTE_PROC_DOMAIN_RESTORE,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_core_dump_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.to = (char *) to;
args.flags = flags;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_set_vcpus_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.nvcpus = nvcpus;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_pin_vcpu_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
if (maplen > REMOTE_CPUMAP_MAX) {
errorf (domain->conn, VIR_ERR_RPC,
_("map length greater than maximum: %d > %d"),
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_get_vcpus_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
if (maxinfo > REMOTE_VCPUINFO_MAX) {
errorf (domain->conn, VIR_ERR_RPC,
_("vCPU count exceeds maximum: %d > %d"),
xdr_free ((xdrproc_t) xdr_remote_domain_get_vcpus_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_get_max_vcpus_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
memset (&ret, 0, sizeof ret);
rv = ret.num;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_dump_xml_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.flags = flags;
rv = ret.xml;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_migrate_prepare_ret ret;
struct private_data *priv = dconn->privateData;
+ remoteDriverLock(priv);
+
args.uri_in = uri_in == NULL ? NULL : (char **) &uri_in;
args.flags = flags;
args.dname = dname == NULL ? NULL : (char **) &dname;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_migrate_perform_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.cookie.cookie_len = cookielen;
args.cookie.cookie_val = (char *) cookie;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_migrate_finish_ret ret;
struct private_data *priv = dconn->privateData;
+ remoteDriverLock(priv);
+
args.dname = (char *) dname;
args.cookie.cookie_len = cookielen;
args.cookie.cookie_val = (char *) cookie;
xdr_free ((xdrproc_t) &xdr_remote_domain_migrate_finish_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return ddom;
}
remote_domain_migrate_prepare2_ret ret;
struct private_data *priv = dconn->privateData;
+ remoteDriverLock(priv);
+
args.uri_in = uri_in == NULL ? NULL : (char **) &uri_in;
args.flags = flags;
args.dname = dname == NULL ? NULL : (char **) &dname;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_migrate_finish2_ret ret;
struct private_data *priv = dconn->privateData;
+ remoteDriverLock(priv);
+
args.dname = (char *) dname;
args.cookie.cookie_len = cookielen;
args.cookie.cookie_val = (char *) cookie;
xdr_free ((xdrproc_t) &xdr_remote_domain_migrate_finish2_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return ddom;
}
remote_list_defined_domains_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
if (maxnames > REMOTE_DOMAIN_NAME_LIST_MAX) {
errorf (conn, VIR_ERR_RPC,
_("too many remote domain names: %d > %d"),
xdr_free ((xdrproc_t) xdr_remote_list_defined_domains_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_num_of_defined_domains_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_NUM_OF_DEFINED_DOMAINS,
(xdrproc_t) xdr_void, (char *) NULL,
rv = ret.num;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_create_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_CREATE,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_define_xml_ret ret;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
args.xml = (char *) xml;
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) xdr_remote_domain_define_xml_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return dom;
}
remote_domain_undefine_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_UNDEFINE,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_attach_device_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.xml = (char *) xml;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_detach_device_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.xml = (char *) xml;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_get_autostart_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
memset (&ret, 0, sizeof ret);
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_set_autostart_args args;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.autostart = autostart;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_get_scheduler_type_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
memset (&ret, 0, sizeof ret);
rv = ret.type;
done:
+ remoteDriverUnlock(priv);
return rv;
}
int i = -1;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.nparams = *nparams;
cleanup:
xdr_free ((xdrproc_t) xdr_remote_domain_get_scheduler_parameters_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
int i, do_error;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
/* Serialise the scheduler parameters. */
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_block_stats_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.path = (char *) path;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_interface_stats_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
make_nonnull_domain (&args.dom, domain);
args.path = (char *) path;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_block_peek_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
if (size > REMOTE_DOMAIN_BLOCK_PEEK_BUFFER_MAX) {
errorf (domain->conn, VIR_ERR_RPC,
_("block peek request too large for remote protocol, %zi > %d"),
free (ret.buffer.buffer_val);
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_domain_memory_peek_ret ret;
struct private_data *priv = domain->conn->privateData;
+ remoteDriverLock(priv);
+
if (size > REMOTE_DOMAIN_MEMORY_PEEK_BUFFER_MAX) {
errorf (domain->conn, VIR_ERR_RPC,
_("memory peek request too large for remote protocol, %zi > %d"),
free (ret.buffer.buffer_val);
done:
+ remoteDriverUnlock(priv);
return rv;
}
if (conn &&
conn->driver &&
STREQ (conn->driver->name, "remote")) {
- /* If we're here, the remote driver is already
+ struct private_data *priv;
+
+ /* If we're here, the remote driver is already
* in use due to a) a QEMU uri, or b) a remote
* URI. So we can re-use existing connection
*/
- conn->networkPrivateData = conn->privateData;
+ priv = conn->privateData;
+ remoteDriverLock(priv);
+ priv->localUses++;
+ conn->networkPrivateData = priv;
+ remoteDriverUnlock(priv);
return VIR_DRV_OPEN_SUCCESS;
} else {
/* Using a non-remote driver, so we need to open a
error (conn, VIR_ERR_NO_MEMORY, _("struct private_data"));
return VIR_DRV_OPEN_ERROR;
}
+ if (virMutexInit(&priv->lock) < 0) {
+ error(conn, VIR_ERR_INTERNAL_ERROR,
+ _("cannot initialize mutex"));
+ VIR_FREE(priv);
+ return VIR_DRV_OPEN_ERROR;
+ }
if (flags & VIR_CONNECT_RO)
rflags |= VIR_DRV_OPEN_REMOTE_RO;
rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
int rv = 0;
struct private_data *priv = conn->networkPrivateData;
- if (priv->localUses) {
- priv->localUses--;
- if (!priv->localUses) {
- rv = doRemoteClose(conn, priv);
- VIR_FREE(priv);
- conn->networkPrivateData = NULL;
- }
+ remoteDriverLock(priv);
+ priv->localUses--;
+ if (!priv->localUses) {
+ rv = doRemoteClose(conn, priv);
+ conn->networkPrivateData = NULL;
+ remoteDriverUnlock(priv);
+ virMutexDestroy(&priv->lock);
+ VIR_FREE(priv);
}
+ if (priv)
+ remoteDriverUnlock(priv);
return rv;
}
remote_num_of_networks_ret ret;
struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_NUM_OF_NETWORKS,
(xdrproc_t) xdr_void, (char *) NULL,
rv = ret.num;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_list_networks_ret ret;
struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+
if (maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
errorf (conn, VIR_ERR_RPC,
_("too many remote networks: %d > %d"),
xdr_free ((xdrproc_t) xdr_remote_list_networks_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_num_of_defined_networks_ret ret;
struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_NUM_OF_DEFINED_NETWORKS,
(xdrproc_t) xdr_void, (char *) NULL,
rv = ret.num;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_list_defined_networks_ret ret;
struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+
if (maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
errorf (conn, VIR_ERR_RPC,
_("too many remote networks: %d > %d"),
xdr_free ((xdrproc_t) xdr_remote_list_defined_networks_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_network_lookup_by_uuid_ret ret;
struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+
memcpy (args.uuid, uuid, VIR_UUID_BUFLEN);
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_network_lookup_by_uuid_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return net;
}
remote_network_lookup_by_name_ret ret;
struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+
args.name = (char *) name;
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_network_lookup_by_name_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return net;
}
remote_network_create_xml_ret ret;
struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+
args.xml = (char *) xmlDesc;
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_network_create_xml_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return net;
}
remote_network_define_xml_ret ret;
struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+
args.xml = (char *) xml;
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_network_define_xml_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return net;
}
remote_network_undefine_args args;
struct private_data *priv = network->conn->networkPrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_network (&args.net, network);
if (call (network->conn, priv, 0, REMOTE_PROC_NETWORK_UNDEFINE,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_network_create_args args;
struct private_data *priv = network->conn->networkPrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_network (&args.net, network);
if (call (network->conn, priv, 0, REMOTE_PROC_NETWORK_CREATE,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_network_destroy_args args;
struct private_data *priv = network->conn->networkPrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_network (&args.net, network);
if (call (network->conn, priv, 0, REMOTE_PROC_NETWORK_DESTROY,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_network_dump_xml_ret ret;
struct private_data *priv = network->conn->networkPrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_network (&args.net, network);
args.flags = flags;
rv = ret.xml;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_network_get_bridge_name_ret ret;
struct private_data *priv = network->conn->networkPrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_network (&args.net, network);
memset (&ret, 0, sizeof ret);
rv = ret.name;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_network_get_autostart_ret ret;
struct private_data *priv = network->conn->networkPrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_network (&args.net, network);
memset (&ret, 0, sizeof ret);
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_network_set_autostart_args args;
struct private_data *priv = network->conn->networkPrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_network (&args.net, network);
args.autostart = autostart;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
if (conn &&
conn->driver &&
STREQ (conn->driver->name, "remote")) {
+ struct private_data *priv = conn->privateData;
/* If we're here, the remote driver is already
* in use due to a) a QEMU uri, or b) a remote
* URI. So we can re-use existing connection
*/
- conn->storagePrivateData = conn->privateData;
+ remoteDriverLock(priv);
+ priv->localUses++;
+ conn->storagePrivateData = priv;
+ remoteDriverUnlock(priv);
return VIR_DRV_OPEN_SUCCESS;
} else if (conn->networkDriver &&
STREQ (conn->networkDriver->name, "remote")) {
- conn->storagePrivateData = conn->networkPrivateData;
- ((struct private_data *)conn->storagePrivateData)->localUses++;
+ struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+ conn->storagePrivateData = priv;
+ priv->localUses++;
+ remoteDriverUnlock(priv);
return VIR_DRV_OPEN_SUCCESS;
} else {
/* Using a non-remote driver, so we need to open a
error (NULL, VIR_ERR_NO_MEMORY, _("struct private_data"));
return VIR_DRV_OPEN_ERROR;
}
+ if (virMutexInit(&priv->lock) < 0) {
+ error(conn, VIR_ERR_INTERNAL_ERROR,
+ _("cannot initialize mutex"));
+ VIR_FREE(priv);
+ return VIR_DRV_OPEN_ERROR;
+ }
if (flags & VIR_CONNECT_RO)
rflags |= VIR_DRV_OPEN_REMOTE_RO;
rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
int ret = 0;
struct private_data *priv = conn->storagePrivateData;
- if (priv->localUses) {
- priv->localUses--;
- if (!priv->localUses) {
- ret = doRemoteClose(conn, priv);
- VIR_FREE(priv);
- conn->storagePrivateData = NULL;
- }
+ remoteDriverLock(priv);
+ priv->localUses--;
+ if (!priv->localUses) {
+ ret = doRemoteClose(conn, priv);
+ conn->storagePrivateData = NULL;
+ remoteDriverUnlock(priv);
+ virMutexDestroy(&priv->lock);
+ VIR_FREE(priv);
}
+ if (priv)
+ remoteDriverUnlock(priv);
return ret;
}
remote_num_of_storage_pools_ret ret;
struct private_data *priv = conn->storagePrivateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_NUM_OF_STORAGE_POOLS,
(xdrproc_t) xdr_void, (char *) NULL,
rv = ret.num;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_list_storage_pools_ret ret;
struct private_data *priv = conn->storagePrivateData;
+ remoteDriverLock(priv);
+
if (maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) {
error (conn, VIR_ERR_RPC, _("too many storage pools requested"));
goto done;
xdr_free ((xdrproc_t) xdr_remote_list_storage_pools_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_num_of_defined_storage_pools_ret ret;
struct private_data *priv = conn->storagePrivateData;
+ remoteDriverLock(priv);
+
memset (&ret, 0, sizeof ret);
if (call (conn, priv, 0, REMOTE_PROC_NUM_OF_DEFINED_STORAGE_POOLS,
(xdrproc_t) xdr_void, (char *) NULL,
rv = ret.num;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_list_defined_storage_pools_ret ret;
struct private_data *priv = conn->storagePrivateData;
+ remoteDriverLock(priv);
+
if (maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) {
error (conn, VIR_ERR_RPC, _("too many storage pools requested"));
goto done;
xdr_free ((xdrproc_t) xdr_remote_list_defined_storage_pools_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
struct private_data *priv = conn->storagePrivateData;
const char *emptyString = "";
+ remoteDriverLock(priv);
+
args.type = (char*)type;
/*
* I'd think the following would work here:
xdr_free ((xdrproc_t) xdr_remote_find_storage_pool_sources_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_lookup_by_uuid_ret ret;
struct private_data *priv = conn->storagePrivateData;
+ remoteDriverLock(priv);
+
memcpy (args.uuid, uuid, VIR_UUID_BUFLEN);
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_storage_pool_lookup_by_uuid_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return pool;
}
remote_storage_pool_lookup_by_name_ret ret;
struct private_data *priv = conn->storagePrivateData;
+ remoteDriverLock(priv);
+
args.name = (char *) name;
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_storage_pool_lookup_by_name_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return pool;
}
remote_storage_pool_lookup_by_volume_ret ret;
struct private_data *priv = vol->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_vol (&args.vol, vol);
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_storage_pool_lookup_by_volume_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return pool;
}
remote_storage_pool_create_xml_ret ret;
struct private_data *priv = conn->storagePrivateData;
+ remoteDriverLock(priv);
+
args.xml = (char *) xmlDesc;
args.flags = flags;
xdr_free ((xdrproc_t) &xdr_remote_storage_pool_create_xml_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return pool;
}
remote_storage_pool_define_xml_ret ret;
struct private_data *priv = conn->storagePrivateData;
+ remoteDriverLock(priv);
+
args.xml = (char *) xml;
args.flags = flags;
xdr_free ((xdrproc_t) &xdr_remote_storage_pool_define_xml_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return pool;
}
remote_storage_pool_undefine_args args;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
if (call (pool->conn, priv, 0, REMOTE_PROC_STORAGE_POOL_UNDEFINE,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_create_args args;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
args.flags = flags;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_build_args args;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
args.flags = flags;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_destroy_args args;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
if (call (pool->conn, priv, 0, REMOTE_PROC_STORAGE_POOL_DESTROY,
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_delete_args args;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
args.flags = flags;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_refresh_args args;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
args.flags = flags;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_get_info_ret ret;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
memset (&ret, 0, sizeof ret);
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_dump_xml_ret ret;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
args.flags = flags;
rv = ret.xml;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_get_autostart_ret ret;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
memset (&ret, 0, sizeof ret);
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_set_autostart_args args;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
args.autostart = autostart;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_num_of_volumes_ret ret;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool(&args.pool, pool);
memset (&ret, 0, sizeof ret);
rv = ret.num;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_pool_list_volumes_ret ret;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
if (maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX) {
error (pool->conn, VIR_ERR_RPC, _("too many storage volumes requested"));
goto done;
xdr_free ((xdrproc_t) xdr_remote_storage_pool_list_volumes_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_vol_lookup_by_name_ret ret;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool(&args.pool, pool);
args.name = (char *) name;
xdr_free ((xdrproc_t) &xdr_remote_storage_vol_lookup_by_name_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return vol;
}
remote_storage_vol_lookup_by_key_ret ret;
struct private_data *priv = conn->storagePrivateData;
+ remoteDriverLock(priv);
+
args.key = (char *) key;
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_storage_vol_lookup_by_key_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return vol;
}
remote_storage_vol_lookup_by_path_ret ret;
struct private_data *priv = conn->storagePrivateData;
+ remoteDriverLock(priv);
+
args.path = (char *) path;
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) &xdr_remote_storage_vol_lookup_by_path_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return vol;
}
remote_storage_vol_create_xml_ret ret;
struct private_data *priv = pool->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_pool (&args.pool, pool);
args.xml = (char *) xmlDesc;
args.flags = flags;
xdr_free ((xdrproc_t) &xdr_remote_storage_vol_create_xml_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return vol;
}
remote_storage_vol_delete_args args;
struct private_data *priv = vol->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_vol (&args.vol, vol);
args.flags = flags;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_vol_get_info_ret ret;
struct private_data *priv = vol->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_vol (&args.vol, vol);
memset (&ret, 0, sizeof ret);
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_vol_dump_xml_ret ret;
struct private_data *priv = vol->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_vol (&args.vol, vol);
args.flags = flags;
rv = ret.xml;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_storage_vol_get_path_ret ret;
struct private_data *priv = vol->conn->storagePrivateData;
+ remoteDriverLock(priv);
+
make_nonnull_storage_vol (&args.vol, vol);
memset (&ret, 0, sizeof ret);
rv = ret.name;
done:
+ remoteDriverUnlock(priv);
return rv;
}
virConnectAuthPtr auth ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED)
{
+ if (inside_daemon)
+ return VIR_DRV_OPEN_DECLINED;
+
if (conn &&
conn->driver &&
STREQ (conn->driver->name, "remote")) {
+ struct private_data *priv = conn->privateData;
/* If we're here, the remote driver is already
* in use due to a) a QEMU uri, or b) a remote
* URI. So we can re-use existing connection
*/
- conn->devMonPrivateData = conn->privateData;
+ remoteDriverLock(priv);
+ priv->localUses++;
+ conn->devMonPrivateData = priv;
+ remoteDriverUnlock(priv);
return VIR_DRV_OPEN_SUCCESS;
- }
+ } else if (conn->networkDriver &&
+ STREQ (conn->networkDriver->name, "remote")) {
+ struct private_data *priv = conn->networkPrivateData;
+ remoteDriverLock(priv);
+ conn->devMonPrivateData = priv;
+ priv->localUses++;
+ remoteDriverUnlock(priv);
+ return VIR_DRV_OPEN_SUCCESS;
+ } else {
+ /* Using a non-remote driver, so we need to open a
+ * new connection for network APIs, forcing it to
+ * use the UNIX transport. This handles Xen driver
+ * which doesn't have its own impl of the network APIs.
+ */
+ struct private_data *priv;
+ int ret, rflags = 0;
+ if (VIR_ALLOC(priv) < 0) {
+ error (NULL, VIR_ERR_NO_MEMORY, _("struct private_data"));
+ return VIR_DRV_OPEN_ERROR;
+ }
+ if (virMutexInit(&priv->lock) < 0) {
+ error(conn, VIR_ERR_INTERNAL_ERROR,
+ _("cannot initialize mutex"));
+ VIR_FREE(priv);
+ return VIR_DRV_OPEN_ERROR;
+ }
+ if (flags & VIR_CONNECT_RO)
+ rflags |= VIR_DRV_OPEN_REMOTE_RO;
+ rflags |= VIR_DRV_OPEN_REMOTE_UNIX;
- /* Decline open. Will fallback to appropriate local node driver. */
- return VIR_DRV_OPEN_DECLINED;
+ priv->sock = -1;
+ ret = doRemoteOpen(conn, priv, auth, rflags);
+ if (ret != VIR_DRV_OPEN_SUCCESS) {
+ conn->devMonPrivateData = NULL;
+ VIR_FREE(priv);
+ } else {
+ priv->localUses = 1;
+ conn->devMonPrivateData = priv;
+ }
+ return ret;
+ }
}
static int remoteDevMonClose(virConnectPtr conn)
int ret = 0;
struct private_data *priv = conn->devMonPrivateData;
- if (priv->localUses) {
- priv->localUses--;
- if (!priv->localUses) {
- ret = doRemoteClose(conn, priv);
- VIR_FREE(priv);
- conn->devMonPrivateData = NULL;
- }
+ remoteDriverLock(priv);
+ priv->localUses--;
+ if (!priv->localUses) {
+ ret = doRemoteClose(conn, priv);
+ conn->devMonPrivateData = NULL;
+ remoteDriverUnlock(priv);
+ virMutexDestroy(&priv->lock);
+ VIR_FREE(priv);
}
+ if (priv)
+ remoteDriverUnlock(priv);
return ret;
}
remote_node_num_of_devices_ret ret;
struct private_data *priv = conn->devMonPrivateData;
+ remoteDriverLock(priv);
+
args.cap = cap ? (char **)&cap : NULL;
args.flags = flags;
rv = ret.num;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_node_list_devices_ret ret;
struct private_data *priv = conn->devMonPrivateData;
+ remoteDriverLock(priv);
+
if (maxnames > REMOTE_NODE_DEVICE_NAME_LIST_MAX) {
error (conn, VIR_ERR_RPC, _("too many device names requested"));
goto done;
xdr_free ((xdrproc_t) xdr_remote_node_list_devices_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
virNodeDevicePtr dev = NULL;
struct private_data *priv = conn->devMonPrivateData;
+ remoteDriverLock(priv);
+
args.name = (char *)name;
memset (&ret, 0, sizeof ret);
xdr_free ((xdrproc_t) xdr_remote_node_device_lookup_by_name_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return dev;
}
remote_node_device_dump_xml_ret ret;
struct private_data *priv = dev->conn->devMonPrivateData;
+ remoteDriverLock(priv);
+
args.name = dev->name;
args.flags = flags;
rv = ret.xml;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_node_device_get_parent_ret ret;
struct private_data *priv = dev->conn->devMonPrivateData;
+ remoteDriverLock(priv);
+
args.name = dev->name;
memset (&ret, 0, sizeof ret);
rv = ret.parent ? *ret.parent : NULL;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_node_device_num_of_caps_ret ret;
struct private_data *priv = dev->conn->devMonPrivateData;
+ remoteDriverLock(priv);
+
args.name = dev->name;
memset (&ret, 0, sizeof ret);
rv = ret.num;
done:
+ remoteDriverUnlock(priv);
return rv;
}
remote_node_device_list_caps_ret ret;
struct private_data *priv = dev->conn->devMonPrivateData;
+ remoteDriverLock(priv);
+
if (maxnames > REMOTE_NODE_DEVICE_CAPS_LIST_MAX) {
error (dev->conn, VIR_ERR_RPC, _("too many capability names requested"));
goto done;
xdr_free ((xdrproc_t) xdr_remote_node_device_list_caps_ret, (char *) &ret);
done:
+ remoteDriverUnlock(priv);
return rv;
}
int rv = -1;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
if (priv->eventFlushTimer < 0) {
error (conn, VIR_ERR_NO_SUPPORT, _("no event support"));
goto done;
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
struct private_data *priv = conn->privateData;
int rv = -1;
+ remoteDriverLock(priv);
+
if (virDomainEventCallbackListRemove(conn, priv->callbackList,
callback) < 0) {
error (conn, VIR_ERR_RPC, _("removing cb fron list"));
rv = 0;
done:
+ remoteDriverUnlock(priv);
return rv;
}
virConnectPtr conn = opaque;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
DEBUG("Event fired %d %d %d %X", watch, fd, event, event);
if (event & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) {
}
done:
- return;
+ remoteDriverUnlock(priv);
}
void
virConnectPtr conn = opaque;
struct private_data *priv = conn->privateData;
+ remoteDriverLock(priv);
+
virDomainEventQueueDispatch(priv->domainEvents, priv->callbackList,
virDomainEventDispatchDefaultFunc, NULL);
virEventUpdateTimeout(priv->eventFlushTimer, -1);
+
+ remoteDriverUnlock(priv);
}