]> git.proxmox.com Git - proxmox-backup.git/commitdiff
tape: hide internal use of all zero uuid for unassigned tapes
authorDominik Csapak <d.csapak@proxmox.com>
Tue, 29 Nov 2022 14:17:00 +0000 (15:17 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 30 Nov 2022 16:28:27 +0000 (17:28 +0100)
a tape assigned to a pool but no media-set, gets the special 'all zero'
media set in it's MediaSetLabel. Instead of having that constant
scattered all over the code, hide this fact by using wrapper functions
to initialize it that way and to check for it

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
src/api2/tape/drive.rs
src/api2/tape/media.rs
src/tape/file_formats/mod.rs
src/tape/inventory.rs
src/tape/media_pool.rs

index 107bcfd842a1946d4e09d397b72dd44ecdb5348f..2175a46075e1badc0a8372d3e4846199bdb4922d 100644 (file)
@@ -528,7 +528,7 @@ fn write_media_label(
             label.label_text,
             pool
         );
-        let set = MediaSetLabel::with_data(pool, [0u8; 16].into(), 0, label.ctime, None);
+        let set = MediaSetLabel::new_unassigned(pool, label.ctime);
 
         drive.write_media_set_label(&set, None)?;
 
@@ -575,7 +575,7 @@ fn write_media_label(
             if let Some(ref pool) = pool {
                 match info.media_set_label {
                     Some(set) => {
-                        if set.uuid != [0u8; 16].into() {
+                        if !set.unassigned() {
                             bail!("verify media set label failed - got wrong set uuid");
                         }
                         if &set.pool != pool {
@@ -1301,7 +1301,7 @@ pub fn catalog_media(
                     return Ok(());
                 }
                 Some(ref set) => {
-                    if set.uuid.as_ref() == [0u8; 16] {
+                    if set.unassigned() {
                         // media is empty
                         task_log!(worker, "media is empty");
                         let _lock = lock_unassigned_media_pool(TAPE_STATUS_DIR)?;
index ed0105b037261e16459c7742b1cfdfcd73b1f22a..cdeffd5bbf20efab7e5197ca369f041a013afb01 100644 (file)
@@ -336,8 +336,7 @@ pub fn destroy_media(label_text: String, force: Option<bool>) -> Result<(), Erro
 
     if !force {
         if let Some(ref set) = media_id.media_set_label {
-            let is_empty = set.uuid.as_ref() == [0u8; 16];
-            if !is_empty {
+            if !set.unassigned() {
                 bail!(
                     "media '{}' contains data (please use 'force' flag to remove.",
                     label_text
index 2b7c98662964c41297e10081a8c0883dd1816a17..f80e2d90aabc28024033a43c167b92f1a196953d 100644 (file)
@@ -168,4 +168,12 @@ impl MediaSetLabel {
             encryption_key_fingerprint,
         }
     }
+
+    pub fn new_unassigned(pool: &str, ctime: i64) -> Self {
+        Self::with_data(pool, [0u8; 16].into(), 0, ctime, None)
+    }
+
+    pub fn unassigned(&self) -> bool {
+        self.uuid.as_ref() == [0u8; 16]
+    }
 }
index 9c5887d72834d1535aeac5b091d23dfc7debd9fc..dd560179b0a7f0cc1391c253b1b12ecf127f4342 100644 (file)
@@ -185,7 +185,7 @@ impl Inventory {
             // do not overwrite unsaved pool assignments
             if media_id.media_set_label.is_none() {
                 if let Some(ref set) = previous.id.media_set_label {
-                    if set.uuid.as_ref() == [0u8; 16] {
+                    if set.unassigned() {
                         media_id.media_set_label = Some(set.clone());
                     }
                 }
@@ -251,15 +251,11 @@ impl Inventory {
     pub fn lookup_media_pool(&self, uuid: &Uuid) -> Option<(&str, bool)> {
         match self.map.get(uuid) {
             None => None,
-            Some(entry) => {
-                match entry.id.media_set_label {
-                    None => None, // not assigned to any pool
-                    Some(ref set) => {
-                        let is_empty = set.uuid.as_ref() == [0u8; 16];
-                        Some((&set.pool, is_empty))
-                    }
-                }
-            }
+            Some(entry) => entry
+                .id
+                .media_set_label
+                .as_ref()
+                .map(|set| (set.pool.as_str(), set.unassigned())),
         }
     }
 
@@ -275,7 +271,7 @@ impl Inventory {
                         continue; // belong to another pool
                     }
 
-                    if set.uuid.as_ref() == [0u8; 16] {
+                    if set.unassigned() {
                         list.push(MediaId {
                             label: entry.id.label.clone(),
                             media_set_label: None,
@@ -298,7 +294,7 @@ impl Inventory {
             match entry.id.media_set_label {
                 None => continue, // not assigned to any pool
                 Some(ref set) => {
-                    if set.uuid.as_ref() != [0u8; 16] {
+                    if set.unassigned() {
                         list.push(entry.id.clone());
                     }
                 }
@@ -410,7 +406,7 @@ impl Inventory {
             .map
             .values()
             .filter_map(|entry| entry.id.media_set_label.as_ref())
-            .filter(|set| set.pool == pool && set.uuid.as_ref() != [0u8; 16]);
+            .filter(|set| set.pool == pool && !set.unassigned());
 
         for set in set_list {
             match last_set {
@@ -435,7 +431,7 @@ impl Inventory {
             .map
             .values()
             .filter_map(|entry| entry.id.media_set_label.as_ref())
-            .filter(|set| set.pool == pool && set.uuid.as_ref() != [0u8; 16]);
+            .filter(|set| set.pool == pool && !set.unassigned());
 
         for set in set_list {
             if set.uuid != uuid && set.ctime >= ctime {
@@ -600,7 +596,7 @@ impl Inventory {
 
         let uuid = label.uuid.clone();
 
-        let set = MediaSetLabel::with_data(pool, [0u8; 16].into(), 0, ctime, None);
+        let set = MediaSetLabel::new_unassigned(pool, ctime);
 
         self.store(
             MediaId {
index eb477885abcb4b59ebf56e106b9096d3c0c8b70d..e1bba9ab43f14592c8869002a083893313d7a67e 100644 (file)
@@ -181,7 +181,7 @@ impl MediaPool {
             // should never trigger
             return (MediaStatus::Unknown, location); // belong to another pool
         }
-        if set.uuid.as_ref() == [0u8; 16] {
+        if set.unassigned() {
             // not assigned to any pool
             return (MediaStatus::Writable, location);
         }