[pbs-devel] [PATCH proxmox-backup 2/3] api: datastore: unmount datastore after sync if configured

Hannes Laimer h.laimer at proxmox.com
Tue Oct 14 13:53:56 CEST 2025


When a sync job is triggered by the mounting of a datastore, we now check
whether it should also be unmounted automatically afterwards. This is only
done for jobs triggered by mounting.

We do not do this for manually started or scheduled sync jobs, as those
run in the proxy process and therefore cannot call the privileged API
endpoint for unmounting.

The task that starts sync jobs on mount runs in the API process (where the
mounting occurs), so in that privileged context, we can also perform the
unmounting.

Signed-off-by: Hannes Laimer <h.laimer at proxmox.com>
---
 src/api2/admin/datastore.rs | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
index 643d1694..7e3cec22 100644
--- a/src/api2/admin/datastore.rs
+++ b/src/api2/admin/datastore.rs
@@ -2430,6 +2430,7 @@ pub fn do_mount_device(datastore: DataStoreConfig) -> Result<bool, Error> {
 
 async fn do_sync_jobs(
     jobs_to_run: Vec<SyncJobConfig>,
+    store: String,
     worker: Arc<WorkerTask>,
 ) -> Result<(), Error> {
     let count = jobs_to_run.len();
@@ -2442,6 +2443,8 @@ async fn do_sync_jobs(
             .join(", ")
     );
 
+    let mut unmount_on_done = false;
+
     let client = crate::client_helpers::connect_to_localhost()
         .context("Failed to connect to localhost for starting sync jobs")?;
     for (i, job_config) in jobs_to_run.into_iter().enumerate() {
@@ -2484,7 +2487,21 @@ async fn do_sync_jobs(
                 }
             }
         }
+        unmount_on_done = unmount_on_done || job_config.unmount_on_done.unwrap_or_default();
+    }
+    if unmount_on_done {
+        match client
+            .post(
+                format!("api2/json/admin/datastore/{store}/unmount").as_str(),
+                None,
+            )
+            .await
+        {
+            Ok(_) => info!("triggered unmounting successfully"),
+            Err(err) => warn!("could not unmount: {err}"),
+        };
     }
+
     Ok(())
 }
 
@@ -2566,10 +2583,10 @@ pub fn mount(store: String, rpcenv: &mut dyn RpcEnvironment) -> Result<Value, Er
                 info!("starting {} sync jobs", jobs_to_run.len());
                 let _ = WorkerTask::spawn(
                     "mount-sync-jobs",
-                    Some(store),
+                    Some(store.clone()),
                     auth_id.to_string(),
                     false,
-                    move |worker| async move { do_sync_jobs(jobs_to_run, worker).await },
+                    move |worker| async move { do_sync_jobs(jobs_to_run, store, worker).await },
                 );
             }
             Ok(())
-- 
2.47.3





More information about the pbs-devel mailing list