mirror of
git://git.proxmox.com/git/proxmox-backup.git
synced 2025-01-31 01:48:09 +03:00
datastore: extract nesting check into helper
and improve the variable namign while we are at it. this allows the check to be re-used in other code paths, like when starting a garbage collection. Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
parent
93bdba1ac6
commit
4d5e14c07e
@ -441,6 +441,45 @@ impl DataStoreConfig {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn ensure_not_nested(&self, stores: &[DataStoreConfig]) -> Result<(), Error> {
|
||||||
|
let our_absolute_path = PathBuf::from(self.absolute_path());
|
||||||
|
let removable = self.backing_device.is_some();
|
||||||
|
for other_store in stores {
|
||||||
|
if self == other_store {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Relative paths must not be nested on the backing device of removable datastores
|
||||||
|
if removable && other_store.backing_device == self.backing_device {
|
||||||
|
let our_relative_path = Path::new(&self.path);
|
||||||
|
let other_relative_path = Path::new(&other_store.path);
|
||||||
|
if our_relative_path.starts_with(other_relative_path)
|
||||||
|
|| other_relative_path.starts_with(our_relative_path)
|
||||||
|
{
|
||||||
|
bail!(
|
||||||
|
"paths on backing device must not be nested - {path:?} already used by '{store}'!",
|
||||||
|
path = other_relative_path,
|
||||||
|
store = other_store.name,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No two datastores should have a nested absolute path
|
||||||
|
let other_absolute_path = PathBuf::from(other_store.absolute_path());
|
||||||
|
if other_absolute_path.starts_with(&our_absolute_path)
|
||||||
|
|| our_absolute_path.starts_with(&other_absolute_path)
|
||||||
|
{
|
||||||
|
bail!(
|
||||||
|
"nested datastores not allowed: '{}' already in {:?}",
|
||||||
|
other_store.name,
|
||||||
|
other_absolute_path,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[api(
|
#[api(
|
||||||
|
@ -82,32 +82,9 @@ pub(crate) fn do_create_datastore(
|
|||||||
bail!("cannot create datastore in root path");
|
bail!("cannot create datastore in root path");
|
||||||
}
|
}
|
||||||
|
|
||||||
let new_store_path = PathBuf::from(&datastore.absolute_path());
|
let existing_stores = config.convert_to_typed_array("datastore")?;
|
||||||
let removable = datastore.backing_device.is_some();
|
if let Err(err) = datastore.ensure_not_nested(&existing_stores) {
|
||||||
for store in config.convert_to_typed_array::<DataStoreConfig>("datastore")? {
|
param_bail!("path", err);
|
||||||
// Relative paths must not be nested on the backing device of removable datastores
|
|
||||||
if removable && store.backing_device == datastore.backing_device {
|
|
||||||
let new_path = Path::new(&datastore.path);
|
|
||||||
let path = Path::new(&store.path);
|
|
||||||
if new_path.starts_with(path) || path.starts_with(new_path) {
|
|
||||||
param_bail!(
|
|
||||||
"path",
|
|
||||||
"paths on backing device must not be nested - {path:?} already used by '{store}'!",
|
|
||||||
store = store.name
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// No two datastores should have a nested absolute path
|
|
||||||
let store_path = PathBuf::from(store.absolute_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();
|
let need_unmount = datastore.backing_device.is_some();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user