}
-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)
if (virDomainNumaDefValidate(def->numa) < 0)
return -1;
- if (virDomainDefFSValidate(def) < 0)
- return -1;
-
if (virDomainDefValidateIOThreads(def) < 0)
return -1;
}
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)
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;
}
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);