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(())
|
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()
|
||||||
}
|
}
|
||||||
|
@ -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>;
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user