提交 4143b194 编写于 作者: J John Ferlan

conf: Check for storage conflicts across pool types

https://bugzilla.redhat.com/show_bug.cgi?id=1233129

The virStoragePoolObjSourceFindDuplicate logic used by PoolCreateXML
and PoolDefineXML avoids comparing the new definition against "other"
pool types. This can cause unexpected corruption if two different pool
source types used the same source device path. For example, a 'disk'
pool using source type device=/dev/sdc could be unwittingly overwritten
by using /dev/sdc for a 'logical' pool which also uses the source
device path.

So rather than blindly ignoring those checks when def->type !=
pool->def->type - have the pool->def->type switch logic handle the
check for which def->type's should be checked.
上级 f84b89fb
...@@ -950,6 +950,9 @@ virStoragePoolObjSourceMatchTypeDEVICE(virStoragePoolObjPtr pool, ...@@ -950,6 +950,9 @@ virStoragePoolObjSourceMatchTypeDEVICE(virStoragePoolObjPtr pool,
virStoragePoolObjPtr matchpool = NULL; virStoragePoolObjPtr matchpool = NULL;
if (pool->def->type == VIR_STORAGE_POOL_ISCSI) { if (pool->def->type == VIR_STORAGE_POOL_ISCSI) {
if (def->type != VIR_STORAGE_POOL_ISCSI)
return NULL;
if ((matchpool = virStoragePoolSourceFindDuplicateDevices(pool, def))) { if ((matchpool = virStoragePoolSourceFindDuplicateDevices(pool, def))) {
if (!virStoragePoolSourceISCSIMatch(matchpool, def)) if (!virStoragePoolSourceISCSIMatch(matchpool, def))
return NULL; return NULL;
...@@ -957,6 +960,9 @@ virStoragePoolObjSourceMatchTypeDEVICE(virStoragePoolObjPtr pool, ...@@ -957,6 +960,9 @@ virStoragePoolObjSourceMatchTypeDEVICE(virStoragePoolObjPtr pool,
return matchpool; return matchpool;
} }
if (def->type == VIR_STORAGE_POOL_ISCSI)
return NULL;
/* VIR_STORAGE_POOL_FS /* VIR_STORAGE_POOL_FS
* VIR_STORAGE_POOL_LOGICAL * VIR_STORAGE_POOL_LOGICAL
* VIR_STORAGE_POOL_DISK * VIR_STORAGE_POOL_DISK
...@@ -978,8 +984,6 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn, ...@@ -978,8 +984,6 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn,
/* Check the pool list for duplicate underlying storage */ /* Check the pool list for duplicate underlying storage */
for (i = 0; i < pools->count; i++) { for (i = 0; i < pools->count; i++) {
pool = pools->objs[i]; pool = pools->objs[i];
if (def->type != pool->def->type)
continue;
/* Don't match against ourself if re-defining existing pool ! */ /* Don't match against ourself if re-defining existing pool ! */
if (STREQ(pool->def->name, def->name)) if (STREQ(pool->def->name, def->name))
...@@ -991,11 +995,14 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn, ...@@ -991,11 +995,14 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn,
case VIR_STORAGE_POOL_DIR: case VIR_STORAGE_POOL_DIR:
case VIR_STORAGE_POOL_GLUSTER: case VIR_STORAGE_POOL_GLUSTER:
case VIR_STORAGE_POOL_NETFS: case VIR_STORAGE_POOL_NETFS:
matchpool = virStoragePoolObjSourceMatchTypeDIR(pool, def); if (def->type == pool->def->type)
matchpool = virStoragePoolObjSourceMatchTypeDIR(pool, def);
break; break;
case VIR_STORAGE_POOL_SCSI: case VIR_STORAGE_POOL_SCSI:
matchpool = virStoragePoolObjSourceMatchTypeISCSI(pool, def, conn); if (def->type == pool->def->type)
matchpool = virStoragePoolObjSourceMatchTypeISCSI(pool, def,
conn);
break; break;
case VIR_STORAGE_POOL_ISCSI: case VIR_STORAGE_POOL_ISCSI:
...@@ -1003,22 +1010,33 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn, ...@@ -1003,22 +1010,33 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn,
case VIR_STORAGE_POOL_LOGICAL: case VIR_STORAGE_POOL_LOGICAL:
case VIR_STORAGE_POOL_DISK: case VIR_STORAGE_POOL_DISK:
case VIR_STORAGE_POOL_ZFS: case VIR_STORAGE_POOL_ZFS:
matchpool = virStoragePoolObjSourceMatchTypeDEVICE(pool, def); if (def->type == VIR_STORAGE_POOL_ISCSI ||
def->type == VIR_STORAGE_POOL_FS ||
def->type == VIR_STORAGE_POOL_LOGICAL ||
def->type == VIR_STORAGE_POOL_DISK ||
def->type == VIR_STORAGE_POOL_ZFS)
matchpool = virStoragePoolObjSourceMatchTypeDEVICE(pool, def);
break; break;
case VIR_STORAGE_POOL_SHEEPDOG: case VIR_STORAGE_POOL_SHEEPDOG:
if (virStoragePoolSourceMatchSingleHost(&pool->def->source, if (def->type == pool->def->type &&
virStoragePoolSourceMatchSingleHost(&pool->def->source,
&def->source)) &def->source))
matchpool = pool; matchpool = pool;
break; break;
case VIR_STORAGE_POOL_MPATH: case VIR_STORAGE_POOL_MPATH:
/* Only one mpath pool is valid per host */ /* Only one mpath pool is valid per host */
matchpool = pool; if (def->type == pool->def->type)
matchpool = pool;
break; break;
case VIR_STORAGE_POOL_VSTORAGE: case VIR_STORAGE_POOL_VSTORAGE:
if (STREQ(pool->def->source.name, def->source.name)) if (def->type == pool->def->type &&
STREQ(pool->def->source.name, def->source.name))
matchpool = pool; matchpool = pool;
break; break;
case VIR_STORAGE_POOL_RBD: case VIR_STORAGE_POOL_RBD:
case VIR_STORAGE_POOL_LAST: case VIR_STORAGE_POOL_LAST:
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册