[pbs-devel] [PATCH proxmox-backup v15 07/26] api: add check for nested datastores on creation
Hannes Laimer
h.laimer at proxmox.com
Mon Nov 25 17:21:54 CET 2024
Signed-off-by: Hannes Laimer <h.laimer at proxmox.com>
---
src/api2/config/datastore.rs | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/src/api2/config/datastore.rs b/src/api2/config/datastore.rs
index d4cee458d..d6cfdbb0c 100644
--- a/src/api2/config/datastore.rs
+++ b/src/api2/config/datastore.rs
@@ -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())?;
--
2.39.5
More information about the pbs-devel
mailing list