From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 812AF1FF39E for ; Mon, 10 Jun 2024 13:44:34 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 18D3E15CD3; Mon, 10 Jun 2024 13:45:09 +0200 (CEST) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Mon, 10 Jun 2024 13:45:04 +0200 Message-Id: <20240610114505.2211336-2-d.csapak@proxmox.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240610114505.2211336-1-d.csapak@proxmox.com> References: <20240610114505.2211336-1-d.csapak@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.021 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy 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 T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pbs-devel] [PATCH proxmox-backup 2/3] tape: disable Programmable Early Warning Zone (PEWZ) 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: , Reply-To: Proxmox Backup Server development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" since that leads to errors that we don't currently catch before we reach the regular early warning on tape. This can be read/set by the Device Configuration Extension Mode Page. ignore errors on reading or writing, since it may not be available on LTO-4 Signed-off-by: Dominik Csapak --- pbs-tape/src/sg_tape.rs | 71 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/pbs-tape/src/sg_tape.rs b/pbs-tape/src/sg_tape.rs index 1aa7d492..96cd3ed8 100644 --- a/pbs-tape/src/sg_tape.rs +++ b/pbs-tape/src/sg_tape.rs @@ -82,6 +82,32 @@ impl DataCompressionModePage { } } +#[repr(C, packed)] +#[derive(Endian, Debug, Copy, Clone)] +struct DeviceConfigurationExtensionModePage { + page_code: u8, // 0x10 + sub_page_code: u8, // 0x01 + page_length: u16, // 0x1C + flags4: u8, + modes: u8, + pews: u16, + flags8: u8, + reserved: [u8; 23], +} + +impl DeviceConfigurationExtensionModePage { + /// Sets the Programmable Early Warning Zone to the given amount, rounded up to the next + /// Megabyte (10^6 bytes) up to 2^16 Megabyte (the value will be clamped) + pub fn set_pewz(&mut self, bytes: usize) { + let mbytes = if bytes == 0 { + 0 + } else { + (bytes / 1000 / 1000) + 1 + }; + self.pews = mbytes.clamp(0, u16::MAX as usize) as u16; + } +} + #[repr(C, packed)] #[derive(Endian)] struct MediumConfigurationModePage { @@ -891,6 +917,16 @@ impl SgTape { self.drive_mode_select(head, block_descriptor, page)?; + // LTO-4 does not support this page, but try to write it if we can read it + if let Ok((mut head, block_descriptor, mut page)) = + self.read_device_configuration_extension_page() + { + head.reset_mode_data_len(); // mode_data_len need to be zero + page.set_pewz(0); // disable PEWZ + + let _ = self.drive_mode_select(head, block_descriptor, page); + } + Ok(()) } @@ -956,6 +992,41 @@ impl SgTape { .map_err(|err| format_err!("read_compression_page failed: {err}")) } + fn read_device_configuration_extension_page( + &mut self, + ) -> Result< + ( + ModeParameterHeader, + ModeBlockDescriptor, + DeviceConfigurationExtensionModePage, + ), + Error, + > { + let (head, block_descriptor, page): (_, _, DeviceConfigurationExtensionModePage) = + scsi_mode_sense(&mut self.file, false, 0x10, 0x01)?; + + proxmox_lang::try_block!({ + if (page.page_code & 0b0011_1111) != 0x10 { + bail!("wrong page code {}", page.page_code); + } + if page.sub_page_code != 0x01 { + bail!("wrong sub page code {}", page.sub_page_code); + } + let page_length = page.page_length; + if page_length != 0x1C { + bail!("wrong page length {page_length}"); + } + + let block_descriptor = match block_descriptor { + Some(block_descriptor) => block_descriptor, + None => bail!("missing block descriptor"), + }; + + Ok((head, block_descriptor, page)) + }) + .map_err(|err| format_err!("read_device_configuration_extension_page failed: {err}")) + } + /// Read drive options/status /// /// We read the drive compression page, including the -- 2.39.2 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel