[pbs-devel] [PATCH proxmox-backup v2 14/15] tape/changer: refactor marking of import/export slots from config
Dominik Csapak
d.csapak at proxmox.com
Thu Jan 28 12:59:54 CET 2021
we did this for 'mtx', but missed it for the sg_pt_changer code
refactor it into the MtxStatus strut, and call it from both
code paths
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
src/tape/changer/mod.rs | 32 ++++++++++++++++++++--
src/tape/changer/mtx/mtx_wrapper.rs | 41 ++++-------------------------
src/tape/changer/sg_pt_changer.rs | 16 +++++++++++
3 files changed, 51 insertions(+), 38 deletions(-)
diff --git a/src/tape/changer/mod.rs b/src/tape/changer/mod.rs
index 0d378587..f9f9da98 100644
--- a/src/tape/changer/mod.rs
+++ b/src/tape/changer/mod.rs
@@ -10,10 +10,16 @@ pub mod mtx;
mod online_status_map;
pub use online_status_map::*;
+use std::collections::HashSet;
+
use anyhow::{bail, Error};
use serde::{Serialize, Deserialize};
+use serde_json::Value;
+
+use proxmox::api::schema::parse_property_string;
use crate::api2::types::{
+ SLOT_ARRAY_SCHEMA,
ScsiTapeChanger,
LinuxTapeDrive,
};
@@ -124,6 +130,29 @@ impl MtxStatus {
}
free_slot
}
+
+ pub fn mark_import_export_slots(&mut self, config: &ScsiTapeChanger) -> Result<(), Error>{
+ let mut export_slots: HashSet<u64> = HashSet::new();
+
+ if let Some(slots) = &config.export_slots {
+ let slots: Value = parse_property_string(&slots, &SLOT_ARRAY_SCHEMA)?;
+ export_slots = slots
+ .as_array()
+ .unwrap()
+ .iter()
+ .filter_map(|v| v.as_u64())
+ .collect();
+ }
+
+ for (i, entry) in self.slots.iter_mut().enumerate() {
+ let slot = i as u64 + 1;
+ if export_slots.contains(&slot) {
+ entry.import_export = true; // mark as IMPORT/EXPORT
+ }
+ }
+
+ Ok(())
+ }
}
/// Interface to SCSI changer devices
@@ -373,8 +402,7 @@ impl ScsiMediaChange for ScsiTapeChanger {
if USE_MTX {
mtx::mtx_status(&self)
} else {
- let mut file = sg_pt_changer::open(&self.path)?;
- sg_pt_changer::read_element_status(&mut file)
+ sg_pt_changer::status(&self)
}
}
diff --git a/src/tape/changer/mtx/mtx_wrapper.rs b/src/tape/changer/mtx/mtx_wrapper.rs
index 116382f1..44d03251 100644
--- a/src/tape/changer/mtx/mtx_wrapper.rs
+++ b/src/tape/changer/mtx/mtx_wrapper.rs
@@ -1,45 +1,19 @@
-use std::collections::HashSet;
-
use anyhow::Error;
use serde_json::Value;
-use proxmox::{
- api::schema::parse_property_string,
-};
-
use crate::{
tools::run_command,
- api2::types::{
- SLOT_ARRAY_SCHEMA,
- ScsiTapeChanger,
- },
- tape::{
- changer::{
- MtxStatus,
- mtx::{
- parse_mtx_status,
- },
- },
+ api2::types::ScsiTapeChanger,
+ tape::changer::{
+ MtxStatus,
+ mtx::parse_mtx_status,
},
};
/// Run 'mtx status' and return parsed result.
pub fn mtx_status(config: &ScsiTapeChanger) -> Result<MtxStatus, Error> {
-
let path = &config.path;
- let mut export_slots: HashSet<u64> = HashSet::new();
-
- if let Some(slots) = &config.export_slots {
- let slots: Value = parse_property_string(&slots, &SLOT_ARRAY_SCHEMA)?;
- export_slots = slots
- .as_array()
- .unwrap()
- .iter()
- .filter_map(|v| v.as_u64())
- .collect();
- }
-
let mut command = std::process::Command::new("mtx");
command.args(&["-f", path, "status"]);
@@ -47,12 +21,7 @@ pub fn mtx_status(config: &ScsiTapeChanger) -> Result<MtxStatus, Error> {
let mut status = parse_mtx_status(&output)?;
- for (i, entry) in status.slots.iter_mut().enumerate() {
- let slot = i as u64 + 1;
- if export_slots.contains(&slot) {
- entry.import_export = true; // mark as IMPORT/EXPORT
- }
- }
+ status.mark_import_export_slots(&config)?;
Ok(status)
}
diff --git a/src/tape/changer/sg_pt_changer.rs b/src/tape/changer/sg_pt_changer.rs
index b6c64381..b2be9548 100644
--- a/src/tape/changer/sg_pt_changer.rs
+++ b/src/tape/changer/sg_pt_changer.rs
@@ -31,6 +31,7 @@ use crate::{
scsi_ascii_to_string,
scsi_inquiry,
},
+ api2::types::ScsiTapeChanger,
};
const SCSI_CHANGER_DEFAULT_TIMEOUT: usize = 60*5; // 5 minutes
@@ -397,6 +398,21 @@ pub fn read_element_status<F: AsRawFd>(file: &mut F) -> Result<MtxStatus, Error>
Ok(status)
}
+/// Read status and map import-export slots from config
+pub fn status(config: &ScsiTapeChanger) -> Result<MtxStatus, Error> {
+ let path = &config.path;
+
+ let mut file = open(path)
+ .map_err(|err| format_err!("error opening '{}': {}", path, err))?;
+ let mut status = read_element_status(&mut file)
+ .map_err(|err| format_err!("error reading element status: {}", err))?;
+
+ status.mark_import_export_slots(&config)?;
+
+ Ok(status)
+}
+
+
#[repr(C, packed)]
#[derive(Endian)]
struct ElementStatusHeader {
--
2.20.1
More information about the pbs-devel
mailing list