From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 0B40C78DFE for ; Mon, 3 May 2021 10:38:42 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 0166C1AB9D for ; Mon, 3 May 2021 10:38:12 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id C18821AB5D for ; Mon, 3 May 2021 10:38:07 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 9518945A28 for ; Mon, 3 May 2021 10:38:07 +0200 (CEST) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Mon, 3 May 2021 10:38:00 +0200 Message-Id: <20210503083806.24138-2-d.csapak@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210503083806.24138-1-d.csapak@proxmox.com> References: <20210503083806.24138-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.005 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pbs-devel] [RFC PATCH proxmox-backup 1/7] tape/drive: add 'move_to_file' to TapeDriver trait X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 03 May 2021 08:38:42 -0000 so that we can directly move to a specified file on the tape Signed-off-by: Dominik Csapak --- src/tape/drive/lto/mod.rs | 4 ++++ src/tape/drive/mod.rs | 3 +++ src/tape/drive/virtual_tape.rs | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/src/tape/drive/lto/mod.rs b/src/tape/drive/lto/mod.rs index 642c3cc7..3894b034 100644 --- a/src/tape/drive/lto/mod.rs +++ b/src/tape/drive/lto/mod.rs @@ -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() } diff --git a/src/tape/drive/mod.rs b/src/tape/drive/mod.rs index fd8f503d..f72e0b51 100644 --- a/src/tape/drive/mod.rs +++ b/src/tape/drive/mod.rs @@ -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; diff --git a/src/tape/drive/virtual_tape.rs b/src/tape/drive/virtual_tape.rs index f7ebc0bb..3c5f9502 100644 --- a/src/tape/drive/virtual_tape.rs +++ b/src/tape/drive/virtual_tape.rs @@ -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, BlockReadError> { let mut status = self.load_status() -- 2.20.1