提交 17a9e03c 编写于 作者: C Chris Lalancette

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: NChris Lalancette <clalance@redhat.com>
上级 7d3041af
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, ...@@ -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, ...@@ -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, ...@@ -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 { ...@@ -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, ...@@ -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, ...@@ -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 = { ...@@ -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, ...@@ -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 = { ...@@ -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, ...@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册