From a7188b3a75c7fc7ac4bd970ca19063c25259d56c Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Thu, 22 Apr 2021 11:44:49 +0200 Subject: [PATCH] tape: fix FORMAT for LTO-4 drives FORMAT requires LTO-5 or newer, so we do a rewind/erase if FORMAT fails. --- src/tape/drive/lto/sg_tape.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/tape/drive/lto/sg_tape.rs b/src/tape/drive/lto/sg_tape.rs index 7faa1639..4e9265fb 100644 --- a/src/tape/drive/lto/sg_tape.rs +++ b/src/tape/drive/lto/sg_tape.rs @@ -193,13 +193,19 @@ impl SgTape { let mut sg_raw = SgRaw::new(&mut self.file, 16)?; sg_raw.set_timeout(Self::SCSI_TAPE_DEFAULT_TIMEOUT); let mut cmd = Vec::new(); + + // Try FORMAT first (requires LTO5 or newer) cmd.extend(&[0x04, 0, 0, 0, 0, 0]); - sg_raw.do_command(&cmd) - .map_err(|err| format_err!("erase failed - {}", err))?; - - if !fast { - self.erase_media(false)?; // overwrite everything + if let Err(err) = sg_raw.do_command(&cmd) { + eprintln!("format failed - using erase insead: {}", err); + // try rewind/erase instead + self.rewind()?; + self.erase_media(fast)? + } else { + if !fast { + self.erase_media(false)?; // overwrite everything + } } Ok(())