mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
Remove virConnectPtr from storage APIs & driver
The virConnectPtr is no longer required for error reporting since that is recorded in a thread local. Remove use of virConnectPtr from all APIs in storage_conf.{h,c} and storage_encryption_conf.{h,c} and update all callers to match
This commit is contained in:
parent
99edc443e9
commit
031366383a
@ -1297,7 +1297,7 @@ virDomainDiskDefParseXML(xmlNodePtr node,
|
||||
devaddr = virXMLPropString(cur, "devaddr");
|
||||
} else if (encryption == NULL &&
|
||||
xmlStrEqual(cur->name, BAD_CAST "encryption")) {
|
||||
encryption = virStorageEncryptionParseNode(NULL, node->doc,
|
||||
encryption = virStorageEncryptionParseNode(node->doc,
|
||||
cur);
|
||||
if (encryption == NULL)
|
||||
goto error;
|
||||
@ -4581,7 +4581,7 @@ virDomainDiskDefFormat(virBufferPtr buf,
|
||||
virBufferEscapeString(buf, " <serial>%s</serial>\n",
|
||||
def->serial);
|
||||
if (def->encryption != NULL &&
|
||||
virStorageEncryptionFormat(NULL, buf, def->encryption) < 0)
|
||||
virStorageEncryptionFormat(buf, def->encryption) < 0)
|
||||
return -1;
|
||||
|
||||
if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
|
||||
|
@ -46,9 +46,6 @@
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_STORAGE
|
||||
|
||||
#define virStorageError(conn, code, fmt...) \
|
||||
virReportErrorHelper(conn, VIR_FROM_STORAGE, code, __FILE__,\
|
||||
__FUNCTION__, __LINE__, fmt)
|
||||
|
||||
VIR_ENUM_IMPL(virStoragePool,
|
||||
VIR_STORAGE_POOL_LAST,
|
||||
@ -223,7 +220,7 @@ virStoragePoolTypeInfoLookup(int type) {
|
||||
if (poolTypeInfo[i].poolType == type)
|
||||
return &poolTypeInfo[i];
|
||||
|
||||
virStorageReportError(NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("missing backend for pool type %d"), type);
|
||||
return NULL;
|
||||
}
|
||||
@ -366,19 +363,18 @@ virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
|
||||
|
||||
|
||||
static int
|
||||
virStoragePoolDefParseAuthChap(virConnectPtr conn,
|
||||
xmlXPathContextPtr ctxt,
|
||||
virStoragePoolDefParseAuthChap(xmlXPathContextPtr ctxt,
|
||||
virStoragePoolAuthChapPtr auth) {
|
||||
auth->login = virXPathString("string(./auth/@login)", ctxt);
|
||||
if (auth->login == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing auth host attribute"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
auth->passwd = virXPathString("string(./auth/@passwd)", ctxt);
|
||||
if (auth->passwd == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing auth passwd attribute"));
|
||||
return -1;
|
||||
}
|
||||
@ -387,8 +383,7 @@ virStoragePoolDefParseAuthChap(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static int
|
||||
virStoragePoolDefParseSource(virConnectPtr conn,
|
||||
xmlXPathContextPtr ctxt,
|
||||
virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
|
||||
virStoragePoolSourcePtr source,
|
||||
int pool_type,
|
||||
xmlNodePtr node) {
|
||||
@ -415,7 +410,7 @@ virStoragePoolDefParseSource(virConnectPtr conn,
|
||||
source->format = options->formatFromString(format);
|
||||
|
||||
if (source->format < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
_("unknown pool format type %s"), format);
|
||||
VIR_FREE(format);
|
||||
goto cleanup;
|
||||
@ -438,7 +433,7 @@ virStoragePoolDefParseSource(virConnectPtr conn,
|
||||
xmlChar *path = xmlGetProp(nodeset[i], BAD_CAST "path");
|
||||
if (path == NULL) {
|
||||
VIR_FREE(nodeset);
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing storage pool source device path"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -457,7 +452,7 @@ virStoragePoolDefParseSource(virConnectPtr conn,
|
||||
if (STREQ(authType, "chap")) {
|
||||
source->authType = VIR_STORAGE_POOL_AUTH_CHAP;
|
||||
} else {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
_("unknown auth type '%s'"),
|
||||
(const char *)authType);
|
||||
goto cleanup;
|
||||
@ -465,7 +460,7 @@ virStoragePoolDefParseSource(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if (source->authType == VIR_STORAGE_POOL_AUTH_CHAP) {
|
||||
if (virStoragePoolDefParseAuthChap(conn, ctxt, &source->auth.chap) < 0)
|
||||
if (virStoragePoolDefParseAuthChap(ctxt, &source->auth.chap) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@ -479,8 +474,7 @@ cleanup:
|
||||
}
|
||||
|
||||
virStoragePoolSourcePtr
|
||||
virStoragePoolDefParseSourceString(virConnectPtr conn,
|
||||
const char *srcSpec,
|
||||
virStoragePoolDefParseSourceString(const char *srcSpec,
|
||||
int pool_type)
|
||||
{
|
||||
xmlDocPtr doc = NULL;
|
||||
@ -493,7 +487,7 @@ virStoragePoolDefParseSourceString(virConnectPtr conn,
|
||||
XML_PARSE_NOERROR | XML_PARSE_NOWARNING);
|
||||
|
||||
if (doc == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("bad <source> spec"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -511,12 +505,12 @@ virStoragePoolDefParseSourceString(virConnectPtr conn,
|
||||
|
||||
node = virXPathNode("/source", xpath_ctxt);
|
||||
if (!node) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("root element was not source"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virStoragePoolDefParseSource(conn, xpath_ctxt, def, pool_type,
|
||||
if (virStoragePoolDefParseSource(xpath_ctxt, def, pool_type,
|
||||
node) < 0)
|
||||
goto cleanup;
|
||||
|
||||
@ -531,8 +525,7 @@ cleanup:
|
||||
return ret;
|
||||
}
|
||||
static int
|
||||
virStorageDefParsePerms(virConnectPtr conn,
|
||||
xmlXPathContextPtr ctxt,
|
||||
virStorageDefParsePerms(xmlXPathContextPtr ctxt,
|
||||
virStoragePermsPtr perms,
|
||||
const char *permxpath,
|
||||
int defaultmode) {
|
||||
@ -563,7 +556,7 @@ virStorageDefParsePerms(virConnectPtr conn,
|
||||
perms->mode = strtol(mode, &end, 8);
|
||||
if (*end || perms->mode < 0 || perms->mode > 0777) {
|
||||
VIR_FREE(mode);
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("malformed octal mode"));
|
||||
goto error;
|
||||
}
|
||||
@ -574,7 +567,7 @@ virStorageDefParsePerms(virConnectPtr conn,
|
||||
perms->uid = getuid();
|
||||
} else {
|
||||
if (virXPathLong("number(./owner)", ctxt, &v) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("malformed owner element"));
|
||||
goto error;
|
||||
}
|
||||
@ -585,7 +578,7 @@ virStorageDefParsePerms(virConnectPtr conn,
|
||||
perms->gid = getgid();
|
||||
} else {
|
||||
if (virXPathLong("number(./group)", ctxt, &v) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("malformed group element"));
|
||||
goto error;
|
||||
}
|
||||
@ -602,8 +595,7 @@ error:
|
||||
}
|
||||
|
||||
static virStoragePoolDefPtr
|
||||
virStoragePoolDefParseXML(virConnectPtr conn,
|
||||
xmlXPathContextPtr ctxt) {
|
||||
virStoragePoolDefParseXML(xmlXPathContextPtr ctxt) {
|
||||
virStoragePoolOptionsPtr options;
|
||||
virStoragePoolDefPtr ret;
|
||||
xmlNodePtr source_node;
|
||||
@ -617,7 +609,7 @@ virStoragePoolDefParseXML(virConnectPtr conn,
|
||||
|
||||
type = virXPathString("string(./@type)", ctxt);
|
||||
if ((ret->type = virStoragePoolTypeFromString((const char *)type)) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("unknown storage pool type %s"), (const char*)type);
|
||||
goto cleanup;
|
||||
}
|
||||
@ -631,7 +623,7 @@ virStoragePoolDefParseXML(virConnectPtr conn,
|
||||
|
||||
source_node = virXPathNode("./source", ctxt);
|
||||
if (source_node) {
|
||||
if (virStoragePoolDefParseSource(conn, ctxt, &ret->source, ret->type,
|
||||
if (virStoragePoolDefParseSource(ctxt, &ret->source, ret->type,
|
||||
source_node) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
@ -641,7 +633,7 @@ virStoragePoolDefParseXML(virConnectPtr conn,
|
||||
options->flags & VIR_STORAGE_POOL_SOURCE_NAME)
|
||||
ret->name = ret->source.name;
|
||||
if (ret->name == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing pool source name element"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -649,13 +641,13 @@ virStoragePoolDefParseXML(virConnectPtr conn,
|
||||
uuid = virXPathString("string(./uuid)", ctxt);
|
||||
if (uuid == NULL) {
|
||||
if (virUUIDGenerate(ret->uuid) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("unable to generate uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
} else {
|
||||
if (virUUIDParse(uuid, ret->uuid) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("malformed uuid element"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -664,7 +656,7 @@ virStoragePoolDefParseXML(virConnectPtr conn,
|
||||
|
||||
if (options->flags & VIR_STORAGE_POOL_SOURCE_HOST) {
|
||||
if (!ret->source.host.name) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s",
|
||||
_("missing storage pool source host name"));
|
||||
goto cleanup;
|
||||
@ -673,7 +665,7 @@ virStoragePoolDefParseXML(virConnectPtr conn,
|
||||
|
||||
if (options->flags & VIR_STORAGE_POOL_SOURCE_DIR) {
|
||||
if (!ret->source.dir) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing storage pool source path"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -691,19 +683,19 @@ virStoragePoolDefParseXML(virConnectPtr conn,
|
||||
|
||||
if (options->flags & VIR_STORAGE_POOL_SOURCE_ADAPTER) {
|
||||
if (!ret->source.adapter) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing storage pool source adapter name"));
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
if ((ret->target.path = virXPathString("string(./target/path)", ctxt)) == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing storage pool target path"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virStorageDefParsePerms(conn, ctxt, &ret->target.perms,
|
||||
if (virStorageDefParsePerms(ctxt, &ret->target.perms,
|
||||
"./target/permissions", 0700) < 0)
|
||||
goto cleanup;
|
||||
|
||||
@ -723,13 +715,10 @@ catchXMLError (void *ctx, const char *msg ATTRIBUTE_UNUSED, ...)
|
||||
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
|
||||
|
||||
if (ctxt) {
|
||||
virConnectPtr conn = ctxt->_private;
|
||||
|
||||
if (conn &&
|
||||
conn->err.code == VIR_ERR_NONE &&
|
||||
if (virGetLastError() == NULL &&
|
||||
ctxt->lastError.level == XML_ERR_FATAL &&
|
||||
ctxt->lastError.message != NULL) {
|
||||
virStorageReportError (conn, VIR_ERR_XML_DETAIL,
|
||||
virStorageReportError (VIR_ERR_XML_DETAIL,
|
||||
_("at line %d: %s"),
|
||||
ctxt->lastError.line,
|
||||
ctxt->lastError.message);
|
||||
@ -738,15 +727,14 @@ catchXMLError (void *ctx, const char *msg ATTRIBUTE_UNUSED, ...)
|
||||
}
|
||||
|
||||
virStoragePoolDefPtr
|
||||
virStoragePoolDefParseNode(virConnectPtr conn,
|
||||
xmlDocPtr xml,
|
||||
virStoragePoolDefParseNode(xmlDocPtr xml,
|
||||
xmlNodePtr root) {
|
||||
xmlXPathContextPtr ctxt = NULL;
|
||||
virStoragePoolDefPtr def = NULL;
|
||||
|
||||
if (STRNEQ((const char *)root->name, "pool")) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
"%s", _("unknown root element for storage pool"));
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("unknown root element for storage pool"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@ -757,15 +745,14 @@ virStoragePoolDefParseNode(virConnectPtr conn,
|
||||
}
|
||||
|
||||
ctxt->node = root;
|
||||
def = virStoragePoolDefParseXML(conn, ctxt);
|
||||
def = virStoragePoolDefParseXML(ctxt);
|
||||
cleanup:
|
||||
xmlXPathFreeContext(ctxt);
|
||||
return def;
|
||||
}
|
||||
|
||||
static virStoragePoolDefPtr
|
||||
virStoragePoolDefParse(virConnectPtr conn,
|
||||
const char *xmlStr,
|
||||
virStoragePoolDefParse(const char *xmlStr,
|
||||
const char *filename) {
|
||||
virStoragePoolDefPtr ret = NULL;
|
||||
xmlParserCtxtPtr pctxt;
|
||||
@ -777,9 +764,7 @@ virStoragePoolDefParse(virConnectPtr conn,
|
||||
if (!pctxt || !pctxt->sax)
|
||||
goto cleanup;
|
||||
pctxt->sax->error = catchXMLError;
|
||||
pctxt->_private = conn;
|
||||
|
||||
if (conn) virResetError (&conn->err);
|
||||
if (filename) {
|
||||
xml = xmlCtxtReadFile (pctxt, filename, NULL,
|
||||
XML_PARSE_NOENT | XML_PARSE_NONET |
|
||||
@ -792,20 +777,20 @@ virStoragePoolDefParse(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if (!xml) {
|
||||
if (conn && conn->err.code == VIR_ERR_NONE)
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
"%s",_("failed to parse xml document"));
|
||||
if (virGetLastError() == NULL)
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s",_("failed to parse xml document"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
node = xmlDocGetRootElement(xml);
|
||||
if (node == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing root element"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = virStoragePoolDefParseNode(conn, xml, node);
|
||||
ret = virStoragePoolDefParseNode(xml, node);
|
||||
|
||||
xmlFreeParserCtxt (pctxt);
|
||||
xmlFreeDoc(xml);
|
||||
@ -819,22 +804,19 @@ virStoragePoolDefParse(virConnectPtr conn,
|
||||
}
|
||||
|
||||
virStoragePoolDefPtr
|
||||
virStoragePoolDefParseString(virConnectPtr conn,
|
||||
const char *xmlStr)
|
||||
virStoragePoolDefParseString(const char *xmlStr)
|
||||
{
|
||||
return virStoragePoolDefParse(conn, xmlStr, NULL);
|
||||
return virStoragePoolDefParse(xmlStr, NULL);
|
||||
}
|
||||
|
||||
virStoragePoolDefPtr
|
||||
virStoragePoolDefParseFile(virConnectPtr conn,
|
||||
const char *filename)
|
||||
virStoragePoolDefParseFile(const char *filename)
|
||||
{
|
||||
return virStoragePoolDefParse(conn, NULL, filename);
|
||||
return virStoragePoolDefParse(NULL, filename);
|
||||
}
|
||||
|
||||
static int
|
||||
virStoragePoolSourceFormat(virConnectPtr conn,
|
||||
virBufferPtr buf,
|
||||
virStoragePoolSourceFormat(virBufferPtr buf,
|
||||
virStoragePoolOptionsPtr options,
|
||||
virStoragePoolSourcePtr src)
|
||||
{
|
||||
@ -876,7 +858,7 @@ virStoragePoolSourceFormat(virConnectPtr conn,
|
||||
if (options->formatToString) {
|
||||
const char *format = (options->formatToString)(src->format);
|
||||
if (!format) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("unknown pool format number %d"),
|
||||
src->format);
|
||||
return -1;
|
||||
@ -896,8 +878,7 @@ virStoragePoolSourceFormat(virConnectPtr conn,
|
||||
|
||||
|
||||
char *
|
||||
virStoragePoolDefFormat(virConnectPtr conn,
|
||||
virStoragePoolDefPtr def) {
|
||||
virStoragePoolDefFormat(virStoragePoolDefPtr def) {
|
||||
virStoragePoolOptionsPtr options;
|
||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||
const char *type;
|
||||
@ -909,7 +890,7 @@ virStoragePoolDefFormat(virConnectPtr conn,
|
||||
|
||||
type = virStoragePoolTypeToString(def->type);
|
||||
if (!type) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("unexpected pool type"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -926,7 +907,7 @@ virStoragePoolDefFormat(virConnectPtr conn,
|
||||
virBufferVSprintf(&buf," <available>%llu</available>\n",
|
||||
def->available);
|
||||
|
||||
if (virStoragePoolSourceFormat(conn, &buf, options, &def->source) < 0)
|
||||
if (virStoragePoolSourceFormat(&buf, options, &def->source) < 0)
|
||||
goto cleanup;
|
||||
|
||||
virBufferAddLit(&buf," <target>\n");
|
||||
@ -964,8 +945,7 @@ virStoragePoolDefFormat(virConnectPtr conn,
|
||||
|
||||
|
||||
static int
|
||||
virStorageSize(virConnectPtr conn,
|
||||
const char *unit,
|
||||
virStorageSize(const char *unit,
|
||||
const char *val,
|
||||
unsigned long long *ret) {
|
||||
unsigned long long mult;
|
||||
@ -1007,19 +987,19 @@ virStorageSize(virConnectPtr conn,
|
||||
break;
|
||||
|
||||
default:
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
_("unknown size units '%s'"), unit);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (virStrToLong_ull (val, &end, 10, ret) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("malformed capacity element"));
|
||||
return -1;
|
||||
}
|
||||
if (*ret > (ULLONG_MAX / mult)) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("capacity element value too large"));
|
||||
return -1;
|
||||
}
|
||||
@ -1030,8 +1010,7 @@ virStorageSize(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static virStorageVolDefPtr
|
||||
virStorageVolDefParseXML(virConnectPtr conn,
|
||||
virStoragePoolDefPtr pool,
|
||||
virStorageVolDefParseXML(virStoragePoolDefPtr pool,
|
||||
xmlXPathContextPtr ctxt) {
|
||||
virStorageVolDefPtr ret;
|
||||
virStorageVolOptionsPtr options;
|
||||
@ -1051,7 +1030,7 @@ virStorageVolDefParseXML(virConnectPtr conn,
|
||||
|
||||
ret->name = virXPathString("string(./name)", ctxt);
|
||||
if (ret->name == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing volume name element"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1062,11 +1041,11 @@ virStorageVolDefParseXML(virConnectPtr conn,
|
||||
capacity = virXPathString("string(./capacity)", ctxt);
|
||||
unit = virXPathString("string(./capacity/@unit)", ctxt);
|
||||
if (capacity == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing capacity element"));
|
||||
goto cleanup;
|
||||
}
|
||||
if (virStorageSize(conn, unit, capacity, &ret->capacity) < 0)
|
||||
if (virStorageSize(unit, capacity, &ret->capacity) < 0)
|
||||
goto cleanup;
|
||||
VIR_FREE(capacity);
|
||||
VIR_FREE(unit);
|
||||
@ -1074,7 +1053,7 @@ virStorageVolDefParseXML(virConnectPtr conn,
|
||||
allocation = virXPathString("string(./allocation)", ctxt);
|
||||
if (allocation) {
|
||||
unit = virXPathString("string(./allocation/@unit)", ctxt);
|
||||
if (virStorageSize(conn, unit, allocation, &ret->allocation) < 0)
|
||||
if (virStorageSize(unit, allocation, &ret->allocation) < 0)
|
||||
goto cleanup;
|
||||
VIR_FREE(allocation);
|
||||
VIR_FREE(unit);
|
||||
@ -1091,7 +1070,7 @@ virStorageVolDefParseXML(virConnectPtr conn,
|
||||
ret->target.format = (options->formatFromString)(format);
|
||||
|
||||
if (ret->target.format < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
_("unknown volume format type %s"), format);
|
||||
VIR_FREE(format);
|
||||
goto cleanup;
|
||||
@ -1099,13 +1078,13 @@ virStorageVolDefParseXML(virConnectPtr conn,
|
||||
VIR_FREE(format);
|
||||
}
|
||||
|
||||
if (virStorageDefParsePerms(conn, ctxt, &ret->target.perms,
|
||||
if (virStorageDefParsePerms(ctxt, &ret->target.perms,
|
||||
"./target/permissions", 0600) < 0)
|
||||
goto cleanup;
|
||||
|
||||
node = virXPathNode("./target/encryption", ctxt);
|
||||
if (node != NULL) {
|
||||
ret->target.encryption = virStorageEncryptionParseNode(conn, ctxt->doc,
|
||||
ret->target.encryption = virStorageEncryptionParseNode(ctxt->doc,
|
||||
node);
|
||||
if (ret->target.encryption == NULL)
|
||||
goto cleanup;
|
||||
@ -1122,7 +1101,7 @@ virStorageVolDefParseXML(virConnectPtr conn,
|
||||
ret->backingStore.format = (options->formatFromString)(format);
|
||||
|
||||
if (ret->backingStore.format < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
_("unknown volume format type %s"), format);
|
||||
VIR_FREE(format);
|
||||
goto cleanup;
|
||||
@ -1130,7 +1109,7 @@ virStorageVolDefParseXML(virConnectPtr conn,
|
||||
VIR_FREE(format);
|
||||
}
|
||||
|
||||
if (virStorageDefParsePerms(conn, ctxt, &ret->backingStore.perms,
|
||||
if (virStorageDefParsePerms(ctxt, &ret->backingStore.perms,
|
||||
"./backingStore/permissions", 0600) < 0)
|
||||
goto cleanup;
|
||||
|
||||
@ -1145,15 +1124,14 @@ virStorageVolDefParseXML(virConnectPtr conn,
|
||||
}
|
||||
|
||||
virStorageVolDefPtr
|
||||
virStorageVolDefParseNode(virConnectPtr conn,
|
||||
virStoragePoolDefPtr pool,
|
||||
virStorageVolDefParseNode(virStoragePoolDefPtr pool,
|
||||
xmlDocPtr xml,
|
||||
xmlNodePtr root) {
|
||||
xmlXPathContextPtr ctxt = NULL;
|
||||
virStorageVolDefPtr def = NULL;
|
||||
|
||||
if (STRNEQ((const char *)root->name, "volume")) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("unknown root element for storage vol"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1165,15 +1143,14 @@ virStorageVolDefParseNode(virConnectPtr conn,
|
||||
}
|
||||
|
||||
ctxt->node = root;
|
||||
def = virStorageVolDefParseXML(conn, pool, ctxt);
|
||||
def = virStorageVolDefParseXML(pool, ctxt);
|
||||
cleanup:
|
||||
xmlXPathFreeContext(ctxt);
|
||||
return def;
|
||||
}
|
||||
|
||||
static virStorageVolDefPtr
|
||||
virStorageVolDefParse(virConnectPtr conn,
|
||||
virStoragePoolDefPtr pool,
|
||||
virStorageVolDefParse(virStoragePoolDefPtr pool,
|
||||
const char *xmlStr,
|
||||
const char *filename) {
|
||||
virStorageVolDefPtr ret = NULL;
|
||||
@ -1186,9 +1163,6 @@ virStorageVolDefParse(virConnectPtr conn,
|
||||
if (!pctxt || !pctxt->sax)
|
||||
goto cleanup;
|
||||
pctxt->sax->error = catchXMLError;
|
||||
pctxt->_private = conn;
|
||||
|
||||
if (conn) virResetError (&conn->err);
|
||||
|
||||
if (filename) {
|
||||
xml = xmlCtxtReadFile (pctxt, filename, NULL,
|
||||
@ -1202,20 +1176,20 @@ virStorageVolDefParse(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if (!xml) {
|
||||
if (conn && conn->err.code == VIR_ERR_NONE)
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
"%s", _("failed to parse xml document"));
|
||||
if (virGetLastError() == NULL)
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("failed to parse xml document"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
node = xmlDocGetRootElement(xml);
|
||||
if (node == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("missing root element"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = virStorageVolDefParseNode(conn, pool, xml, node);
|
||||
ret = virStorageVolDefParseNode(pool, xml, node);
|
||||
|
||||
xmlFreeParserCtxt (pctxt);
|
||||
xmlFreeDoc(xml);
|
||||
@ -1229,24 +1203,21 @@ virStorageVolDefParse(virConnectPtr conn,
|
||||
}
|
||||
|
||||
virStorageVolDefPtr
|
||||
virStorageVolDefParseString(virConnectPtr conn,
|
||||
virStoragePoolDefPtr pool,
|
||||
virStorageVolDefParseString(virStoragePoolDefPtr pool,
|
||||
const char *xmlStr)
|
||||
{
|
||||
return virStorageVolDefParse(conn, pool, xmlStr, NULL);
|
||||
return virStorageVolDefParse(pool, xmlStr, NULL);
|
||||
}
|
||||
|
||||
virStorageVolDefPtr
|
||||
virStorageVolDefParseFile(virConnectPtr conn,
|
||||
virStoragePoolDefPtr pool,
|
||||
virStorageVolDefParseFile(virStoragePoolDefPtr pool,
|
||||
const char *filename)
|
||||
{
|
||||
return virStorageVolDefParse(conn, pool, NULL, filename);
|
||||
return virStorageVolDefParse(pool, NULL, filename);
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageVolTargetDefFormat(virConnectPtr conn,
|
||||
virStorageVolOptionsPtr options,
|
||||
virStorageVolTargetDefFormat(virStorageVolOptionsPtr options,
|
||||
virBufferPtr buf,
|
||||
virStorageVolTargetPtr def,
|
||||
const char *type) {
|
||||
@ -1258,7 +1229,7 @@ virStorageVolTargetDefFormat(virConnectPtr conn,
|
||||
if (options->formatToString) {
|
||||
const char *format = (options->formatToString)(def->format);
|
||||
if (!format) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("unknown volume format number %d"),
|
||||
def->format);
|
||||
return -1;
|
||||
@ -1282,7 +1253,7 @@ virStorageVolTargetDefFormat(virConnectPtr conn,
|
||||
virBufferAddLit(buf," </permissions>\n");
|
||||
|
||||
if (def->encryption != NULL &&
|
||||
virStorageEncryptionFormat(conn, buf, def->encryption) < 0)
|
||||
virStorageEncryptionFormat(buf, def->encryption) < 0)
|
||||
return -1;
|
||||
|
||||
virBufferVSprintf(buf, " </%s>\n", type);
|
||||
@ -1291,8 +1262,7 @@ virStorageVolTargetDefFormat(virConnectPtr conn,
|
||||
}
|
||||
|
||||
char *
|
||||
virStorageVolDefFormat(virConnectPtr conn,
|
||||
virStoragePoolDefPtr pool,
|
||||
virStorageVolDefFormat(virStoragePoolDefPtr pool,
|
||||
virStorageVolDefPtr def) {
|
||||
virStorageVolOptionsPtr options;
|
||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||
@ -1335,12 +1305,12 @@ virStorageVolDefFormat(virConnectPtr conn,
|
||||
virBufferVSprintf(&buf," <allocation>%llu</allocation>\n",
|
||||
def->allocation);
|
||||
|
||||
if (virStorageVolTargetDefFormat(conn, options, &buf,
|
||||
if (virStorageVolTargetDefFormat(options, &buf,
|
||||
&def->target, "target") < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (def->backingStore.path &&
|
||||
virStorageVolTargetDefFormat(conn, options, &buf,
|
||||
virStorageVolTargetDefFormat(options, &buf,
|
||||
&def->backingStore, "backingStore") < 0)
|
||||
goto cleanup;
|
||||
|
||||
@ -1437,8 +1407,7 @@ virStorageVolDefFindByName(virStoragePoolObjPtr pool,
|
||||
}
|
||||
|
||||
virStoragePoolObjPtr
|
||||
virStoragePoolObjAssignDef(virConnectPtr conn,
|
||||
virStoragePoolObjListPtr pools,
|
||||
virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools,
|
||||
virStoragePoolDefPtr def) {
|
||||
virStoragePoolObjPtr pool;
|
||||
|
||||
@ -1460,7 +1429,7 @@ virStoragePoolObjAssignDef(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if (virMutexInit(&pool->lock) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("cannot initialize mutex"));
|
||||
VIR_FREE(pool);
|
||||
return NULL;
|
||||
@ -1482,27 +1451,26 @@ virStoragePoolObjAssignDef(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static virStoragePoolObjPtr
|
||||
virStoragePoolObjLoad(virConnectPtr conn,
|
||||
virStoragePoolObjListPtr pools,
|
||||
virStoragePoolObjLoad(virStoragePoolObjListPtr pools,
|
||||
const char *file,
|
||||
const char *path,
|
||||
const char *autostartLink) {
|
||||
virStoragePoolDefPtr def;
|
||||
virStoragePoolObjPtr pool;
|
||||
|
||||
if (!(def = virStoragePoolDefParseFile(conn, path))) {
|
||||
if (!(def = virStoragePoolDefParseFile(path))) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!virFileMatchesNameSuffix(file, def->name, ".xml")) {
|
||||
virStorageError(conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"Storage pool config filename '%s' does not match pool name '%s'",
|
||||
path, def->name);
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"Storage pool config filename '%s' does not match pool name '%s'",
|
||||
path, def->name);
|
||||
virStoragePoolDefFree(def);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(pool = virStoragePoolObjAssignDef(conn, pools, def))) {
|
||||
if (!(pool = virStoragePoolObjAssignDef(pools, def))) {
|
||||
virStoragePoolDefFree(def);
|
||||
return NULL;
|
||||
}
|
||||
@ -1528,8 +1496,7 @@ virStoragePoolObjLoad(virConnectPtr conn,
|
||||
|
||||
|
||||
int
|
||||
virStoragePoolLoadAllConfigs(virConnectPtr conn,
|
||||
virStoragePoolObjListPtr pools,
|
||||
virStoragePoolLoadAllConfigs(virStoragePoolObjListPtr pools,
|
||||
const char *configDir,
|
||||
const char *autostartDir) {
|
||||
DIR *dir;
|
||||
@ -1556,21 +1523,21 @@ virStoragePoolLoadAllConfigs(virConnectPtr conn,
|
||||
|
||||
if (virFileBuildPath(configDir, entry->d_name,
|
||||
NULL, path, PATH_MAX) < 0) {
|
||||
virStorageError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
"Config filename '%s/%s' is too long",
|
||||
configDir, entry->d_name);
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"Config filename '%s/%s' is too long",
|
||||
configDir, entry->d_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (virFileBuildPath(autostartDir, entry->d_name,
|
||||
NULL, autostartLink, PATH_MAX) < 0) {
|
||||
virStorageError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
"Autostart link path '%s/%s' is too long",
|
||||
autostartDir, entry->d_name);
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"Autostart link path '%s/%s' is too long",
|
||||
autostartDir, entry->d_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
pool = virStoragePoolObjLoad(conn, pools, entry->d_name, path,
|
||||
pool = virStoragePoolObjLoad(pools, entry->d_name, path,
|
||||
autostartLink);
|
||||
if (pool)
|
||||
virStoragePoolObjUnlock(pool);
|
||||
@ -1582,8 +1549,7 @@ virStoragePoolLoadAllConfigs(virConnectPtr conn,
|
||||
}
|
||||
|
||||
int
|
||||
virStoragePoolObjSaveDef(virConnectPtr conn,
|
||||
virStorageDriverStatePtr driver,
|
||||
virStoragePoolObjSaveDef(virStorageDriverStatePtr driver,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStoragePoolDefPtr def) {
|
||||
char *xml;
|
||||
@ -1603,7 +1569,7 @@ virStoragePoolObjSaveDef(virConnectPtr conn,
|
||||
|
||||
if (virFileBuildPath(driver->configDir, def->name, ".xml",
|
||||
path, sizeof(path)) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("cannot construct config file path"));
|
||||
return -1;
|
||||
}
|
||||
@ -1614,7 +1580,7 @@ virStoragePoolObjSaveDef(virConnectPtr conn,
|
||||
|
||||
if (virFileBuildPath(driver->autostartDir, def->name, ".xml",
|
||||
path, sizeof(path)) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("cannot construct "
|
||||
"autostart link path"));
|
||||
VIR_FREE(pool->configFile);
|
||||
@ -1627,8 +1593,8 @@ virStoragePoolObjSaveDef(virConnectPtr conn,
|
||||
}
|
||||
}
|
||||
|
||||
if (!(xml = virStoragePoolDefFormat(conn, def))) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
if (!(xml = virStoragePoolDefFormat(def))) {
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("failed to generate XML"));
|
||||
return -1;
|
||||
}
|
||||
@ -1669,16 +1635,15 @@ virStoragePoolObjSaveDef(virConnectPtr conn,
|
||||
}
|
||||
|
||||
int
|
||||
virStoragePoolObjDeleteDef(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool) {
|
||||
virStoragePoolObjDeleteDef(virStoragePoolObjPtr pool) {
|
||||
if (!pool->configFile) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("no config file for %s"), pool->def->name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (unlink(pool->configFile) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("cannot remove config for %s"),
|
||||
pool->def->name);
|
||||
return -1;
|
||||
@ -1688,8 +1653,7 @@ virStoragePoolObjDeleteDef(virConnectPtr conn,
|
||||
}
|
||||
|
||||
virStoragePoolSourcePtr
|
||||
virStoragePoolSourceListNewSource(virConnectPtr conn ATTRIBUTE_UNUSED /*TEMPORARY*/,
|
||||
virStoragePoolSourceListPtr list)
|
||||
virStoragePoolSourceListNewSource(virStoragePoolSourceListPtr list)
|
||||
{
|
||||
virStoragePoolSourcePtr source;
|
||||
|
||||
@ -1704,8 +1668,7 @@ virStoragePoolSourceListNewSource(virConnectPtr conn ATTRIBUTE_UNUSED /*TEMPORAR
|
||||
return source;
|
||||
}
|
||||
|
||||
char *virStoragePoolSourceListFormat(virConnectPtr conn,
|
||||
virStoragePoolSourceListPtr def)
|
||||
char *virStoragePoolSourceListFormat(virStoragePoolSourceListPtr def)
|
||||
{
|
||||
virStoragePoolOptionsPtr options;
|
||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||
@ -1718,7 +1681,7 @@ char *virStoragePoolSourceListFormat(virConnectPtr conn,
|
||||
|
||||
type = virStoragePoolTypeToString(def->type);
|
||||
if (!type) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("unexpected pool type"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1726,7 +1689,7 @@ char *virStoragePoolSourceListFormat(virConnectPtr conn,
|
||||
virBufferAddLit(&buf, "<sources>\n");
|
||||
|
||||
for (i = 0; i < def->nsources; i++) {
|
||||
virStoragePoolSourceFormat(conn, &buf, options, &def->sources[i]);
|
||||
virStoragePoolSourceFormat(&buf, options, &def->sources[i]);
|
||||
}
|
||||
|
||||
virBufferAddLit(&buf, "</sources>\n");
|
||||
|
@ -318,12 +318,11 @@ static inline int virStoragePoolObjIsActive(virStoragePoolObjPtr pool) {
|
||||
return pool->active;
|
||||
}
|
||||
|
||||
#define virStorageReportError(conn, code, fmt...) \
|
||||
virReportErrorHelper(conn, VIR_FROM_STORAGE, code, __FILE__, \
|
||||
__FUNCTION__, __LINE__, fmt)
|
||||
#define virStorageReportError(code, fmt...) \
|
||||
virReportErrorHelper(NULL, VIR_FROM_STORAGE, code, __FILE__, \
|
||||
__FUNCTION__, __LINE__, fmt)
|
||||
|
||||
int virStoragePoolLoadAllConfigs(virConnectPtr conn,
|
||||
virStoragePoolObjListPtr pools,
|
||||
int virStoragePoolLoadAllConfigs(virStoragePoolObjListPtr pools,
|
||||
const char *configDir,
|
||||
const char *autostartDir);
|
||||
|
||||
@ -341,40 +340,29 @@ virStorageVolDefPtr virStorageVolDefFindByName(virStoragePoolObjPtr pool,
|
||||
|
||||
void virStoragePoolObjClearVols(virStoragePoolObjPtr pool);
|
||||
|
||||
virStoragePoolDefPtr virStoragePoolDefParseString(virConnectPtr conn,
|
||||
const char *xml);
|
||||
virStoragePoolDefPtr virStoragePoolDefParseFile(virConnectPtr conn,
|
||||
const char *filename);
|
||||
virStoragePoolDefPtr virStoragePoolDefParseNode(virConnectPtr conn,
|
||||
xmlDocPtr xml,
|
||||
virStoragePoolDefPtr virStoragePoolDefParseString(const char *xml);
|
||||
virStoragePoolDefPtr virStoragePoolDefParseFile(const char *filename);
|
||||
virStoragePoolDefPtr virStoragePoolDefParseNode(xmlDocPtr xml,
|
||||
xmlNodePtr root);
|
||||
char *virStoragePoolDefFormat(virConnectPtr conn,
|
||||
virStoragePoolDefPtr def);
|
||||
char *virStoragePoolDefFormat(virStoragePoolDefPtr def);
|
||||
|
||||
virStorageVolDefPtr virStorageVolDefParseString(virConnectPtr conn,
|
||||
virStoragePoolDefPtr pool,
|
||||
virStorageVolDefPtr virStorageVolDefParseString(virStoragePoolDefPtr pool,
|
||||
const char *xml);
|
||||
virStorageVolDefPtr virStorageVolDefParseFile(virConnectPtr conn,
|
||||
virStoragePoolDefPtr pool,
|
||||
virStorageVolDefPtr virStorageVolDefParseFile(virStoragePoolDefPtr pool,
|
||||
const char *filename);
|
||||
virStorageVolDefPtr virStorageVolDefParseNode(virConnectPtr conn,
|
||||
virStoragePoolDefPtr pool,
|
||||
virStorageVolDefPtr virStorageVolDefParseNode(virStoragePoolDefPtr pool,
|
||||
xmlDocPtr xml,
|
||||
xmlNodePtr root);
|
||||
char *virStorageVolDefFormat(virConnectPtr conn,
|
||||
virStoragePoolDefPtr pool,
|
||||
char *virStorageVolDefFormat(virStoragePoolDefPtr pool,
|
||||
virStorageVolDefPtr def);
|
||||
|
||||
virStoragePoolObjPtr virStoragePoolObjAssignDef(virConnectPtr conn,
|
||||
virStoragePoolObjListPtr pools,
|
||||
virStoragePoolObjPtr virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools,
|
||||
virStoragePoolDefPtr def);
|
||||
|
||||
int virStoragePoolObjSaveDef(virConnectPtr conn,
|
||||
virStorageDriverStatePtr driver,
|
||||
int virStoragePoolObjSaveDef(virStorageDriverStatePtr driver,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStoragePoolDefPtr def);
|
||||
int virStoragePoolObjDeleteDef(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool);
|
||||
int virStoragePoolObjDeleteDef(virStoragePoolObjPtr pool);
|
||||
|
||||
void virStorageVolDefFree(virStorageVolDefPtr def);
|
||||
void virStoragePoolSourceFree(virStoragePoolSourcePtr source);
|
||||
@ -385,14 +373,11 @@ void virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
|
||||
virStoragePoolObjPtr pool);
|
||||
|
||||
virStoragePoolSourcePtr
|
||||
virStoragePoolDefParseSourceString(virConnectPtr conn,
|
||||
const char *srcSpec,
|
||||
virStoragePoolDefParseSourceString(const char *srcSpec,
|
||||
int pool_type);
|
||||
virStoragePoolSourcePtr
|
||||
virStoragePoolSourceListNewSource(virConnectPtr conn,
|
||||
virStoragePoolSourceListPtr list);
|
||||
char *virStoragePoolSourceListFormat(virConnectPtr conn,
|
||||
virStoragePoolSourceListPtr def);
|
||||
virStoragePoolSourceListNewSource(virStoragePoolSourceListPtr list);
|
||||
char *virStoragePoolSourceListFormat(virStoragePoolSourceListPtr def);
|
||||
|
||||
void virStoragePoolObjLock(virStoragePoolObjPtr obj);
|
||||
void virStoragePoolObjUnlock(virStoragePoolObjPtr obj);
|
||||
|
@ -70,7 +70,7 @@ virStorageEncryptionFree(virStorageEncryptionPtr enc)
|
||||
#ifndef PROXY
|
||||
|
||||
static virStorageEncryptionSecretPtr
|
||||
virStorageEncryptionSecretParse(virConnectPtr conn, xmlXPathContextPtr ctxt,
|
||||
virStorageEncryptionSecretParse(xmlXPathContextPtr ctxt,
|
||||
xmlNodePtr node)
|
||||
{
|
||||
xmlNodePtr old_node;
|
||||
@ -89,13 +89,13 @@ virStorageEncryptionSecretParse(virConnectPtr conn, xmlXPathContextPtr ctxt,
|
||||
|
||||
type_str = virXPathString("string(./@type)", ctxt);
|
||||
if (type_str == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("unknown volume encryption secret type"));
|
||||
goto cleanup;
|
||||
}
|
||||
type = virStorageEncryptionSecretTypeTypeFromString(type_str);
|
||||
if (type < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
_("unknown volume encryption secret type %s"),
|
||||
type_str);
|
||||
VIR_FREE(type_str);
|
||||
@ -107,14 +107,14 @@ virStorageEncryptionSecretParse(virConnectPtr conn, xmlXPathContextPtr ctxt,
|
||||
uuidstr = virXPathString("string(./@uuid)", ctxt);
|
||||
if (uuidstr) {
|
||||
if (virUUIDParse(uuidstr, ret->uuid) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
_("malformed volume encryption uuid '%s'"),
|
||||
uuidstr);
|
||||
goto cleanup;
|
||||
}
|
||||
VIR_FREE(uuidstr);
|
||||
} else {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("missing volume encryption uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -129,7 +129,7 @@ virStorageEncryptionSecretParse(virConnectPtr conn, xmlXPathContextPtr ctxt,
|
||||
}
|
||||
|
||||
static virStorageEncryptionPtr
|
||||
virStorageEncryptionParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt)
|
||||
virStorageEncryptionParseXML(xmlXPathContextPtr ctxt)
|
||||
{
|
||||
xmlNodePtr *nodes = NULL;
|
||||
virStorageEncryptionPtr ret;
|
||||
@ -143,13 +143,13 @@ virStorageEncryptionParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt)
|
||||
|
||||
format_str = virXPathString("string(./@format)", ctxt);
|
||||
if (format_str == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("unknown volume encryption format"));
|
||||
goto cleanup;
|
||||
}
|
||||
format = virStorageEncryptionFormatTypeFromString(format_str);
|
||||
if (format < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
_("unknown volume encryption format type %s"),
|
||||
format_str);
|
||||
VIR_FREE(format_str);
|
||||
@ -160,7 +160,7 @@ virStorageEncryptionParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt)
|
||||
|
||||
n = virXPathNodeSet("./secret", ctxt, &nodes);
|
||||
if (n < 0){
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("cannot extract volume encryption secrets"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -170,7 +170,7 @@ virStorageEncryptionParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt)
|
||||
}
|
||||
ret->nsecrets = n;
|
||||
for (i = 0; i < n; i++) {
|
||||
ret->secrets[i] = virStorageEncryptionSecretParse(conn, ctxt, nodes[i]);
|
||||
ret->secrets[i] = virStorageEncryptionSecretParse(ctxt, nodes[i]);
|
||||
if (ret->secrets[i] == NULL)
|
||||
goto cleanup;
|
||||
}
|
||||
@ -185,14 +185,13 @@ virStorageEncryptionParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt)
|
||||
}
|
||||
|
||||
virStorageEncryptionPtr
|
||||
virStorageEncryptionParseNode(virConnectPtr conn,
|
||||
xmlDocPtr xml, xmlNodePtr root)
|
||||
virStorageEncryptionParseNode(xmlDocPtr xml, xmlNodePtr root)
|
||||
{
|
||||
xmlXPathContextPtr ctxt = NULL;
|
||||
virStorageEncryptionPtr enc = NULL;
|
||||
|
||||
if (STRNEQ((const char *) root->name, "encryption")) {
|
||||
virStorageReportError(conn, VIR_ERR_XML_ERROR,
|
||||
virStorageReportError(VIR_ERR_XML_ERROR,
|
||||
"%s", _("unknown root element for volume "
|
||||
"encryption information"));
|
||||
goto cleanup;
|
||||
@ -205,7 +204,7 @@ virStorageEncryptionParseNode(virConnectPtr conn,
|
||||
}
|
||||
|
||||
ctxt->node = root;
|
||||
enc = virStorageEncryptionParseXML(conn, ctxt);
|
||||
enc = virStorageEncryptionParseXML(ctxt);
|
||||
|
||||
cleanup:
|
||||
xmlXPathFreeContext(ctxt);
|
||||
@ -215,8 +214,7 @@ virStorageEncryptionParseNode(virConnectPtr conn,
|
||||
|
||||
|
||||
static int
|
||||
virStorageEncryptionSecretFormat(virConnectPtr conn,
|
||||
virBufferPtr buf,
|
||||
virStorageEncryptionSecretFormat(virBufferPtr buf,
|
||||
virStorageEncryptionSecretPtr secret)
|
||||
{
|
||||
const char *type;
|
||||
@ -224,7 +222,7 @@ virStorageEncryptionSecretFormat(virConnectPtr conn,
|
||||
|
||||
type = virStorageEncryptionSecretTypeTypeToString(secret->type);
|
||||
if (!type) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("unexpected volume encryption secret type"));
|
||||
return -1;
|
||||
}
|
||||
@ -235,8 +233,7 @@ virStorageEncryptionSecretFormat(virConnectPtr conn,
|
||||
}
|
||||
|
||||
int
|
||||
virStorageEncryptionFormat(virConnectPtr conn,
|
||||
virBufferPtr buf,
|
||||
virStorageEncryptionFormat(virBufferPtr buf,
|
||||
virStorageEncryptionPtr enc)
|
||||
{
|
||||
const char *format;
|
||||
@ -244,14 +241,14 @@ virStorageEncryptionFormat(virConnectPtr conn,
|
||||
|
||||
format = virStorageEncryptionFormatTypeToString(enc->format);
|
||||
if (!format) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("unexpected encryption format"));
|
||||
return -1;
|
||||
}
|
||||
virBufferVSprintf(buf, " <encryption format='%s'>\n", format);
|
||||
|
||||
for (i = 0; i < enc->nsecrets; i++) {
|
||||
if (virStorageEncryptionSecretFormat(conn, buf, enc->secrets[i]) < 0)
|
||||
if (virStorageEncryptionSecretFormat(buf, enc->secrets[i]) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -261,7 +258,7 @@ virStorageEncryptionFormat(virConnectPtr conn,
|
||||
}
|
||||
|
||||
int
|
||||
virStorageGenerateQcowPassphrase(virConnectPtr conn, unsigned char *dest)
|
||||
virStorageGenerateQcowPassphrase(unsigned char *dest)
|
||||
{
|
||||
int fd;
|
||||
size_t i;
|
||||
@ -271,7 +268,7 @@ virStorageGenerateQcowPassphrase(virConnectPtr conn, unsigned char *dest)
|
||||
unpleasant surprises with the qemu monitor input mechanism. */
|
||||
fd = open("/dev/urandom", O_RDONLY);
|
||||
if (fd < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("Cannot open /dev/urandom"));
|
||||
return -1;
|
||||
}
|
||||
@ -282,7 +279,7 @@ virStorageGenerateQcowPassphrase(virConnectPtr conn, unsigned char *dest)
|
||||
while ((r = read(fd, dest + i, 1)) == -1 && errno == EINTR)
|
||||
;
|
||||
if (r <= 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("Cannot read from /dev/urandom"));
|
||||
close(fd);
|
||||
return -1;
|
||||
|
@ -64,10 +64,9 @@ struct _virStorageEncryption {
|
||||
|
||||
void virStorageEncryptionFree(virStorageEncryptionPtr enc);
|
||||
|
||||
virStorageEncryptionPtr virStorageEncryptionParseNode(virConnectPtr conn,
|
||||
xmlDocPtr xml,
|
||||
virStorageEncryptionPtr virStorageEncryptionParseNode(xmlDocPtr xml,
|
||||
xmlNodePtr root);
|
||||
int virStorageEncryptionFormat(virConnectPtr conn, virBufferPtr buf,
|
||||
int virStorageEncryptionFormat(virBufferPtr buf,
|
||||
virStorageEncryptionPtr enc);
|
||||
|
||||
/* A helper for VIR_STORAGE_ENCRYPTION_FORMAT_QCOW */
|
||||
@ -75,6 +74,6 @@ enum {
|
||||
VIR_STORAGE_QCOW_PASSPHRASE_SIZE = 16
|
||||
};
|
||||
|
||||
int virStorageGenerateQcowPassphrase(virConnectPtr conn, unsigned char *dest);
|
||||
int virStorageGenerateQcowPassphrase(unsigned char *dest);
|
||||
|
||||
#endif /* __VIR_STORAGE_ENCRYPTION_H__ */
|
||||
|
@ -271,7 +271,7 @@ cleanup:
|
||||
}
|
||||
|
||||
int
|
||||
virStorageBackendCreateRaw(virConnectPtr conn,
|
||||
virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageVolDefPtr vol,
|
||||
virStorageVolDefPtr inputvol,
|
||||
@ -284,7 +284,7 @@ virStorageBackendCreateRaw(virConnectPtr conn,
|
||||
char *buf = NULL;
|
||||
|
||||
if (vol->target.encryption != NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
"%s", _("storage pool does not support encrypted "
|
||||
"volumes"));
|
||||
return -1;
|
||||
@ -419,14 +419,14 @@ virStorageGenerateQcowEncryption(virConnectPtr conn,
|
||||
conn->secretDriver->lookupByUUID == NULL ||
|
||||
conn->secretDriver->defineXML == NULL ||
|
||||
conn->secretDriver->setValue == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_SUPPORT, "%s",
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT, "%s",
|
||||
_("secret storage not supported"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
enc = vol->target.encryption;
|
||||
if (enc->nsecrets != 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("secrets already defined"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -461,7 +461,7 @@ virStorageGenerateQcowEncryption(virConnectPtr conn,
|
||||
}
|
||||
VIR_FREE(xml);
|
||||
|
||||
if (virStorageGenerateQcowPassphrase(conn, value) < 0)
|
||||
if (virStorageGenerateQcowPassphrase(value) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (conn->secretDriver->setValue(secret, value, sizeof(value), 0) < 0)
|
||||
@ -619,13 +619,13 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
|
||||
};
|
||||
|
||||
if (type == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("unknown storage vol type %d"),
|
||||
vol->target.format);
|
||||
return -1;
|
||||
}
|
||||
if (inputvol && inputType == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("unknown storage vol type %d"),
|
||||
inputvol->target.format);
|
||||
return -1;
|
||||
@ -640,14 +640,14 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
|
||||
if (inputvol &&
|
||||
(!inputBackingPath ||
|
||||
STRNEQ(inputBackingPath, vol->backingStore.path))) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("a different backing store can not "
|
||||
"be specified."));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (backingType == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("unknown storage vol backing store type %d"),
|
||||
vol->backingStore.format);
|
||||
return -1;
|
||||
@ -665,7 +665,7 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
|
||||
|
||||
if (vol->target.format != VIR_STORAGE_FILE_QCOW &&
|
||||
vol->target.format != VIR_STORAGE_FILE_QCOW2) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
_("qcow volume encryption unsupported with "
|
||||
"volume format %s"), type);
|
||||
return -1;
|
||||
@ -673,13 +673,13 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
|
||||
enc = vol->target.encryption;
|
||||
if (enc->format != VIR_STORAGE_ENCRYPTION_FORMAT_QCOW &&
|
||||
enc->format != VIR_STORAGE_ENCRYPTION_FORMAT_DEFAULT) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
_("unsupported volume encryption format %d"),
|
||||
vol->target.encryption->format);
|
||||
return -1;
|
||||
}
|
||||
if (enc->nsecrets > 1) {
|
||||
virStorageReportError(conn, VIR_ERR_INVALID_STORAGE_VOL, "%s",
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_VOL, "%s",
|
||||
_("too many secrets for qcow encryption"));
|
||||
return -1;
|
||||
}
|
||||
@ -695,7 +695,7 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
|
||||
else if ((create_tool = virFindFileInPath("qemu-img")) != NULL)
|
||||
use_kvmimg = 0;
|
||||
else {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("unable to find kvm-img or qemu-img"));
|
||||
return -1;
|
||||
}
|
||||
@ -737,7 +737,7 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
|
||||
* with a partially functional qcow-create. Go figure ??!?
|
||||
*/
|
||||
static int
|
||||
virStorageBackendCreateQcowCreate(virConnectPtr conn,
|
||||
virStorageBackendCreateQcowCreate(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageVolDefPtr vol,
|
||||
virStorageVolDefPtr inputvol,
|
||||
@ -748,25 +748,25 @@ virStorageBackendCreateQcowCreate(virConnectPtr conn,
|
||||
const char *imgargv[4];
|
||||
|
||||
if (inputvol) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("cannot copy from volume with qcow-create"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (vol->target.format != VIR_STORAGE_FILE_QCOW2) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("unsupported storage vol type %d"),
|
||||
vol->target.format);
|
||||
return -1;
|
||||
}
|
||||
if (vol->backingStore.path != NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_SUPPORT, "%s",
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT, "%s",
|
||||
_("copy-on-write image not supported with "
|
||||
"qcow-create"));
|
||||
return -1;
|
||||
}
|
||||
if (vol->target.encryption != NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
"%s", _("encrypted volumes not supported with "
|
||||
"qcow-create"));
|
||||
return -1;
|
||||
@ -787,7 +787,7 @@ virStorageBackendCreateQcowCreate(virConnectPtr conn,
|
||||
}
|
||||
|
||||
virStorageBackendBuildVolFrom
|
||||
virStorageBackendFSImageToolTypeToFunc(virConnectPtr conn, int tool_type)
|
||||
virStorageBackendFSImageToolTypeToFunc(int tool_type)
|
||||
{
|
||||
switch (tool_type) {
|
||||
case TOOL_KVM_IMG:
|
||||
@ -796,7 +796,7 @@ virStorageBackendFSImageToolTypeToFunc(virConnectPtr conn, int tool_type)
|
||||
case TOOL_QCOW_CREATE:
|
||||
return virStorageBackendCreateQcowCreate;
|
||||
default:
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Unknown file create tool type '%d'."),
|
||||
tool_type);
|
||||
}
|
||||
@ -827,8 +827,7 @@ virStorageBackendFindFSImageTool(char **tool)
|
||||
}
|
||||
|
||||
virStorageBackendBuildVolFrom
|
||||
virStorageBackendGetBuildVolFromFunction(virConnectPtr conn,
|
||||
virStorageVolDefPtr vol,
|
||||
virStorageBackendGetBuildVolFromFunction(virStorageVolDefPtr vol,
|
||||
virStorageVolDefPtr inputvol)
|
||||
{
|
||||
int tool_type;
|
||||
@ -845,13 +844,13 @@ virStorageBackendGetBuildVolFromFunction(virConnectPtr conn,
|
||||
inputvol->target.format != VIR_STORAGE_FILE_RAW)) {
|
||||
|
||||
if ((tool_type = virStorageBackendFindFSImageTool(NULL)) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("creation of non-raw file images is "
|
||||
"not supported without qemu-img."));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return virStorageBackendFSImageToolTypeToFunc(conn, tool_type);
|
||||
return virStorageBackendFSImageToolTypeToFunc(tool_type);
|
||||
}
|
||||
|
||||
if (vol->type == VIR_STORAGE_VOL_BLOCK)
|
||||
@ -868,7 +867,7 @@ virStorageBackendForType(int type) {
|
||||
if (backends[i]->type == type)
|
||||
return backends[i];
|
||||
|
||||
virStorageReportError(NULL, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("missing backend for pool type %d"), type);
|
||||
return NULL;
|
||||
}
|
||||
@ -1192,8 +1191,7 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool,
|
||||
* then run a callback passing in all the matches
|
||||
*/
|
||||
int
|
||||
virStorageBackendRunProgRegex(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
|
||||
const char *const*prog,
|
||||
int nregex,
|
||||
const char **regex,
|
||||
@ -1223,7 +1221,7 @@ virStorageBackendRunProgRegex(virConnectPtr conn,
|
||||
if (err != 0) {
|
||||
char error[100];
|
||||
regerror(err, ®[i], error, sizeof(error));
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to compile regex %s"), error);
|
||||
for (j = 0 ; j <= i ; j++)
|
||||
regfree(®[j]);
|
||||
@ -1255,7 +1253,7 @@ virStorageBackendRunProgRegex(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if ((list = fdopen(fd, "r")) == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("cannot read fd"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1286,7 +1284,7 @@ virStorageBackendRunProgRegex(virConnectPtr conn,
|
||||
|
||||
/* We're matching on the last regex, so callback time */
|
||||
if (i == (nregex-1)) {
|
||||
if (((*func)(conn, pool, groups, data)) < 0)
|
||||
if (((*func)(pool, groups, data)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* Release matches & restart to matching the first regex */
|
||||
@ -1337,7 +1335,7 @@ virStorageBackendRunProgRegex(virConnectPtr conn,
|
||||
if (outexit != NULL)
|
||||
*outexit = WEXITSTATUS(exitstatus);
|
||||
} else {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("command did not exit cleanly"));
|
||||
return -1;
|
||||
}
|
||||
@ -1358,8 +1356,7 @@ virStorageBackendRunProgRegex(virConnectPtr conn,
|
||||
* If there are no input tokens (empty input), call FUNC with N_COLUMNS == 0.
|
||||
*/
|
||||
int
|
||||
virStorageBackendRunProgNul(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendRunProgNul(virStoragePoolObjPtr pool,
|
||||
const char **prog,
|
||||
size_t n_columns,
|
||||
virStorageBackendListVolNulFunc func,
|
||||
@ -1391,7 +1388,7 @@ virStorageBackendRunProgNul(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if ((fp = fdopen(fd, "r")) == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("cannot read fd"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1406,13 +1403,13 @@ virStorageBackendRunProgNul(virConnectPtr conn,
|
||||
if (tok_len < 0) {
|
||||
/* Maybe EOF, maybe an error.
|
||||
If n_tok > 0, then we know it's an error. */
|
||||
if (n_tok && func (conn, pool, n_tok, v, data) < 0)
|
||||
if (n_tok && func (pool, n_tok, v, data) < 0)
|
||||
goto cleanup;
|
||||
break;
|
||||
}
|
||||
++n_tok;
|
||||
if (n_tok == n_columns) {
|
||||
if (func (conn, pool, n_tok, v, data) < 0)
|
||||
if (func (pool, n_tok, v, data) < 0)
|
||||
goto cleanup;
|
||||
n_tok = 0;
|
||||
for (i = 0; i < n_columns; i++) {
|
||||
@ -1452,13 +1449,13 @@ virStorageBackendRunProgNul(virConnectPtr conn,
|
||||
} else {
|
||||
if (WIFEXITED(exitstatus)) {
|
||||
if (WEXITSTATUS(exitstatus) != 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("non-zero exit status from command %d"),
|
||||
WEXITSTATUS(exitstatus));
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("command did not exit cleanly"));
|
||||
return -1;
|
||||
}
|
||||
@ -1480,7 +1477,7 @@ virStorageBackendRunProgRegex(virConnectPtr conn,
|
||||
void *data ATTRIBUTE_UNUSED,
|
||||
int *outexit ATTRIBUTE_UNUSED)
|
||||
{
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, _("%s not implemented on Win32"), __FUNCTION__);
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR, _("%s not implemented on Win32"), __FUNCTION__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -1492,7 +1489,7 @@ virStorageBackendRunProgNul(virConnectPtr conn,
|
||||
virStorageBackendListVolNulFunc func ATTRIBUTE_UNUSED,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, _("%s not implemented on Win32"), __FUNCTION__);
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR, _("%s not implemented on Win32"), __FUNCTION__);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
@ -51,13 +51,11 @@ int virStorageBackendCreateRaw(virConnectPtr conn,
|
||||
virStorageVolDefPtr inputvol,
|
||||
unsigned int flags);
|
||||
virStorageBackendBuildVolFrom
|
||||
virStorageBackendGetBuildVolFromFunction(virConnectPtr conn,
|
||||
virStorageVolDefPtr vol,
|
||||
virStorageBackendGetBuildVolFromFunction(virStorageVolDefPtr vol,
|
||||
virStorageVolDefPtr inputvol);
|
||||
int virStorageBackendFindFSImageTool(char **tool);
|
||||
virStorageBackendBuildVolFrom
|
||||
virStorageBackendFSImageToolTypeToFunc(virConnectPtr conn,
|
||||
int tool_type);
|
||||
virStorageBackendFSImageToolTypeToFunc(int tool_type);
|
||||
|
||||
|
||||
typedef struct _virStorageBackend virStorageBackend;
|
||||
@ -100,18 +98,15 @@ virStorageBackendUpdateVolTargetFormatFD(virStorageVolTargetPtr target,
|
||||
char *virStorageBackendStablePath(virStoragePoolObjPtr pool,
|
||||
const char *devpath);
|
||||
|
||||
typedef int (*virStorageBackendListVolRegexFunc)(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
typedef int (*virStorageBackendListVolRegexFunc)(virStoragePoolObjPtr pool,
|
||||
char **const groups,
|
||||
void *data);
|
||||
typedef int (*virStorageBackendListVolNulFunc)(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
typedef int (*virStorageBackendListVolNulFunc)(virStoragePoolObjPtr pool,
|
||||
size_t n_tokens,
|
||||
char **const groups,
|
||||
void *data);
|
||||
|
||||
int virStorageBackendRunProgRegex(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
int virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
|
||||
const char *const*prog,
|
||||
int nregex,
|
||||
const char **regex,
|
||||
@ -120,8 +115,7 @@ int virStorageBackendRunProgRegex(virConnectPtr conn,
|
||||
void *data,
|
||||
int *exitstatus);
|
||||
|
||||
int virStorageBackendRunProgNul(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
int virStorageBackendRunProgNul(virStoragePoolObjPtr pool,
|
||||
const char **prog,
|
||||
size_t n_columns,
|
||||
virStorageBackendListVolNulFunc func,
|
||||
|
@ -39,8 +39,7 @@
|
||||
#define SECTOR_SIZE 512
|
||||
|
||||
static int
|
||||
virStorageBackendDiskMakeDataVol(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendDiskMakeDataVol(virStoragePoolObjPtr pool,
|
||||
char **const groups,
|
||||
virStorageVolDefPtr vol)
|
||||
{
|
||||
@ -105,14 +104,14 @@ virStorageBackendDiskMakeDataVol(virConnectPtr conn,
|
||||
|
||||
if (virStrToLong_ull(groups[3], NULL, 10,
|
||||
&vol->source.extents[0].start) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("cannot parse device start location"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virStrToLong_ull(groups[4], NULL, 10,
|
||||
&vol->source.extents[0].end) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("cannot parse device end location"));
|
||||
return -1;
|
||||
}
|
||||
@ -154,8 +153,7 @@ virStorageBackendDiskMakeDataVol(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendDiskMakeFreeExtent(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendDiskMakeFreeExtent(virStoragePoolObjPtr pool,
|
||||
char **const groups)
|
||||
{
|
||||
virStoragePoolSourceDevicePtr dev = &pool->def->source.devices[0];
|
||||
@ -202,8 +200,7 @@ virStorageBackendDiskMakeFreeExtent(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendDiskMakeVol(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendDiskMakeVol(virStoragePoolObjPtr pool,
|
||||
size_t ntok ATTRIBUTE_UNUSED,
|
||||
char **const groups,
|
||||
void *data)
|
||||
@ -237,10 +234,10 @@ virStorageBackendDiskMakeVol(virConnectPtr conn,
|
||||
}
|
||||
}
|
||||
|
||||
return virStorageBackendDiskMakeDataVol(conn, pool, groups, vol);
|
||||
return virStorageBackendDiskMakeDataVol(pool, groups, vol);
|
||||
} else if (STREQ(groups[2], "free")) {
|
||||
/* ....or free space extents */
|
||||
return virStorageBackendDiskMakeFreeExtent(conn, pool, groups);
|
||||
return virStorageBackendDiskMakeFreeExtent(pool, groups);
|
||||
} else {
|
||||
/* This code path should never happen unless someone changed
|
||||
* libvirt_parthelper forgot to change this code */
|
||||
@ -260,8 +257,7 @@ virStorageBackendDiskMakeVol(virConnectPtr conn,
|
||||
* and we can even ensure the output is friendly.
|
||||
*/
|
||||
static int
|
||||
virStorageBackendDiskReadPartitions(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendDiskReadPartitions(virStoragePoolObjPtr pool,
|
||||
virStorageVolDefPtr vol)
|
||||
{
|
||||
|
||||
@ -278,8 +274,7 @@ virStorageBackendDiskReadPartitions(virConnectPtr conn,
|
||||
|
||||
pool->def->allocation = pool->def->capacity = pool->def->available = 0;
|
||||
|
||||
return virStorageBackendRunProgNul(conn,
|
||||
pool,
|
||||
return virStorageBackendRunProgNul(pool,
|
||||
prog,
|
||||
6,
|
||||
virStorageBackendDiskMakeVol,
|
||||
@ -287,11 +282,10 @@ virStorageBackendDiskReadPartitions(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendDiskMakePoolGeometry(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool,
|
||||
size_t ntok ATTRIBUTE_UNUSED,
|
||||
char **const groups,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
virStorageBackendDiskMakePoolGeometry(virStoragePoolObjPtr pool,
|
||||
size_t ntok ATTRIBUTE_UNUSED,
|
||||
char **const groups,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
|
||||
pool->def->source.devices[0].geometry.cyliders = atoi(groups[0]);
|
||||
@ -302,14 +296,13 @@ virStorageBackendDiskMakePoolGeometry(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendDiskReadGeometry(virConnectPtr conn, virStoragePoolObjPtr pool)
|
||||
virStorageBackendDiskReadGeometry(virStoragePoolObjPtr pool)
|
||||
{
|
||||
const char *prog[] = {
|
||||
PARTHELPER, pool->def->source.devices[0].path, "-g", NULL,
|
||||
};
|
||||
|
||||
return virStorageBackendRunProgNul(conn,
|
||||
pool,
|
||||
return virStorageBackendRunProgNul(pool,
|
||||
prog,
|
||||
3,
|
||||
virStorageBackendDiskMakePoolGeometry,
|
||||
@ -317,7 +310,7 @@ virStorageBackendDiskReadGeometry(virConnectPtr conn, virStoragePoolObjPtr pool)
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendDiskRefreshPool(virConnectPtr conn,
|
||||
virStorageBackendDiskRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool)
|
||||
{
|
||||
VIR_FREE(pool->def->source.devices[0].freeExtents);
|
||||
@ -325,11 +318,11 @@ virStorageBackendDiskRefreshPool(virConnectPtr conn,
|
||||
|
||||
virFileWaitForDevices();
|
||||
|
||||
if (virStorageBackendDiskReadGeometry(conn, pool) != 0) {
|
||||
if (virStorageBackendDiskReadGeometry(pool) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return virStorageBackendDiskReadPartitions(conn, pool, NULL);
|
||||
return virStorageBackendDiskReadPartitions(pool, NULL);
|
||||
}
|
||||
|
||||
|
||||
@ -386,7 +379,7 @@ virStorageBackendDiskPartTypeToCreate(virStoragePoolObjPtr pool)
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendDiskPartFormat(virConnectPtr conn, virStoragePoolObjPtr pool,
|
||||
virStorageBackendDiskPartFormat(virStoragePoolObjPtr pool,
|
||||
virStorageVolDefPtr vol,
|
||||
char* partFormat)
|
||||
{
|
||||
@ -394,7 +387,7 @@ virStorageBackendDiskPartFormat(virConnectPtr conn, virStoragePoolObjPtr pool,
|
||||
if (pool->def->source.format == VIR_STORAGE_POOL_DISK_DOS) {
|
||||
const char *partedFormat = virStoragePartedFsTypeTypeToString(vol->target.format);
|
||||
if(partedFormat == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("Invalid partition type"));
|
||||
return -1;
|
||||
}
|
||||
@ -402,7 +395,7 @@ virStorageBackendDiskPartFormat(virConnectPtr conn, virStoragePoolObjPtr pool,
|
||||
/* make sure we don't have a extended partition already */
|
||||
for (i = 0; i < pool->volumes.count; i++) {
|
||||
if (pool->volumes.objs[i]->target.format == VIR_STORAGE_VOL_DISK_EXTENDED) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("extended partition already exists"));
|
||||
return -1;
|
||||
}
|
||||
@ -426,7 +419,7 @@ virStorageBackendDiskPartFormat(virConnectPtr conn, virStoragePoolObjPtr pool,
|
||||
}
|
||||
}
|
||||
if (i == pool->volumes.count) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("no extended partition found and no primary partition available"));
|
||||
return -1;
|
||||
}
|
||||
@ -448,8 +441,7 @@ virStorageBackendDiskPartFormat(virConnectPtr conn, virStoragePoolObjPtr pool,
|
||||
* partitions
|
||||
*/
|
||||
static int
|
||||
virStorageBackendDiskPartBoundries(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendDiskPartBoundries(virStoragePoolObjPtr pool,
|
||||
unsigned long long *start,
|
||||
unsigned long long *end,
|
||||
unsigned long long allocation)
|
||||
@ -511,7 +503,7 @@ virStorageBackendDiskPartBoundries(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if (smallestExtent == -1) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("no large enough free extent"));
|
||||
return -1;
|
||||
}
|
||||
@ -538,7 +530,7 @@ virStorageBackendDiskPartBoundries(virConnectPtr conn,
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendDiskCreateVol(virConnectPtr conn,
|
||||
virStorageBackendDiskCreateVol(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageVolDefPtr vol)
|
||||
{
|
||||
@ -556,17 +548,17 @@ virStorageBackendDiskCreateVol(virConnectPtr conn,
|
||||
};
|
||||
|
||||
if (vol->target.encryption != NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
"%s", _("storage pool does not support encrypted "
|
||||
"volumes"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virStorageBackendDiskPartFormat(conn, pool, vol, partFormat) != 0) {
|
||||
if (virStorageBackendDiskPartFormat(pool, vol, partFormat) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virStorageBackendDiskPartBoundries(conn, pool, &startOffset,
|
||||
if (virStorageBackendDiskPartBoundries(pool, &startOffset,
|
||||
&endOffset,
|
||||
vol->capacity) != 0) {
|
||||
return -1;
|
||||
@ -591,7 +583,7 @@ virStorageBackendDiskCreateVol(virConnectPtr conn,
|
||||
VIR_FREE(vol->target.path);
|
||||
|
||||
/* Fetch actual extent info, generate key */
|
||||
if (virStorageBackendDiskReadPartitions(conn, pool, vol) < 0)
|
||||
if (virStorageBackendDiskReadPartitions(pool, vol) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
@ -606,7 +598,7 @@ virStorageBackendDiskBuildVolFrom(virConnectPtr conn,
|
||||
{
|
||||
virStorageBackendBuildVolFrom build_func;
|
||||
|
||||
build_func = virStorageBackendGetBuildVolFromFunction(conn, vol, inputvol);
|
||||
build_func = virStorageBackendGetBuildVolFromFunction(vol, inputvol);
|
||||
if (!build_func)
|
||||
return -1;
|
||||
|
||||
@ -614,7 +606,7 @@ virStorageBackendDiskBuildVolFrom(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendDiskDeleteVol(virConnectPtr conn,
|
||||
virStorageBackendDiskDeleteVol(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageVolDefPtr vol,
|
||||
unsigned int flags ATTRIBUTE_UNUSED)
|
||||
@ -637,7 +629,7 @@ virStorageBackendDiskDeleteVol(virConnectPtr conn,
|
||||
DEBUG("devname=%s, srcname=%s", devname, srcname);
|
||||
|
||||
if (!STRPREFIX(devname, srcname)) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Volume path '%s' did not start with parent "
|
||||
"pool source device name."), devname);
|
||||
goto cleanup;
|
||||
@ -646,7 +638,7 @@ virStorageBackendDiskDeleteVol(virConnectPtr conn,
|
||||
part_num = devname + strlen(srcname);
|
||||
|
||||
if (*part_num == 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("cannot parse partition number from target "
|
||||
"'%s'"), devname);
|
||||
goto cleanup;
|
||||
|
@ -135,8 +135,7 @@ struct _virNetfsDiscoverState {
|
||||
typedef struct _virNetfsDiscoverState virNetfsDiscoverState;
|
||||
|
||||
static int
|
||||
virStorageBackendFileSystemNetFindPoolSourcesFunc(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
|
||||
virStorageBackendFileSystemNetFindPoolSourcesFunc(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
|
||||
char **const groups,
|
||||
void *data)
|
||||
{
|
||||
@ -149,18 +148,18 @@ virStorageBackendFileSystemNetFindPoolSourcesFunc(virConnectPtr conn,
|
||||
|
||||
name = strrchr(path, '/');
|
||||
if (name == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("invalid netfs path (no /): %s"), path);
|
||||
goto cleanup;
|
||||
}
|
||||
name += 1;
|
||||
if (*name == '\0') {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("invalid netfs path (ends in /): %s"), path);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(src = virStoragePoolSourceListNewSource(conn, &state->list)))
|
||||
if (!(src = virStoragePoolSourceListNewSource(&state->list)))
|
||||
goto cleanup;
|
||||
|
||||
if (!(src->host.name = strdup(state->host)) ||
|
||||
@ -180,7 +179,7 @@ cleanup:
|
||||
|
||||
|
||||
static char *
|
||||
virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn,
|
||||
virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
const char *srcSpec,
|
||||
unsigned int flags ATTRIBUTE_UNUSED)
|
||||
{
|
||||
@ -212,7 +211,7 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn,
|
||||
char *retval = NULL;
|
||||
unsigned int i;
|
||||
|
||||
source = virStoragePoolDefParseSourceString(conn, srcSpec,
|
||||
source = virStoragePoolDefParseSourceString(srcSpec,
|
||||
VIR_STORAGE_POOL_NETFS);
|
||||
if (!source)
|
||||
goto cleanup;
|
||||
@ -220,12 +219,12 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn,
|
||||
state.host = source->host.name;
|
||||
prog[3] = source->host.name;
|
||||
|
||||
if (virStorageBackendRunProgRegex(conn, NULL, prog, 1, regexes, vars,
|
||||
if (virStorageBackendRunProgRegex(NULL, prog, 1, regexes, vars,
|
||||
virStorageBackendFileSystemNetFindPoolSourcesFunc,
|
||||
&state, &exitstatus) < 0)
|
||||
goto cleanup;
|
||||
|
||||
retval = virStoragePoolSourceListFormat(conn, &state.list);
|
||||
retval = virStoragePoolSourceListFormat(&state.list);
|
||||
if (retval == NULL) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
@ -286,8 +285,7 @@ virStorageBackendFileSystemIsMounted(virStoragePoolObjPtr pool) {
|
||||
* Returns 0 if successfully mounted, -1 on error
|
||||
*/
|
||||
static int
|
||||
virStorageBackendFileSystemMount(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool) {
|
||||
virStorageBackendFileSystemMount(virStoragePoolObjPtr pool) {
|
||||
char *src;
|
||||
char *options;
|
||||
const char **mntargv;
|
||||
@ -351,18 +349,18 @@ virStorageBackendFileSystemMount(virConnectPtr conn,
|
||||
|
||||
if (pool->def->type == VIR_STORAGE_POOL_NETFS) {
|
||||
if (pool->def->source.host.name == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("missing source host"));
|
||||
return -1;
|
||||
}
|
||||
if (pool->def->source.dir == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("missing source path"));
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (pool->def->source.ndevice != 1) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("missing source device"));
|
||||
return -1;
|
||||
}
|
||||
@ -420,25 +418,24 @@ virStorageBackendFileSystemMount(virConnectPtr conn,
|
||||
* Returns 0 if successfully unmounted, -1 on error
|
||||
*/
|
||||
static int
|
||||
virStorageBackendFileSystemUnmount(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool) {
|
||||
virStorageBackendFileSystemUnmount(virStoragePoolObjPtr pool) {
|
||||
const char *mntargv[3];
|
||||
int ret;
|
||||
|
||||
if (pool->def->type == VIR_STORAGE_POOL_NETFS) {
|
||||
if (pool->def->source.host.name == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("missing source host"));
|
||||
return -1;
|
||||
}
|
||||
if (pool->def->source.dir == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("missing source dir"));
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (pool->def->source.ndevice != 1) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("missing source device"));
|
||||
return -1;
|
||||
}
|
||||
@ -476,11 +473,11 @@ virStorageBackendFileSystemUnmount(virConnectPtr conn,
|
||||
*/
|
||||
#if WITH_STORAGE_FS
|
||||
static int
|
||||
virStorageBackendFileSystemStart(virConnectPtr conn,
|
||||
virStorageBackendFileSystemStart(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool)
|
||||
{
|
||||
if (pool->def->type != VIR_STORAGE_POOL_DIR &&
|
||||
virStorageBackendFileSystemMount(conn, pool) < 0)
|
||||
virStorageBackendFileSystemMount(pool) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
@ -499,7 +496,7 @@ virStorageBackendFileSystemStart(virConnectPtr conn,
|
||||
* Returns 0 on success, -1 on error
|
||||
*/
|
||||
static int
|
||||
virStorageBackendFileSystemBuild(virConnectPtr conn,
|
||||
virStorageBackendFileSystemBuild(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool,
|
||||
unsigned int flags ATTRIBUTE_UNUSED)
|
||||
{
|
||||
@ -512,7 +509,7 @@ virStorageBackendFileSystemBuild(virConnectPtr conn,
|
||||
goto error;
|
||||
}
|
||||
if (!(p = strrchr(parent, '/'))) {
|
||||
virStorageReportError(conn, VIR_ERR_INVALID_ARG,
|
||||
virStorageReportError(VIR_ERR_INVALID_ARG,
|
||||
_("path '%s' is not absolute"),
|
||||
pool->def->target.path);
|
||||
goto error;
|
||||
@ -694,11 +691,11 @@ no_memory:
|
||||
*/
|
||||
#if WITH_STORAGE_FS
|
||||
static int
|
||||
virStorageBackendFileSystemStop(virConnectPtr conn,
|
||||
virStorageBackendFileSystemStop(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool)
|
||||
{
|
||||
if (pool->def->type != VIR_STORAGE_POOL_DIR &&
|
||||
virStorageBackendFileSystemUnmount(conn, pool) < 0)
|
||||
virStorageBackendFileSystemUnmount(pool) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
@ -766,7 +763,7 @@ virStorageBackendFileSystemVolCreate(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int createFileDir(virConnectPtr conn,
|
||||
static int createFileDir(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageVolDefPtr vol,
|
||||
virStorageVolDefPtr inputvol,
|
||||
@ -774,7 +771,7 @@ static int createFileDir(virConnectPtr conn,
|
||||
int err;
|
||||
|
||||
if (inputvol) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s",
|
||||
_("cannot copy from volume to a directory volume"));
|
||||
return -1;
|
||||
@ -803,13 +800,13 @@ _virStorageBackendFileSystemVolBuild(virConnectPtr conn,
|
||||
|
||||
if (inputvol) {
|
||||
if (vol->target.encryption != NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
"%s", _("storage pool does not support "
|
||||
"building encrypted volumes from "
|
||||
"other volumes"));
|
||||
return -1;
|
||||
}
|
||||
create_func = virStorageBackendGetBuildVolFromFunction(conn, vol,
|
||||
create_func = virStorageBackendGetBuildVolFromFunction(vol,
|
||||
inputvol);
|
||||
if (!create_func)
|
||||
return -1;
|
||||
@ -818,12 +815,12 @@ _virStorageBackendFileSystemVolBuild(virConnectPtr conn,
|
||||
} else if (vol->target.format == VIR_STORAGE_FILE_DIR) {
|
||||
create_func = createFileDir;
|
||||
} else if ((tool_type = virStorageBackendFindFSImageTool(NULL)) != -1) {
|
||||
create_func = virStorageBackendFSImageToolTypeToFunc(conn, tool_type);
|
||||
create_func = virStorageBackendFSImageToolTypeToFunc(tool_type);
|
||||
|
||||
if (!create_func)
|
||||
return -1;
|
||||
} else {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("creation of non-raw images "
|
||||
"is not supported without qemu-img"));
|
||||
return -1;
|
||||
|
@ -45,8 +45,7 @@
|
||||
#define VIR_FROM_THIS VIR_FROM_STORAGE
|
||||
|
||||
static int
|
||||
virStorageBackendISCSITargetIP(virConnectPtr conn,
|
||||
const char *hostname,
|
||||
virStorageBackendISCSITargetIP(const char *hostname,
|
||||
char *ipaddr,
|
||||
size_t ipaddrlen)
|
||||
{
|
||||
@ -62,14 +61,14 @@ virStorageBackendISCSITargetIP(virConnectPtr conn,
|
||||
|
||||
ret = getaddrinfo(hostname, NULL, &hints, &result);
|
||||
if (ret != 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("host lookup failed %s"),
|
||||
gai_strerror(ret));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (result == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("no IP address for target %s"),
|
||||
hostname);
|
||||
return -1;
|
||||
@ -78,7 +77,7 @@ virStorageBackendISCSITargetIP(virConnectPtr conn,
|
||||
if (getnameinfo(result->ai_addr, result->ai_addrlen,
|
||||
ipaddr, ipaddrlen, NULL, 0,
|
||||
NI_NUMERICHOST) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("cannot format ip addr for %s"),
|
||||
hostname);
|
||||
freeaddrinfo(result);
|
||||
@ -90,8 +89,7 @@ virStorageBackendISCSITargetIP(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendISCSIExtractSession(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendISCSIExtractSession(virStoragePoolObjPtr pool,
|
||||
char **const groups,
|
||||
void *data)
|
||||
{
|
||||
@ -108,8 +106,7 @@ virStorageBackendISCSIExtractSession(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
}
|
||||
|
||||
static char *
|
||||
virStorageBackendISCSISession(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendISCSISession(virStoragePoolObjPtr pool,
|
||||
int probe)
|
||||
{
|
||||
/*
|
||||
@ -134,7 +131,7 @@ virStorageBackendISCSISession(virConnectPtr conn,
|
||||
* returned an exit status of > 0, even if they succeeded. We will just
|
||||
* rely on whether session got filled in properly.
|
||||
*/
|
||||
if (virStorageBackendRunProgRegex(conn, pool,
|
||||
if (virStorageBackendRunProgRegex(pool,
|
||||
prog,
|
||||
1,
|
||||
regexes,
|
||||
@ -146,7 +143,7 @@ virStorageBackendISCSISession(virConnectPtr conn,
|
||||
|
||||
if (session == NULL &&
|
||||
!probe) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("cannot find session"));
|
||||
return NULL;
|
||||
}
|
||||
@ -158,8 +155,7 @@ virStorageBackendISCSISession(virConnectPtr conn,
|
||||
#define LINE_SIZE 4096
|
||||
|
||||
static int
|
||||
virStorageBackendIQNFound(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendIQNFound(virStoragePoolObjPtr pool,
|
||||
char **ifacename)
|
||||
{
|
||||
int ret = IQN_MISSING, fd = -1;
|
||||
@ -174,7 +170,7 @@ virStorageBackendIQNFound(virConnectPtr conn,
|
||||
|
||||
if (VIR_ALLOC_N(line, LINE_SIZE) != 0) {
|
||||
ret = IQN_ERROR;
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Could not allocate memory for output of '%s'"),
|
||||
prog[0]);
|
||||
goto out;
|
||||
@ -183,7 +179,7 @@ virStorageBackendIQNFound(virConnectPtr conn,
|
||||
memset(line, 0, LINE_SIZE);
|
||||
|
||||
if (virExec(prog, NULL, NULL, &child, -1, &fd, NULL, VIR_EXEC_NONE) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to run '%s' when looking for existing interface with IQN '%s'"),
|
||||
prog[0], pool->def->source.initiator.iqn);
|
||||
|
||||
@ -192,7 +188,7 @@ virStorageBackendIQNFound(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if ((fp = fdopen(fd, "r")) == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to open stream for file descriptor "
|
||||
"when reading output from '%s': '%s'"),
|
||||
prog[0], virStrerror(errno, ebuf, sizeof ebuf));
|
||||
@ -204,7 +200,7 @@ virStorageBackendIQNFound(virConnectPtr conn,
|
||||
newline = strrchr(line, '\n');
|
||||
if (newline == NULL) {
|
||||
ret = IQN_ERROR;
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Unexpected line > %d characters "
|
||||
"when parsing output of '%s'"),
|
||||
LINE_SIZE, prog[0]);
|
||||
@ -251,15 +247,14 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendCreateIfaceIQN(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
char **ifacename)
|
||||
virStorageBackendCreateIfaceIQN(virStoragePoolObjPtr pool,
|
||||
char **ifacename)
|
||||
{
|
||||
int ret = -1, exitstatus = -1;
|
||||
char temp_ifacename[32];
|
||||
|
||||
if (virRandomInitialize(time(NULL) ^ getpid()) == -1) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("Failed to initialize random generator "
|
||||
"when creating iscsi interface"));
|
||||
goto out;
|
||||
@ -280,7 +275,7 @@ virStorageBackendCreateIfaceIQN(virConnectPtr conn,
|
||||
* We will just rely on whether the interface got created
|
||||
* properly. */
|
||||
if (virRun(cmdargv1, &exitstatus) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to run command '%s' to create new iscsi interface"),
|
||||
cmdargv1[0]);
|
||||
goto out;
|
||||
@ -296,14 +291,14 @@ virStorageBackendCreateIfaceIQN(virConnectPtr conn,
|
||||
* returned an exit status of > 0, even if they succeeded. We will just
|
||||
* rely on whether iface file got updated properly. */
|
||||
if (virRun(cmdargv2, &exitstatus) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to run command '%s' to update iscsi interface with IQN '%s'"),
|
||||
cmdargv1[0], pool->def->source.initiator.iqn);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check again to make sure the interface was created. */
|
||||
if (virStorageBackendIQNFound(conn, pool, ifacename) != IQN_FOUND) {
|
||||
if (virStorageBackendIQNFound(pool, ifacename) != IQN_FOUND) {
|
||||
VIR_DEBUG("Failed to find interface '%s' with IQN '%s' "
|
||||
"after attempting to create it",
|
||||
&temp_ifacename[0], pool->def->source.initiator.iqn);
|
||||
@ -323,20 +318,19 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendISCSIConnectionIQN(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendISCSIConnectionIQN(virStoragePoolObjPtr pool,
|
||||
const char *portal,
|
||||
const char *action)
|
||||
{
|
||||
int ret = -1;
|
||||
char *ifacename = NULL;
|
||||
|
||||
switch (virStorageBackendIQNFound(conn, pool, &ifacename)) {
|
||||
switch (virStorageBackendIQNFound(pool, &ifacename)) {
|
||||
case IQN_FOUND:
|
||||
VIR_DEBUG("ifacename: '%s'", ifacename);
|
||||
break;
|
||||
case IQN_MISSING:
|
||||
if (virStorageBackendCreateIfaceIQN(conn, pool, &ifacename) != 0) {
|
||||
if (virStorageBackendCreateIfaceIQN(pool, &ifacename) != 0) {
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
@ -349,7 +343,7 @@ virStorageBackendISCSIConnectionIQN(virConnectPtr conn,
|
||||
ISCSIADM, "--mode", "discovery", "--type", "sendtargets", "--portal", portal, NULL
|
||||
};
|
||||
if (virRun(sendtargets, NULL) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to run %s to get target list"),
|
||||
sendtargets[0]);
|
||||
goto out;
|
||||
@ -362,7 +356,7 @@ virStorageBackendISCSIConnectionIQN(virConnectPtr conn,
|
||||
};
|
||||
|
||||
if (virRun(cmdargv, NULL) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to run command '%s' with action '%s'"),
|
||||
cmdargv[0], action);
|
||||
goto out;
|
||||
@ -377,8 +371,7 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendISCSIConnection(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendISCSIConnection(virStoragePoolObjPtr pool,
|
||||
const char *portal,
|
||||
const char *action)
|
||||
{
|
||||
@ -386,7 +379,7 @@ virStorageBackendISCSIConnection(virConnectPtr conn,
|
||||
|
||||
if (pool->def->source.initiator.iqn != NULL) {
|
||||
|
||||
ret = virStorageBackendISCSIConnectionIQN(conn, pool, portal, action);
|
||||
ret = virStorageBackendISCSIConnectionIQN(pool, portal, action);
|
||||
|
||||
} else {
|
||||
|
||||
@ -406,8 +399,7 @@ virStorageBackendISCSIConnection(virConnectPtr conn,
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendISCSIFindLUs(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendISCSIFindLUs(virStoragePoolObjPtr pool,
|
||||
const char *session)
|
||||
{
|
||||
char sysfs_path[PATH_MAX];
|
||||
@ -425,7 +417,7 @@ virStorageBackendISCSIFindLUs(virConnectPtr conn,
|
||||
retval = -1;
|
||||
}
|
||||
|
||||
if (virStorageBackendSCSIFindLUs(conn, pool, host) < 0) {
|
||||
if (virStorageBackendSCSIFindLUs(pool, host) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("Failed to find LUs on host %u"), host);
|
||||
retval = -1;
|
||||
@ -435,8 +427,7 @@ virStorageBackendISCSIFindLUs(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendISCSIRescanLUNs(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
|
||||
virStorageBackendISCSIRescanLUNs(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
|
||||
const char *session)
|
||||
{
|
||||
const char *const cmdargv[] = {
|
||||
@ -451,8 +442,7 @@ virStorageBackendISCSIRescanLUNs(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendISCSILogin(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendISCSILogin(virStoragePoolObjPtr pool,
|
||||
const char *portal)
|
||||
{
|
||||
const char *const cmdsendtarget[] = {
|
||||
@ -463,26 +453,23 @@ virStorageBackendISCSILogin(virConnectPtr conn,
|
||||
if (virRun(cmdsendtarget, NULL) < 0)
|
||||
return -1;
|
||||
|
||||
return virStorageBackendISCSIConnection(conn, pool, portal, "--login");
|
||||
return virStorageBackendISCSIConnection(pool, portal, "--login");
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendISCSILogout(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendISCSILogout(virStoragePoolObjPtr pool,
|
||||
const char *portal)
|
||||
{
|
||||
return virStorageBackendISCSIConnection(conn, pool, portal, "--logout");
|
||||
return virStorageBackendISCSIConnection(pool, portal, "--logout");
|
||||
}
|
||||
|
||||
static char *
|
||||
virStorageBackendISCSIPortal(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool)
|
||||
virStorageBackendISCSIPortal(virStoragePoolObjPtr pool)
|
||||
{
|
||||
char ipaddr[NI_MAXHOST];
|
||||
char *portal;
|
||||
|
||||
if (virStorageBackendISCSITargetIP(conn,
|
||||
pool->def->source.host.name,
|
||||
if (virStorageBackendISCSITargetIP(pool->def->source.host.name,
|
||||
ipaddr, sizeof(ipaddr)) < 0)
|
||||
return NULL;
|
||||
|
||||
@ -499,29 +486,29 @@ virStorageBackendISCSIPortal(virConnectPtr conn,
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendISCSIStartPool(virConnectPtr conn,
|
||||
virStorageBackendISCSIStartPool(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool)
|
||||
{
|
||||
char *portal = NULL;
|
||||
char *session;
|
||||
|
||||
if (pool->def->source.host.name == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("missing source host"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (pool->def->source.ndevice != 1 ||
|
||||
pool->def->source.devices[0].path == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("missing source device"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((session = virStorageBackendISCSISession(conn, pool, 1)) == NULL) {
|
||||
if ((portal = virStorageBackendISCSIPortal(conn, pool)) == NULL)
|
||||
if ((session = virStorageBackendISCSISession(pool, 1)) == NULL) {
|
||||
if ((portal = virStorageBackendISCSIPortal(pool)) == NULL)
|
||||
return -1;
|
||||
if (virStorageBackendISCSILogin(conn, pool, portal) < 0) {
|
||||
if (virStorageBackendISCSILogin(pool, portal) < 0) {
|
||||
VIR_FREE(portal);
|
||||
return -1;
|
||||
}
|
||||
@ -533,18 +520,18 @@ virStorageBackendISCSIStartPool(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendISCSIRefreshPool(virConnectPtr conn,
|
||||
virStorageBackendISCSIRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool)
|
||||
{
|
||||
char *session = NULL;
|
||||
|
||||
pool->def->allocation = pool->def->capacity = pool->def->available = 0;
|
||||
|
||||
if ((session = virStorageBackendISCSISession(conn, pool, 0)) == NULL)
|
||||
if ((session = virStorageBackendISCSISession(pool, 0)) == NULL)
|
||||
goto cleanup;
|
||||
if (virStorageBackendISCSIRescanLUNs(conn, pool, session) < 0)
|
||||
if (virStorageBackendISCSIRescanLUNs(pool, session) < 0)
|
||||
goto cleanup;
|
||||
if (virStorageBackendISCSIFindLUs(conn, pool, session) < 0)
|
||||
if (virStorageBackendISCSIFindLUs(pool, session) < 0)
|
||||
goto cleanup;
|
||||
VIR_FREE(session);
|
||||
|
||||
@ -557,15 +544,15 @@ virStorageBackendISCSIRefreshPool(virConnectPtr conn,
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendISCSIStopPool(virConnectPtr conn,
|
||||
virStorageBackendISCSIStopPool(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool)
|
||||
{
|
||||
char *portal;
|
||||
|
||||
if ((portal = virStorageBackendISCSIPortal(conn, pool)) == NULL)
|
||||
if ((portal = virStorageBackendISCSIPortal(pool)) == NULL)
|
||||
return -1;
|
||||
|
||||
if (virStorageBackendISCSILogout(conn, pool, portal) < 0) {
|
||||
if (virStorageBackendISCSILogout(pool, portal) < 0) {
|
||||
VIR_FREE(portal);
|
||||
return -1;
|
||||
}
|
||||
|
@ -62,8 +62,7 @@ virStorageBackendLogicalSetActive(virStoragePoolObjPtr pool,
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendLogicalMakeVol(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendLogicalMakeVol(virStoragePoolObjPtr pool,
|
||||
char **const groups,
|
||||
void *data)
|
||||
{
|
||||
@ -149,17 +148,17 @@ virStorageBackendLogicalMakeVol(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if (virStrToLong_ull(groups[4], NULL, 10, &offset) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("malformed volume extent offset value"));
|
||||
return -1;
|
||||
}
|
||||
if (virStrToLong_ull(groups[5], NULL, 10, &length) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("malformed volume extent length value"));
|
||||
return -1;
|
||||
}
|
||||
if (virStrToLong_ull(groups[6], NULL, 10, &size) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("malformed volume extent size value"));
|
||||
return -1;
|
||||
}
|
||||
@ -172,8 +171,7 @@ virStorageBackendLogicalMakeVol(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendLogicalFindLVs(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool,
|
||||
virStorageVolDefPtr vol)
|
||||
{
|
||||
/*
|
||||
@ -208,8 +206,7 @@ virStorageBackendLogicalFindLVs(virConnectPtr conn,
|
||||
|
||||
int exitstatus;
|
||||
|
||||
if (virStorageBackendRunProgRegex(conn,
|
||||
pool,
|
||||
if (virStorageBackendRunProgRegex(pool,
|
||||
prog,
|
||||
1,
|
||||
regexes,
|
||||
@ -217,13 +214,13 @@ virStorageBackendLogicalFindLVs(virConnectPtr conn,
|
||||
virStorageBackendLogicalMakeVol,
|
||||
vol,
|
||||
&exitstatus) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("lvs command failed"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (exitstatus != 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("lvs command failed with exitstatus %d"),
|
||||
exitstatus);
|
||||
return -1;
|
||||
@ -233,8 +230,7 @@ virStorageBackendLogicalFindLVs(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendLogicalRefreshPoolFunc(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
|
||||
virStorageBackendLogicalRefreshPoolFunc(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
|
||||
char **const groups,
|
||||
void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
@ -249,8 +245,7 @@ virStorageBackendLogicalRefreshPoolFunc(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendLogicalFindPoolSourcesFunc(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
|
||||
virStorageBackendLogicalFindPoolSourcesFunc(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
|
||||
char **const groups,
|
||||
void *data)
|
||||
{
|
||||
@ -278,8 +273,7 @@ virStorageBackendLogicalFindPoolSourcesFunc(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if (thisSource == NULL) {
|
||||
if (!(thisSource = virStoragePoolSourceListNewSource(conn,
|
||||
sourceList)))
|
||||
if (!(thisSource = virStoragePoolSourceListNewSource(sourceList)))
|
||||
goto err_no_memory;
|
||||
|
||||
thisSource->name = vgname;
|
||||
@ -309,7 +303,7 @@ virStorageBackendLogicalFindPoolSourcesFunc(virConnectPtr conn,
|
||||
}
|
||||
|
||||
static char *
|
||||
virStorageBackendLogicalFindPoolSources(virConnectPtr conn,
|
||||
virStorageBackendLogicalFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
const char *srcSpec ATTRIBUTE_UNUSED,
|
||||
unsigned int flags ATTRIBUTE_UNUSED)
|
||||
{
|
||||
@ -343,14 +337,14 @@ virStorageBackendLogicalFindPoolSources(virConnectPtr conn,
|
||||
memset(&sourceList, 0, sizeof(sourceList));
|
||||
sourceList.type = VIR_STORAGE_POOL_LOGICAL;
|
||||
|
||||
if (virStorageBackendRunProgRegex(conn, NULL, prog, 1, regexes, vars,
|
||||
if (virStorageBackendRunProgRegex(NULL, prog, 1, regexes, vars,
|
||||
virStorageBackendLogicalFindPoolSourcesFunc,
|
||||
&sourceList, &exitstatus) < 0)
|
||||
return NULL;
|
||||
|
||||
retval = virStoragePoolSourceListFormat(conn, &sourceList);
|
||||
retval = virStoragePoolSourceListFormat(&sourceList);
|
||||
if (retval == NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("failed to get source from sourceList"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -451,7 +445,7 @@ virStorageBackendLogicalBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendLogicalRefreshPool(virConnectPtr conn,
|
||||
virStorageBackendLogicalRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool)
|
||||
{
|
||||
/*
|
||||
@ -478,14 +472,13 @@ virStorageBackendLogicalRefreshPool(virConnectPtr conn,
|
||||
virFileWaitForDevices();
|
||||
|
||||
/* Get list of all logical volumes */
|
||||
if (virStorageBackendLogicalFindLVs(conn, pool, NULL) < 0) {
|
||||
if (virStorageBackendLogicalFindLVs(pool, NULL) < 0) {
|
||||
virStoragePoolObjClearVols(pool);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Now get basic volgrp metadata */
|
||||
if (virStorageBackendRunProgRegex(conn,
|
||||
pool,
|
||||
if (virStorageBackendRunProgRegex(pool,
|
||||
prog,
|
||||
1,
|
||||
regexes,
|
||||
@ -579,7 +572,7 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
|
||||
const char **cmdargv = cmdargvnew;
|
||||
|
||||
if (vol->target.encryption != NULL) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
"%s", _("storage pool does not support encrypted "
|
||||
"volumes"));
|
||||
return -1;
|
||||
@ -641,7 +634,7 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
|
||||
fd = -1;
|
||||
|
||||
/* Fill in data about this new vol */
|
||||
if (virStorageBackendLogicalFindLVs(conn, pool, vol) < 0) {
|
||||
if (virStorageBackendLogicalFindLVs(pool, vol) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot find newly created volume '%s'"),
|
||||
vol->target.path);
|
||||
@ -666,7 +659,7 @@ virStorageBackendLogicalBuildVolFrom(virConnectPtr conn,
|
||||
{
|
||||
virStorageBackendBuildVolFrom build_func;
|
||||
|
||||
build_func = virStorageBackendGetBuildVolFromFunction(conn, vol, inputvol);
|
||||
build_func = virStorageBackendGetBuildVolFromFunction(vol, inputvol);
|
||||
if (!build_func)
|
||||
return -1;
|
||||
|
||||
|
@ -39,8 +39,7 @@
|
||||
#define VIR_FROM_THIS VIR_FROM_STORAGE
|
||||
|
||||
static int
|
||||
virStorageBackendMpathUpdateVolTargetInfo(virConnectPtr conn,
|
||||
virStorageVolTargetPtr target,
|
||||
virStorageBackendMpathUpdateVolTargetInfo(virStorageVolTargetPtr target,
|
||||
unsigned long long *allocation,
|
||||
unsigned long long *capacity)
|
||||
{
|
||||
@ -60,7 +59,7 @@ virStorageBackendMpathUpdateVolTargetInfo(virConnectPtr conn,
|
||||
allocation,
|
||||
capacity) < 0) {
|
||||
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to update volume target info for '%s'"),
|
||||
target->path);
|
||||
|
||||
@ -69,7 +68,7 @@ virStorageBackendMpathUpdateVolTargetInfo(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if (virStorageBackendUpdateVolTargetFormatFD(target, fd) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to update volume target format for '%s'"),
|
||||
target->path);
|
||||
|
||||
@ -86,8 +85,7 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendMpathNewVol(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendMpathNewVol(virStoragePoolObjPtr pool,
|
||||
const int devnum,
|
||||
const char *dev)
|
||||
{
|
||||
@ -111,12 +109,11 @@ virStorageBackendMpathNewVol(virConnectPtr conn,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virStorageBackendMpathUpdateVolTargetInfo(conn,
|
||||
&vol->target,
|
||||
if (virStorageBackendMpathUpdateVolTargetInfo(&vol->target,
|
||||
&vol->allocation,
|
||||
&vol->capacity) < 0) {
|
||||
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to update volume for '%s'"),
|
||||
vol->target.path);
|
||||
goto cleanup;
|
||||
@ -231,8 +228,7 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendCreateVols(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendCreateVols(virStoragePoolObjPtr pool,
|
||||
struct dm_names *names)
|
||||
{
|
||||
int retval = 0, is_mpath = 0;
|
||||
@ -260,8 +256,7 @@ virStorageBackendCreateVols(virConnectPtr conn,
|
||||
goto out;
|
||||
}
|
||||
|
||||
virStorageBackendMpathNewVol(conn,
|
||||
pool,
|
||||
virStorageBackendMpathNewVol(pool,
|
||||
minor,
|
||||
map_device);
|
||||
|
||||
@ -280,8 +275,7 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendGetMaps(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool)
|
||||
virStorageBackendGetMaps(virStoragePoolObjPtr pool)
|
||||
{
|
||||
int retval = 0;
|
||||
struct dm_task *dmt = NULL;
|
||||
@ -309,7 +303,7 @@ virStorageBackendGetMaps(virConnectPtr conn,
|
||||
goto out;
|
||||
}
|
||||
|
||||
virStorageBackendCreateVols(conn, pool, names);
|
||||
virStorageBackendCreateVols(pool, names);
|
||||
|
||||
out:
|
||||
if (dmt != NULL) {
|
||||
@ -320,7 +314,7 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendMpathRefreshPool(virConnectPtr conn,
|
||||
virStorageBackendMpathRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool)
|
||||
{
|
||||
int retval = 0;
|
||||
@ -331,7 +325,7 @@ virStorageBackendMpathRefreshPool(virConnectPtr conn,
|
||||
|
||||
virFileWaitForDevices();
|
||||
|
||||
virStorageBackendGetMaps(conn, pool);
|
||||
virStorageBackendGetMaps(pool);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -40,8 +40,7 @@
|
||||
* the device otherwise.
|
||||
*/
|
||||
static int
|
||||
getDeviceType(virConnectPtr conn,
|
||||
uint32_t host,
|
||||
getDeviceType(uint32_t host,
|
||||
uint32_t bus,
|
||||
uint32_t target,
|
||||
uint32_t lun,
|
||||
@ -85,7 +84,7 @@ getDeviceType(virConnectPtr conn,
|
||||
* character is not \0, virStrToLong_i complains
|
||||
*/
|
||||
if (virStrToLong_i(typestr, &p, 10, type) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Device type '%s' is not an integer"),
|
||||
typestr);
|
||||
/* Hm, type wasn't an integer; seems strange */
|
||||
@ -191,8 +190,7 @@ virStorageBackendSCSIUpdateVolTargetInfo(virStorageVolTargetPtr target,
|
||||
}
|
||||
|
||||
static int
|
||||
virStorageBackendSCSINewLun(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendSCSINewLun(virStoragePoolObjPtr pool,
|
||||
uint32_t host,
|
||||
uint32_t bus,
|
||||
uint32_t target,
|
||||
@ -252,7 +250,7 @@ virStorageBackendSCSINewLun(virConnectPtr conn,
|
||||
&vol->allocation,
|
||||
&vol->capacity) < 0) {
|
||||
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to update volume for '%s'"),
|
||||
devpath);
|
||||
retval = -1;
|
||||
@ -289,8 +287,7 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
getNewStyleBlockDevice(virConnectPtr conn ATTRIBUTE_UNUSED /*TEMPORARY*/,
|
||||
const char *lun_path,
|
||||
getNewStyleBlockDevice(const char *lun_path,
|
||||
const char *block_name ATTRIBUTE_UNUSED,
|
||||
char **block_device)
|
||||
{
|
||||
@ -344,8 +341,7 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
getOldStyleBlockDevice(virConnectPtr conn,
|
||||
const char *lun_path ATTRIBUTE_UNUSED,
|
||||
getOldStyleBlockDevice(const char *lun_path ATTRIBUTE_UNUSED,
|
||||
const char *block_name,
|
||||
char **block_device)
|
||||
{
|
||||
@ -356,7 +352,7 @@ getOldStyleBlockDevice(virConnectPtr conn,
|
||||
blockp = strrchr(block_name, ':');
|
||||
if (blockp == NULL) {
|
||||
/* Hm, wasn't what we were expecting; have to give up */
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to parse block name %s"),
|
||||
block_name);
|
||||
retval = -1;
|
||||
@ -379,8 +375,7 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
getBlockDevice(virConnectPtr conn,
|
||||
uint32_t host,
|
||||
getBlockDevice(uint32_t host,
|
||||
uint32_t bus,
|
||||
uint32_t target,
|
||||
uint32_t lun,
|
||||
@ -409,13 +404,11 @@ getBlockDevice(virConnectPtr conn,
|
||||
while ((lun_dirent = readdir(lun_dir))) {
|
||||
if (STREQLEN(lun_dirent->d_name, "block", 5)) {
|
||||
if (strlen(lun_dirent->d_name) == 5) {
|
||||
retval = getNewStyleBlockDevice(conn,
|
||||
lun_path,
|
||||
retval = getNewStyleBlockDevice(lun_path,
|
||||
lun_dirent->d_name,
|
||||
block_device);
|
||||
} else {
|
||||
retval = getOldStyleBlockDevice(conn,
|
||||
lun_path,
|
||||
retval = getOldStyleBlockDevice(lun_path,
|
||||
lun_dirent->d_name,
|
||||
block_device);
|
||||
}
|
||||
@ -432,8 +425,7 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
processLU(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
processLU(virStoragePoolObjPtr pool,
|
||||
uint32_t host,
|
||||
uint32_t bus,
|
||||
uint32_t target,
|
||||
@ -447,8 +439,8 @@ processLU(virConnectPtr conn,
|
||||
VIR_DEBUG(_("Processing LU %u:%u:%u:%u"),
|
||||
host, bus, target, lun);
|
||||
|
||||
if (getDeviceType(conn, host, bus, target, lun, &device_type) < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
if (getDeviceType(host, bus, target, lun, &device_type) < 0) {
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to determine if %u:%u:%u:%u is a Direct-Access LUN"),
|
||||
host, bus, target, lun);
|
||||
retval = -1;
|
||||
@ -468,11 +460,11 @@ processLU(virConnectPtr conn,
|
||||
VIR_DEBUG(_("%u:%u:%u:%u is a Direct-Access LUN"),
|
||||
host, bus, target, lun);
|
||||
|
||||
if (getBlockDevice(conn, host, bus, target, lun, &block_device) < 0) {
|
||||
if (getBlockDevice(host, bus, target, lun, &block_device) < 0) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (virStorageBackendSCSINewLun(conn, pool,
|
||||
if (virStorageBackendSCSINewLun(pool,
|
||||
host, bus, target, lun,
|
||||
block_device) < 0) {
|
||||
VIR_DEBUG(_("Failed to create new storage volume for %u:%u:%u:%u"),
|
||||
@ -492,8 +484,7 @@ out:
|
||||
|
||||
|
||||
int
|
||||
virStorageBackendSCSIFindLUs(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendSCSIFindLUs(virStoragePoolObjPtr pool,
|
||||
uint32_t scanhost)
|
||||
{
|
||||
int retval = 0;
|
||||
@ -531,7 +522,7 @@ virStorageBackendSCSIFindLUs(virConnectPtr conn,
|
||||
|
||||
VIR_DEBUG(_("Found LU '%s'"), lun_dirent->d_name);
|
||||
|
||||
processLU(conn, pool, scanhost, bus, target, lun);
|
||||
processLU(pool, scanhost, bus, target, lun);
|
||||
}
|
||||
|
||||
closedir(devicedir);
|
||||
@ -627,7 +618,7 @@ out:
|
||||
|
||||
|
||||
static int
|
||||
virStorageBackendSCSIRefreshPool(virConnectPtr conn,
|
||||
virStorageBackendSCSIRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
virStoragePoolObjPtr pool)
|
||||
{
|
||||
int retval = 0;
|
||||
@ -649,7 +640,7 @@ virStorageBackendSCSIRefreshPool(virConnectPtr conn,
|
||||
goto out;
|
||||
}
|
||||
|
||||
virStorageBackendSCSIFindLUs(conn, pool, host);
|
||||
virStorageBackendSCSIFindLUs(pool, host);
|
||||
|
||||
out:
|
||||
return retval;
|
||||
|
@ -36,8 +36,7 @@ int
|
||||
virStorageBackendSCSIGetHostNumber(const char *sysfs_path,
|
||||
uint32_t *host);
|
||||
int
|
||||
virStorageBackendSCSIFindLUs(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
virStorageBackendSCSIFindLUs(virStoragePoolObjPtr pool,
|
||||
uint32_t scanhost);
|
||||
|
||||
#endif /* __VIR_STORAGE_BACKEND_SCSI_H__ */
|
||||
|
@ -161,8 +161,7 @@ storageDriverStartup(int privileged) {
|
||||
}
|
||||
*/
|
||||
|
||||
if (virStoragePoolLoadAllConfigs(NULL,
|
||||
&driverState->pools,
|
||||
if (virStoragePoolLoadAllConfigs(&driverState->pools,
|
||||
driverState->configDir,
|
||||
driverState->autostartDir) < 0)
|
||||
goto error;
|
||||
@ -192,8 +191,7 @@ storageDriverReload(void) {
|
||||
return -1;
|
||||
|
||||
storageDriverLock(driverState);
|
||||
virStoragePoolLoadAllConfigs(NULL,
|
||||
&driverState->pools,
|
||||
virStoragePoolLoadAllConfigs(&driverState->pools,
|
||||
driverState->configDir,
|
||||
driverState->autostartDir);
|
||||
storageDriverAutostart(driverState);
|
||||
@ -268,7 +266,7 @@ storagePoolLookupByUUID(virConnectPtr conn,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_POOL,
|
||||
"%s", _("no pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -293,7 +291,7 @@ storagePoolLookupByName(virConnectPtr conn,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_POOL,
|
||||
_("no pool with matching name '%s'"), name);
|
||||
goto cleanup;
|
||||
}
|
||||
@ -439,7 +437,7 @@ storageFindPoolSources(virConnectPtr conn,
|
||||
|
||||
backend_type = virStoragePoolTypeFromString(type);
|
||||
if (backend_type < 0) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("unknown storage pool type %s"), type);
|
||||
goto cleanup;
|
||||
}
|
||||
@ -449,7 +447,7 @@ storageFindPoolSources(virConnectPtr conn,
|
||||
goto cleanup;
|
||||
|
||||
if (!backend->findPoolSources) {
|
||||
virStorageReportError(conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
_("pool type '%s' does not support source "
|
||||
"discovery"), type);
|
||||
goto cleanup;
|
||||
@ -472,7 +470,7 @@ static int storagePoolIsActive(virStoragePoolPtr pool)
|
||||
obj = virStoragePoolObjFindByUUID(&driver->pools, pool->uuid);
|
||||
storageDriverUnlock(driver);
|
||||
if (!obj) {
|
||||
virStorageReportError(pool->conn, VIR_ERR_NO_STORAGE_POOL, NULL);
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_POOL, NULL);
|
||||
goto cleanup;
|
||||
}
|
||||
ret = virStoragePoolObjIsActive(obj);
|
||||
@ -493,7 +491,7 @@ static int storagePoolIsPersistent(virStoragePoolPtr pool)
|
||||
obj = virStoragePoolObjFindByUUID(&driver->pools, pool->uuid);
|
||||
storageDriverUnlock(driver);
|
||||
if (!obj) {
|
||||
virStorageReportError(pool->conn, VIR_ERR_NO_STORAGE_POOL, NULL);
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_POOL, NULL);
|
||||
goto cleanup;
|
||||
}
|
||||
ret = obj->configFile ? 1 : 0;
|
||||
@ -516,7 +514,7 @@ storagePoolCreate(virConnectPtr conn,
|
||||
virStorageBackendPtr backend;
|
||||
|
||||
storageDriverLock(driver);
|
||||
if (!(def = virStoragePoolDefParseString(conn, xml)))
|
||||
if (!(def = virStoragePoolDefParseString(xml)))
|
||||
goto cleanup;
|
||||
|
||||
pool = virStoragePoolObjFindByUUID(&driver->pools, def->uuid);
|
||||
@ -524,7 +522,7 @@ storagePoolCreate(virConnectPtr conn,
|
||||
pool = virStoragePoolObjFindByName(&driver->pools, def->name);
|
||||
|
||||
if (pool) {
|
||||
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool already exists"));
|
||||
virStoragePoolObjUnlock(pool);
|
||||
pool = NULL;
|
||||
@ -534,7 +532,7 @@ storagePoolCreate(virConnectPtr conn,
|
||||
if ((backend = virStorageBackendForType(def->type)) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if (!(pool = virStoragePoolObjAssignDef(conn, &driver->pools, def)))
|
||||
if (!(pool = virStoragePoolObjAssignDef(&driver->pools, def)))
|
||||
goto cleanup;
|
||||
def = NULL;
|
||||
|
||||
@ -574,16 +572,16 @@ storagePoolDefine(virConnectPtr conn,
|
||||
virStoragePoolPtr ret = NULL;
|
||||
|
||||
storageDriverLock(driver);
|
||||
if (!(def = virStoragePoolDefParseString(conn, xml)))
|
||||
if (!(def = virStoragePoolDefParseString(xml)))
|
||||
goto cleanup;
|
||||
|
||||
if (virStorageBackendForType(def->type) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if (!(pool = virStoragePoolObjAssignDef(conn, &driver->pools, def)))
|
||||
if (!(pool = virStoragePoolObjAssignDef(&driver->pools, def)))
|
||||
goto cleanup;
|
||||
|
||||
if (virStoragePoolObjSaveDef(conn, driver, pool, def) < 0) {
|
||||
if (virStoragePoolObjSaveDef(driver, pool, def) < 0) {
|
||||
virStoragePoolObjRemove(&driver->pools, pool);
|
||||
def = NULL;
|
||||
goto cleanup;
|
||||
@ -609,25 +607,25 @@ storagePoolUndefine(virStoragePoolPtr obj) {
|
||||
storageDriverLock(driver);
|
||||
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("pool is still active"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (pool->asyncjobs > 0) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("pool '%s' has asynchronous jobs running."),
|
||||
pool->def->name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virStoragePoolObjDeleteDef(obj->conn, pool) < 0)
|
||||
if (virStoragePoolObjDeleteDef(pool) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (unlink(pool->autostartLink) < 0 && errno != ENOENT && errno != ENOTDIR) {
|
||||
@ -663,7 +661,7 @@ storagePoolStart(virStoragePoolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -672,7 +670,7 @@ storagePoolStart(virStoragePoolPtr obj,
|
||||
goto cleanup;
|
||||
|
||||
if (virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("pool already active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -708,7 +706,7 @@ storagePoolBuild(virStoragePoolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -717,7 +715,7 @@ storagePoolBuild(virStoragePoolPtr obj,
|
||||
goto cleanup;
|
||||
|
||||
if (virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is already active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -745,7 +743,7 @@ storagePoolDestroy(virStoragePoolPtr obj) {
|
||||
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -754,13 +752,13 @@ storagePoolDestroy(virStoragePoolPtr obj) {
|
||||
goto cleanup;
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (pool->asyncjobs > 0) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("pool '%s' has asynchronous jobs running."),
|
||||
pool->def->name);
|
||||
goto cleanup;
|
||||
@ -801,7 +799,7 @@ storagePoolDelete(virStoragePoolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -810,20 +808,20 @@ storagePoolDelete(virStoragePoolPtr obj,
|
||||
goto cleanup;
|
||||
|
||||
if (virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is still active"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (pool->asyncjobs > 0) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("pool '%s' has asynchronous jobs running."),
|
||||
pool->def->name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!backend->deletePool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
"%s", _("pool does not support volume delete"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -850,7 +848,7 @@ storagePoolRefresh(virStoragePoolPtr obj,
|
||||
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -859,13 +857,13 @@ storagePoolRefresh(virStoragePoolPtr obj,
|
||||
goto cleanup;
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (pool->asyncjobs > 0) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("pool '%s' has asynchronous jobs running."),
|
||||
pool->def->name);
|
||||
goto cleanup;
|
||||
@ -906,7 +904,7 @@ storagePoolGetInfo(virStoragePoolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -942,12 +940,12 @@ storagePoolDumpXML(virStoragePoolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = virStoragePoolDefFormat(obj->conn, pool->def);
|
||||
ret = virStoragePoolDefFormat(pool->def);
|
||||
|
||||
cleanup:
|
||||
if (pool)
|
||||
@ -967,7 +965,7 @@ storagePoolGetAutostart(virStoragePoolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -996,13 +994,13 @@ storagePoolSetAutostart(virStoragePoolPtr obj,
|
||||
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!pool->configFile) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_ARG,
|
||||
virStorageReportError(VIR_ERR_INVALID_ARG,
|
||||
"%s", _("pool has no config file"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1058,13 +1056,13 @@ storagePoolNumVolumes(virStoragePoolPtr obj) {
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1091,13 +1089,13 @@ storagePoolListVolumes(virStoragePoolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1136,13 +1134,13 @@ storageVolumeLookupByName(virStoragePoolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1150,8 +1148,8 @@ storageVolumeLookupByName(virStoragePoolPtr obj,
|
||||
vol = virStorageVolDefFindByName(pool, name);
|
||||
|
||||
if (!vol) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_STORAGE_VOL,
|
||||
_("no storage vol with matching name '%s'"),
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_VOL,
|
||||
_("no storage vol with matching name '%s'"),
|
||||
name);
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1190,7 +1188,7 @@ storageVolumeLookupByKey(virConnectPtr conn,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!ret)
|
||||
virStorageReportError(conn, VIR_ERR_INVALID_STORAGE_VOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_VOL,
|
||||
"%s", _("no storage vol with matching key"));
|
||||
|
||||
return ret;
|
||||
@ -1236,7 +1234,7 @@ storageVolumeLookupByPath(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
virStorageReportError(conn, VIR_ERR_INVALID_STORAGE_VOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_VOL,
|
||||
"%s", _("no storage vol with matching path"));
|
||||
|
||||
cleanup:
|
||||
@ -1261,13 +1259,13 @@ storageVolumeCreateXML(virStoragePoolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1275,12 +1273,12 @@ storageVolumeCreateXML(virStoragePoolPtr obj,
|
||||
if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
voldef = virStorageVolDefParseString(obj->conn, pool->def, xmldesc);
|
||||
voldef = virStorageVolDefParseString(pool->def, xmldesc);
|
||||
if (voldef == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if (virStorageVolDefFindByName(pool, voldef->name)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("storage vol already exists"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1292,7 +1290,7 @@ storageVolumeCreateXML(virStoragePoolPtr obj,
|
||||
}
|
||||
|
||||
if (!backend->createVol) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
"%s", _("storage pool does not support volume "
|
||||
"creation"));
|
||||
goto cleanup;
|
||||
@ -1382,26 +1380,26 @@ storageVolumeCreateXMLFrom(virStoragePoolPtr obj,
|
||||
}
|
||||
storageDriverUnlock(driver);
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (STRNEQ(obj->name, vobj->pool) && !origpool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_STORAGE_POOL,
|
||||
_("no storage pool with matching name '%s'"),
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_POOL,
|
||||
_("no storage pool with matching name '%s'"),
|
||||
vobj->pool);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (origpool && !virStoragePoolObjIsActive(origpool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1411,18 +1409,18 @@ storageVolumeCreateXMLFrom(virStoragePoolPtr obj,
|
||||
|
||||
origvol = virStorageVolDefFindByName(origpool ? origpool : pool, vobj->name);
|
||||
if (!origvol) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_STORAGE_VOL,
|
||||
_("no storage vol with matching name '%s'"),
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_VOL,
|
||||
_("no storage vol with matching name '%s'"),
|
||||
vobj->name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
newvol = virStorageVolDefParseString(obj->conn, pool->def, xmldesc);
|
||||
newvol = virStorageVolDefParseString(pool->def, xmldesc);
|
||||
if (newvol == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if (virStorageVolDefFindByName(pool, newvol->name)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
_("storage volume name '%s' already in use."),
|
||||
newvol->name);
|
||||
goto cleanup;
|
||||
@ -1438,13 +1436,13 @@ storageVolumeCreateXMLFrom(virStoragePoolPtr obj,
|
||||
newvol->allocation = origvol->capacity;
|
||||
|
||||
if (!backend->buildVolFrom) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
"%s", _("storage pool does not support volume creation from an existing volume"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (origvol->building) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("volume '%s' is still being allocated."),
|
||||
origvol->name);
|
||||
goto cleanup;
|
||||
@ -1535,13 +1533,13 @@ storageVolumeDelete(virStorageVolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1552,21 +1550,21 @@ storageVolumeDelete(virStorageVolPtr obj,
|
||||
vol = virStorageVolDefFindByName(pool, obj->name);
|
||||
|
||||
if (!vol) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_STORAGE_VOL,
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_VOL,
|
||||
_("no storage vol with matching name '%s'"),
|
||||
obj->name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (vol->building) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("volume '%s' is still being allocated."),
|
||||
vol->name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!backend->deleteVol) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_SUPPORT,
|
||||
virStorageReportError(VIR_ERR_NO_SUPPORT,
|
||||
"%s", _("storage pool does not support vol deletion"));
|
||||
|
||||
goto cleanup;
|
||||
@ -1614,13 +1612,13 @@ storageVolumeGetInfo(virStorageVolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1628,8 +1626,8 @@ storageVolumeGetInfo(virStorageVolPtr obj,
|
||||
vol = virStorageVolDefFindByName(pool, obj->name);
|
||||
|
||||
if (!vol) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_STORAGE_VOL,
|
||||
_("no storage vol with matching name '%s'"),
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_VOL,
|
||||
_("no storage vol with matching name '%s'"),
|
||||
obj->name);
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1667,13 +1665,13 @@ storageVolumeGetXMLDesc(virStorageVolPtr obj,
|
||||
storageDriverUnlock(driver);
|
||||
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1681,7 +1679,7 @@ storageVolumeGetXMLDesc(virStorageVolPtr obj,
|
||||
vol = virStorageVolDefFindByName(pool, obj->name);
|
||||
|
||||
if (!vol) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_STORAGE_VOL,
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_VOL,
|
||||
_("no storage vol with matching name '%s'"),
|
||||
obj->name);
|
||||
goto cleanup;
|
||||
@ -1694,7 +1692,7 @@ storageVolumeGetXMLDesc(virStorageVolPtr obj,
|
||||
backend->refreshVol(obj->conn, pool, vol) < 0)
|
||||
goto cleanup;
|
||||
|
||||
ret = virStorageVolDefFormat(obj->conn, pool->def, vol);
|
||||
ret = virStorageVolDefFormat(pool->def, vol);
|
||||
|
||||
cleanup:
|
||||
if (pool)
|
||||
@ -1714,13 +1712,13 @@ storageVolumeGetPath(virStorageVolPtr obj) {
|
||||
pool = virStoragePoolObjFindByName(&driver->pools, obj->pool);
|
||||
storageDriverUnlock(driver);
|
||||
if (!pool) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
|
||||
virStorageReportError(VIR_ERR_INVALID_STORAGE_POOL,
|
||||
"%s", _("no storage pool with matching uuid"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!virStoragePoolObjIsActive(pool)) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_INTERNAL_ERROR,
|
||||
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
"%s", _("storage pool is not active"));
|
||||
goto cleanup;
|
||||
}
|
||||
@ -1728,8 +1726,8 @@ storageVolumeGetPath(virStorageVolPtr obj) {
|
||||
vol = virStorageVolDefFindByName(pool, obj->name);
|
||||
|
||||
if (!vol) {
|
||||
virStorageReportError(obj->conn, VIR_ERR_NO_STORAGE_VOL,
|
||||
_("no storage vol with matching name '%s'"),
|
||||
virStorageReportError(VIR_ERR_NO_STORAGE_VOL,
|
||||
_("no storage vol with matching name '%s'"),
|
||||
obj->name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -577,10 +577,10 @@ static int testOpenDefault(virConnectPtr conn) {
|
||||
interfaceobj->active = 1;
|
||||
virInterfaceObjUnlock(interfaceobj);
|
||||
|
||||
if (!(pooldef = virStoragePoolDefParseString(conn, defaultPoolXML)))
|
||||
if (!(pooldef = virStoragePoolDefParseString(defaultPoolXML)))
|
||||
goto error;
|
||||
|
||||
if (!(poolobj = virStoragePoolObjAssignDef(conn, &privconn->pools,
|
||||
if (!(poolobj = virStoragePoolObjAssignDef(&privconn->pools,
|
||||
pooldef))) {
|
||||
virStoragePoolDefFree(pooldef);
|
||||
goto error;
|
||||
@ -648,8 +648,7 @@ static char *testBuildFilename(const char *relativeTo,
|
||||
}
|
||||
}
|
||||
|
||||
static int testOpenVolumesForPool(virConnectPtr conn,
|
||||
xmlDocPtr xml,
|
||||
static int testOpenVolumesForPool(xmlDocPtr xml,
|
||||
xmlXPathContextPtr ctxt,
|
||||
const char *file,
|
||||
virStoragePoolObjPtr pool,
|
||||
@ -684,12 +683,12 @@ static int testOpenVolumesForPool(virConnectPtr conn,
|
||||
goto error;
|
||||
}
|
||||
|
||||
def = virStorageVolDefParseFile(conn, pool->def, absFile);
|
||||
def = virStorageVolDefParseFile(pool->def, absFile);
|
||||
VIR_FREE(absFile);
|
||||
if (!def)
|
||||
goto error;
|
||||
} else {
|
||||
if ((def = virStorageVolDefParseNode(conn, pool->def, xml,
|
||||
if ((def = virStorageVolDefParseNode(pool->def, xml,
|
||||
vols[i])) == NULL) {
|
||||
goto error;
|
||||
}
|
||||
@ -1008,18 +1007,18 @@ static int testOpenFromFile(virConnectPtr conn,
|
||||
goto error;
|
||||
}
|
||||
|
||||
def = virStoragePoolDefParseFile(conn, absFile);
|
||||
def = virStoragePoolDefParseFile(absFile);
|
||||
VIR_FREE(absFile);
|
||||
if (!def)
|
||||
goto error;
|
||||
} else {
|
||||
if ((def = virStoragePoolDefParseNode(conn, xml,
|
||||
if ((def = virStoragePoolDefParseNode(xml,
|
||||
pools[i])) == NULL) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(pool = virStoragePoolObjAssignDef(conn, &privconn->pools,
|
||||
if (!(pool = virStoragePoolObjAssignDef(&privconn->pools,
|
||||
def))) {
|
||||
virStoragePoolDefFree(def);
|
||||
goto error;
|
||||
@ -1032,7 +1031,7 @@ static int testOpenFromFile(virConnectPtr conn,
|
||||
pool->active = 1;
|
||||
|
||||
/* Find storage volumes */
|
||||
if (testOpenVolumesForPool(conn, xml, ctxt, file, pool, i+1) < 0) {
|
||||
if (testOpenVolumesForPool(xml, ctxt, file, pool, i+1) < 0) {
|
||||
virStoragePoolObjUnlock(pool);
|
||||
goto error;
|
||||
}
|
||||
@ -3727,7 +3726,7 @@ testStorageFindPoolSources(virConnectPtr conn,
|
||||
}
|
||||
|
||||
if (srcSpec) {
|
||||
source = virStoragePoolDefParseSourceString(conn, srcSpec, pool_type);
|
||||
source = virStoragePoolDefParseSourceString(srcSpec, pool_type);
|
||||
if (!source)
|
||||
goto cleanup;
|
||||
}
|
||||
@ -3773,7 +3772,7 @@ testStoragePoolCreate(virConnectPtr conn,
|
||||
virStoragePoolPtr ret = NULL;
|
||||
|
||||
testDriverLock(privconn);
|
||||
if (!(def = virStoragePoolDefParseString(conn, xml)))
|
||||
if (!(def = virStoragePoolDefParseString(xml)))
|
||||
goto cleanup;
|
||||
|
||||
pool = virStoragePoolObjFindByUUID(&privconn->pools, def->uuid);
|
||||
@ -3785,7 +3784,7 @@ testStoragePoolCreate(virConnectPtr conn,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(pool = virStoragePoolObjAssignDef(conn, &privconn->pools, def)))
|
||||
if (!(pool = virStoragePoolObjAssignDef(&privconn->pools, def)))
|
||||
goto cleanup;
|
||||
def = NULL;
|
||||
|
||||
@ -3816,14 +3815,14 @@ testStoragePoolDefine(virConnectPtr conn,
|
||||
virStoragePoolPtr ret = NULL;
|
||||
|
||||
testDriverLock(privconn);
|
||||
if (!(def = virStoragePoolDefParseString(conn, xml)))
|
||||
if (!(def = virStoragePoolDefParseString(xml)))
|
||||
goto cleanup;
|
||||
|
||||
def->capacity = defaultPoolCap;
|
||||
def->allocation = defaultPoolAlloc;
|
||||
def->available = defaultPoolCap - defaultPoolAlloc;
|
||||
|
||||
if (!(pool = virStoragePoolObjAssignDef(conn, &privconn->pools, def)))
|
||||
if (!(pool = virStoragePoolObjAssignDef(&privconn->pools, def)))
|
||||
goto cleanup;
|
||||
def = NULL;
|
||||
|
||||
@ -4055,7 +4054,7 @@ testStoragePoolDumpXML(virStoragePoolPtr pool,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = virStoragePoolDefFormat(pool->conn, privpool->def);
|
||||
ret = virStoragePoolDefFormat(privpool->def);
|
||||
|
||||
cleanup:
|
||||
if (privpool)
|
||||
@ -4341,7 +4340,7 @@ testStorageVolumeCreateXML(virStoragePoolPtr pool,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
privvol = virStorageVolDefParseString(pool->conn, privpool->def, xmldesc);
|
||||
privvol = virStorageVolDefParseString(privpool->def, xmldesc);
|
||||
if (privvol == NULL)
|
||||
goto cleanup;
|
||||
|
||||
@ -4422,7 +4421,7 @@ testStorageVolumeCreateXMLFrom(virStoragePoolPtr pool,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
privvol = virStorageVolDefParseString(pool->conn, privpool->def, xmldesc);
|
||||
privvol = virStorageVolDefParseString(privpool->def, xmldesc);
|
||||
if (privvol == NULL)
|
||||
goto cleanup;
|
||||
|
||||
@ -4645,7 +4644,7 @@ testStorageVolumeGetXMLDesc(virStorageVolPtr vol,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = virStorageVolDefFormat(vol->conn, privpool->def, privvol);
|
||||
ret = virStorageVolDefFormat(privpool->def, privvol);
|
||||
|
||||
cleanup:
|
||||
if (privpool)
|
||||
|
@ -6578,7 +6578,7 @@ static virStorageVolPtr vboxStorageVolCreateXML(virStoragePoolPtr pool,
|
||||
memset(&poolDef, 0, sizeof(poolDef));
|
||||
poolDef.type = VIR_STORAGE_POOL_DIR;
|
||||
|
||||
if ((def = virStorageVolDefParseString(pool->conn, &poolDef, xml)) == NULL)
|
||||
if ((def = virStorageVolDefParseString(&poolDef, xml)) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if ( !def->name
|
||||
@ -6922,7 +6922,7 @@ static char *vboxStorageVolGetXMLDesc(virStorageVolPtr vol, unsigned int flags A
|
||||
vboxIIDUtf16Free(hddIID);
|
||||
|
||||
if (defOk)
|
||||
ret = virStorageVolDefFormat(vol->conn, &pool, &def);
|
||||
ret = virStorageVolDefFormat(&pool, &def);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -33,10 +33,10 @@ static int testCompareXMLToXMLFiles(const char *inxml, const char *outxml) {
|
||||
if (virtTestLoadFile(outxml, &outXmlPtr, MAX_FILE) < 0)
|
||||
goto fail;
|
||||
|
||||
if (!(dev = virStoragePoolDefParseString(NULL, inXmlData)))
|
||||
if (!(dev = virStoragePoolDefParseString(inXmlData)))
|
||||
goto fail;
|
||||
|
||||
if (!(actual = virStoragePoolDefFormat(NULL, dev)))
|
||||
if (!(actual = virStoragePoolDefFormat(dev)))
|
||||
goto fail;
|
||||
|
||||
if (STRNEQ(outXmlData, actual)) {
|
||||
|
@ -40,13 +40,13 @@ static int testCompareXMLToXMLFiles(const char *poolxml,
|
||||
if (virtTestLoadFile(outxml, &outXmlPtr, MAX_FILE) < 0)
|
||||
goto fail;
|
||||
|
||||
if (!(pool = virStoragePoolDefParseString(NULL, poolXmlData)))
|
||||
if (!(pool = virStoragePoolDefParseString(poolXmlData)))
|
||||
goto fail;
|
||||
|
||||
if (!(dev = virStorageVolDefParseString(NULL, pool, inXmlData)))
|
||||
if (!(dev = virStorageVolDefParseString(pool, inXmlData)))
|
||||
goto fail;
|
||||
|
||||
if (!(actual = virStorageVolDefFormat(NULL, pool, dev)))
|
||||
if (!(actual = virStorageVolDefFormat(pool, dev)))
|
||||
goto fail;
|
||||
|
||||
if (STRNEQ(outXmlData, actual)) {
|
||||
|
Loading…
Reference in New Issue
Block a user