mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-26 18:41:17 +00:00
Give iSCSI and disk storage backend drivers the
ability to resolve any kind of volume path to the pool target volume path. For instance, if the pool was defined with a <target><path>/dev/disk/by-id</path></target> section, and one of the volumes is /dev/disk/by-id/scsi-S_beaf11, then you would be able to call virStorageVolLookupByPath("/dev/sdc"), and get the correct volume back. Signed-off-by: Chris Lalancette <clalance@redhat.com>
This commit is contained in:
parent
7d3041aff3
commit
17a9e03cd1
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
Mon Nov 03 12:37:00 CET 2008 Chris Lalancette <clalance@redhat.com>
|
||||||
|
* src/storage_backend.c src/storage_backend.h
|
||||||
|
src/storage_backend_disk.c src/storage_backend_iscsi.c
|
||||||
|
src/storage_driver.c: Give iSCSI and disk storage backend drivers the
|
||||||
|
ability to resolve any kind of volume path to the pool target volume
|
||||||
|
path. For instance, if the pool was defined with a
|
||||||
|
<target><path>/dev/disk/by-id</path></target> section, and one of the
|
||||||
|
volumes is /dev/disk/by-id/scsi-S_beaf11, then you would be able to
|
||||||
|
call virStorageVolLookupByPath("/dev/sdc"), and get the correct volume
|
||||||
|
back.
|
||||||
|
|
||||||
Fri Oct 31 14:55:46 CET 2008 Daniel Veillard <veillard@redhat.com>
|
Fri Oct 31 14:55:46 CET 2008 Daniel Veillard <veillard@redhat.com>
|
||||||
|
|
||||||
* python/virConnect.py: needed for events from the python bindings
|
* python/virConnect.py: needed for events from the python bindings
|
||||||
|
@ -357,16 +357,17 @@ virStorageBackendUpdateVolInfoFD(virConnectPtr conn,
|
|||||||
char *
|
char *
|
||||||
virStorageBackendStablePath(virConnectPtr conn,
|
virStorageBackendStablePath(virConnectPtr conn,
|
||||||
virStoragePoolObjPtr pool,
|
virStoragePoolObjPtr pool,
|
||||||
char *devpath)
|
const char *devpath)
|
||||||
{
|
{
|
||||||
DIR *dh;
|
DIR *dh;
|
||||||
struct dirent *dent;
|
struct dirent *dent;
|
||||||
|
char *stablepath;
|
||||||
|
|
||||||
/* Short circuit if pool has no target, or if its /dev */
|
/* Short circuit if pool has no target, or if its /dev */
|
||||||
if (pool->def->target.path == NULL ||
|
if (pool->def->target.path == NULL ||
|
||||||
STREQ(pool->def->target.path, "/dev") ||
|
STREQ(pool->def->target.path, "/dev") ||
|
||||||
STREQ(pool->def->target.path, "/dev/"))
|
STREQ(pool->def->target.path, "/dev/"))
|
||||||
return devpath;
|
goto ret_strdup;
|
||||||
|
|
||||||
/* The pool is pointing somewhere like /dev/disk/by-path
|
/* The pool is pointing somewhere like /dev/disk/by-path
|
||||||
* or /dev/disk/by-id, so we need to check all symlinks in
|
* or /dev/disk/by-id, so we need to check all symlinks in
|
||||||
@ -382,7 +383,6 @@ virStorageBackendStablePath(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
while ((dent = readdir(dh)) != NULL) {
|
while ((dent = readdir(dh)) != NULL) {
|
||||||
char *stablepath;
|
|
||||||
if (dent->d_name[0] == '.')
|
if (dent->d_name[0] == '.')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -407,10 +407,17 @@ virStorageBackendStablePath(virConnectPtr conn,
|
|||||||
|
|
||||||
closedir(dh);
|
closedir(dh);
|
||||||
|
|
||||||
|
ret_strdup:
|
||||||
/* Couldn't find any matching stable link so give back
|
/* Couldn't find any matching stable link so give back
|
||||||
* the original non-stable dev path
|
* the original non-stable dev path
|
||||||
*/
|
*/
|
||||||
return devpath;
|
|
||||||
|
stablepath = strdup(devpath);
|
||||||
|
|
||||||
|
if (stablepath == NULL)
|
||||||
|
virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("dup path"));
|
||||||
|
|
||||||
|
return stablepath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -50,6 +50,7 @@ enum {
|
|||||||
VIR_STORAGE_BACKEND_POOL_SOURCE_DIR = (1<<2),
|
VIR_STORAGE_BACKEND_POOL_SOURCE_DIR = (1<<2),
|
||||||
VIR_STORAGE_BACKEND_POOL_SOURCE_ADAPTER = (1<<3),
|
VIR_STORAGE_BACKEND_POOL_SOURCE_ADAPTER = (1<<3),
|
||||||
VIR_STORAGE_BACKEND_POOL_SOURCE_NAME = (1<<4),
|
VIR_STORAGE_BACKEND_POOL_SOURCE_NAME = (1<<4),
|
||||||
|
VIR_STORAGE_BACKEND_POOL_STABLE_PATH = (1<<5),
|
||||||
};
|
};
|
||||||
|
|
||||||
enum partTableType {
|
enum partTableType {
|
||||||
@ -138,7 +139,7 @@ int virStorageBackendUpdateVolInfoFD(virConnectPtr conn,
|
|||||||
|
|
||||||
char *virStorageBackendStablePath(virConnectPtr conn,
|
char *virStorageBackendStablePath(virConnectPtr conn,
|
||||||
virStoragePoolObjPtr pool,
|
virStoragePoolObjPtr pool,
|
||||||
char *devpath);
|
const char *devpath);
|
||||||
|
|
||||||
typedef int (*virStorageBackendListVolRegexFunc)(virConnectPtr conn,
|
typedef int (*virStorageBackendListVolRegexFunc)(virConnectPtr conn,
|
||||||
virStoragePoolObjPtr pool,
|
virStoragePoolObjPtr pool,
|
||||||
|
@ -109,8 +109,7 @@ virStorageBackendDiskMakeDataVol(virConnectPtr conn,
|
|||||||
devpath)) == NULL)
|
devpath)) == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (devpath != vol->target.path)
|
VIR_FREE(devpath);
|
||||||
VIR_FREE(devpath);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vol->key == NULL) {
|
if (vol->key == NULL) {
|
||||||
@ -447,7 +446,8 @@ virStorageBackend virStorageBackendDisk = {
|
|||||||
.deleteVol = virStorageBackendDiskDeleteVol,
|
.deleteVol = virStorageBackendDiskDeleteVol,
|
||||||
|
|
||||||
.poolOptions = {
|
.poolOptions = {
|
||||||
.flags = (VIR_STORAGE_BACKEND_POOL_SOURCE_DEVICE),
|
.flags = (VIR_STORAGE_BACKEND_POOL_SOURCE_DEVICE|
|
||||||
|
VIR_STORAGE_BACKEND_POOL_STABLE_PATH),
|
||||||
.defaultFormat = VIR_STORAGE_POOL_DISK_UNKNOWN,
|
.defaultFormat = VIR_STORAGE_POOL_DISK_UNKNOWN,
|
||||||
.formatFromString = virStorageBackendPartTableTypeFromString,
|
.formatFromString = virStorageBackendPartTableTypeFromString,
|
||||||
.formatToString = virStorageBackendPartTableTypeToString,
|
.formatToString = virStorageBackendPartTableTypeToString,
|
||||||
|
@ -219,8 +219,7 @@ virStorageBackendISCSINewLun(virConnectPtr conn, virStoragePoolObjPtr pool,
|
|||||||
devpath)) == NULL)
|
devpath)) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (devpath != vol->target.path)
|
VIR_FREE(devpath);
|
||||||
VIR_FREE(devpath);
|
|
||||||
|
|
||||||
if (virStorageBackendUpdateVolInfoFD(conn, vol, fd, 1) < 0)
|
if (virStorageBackendUpdateVolInfoFD(conn, vol, fd, 1) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -645,7 +644,8 @@ virStorageBackend virStorageBackendISCSI = {
|
|||||||
|
|
||||||
.poolOptions = {
|
.poolOptions = {
|
||||||
.flags = (VIR_STORAGE_BACKEND_POOL_SOURCE_HOST |
|
.flags = (VIR_STORAGE_BACKEND_POOL_SOURCE_HOST |
|
||||||
VIR_STORAGE_BACKEND_POOL_SOURCE_DEVICE)
|
VIR_STORAGE_BACKEND_POOL_SOURCE_DEVICE |
|
||||||
|
VIR_STORAGE_BACKEND_POOL_STABLE_PATH)
|
||||||
},
|
},
|
||||||
|
|
||||||
.volType = VIR_STORAGE_VOL_BLOCK,
|
.volType = VIR_STORAGE_VOL_BLOCK,
|
||||||
|
@ -966,8 +966,34 @@ storageVolumeLookupByPath(virConnectPtr conn,
|
|||||||
|
|
||||||
for (i = 0 ; i < driver->pools.count ; i++) {
|
for (i = 0 ; i < driver->pools.count ; i++) {
|
||||||
if (virStoragePoolObjIsActive(driver->pools.objs[i])) {
|
if (virStoragePoolObjIsActive(driver->pools.objs[i])) {
|
||||||
virStorageVolDefPtr vol =
|
virStorageVolDefPtr vol;
|
||||||
virStorageVolDefFindByPath(driver->pools.objs[i], path);
|
virStorageBackendPoolOptionsPtr options;
|
||||||
|
|
||||||
|
options = virStorageBackendPoolOptionsForType(driver->pools.objs[i]->def->type);
|
||||||
|
if (options == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (options->flags & VIR_STORAGE_BACKEND_POOL_STABLE_PATH) {
|
||||||
|
const char *stable_path;
|
||||||
|
|
||||||
|
stable_path = virStorageBackendStablePath(conn,
|
||||||
|
driver->pools.objs[i],
|
||||||
|
path);
|
||||||
|
/*
|
||||||
|
* virStorageBackendStablePath already does
|
||||||
|
* virStorageReportError if it fails; we just need to keep
|
||||||
|
* propagating the return code
|
||||||
|
*/
|
||||||
|
if (stable_path == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
vol = virStorageVolDefFindByPath(driver->pools.objs[i],
|
||||||
|
stable_path);
|
||||||
|
VIR_FREE(stable_path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
vol = virStorageVolDefFindByPath(driver->pools.objs[i], path);
|
||||||
|
|
||||||
|
|
||||||
if (vol)
|
if (vol)
|
||||||
return virGetStorageVol(conn,
|
return virGetStorageVol(conn,
|
||||||
|
Loading…
Reference in New Issue
Block a user