Skip to main content

btrfs_cli/replace/
cancel.rs

1use crate::{RunContext, Runnable, util::open_path};
2use anyhow::{Context, Result};
3use btrfs_uapi::replace::replace_cancel;
4use clap::Parser;
5use std::{os::unix::io::AsFd, path::PathBuf};
6
7/// Cancel a running device replace operation.
8///
9/// If a replace operation is in progress on the filesystem mounted at
10/// mount_point, it is cancelled. The target device is left in an undefined
11/// state and should not be used further without reformatting.
12#[derive(Parser, Debug)]
13#[allow(clippy::doc_markdown)]
14pub struct ReplaceCancelCommand {
15    /// Path to the mounted btrfs filesystem
16    pub mount_point: PathBuf,
17}
18
19impl Runnable for ReplaceCancelCommand {
20    fn run(&self, _ctx: &RunContext) -> Result<()> {
21        let file = open_path(&self.mount_point)?;
22
23        let was_running = replace_cancel(file.as_fd()).with_context(|| {
24            format!(
25                "failed to cancel replace on '{}'",
26                self.mount_point.display()
27            )
28        })?;
29
30        if was_running {
31            println!("replace cancelled on '{}'", self.mount_point.display());
32        } else {
33            println!("no replace operation was in progress");
34        }
35
36        Ok(())
37    }
38}