* [pbs-devel] [PATCH proxmox-backup 1/3] tape: refactor setting the mode page
@ 2024-06-10 11:45 Dominik Csapak
2024-06-10 11:45 ` [pbs-devel] [PATCH proxmox-backup 2/3] tape: disable Programmable Early Warning Zone (PEWZ) Dominik Csapak
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Dominik Csapak @ 2024-06-10 11:45 UTC (permalink / raw)
To: pbs-devel
we'll reuse that code later for a different page/subpage
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
pbs-tape/src/sg_tape.rs | 59 ++++++++++++++++++++++++-----------------
1 file changed, 35 insertions(+), 24 deletions(-)
diff --git a/pbs-tape/src/sg_tape.rs b/pbs-tape/src/sg_tape.rs
index 50f5c079..1aa7d492 100644
--- a/pbs-tape/src/sg_tape.rs
+++ b/pbs-tape/src/sg_tape.rs
@@ -804,35 +804,17 @@ impl SgTape {
Ok(())
}
- /// Set important drive options
- #[allow(clippy::vec_init_then_push)]
- pub fn set_drive_options(
+ // tries to set the given page with either mode sense 6 or 10 depending on
+ // the given header size
+ fn drive_mode_select<T: Endian>(
&mut self,
- compression: Option<bool>,
- block_length: Option<u32>,
- buffer_mode: Option<bool>,
+ head: ModeParameterHeader,
+ block_descriptor: ModeBlockDescriptor,
+ page: T,
) -> Result<(), Error> {
- // Note: Read/Modify/Write
-
- let (mut head, mut block_descriptor, mut page) = self.read_compression_page()?;
-
let mut sg_raw = SgRaw::new(&mut self.file, 0)?;
sg_raw.set_timeout(Self::SCSI_TAPE_DEFAULT_TIMEOUT);
- head.reset_mode_data_len(); // mode_data_len need to be zero
-
- if let Some(compression) = compression {
- page.set_compression(compression);
- }
-
- if let Some(block_length) = block_length {
- block_descriptor.set_block_length(block_length)?;
- }
-
- if let Some(buffer_mode) = buffer_mode {
- head.set_buffer_mode(buffer_mode);
- }
-
match head {
ModeParameterHeader::Long(head) => {
let mut data = Vec::new();
@@ -878,8 +860,37 @@ impl SgTape {
format_err!("set drive options (mode select(6)) failed - {err}")
})?;
}
+ };
+ Ok(())
+ }
+
+ /// Set important drive options
+ #[allow(clippy::vec_init_then_push)]
+ pub fn set_drive_options(
+ &mut self,
+ compression: Option<bool>,
+ block_length: Option<u32>,
+ buffer_mode: Option<bool>,
+ ) -> Result<(), Error> {
+ // Note: Read/Modify/Write
+ let (mut head, mut block_descriptor, mut page) = self.read_compression_page()?;
+
+ head.reset_mode_data_len(); // mode_data_len need to be zero
+
+ if let Some(compression) = compression {
+ page.set_compression(compression);
}
+ if let Some(block_length) = block_length {
+ block_descriptor.set_block_length(block_length)?;
+ }
+
+ if let Some(buffer_mode) = buffer_mode {
+ head.set_buffer_mode(buffer_mode);
+ }
+
+ self.drive_mode_select(head, block_descriptor, page)?;
+
Ok(())
}
--
2.39.2
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
* [pbs-devel] [PATCH proxmox-backup 2/3] tape: disable Programmable Early Warning Zone (PEWZ)
2024-06-10 11:45 [pbs-devel] [PATCH proxmox-backup 1/3] tape: refactor setting the mode page Dominik Csapak
@ 2024-06-10 11:45 ` Dominik Csapak
2024-06-10 11:45 ` [pbs-devel] [PATCH proxmox-backup 3/3] tape: handle PEWZ like regular early warning Dominik Csapak
2024-06-11 8:34 ` [pbs-devel] applied: [PATCH proxmox-backup 1/3] tape: refactor setting the mode page Dietmar Maurer
2 siblings, 0 replies; 4+ messages in thread
From: Dominik Csapak @ 2024-06-10 11:45 UTC (permalink / raw)
To: 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 <d.csapak@proxmox.com>
---
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
^ permalink raw reply [flat|nested] 4+ messages in thread
* [pbs-devel] [PATCH proxmox-backup 3/3] tape: handle PEWZ like regular early warning
2024-06-10 11:45 [pbs-devel] [PATCH proxmox-backup 1/3] tape: refactor setting the mode page Dominik Csapak
2024-06-10 11:45 ` [pbs-devel] [PATCH proxmox-backup 2/3] tape: disable Programmable Early Warning Zone (PEWZ) Dominik Csapak
@ 2024-06-10 11:45 ` Dominik Csapak
2024-06-11 8:34 ` [pbs-devel] applied: [PATCH proxmox-backup 1/3] tape: refactor setting the mode page Dietmar Maurer
2 siblings, 0 replies; 4+ messages in thread
From: Dominik Csapak @ 2024-06-10 11:45 UTC (permalink / raw)
To: pbs-devel
as a safeguard, should the disabling not work for some reason.
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
pbs-tape/src/sg_tape.rs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/pbs-tape/src/sg_tape.rs b/pbs-tape/src/sg_tape.rs
index 96cd3ed8..60537203 100644
--- a/pbs-tape/src/sg_tape.rs
+++ b/pbs-tape/src/sg_tape.rs
@@ -626,8 +626,8 @@ impl SgTape {
Err(ScsiError::Sense(SenseInfo {
sense_key: 0,
asc: 0,
- ascq: 2,
- })) => { /* LEOM - ignore */ }
+ ascq: 2 | 7,
+ })) => { /* LEOM or PEWZ - ignore */ }
Err(err) => {
proxmox_lang::io_bail!("write filemark failed - {err}");
}
@@ -742,9 +742,9 @@ impl SgTape {
Err(ScsiError::Sense(SenseInfo {
sense_key: 0,
asc: 0,
- ascq: 2,
+ ascq: 2 | 7,
})) => {
- Ok(true) // LEOM
+ Ok(true) // LEOM or PEWZ
}
Err(err) => {
proxmox_lang::io_bail!("write failed - {err}");
--
2.39.2
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
* [pbs-devel] applied: [PATCH proxmox-backup 1/3] tape: refactor setting the mode page
2024-06-10 11:45 [pbs-devel] [PATCH proxmox-backup 1/3] tape: refactor setting the mode page Dominik Csapak
2024-06-10 11:45 ` [pbs-devel] [PATCH proxmox-backup 2/3] tape: disable Programmable Early Warning Zone (PEWZ) Dominik Csapak
2024-06-10 11:45 ` [pbs-devel] [PATCH proxmox-backup 3/3] tape: handle PEWZ like regular early warning Dominik Csapak
@ 2024-06-11 8:34 ` Dietmar Maurer
2 siblings, 0 replies; 4+ messages in thread
From: Dietmar Maurer @ 2024-06-11 8:34 UTC (permalink / raw)
To: Proxmox Backup Server development discussion, Dominik Csapak
applied all 3 patches
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-06-11 8:34 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-10 11:45 [pbs-devel] [PATCH proxmox-backup 1/3] tape: refactor setting the mode page Dominik Csapak
2024-06-10 11:45 ` [pbs-devel] [PATCH proxmox-backup 2/3] tape: disable Programmable Early Warning Zone (PEWZ) Dominik Csapak
2024-06-10 11:45 ` [pbs-devel] [PATCH proxmox-backup 3/3] tape: handle PEWZ like regular early warning Dominik Csapak
2024-06-11 8:34 ` [pbs-devel] applied: [PATCH proxmox-backup 1/3] tape: refactor setting the mode page Dietmar Maurer
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal