conf: virtiofs: validate that the target dir is unique even for hotplug

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

Signed-off-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Ján Tomko 2023-06-07 17:40:23 +02:00
parent 063e8b9d62
commit a7ee9eac83

View File

@ -1735,33 +1735,6 @@ virDomainDefIOMMUValidate(const virDomainDef *def)
}
static int
virDomainDefFSValidate(const virDomainDef *def)
{
size_t i;
g_autoptr(GHashTable) dsts = virHashNew(NULL);
for (i = 0; i < def->nfss; i++) {
const virDomainFSDef *fs = def->fss[i];
if (fs->fsdriver != VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS)
continue;
if (virHashHasEntry(dsts, fs->dst)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("filesystem target '%1$s' specified twice"),
fs->dst);
return -1;
}
if (virHashAddEntry(dsts, fs->dst, (void *) 0x1) < 0)
return -1;
}
return 0;
}
static int
virDomainDefValidateIOThreadsThreadPool(int thread_pool_min,
int thread_pool_max)
@ -1856,9 +1829,6 @@ virDomainDefValidateInternal(const virDomainDef *def,
if (virDomainNumaDefValidate(def->numa) < 0)
return -1;
if (virDomainDefFSValidate(def) < 0)
return -1;
if (virDomainDefValidateIOThreads(def) < 0)
return -1;
@ -2573,8 +2543,13 @@ virDomainShmemDefValidate(const virDomainShmemDef *shmem)
}
static int
virDomainFSDefValidate(const virDomainFSDef *fs)
virDomainFSDefValidate(const virDomainDef *def,
const virDomainFSDef *fs)
{
g_autoptr(GHashTable) dsts = virHashNew(NULL);
const virDomainFSDef *lookup;
size_t i;
if (fs->dst == NULL) {
const char *source = fs->src->path;
if (!source)
@ -2592,6 +2567,31 @@ virDomainFSDefValidate(const virDomainFSDef *fs)
return -1;
}
for (i = 0; i < def->nfss; i++) {
const virDomainFSDef *iter = def->fss[i];
if (iter->fsdriver != VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS)
continue;
if (virHashHasEntry(dsts, iter->dst)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("filesystem target '%1$s' specified twice"),
iter->dst);
return -1;
}
if (virHashAddEntry(dsts, iter->dst, (void *) iter) < 0)
return -1;
}
lookup = g_hash_table_lookup(dsts, fs->dst);
if (lookup && lookup != fs) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("filesystem target '%1$s' specified twice"),
fs->dst);
return -1;
}
return 0;
}
@ -2885,7 +2885,7 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
return virDomainShmemDefValidate(dev->data.shmem);
case VIR_DOMAIN_DEVICE_FS:
return virDomainFSDefValidate(dev->data.fs);
return virDomainFSDefValidate(def, dev->data.fs);
case VIR_DOMAIN_DEVICE_AUDIO:
return virDomainAudioDefValidate(def, dev->data.audio);