tape/drive: add 'move_to_file' to TapeDriver trait

so that we can directly move to a specified file on the tape

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2021-05-05 12:09:11 +02:00 committed by Dietmar Maurer
parent e0ba5553be
commit 56d36ca439
3 changed files with 29 additions and 0 deletions

View File

@ -309,6 +309,10 @@ impl TapeDriver for LtoTapeHandle {
Ok(()) Ok(())
} }
fn move_to_file(&mut self, file: u64) -> Result<(), Error> {
self.locate_file(file)
}
fn rewind(&mut self) -> Result<(), Error> { fn rewind(&mut self) -> Result<(), Error> {
self.sg_tape.rewind() self.sg_tape.rewind()
} }

View File

@ -80,6 +80,9 @@ pub trait TapeDriver {
/// Move to last file /// Move to last file
fn move_to_last_file(&mut self) -> Result<(), Error>; fn move_to_last_file(&mut self) -> Result<(), Error>;
/// Move to given file nr
fn move_to_file(&mut self, file: u64) -> Result<(), Error>;
/// Current file number /// Current file number
fn current_file_number(&mut self) -> Result<u64, Error>; fn current_file_number(&mut self) -> Result<u64, Error>;

View File

@ -261,6 +261,28 @@ impl TapeDriver for VirtualTapeHandle {
Ok(()) Ok(())
} }
fn move_to_file(&mut self, file: u64) -> Result<(), Error> {
let mut status = self.load_status()?;
match status.current_tape {
Some(VirtualTapeStatus { ref name, ref mut pos }) => {
let index = self.load_tape_index(name)
.map_err(|err| io::Error::new(io::ErrorKind::Other, err.to_string()))?;
if file as usize > index.files {
bail!("invalid file nr");
}
*pos = file as usize;
self.store_status(&status)
.map_err(|err| io::Error::new(io::ErrorKind::Other, err.to_string()))?;
Ok(())
}
None => bail!("drive is empty (no tape loaded)."),
}
}
fn read_next_file(&mut self) -> Result<Box<dyn TapeRead>, BlockReadError> { fn read_next_file(&mut self) -> Result<Box<dyn TapeRead>, BlockReadError> {
let mut status = self.load_status() let mut status = self.load_status()