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:
parent
e0ba5553be
commit
56d36ca439
@ -309,6 +309,10 @@ impl TapeDriver for LtoTapeHandle {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn move_to_file(&mut self, file: u64) -> Result<(), Error> {
|
||||
self.locate_file(file)
|
||||
}
|
||||
|
||||
fn rewind(&mut self) -> Result<(), Error> {
|
||||
self.sg_tape.rewind()
|
||||
}
|
||||
|
@ -80,6 +80,9 @@ pub trait TapeDriver {
|
||||
/// Move to last file
|
||||
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
|
||||
fn current_file_number(&mut self) -> Result<u64, Error>;
|
||||
|
||||
|
@ -261,6 +261,28 @@ impl TapeDriver for VirtualTapeHandle {
|
||||
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> {
|
||||
let mut status = self.load_status()
|
||||
|
Loading…
Reference in New Issue
Block a user