api: add check for nested datastores on creation

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
This commit is contained in:
Hannes Laimer 2024-11-25 17:21:54 +01:00 committed by Thomas Lamprecht
parent 91c67298f4
commit 40a2b110bf

View File

@ -1,4 +1,4 @@
use std::path::PathBuf;
use std::path::{Path, PathBuf};
use ::serde::{Deserialize, Serialize};
use anyhow::{bail, format_err, Error};
@ -81,6 +81,25 @@ pub(crate) fn do_create_datastore(
bail!("cannot create datastore in root path");
}
let new_store_path = Path::new(&datastore.path);
for store in config.convert_to_typed_array::<DataStoreConfig>("datastore")? {
if store.backing_device != datastore.backing_device {
continue;
}
// Since we check for that on creation, we assume all removable datastore
// paths are relative, so don't have a leading `/`.
let store_path = Path::new(&store.path);
if store_path.starts_with(&new_store_path) || new_store_path.starts_with(&store_path) {
param_bail!(
"path",
"nested datastores not allowed: '{}' already in '{}'",
store.name,
store.path
);
}
}
let need_unmount = datastore.backing_device.is_some();
if need_unmount {
do_mount_device(datastore.clone())?;