From a6ab2577d82b57744cae2133291c31c672da8a3a Mon Sep 17 00:00:00 2001 From: Marian Csontos Date: Thu, 31 Aug 2023 11:44:12 +0200 Subject: [PATCH] Fix ioctl call on ppc64le breaking installation. --- ...he-ioctl-request-code-for-the-powerp.patch | 217 ++++++++++++++++++ ...s-Verify-ioctl-request-code-in-tests.patch | 120 ++++++++++ device-mapper-persistent-data.spec | 7 +- 3 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 0002-file_utils-Fix-the-ioctl-request-code-for-the-powerp.patch create mode 100644 0003-file_utils-Verify-ioctl-request-code-in-tests.patch diff --git a/0002-file_utils-Fix-the-ioctl-request-code-for-the-powerp.patch b/0002-file_utils-Fix-the-ioctl-request-code-for-the-powerp.patch new file mode 100644 index 0000000..e2a6f0e --- /dev/null +++ b/0002-file_utils-Fix-the-ioctl-request-code-for-the-powerp.patch @@ -0,0 +1,217 @@ +From 6de336c0e974989010c32693c9540180d4f28f0b Mon Sep 17 00:00:00 2001 +From: Ming-Hung Tsai +Date: Sat, 26 Aug 2023 18:19:15 +0800 +Subject: [PATCH 2/3] [file_utils] Fix the ioctl request code for the powerpc + architecture + +The PowerPC architecture employees a different bitwise layout in the +request code than other platforms, resulting in different request code +values. + +(cherry picked from commit afcbcd7d85902fc7f1e51fc5302230851303ab85) +--- + src/file_utils.rs | 14 ++---- + src/ioctl.rs | 106 ++++++++++++++++++++++++++++++++++++++++++++++ + src/lib.rs | 1 + + src/thin/trim.rs | 11 ++--- + 4 files changed, 115 insertions(+), 17 deletions(-) + create mode 100644 src/ioctl.rs + +diff --git a/src/file_utils.rs b/src/file_utils.rs +index 81d4a8a7..97400272 100644 +--- a/src/file_utils.rs ++++ b/src/file_utils.rs +@@ -5,6 +5,8 @@ use std::os::unix::ffi::OsStrExt; + use std::os::unix::io::AsRawFd; + use std::path::Path; + ++use crate::ioctl::{self, *}; ++ + //--------------------------------------- + + fn test_bit(mode: u32, flag: u32) -> bool { +@@ -41,10 +43,7 @@ pub fn is_file(path: &Path) -> io::Result { + + //--------------------------------------- + +-#[cfg(target_pointer_width = "32")] +-const BLKGETSIZE64: u32 = 0x80041272; +-#[cfg(target_pointer_width = "64")] +-const BLKGETSIZE64: u32 = 0x80081272; ++const BLKGETSIZE64: ioctl::RequestType = crate::request_code_read!(0x12, 114, usize); + + pub fn fail(msg: &str) -> io::Result { + let e = io::Error::new(io::ErrorKind::Other, msg); +@@ -56,13 +55,8 @@ fn get_device_size>(path: P) -> io::Result { + let fd = file.as_raw_fd(); + let mut cap = 0u64; + +- #[cfg(target_env = "musl")] +- type RequestType = libc::c_int; +- #[cfg(not(target_env = "musl"))] +- type RequestType = libc::c_ulong; +- + unsafe { +- if libc::ioctl(fd, BLKGETSIZE64 as RequestType, &mut cap) == 0 { ++ if libc::ioctl(fd, BLKGETSIZE64, &mut cap) == 0 { + Ok(cap) + } else { + Err(io::Error::last_os_error()) +diff --git a/src/ioctl.rs b/src/ioctl.rs +new file mode 100644 +index 00000000..84933648 +--- /dev/null ++++ b/src/ioctl.rs +@@ -0,0 +1,106 @@ ++/* Rust port of kernel include/uapi/asm-generic/ioctl.h */ ++ ++//------------------------------------------ ++ ++#[cfg(target_env = "musl")] ++pub type RequestType = libc::c_int; ++#[cfg(not(target_env = "musl"))] ++pub type RequestType = libc::c_ulong; ++ ++#[cfg(any( ++ target_arch = "mips", ++ target_arch = "mips64", ++ target_arch = "powerpc", ++ target_arch = "powerpc64", ++ target_arch = "powerpc64le", ++ target_arch = "sparc", ++ target_arch = "sparc64" ++))] ++mod defs { ++ use super::RequestType; ++ pub const IOC_NONE: RequestType = 1; ++ pub const IOC_READ: RequestType = 2; ++ pub const IOC_WRITE: RequestType = 4; ++ pub const IOC_DIRBITS: RequestType = 3; ++ pub const IOC_SIZEBITS: RequestType = 13; ++} ++ ++#[cfg(not(any( ++ target_arch = "mips", ++ target_arch = "mips64", ++ target_arch = "powerpc", ++ target_arch = "powerpc64", ++ target_arch = "powerpc64le", ++ target_arch = "sparc", ++ target_arch = "sparc64" ++)))] ++mod defs { ++ use super::RequestType; ++ pub const IOC_NONE: RequestType = 0; ++ pub const IOC_WRITE: RequestType = 1; ++ pub const IOC_READ: RequestType = 2; ++ pub const IOC_DIRBITS: RequestType = 2; ++ pub const IOC_SIZEBITS: RequestType = 14; ++} ++ ++pub use defs::*; ++ ++pub const IOC_NRBITS: RequestType = 8; ++pub const IOC_TYPEBITS: RequestType = 8; ++ ++pub const IOC_NRMASK: RequestType = (1 << IOC_NRBITS) - 1; ++pub const IOC_TYPEMASK: RequestType = (1 << IOC_TYPEBITS) - 1; ++pub const IOC_SIZEMASK: RequestType = (1 << IOC_SIZEBITS) - 1; ++pub const IOC_DIRMASK: RequestType = (1 << IOC_DIRBITS) - 1; ++ ++pub const IOC_NRSHIFT: RequestType = 0; ++pub const IOC_TYPESHIFT: RequestType = IOC_NRSHIFT + IOC_NRBITS; ++pub const IOC_SIZESHIFT: RequestType = IOC_TYPESHIFT + IOC_TYPEBITS; ++pub const IOC_DIRSHIFT: RequestType = IOC_SIZESHIFT + IOC_SIZEBITS; ++ ++#[macro_export] ++macro_rules! ioc { ++ ($dir: expr, $typ: expr, $nr: expr, $size: expr) => { ++ (($dir as RequestType & IOC_DIRMASK) << IOC_DIRSHIFT) ++ | (($typ as RequestType & IOC_TYPEMASK) << IOC_TYPESHIFT) ++ | (($nr as RequestType & IOC_NRMASK) << IOC_NRSHIFT) ++ | (($size as RequestType & IOC_SIZEMASK) << IOC_SIZESHIFT) ++ }; ++} ++ ++//------------------------------------------ ++ ++#[macro_export] ++macro_rules! request_code_none { ++ ($typ: expr, $nr: expr) => { ++ $crate::ioc!(IOC_NONE, $typ, $nr, 0) ++ }; ++} ++ ++#[macro_export] ++macro_rules! request_code_read { ++ ($typ: expr, $nr: expr, $size_type: ty) => { ++ $crate::ioc!(IOC_READ, $typ, $nr, ::std::mem::size_of::<$size_type>()) ++ }; ++} ++ ++#[macro_export] ++macro_rules! request_code_write { ++ ($typ: expr, $nr: expr, $size_type: ty) => { ++ $crate::ioc!(IOC_WRITE, $typ, $nr, ::std::mem::size_of::<$size_type>()) ++ }; ++} ++ ++#[macro_export] ++macro_rules! request_code_readwrite { ++ ($typ: expr, $nr: expr, $size_type: ty) => { ++ $crate::ioc!( ++ IOC_READ | IOC_WRITE, ++ $typ, ++ $nr, ++ ::std::mem::size_of::<$size_type>() ++ ) ++ }; ++} ++ ++//------------------------------------------ +diff --git a/src/lib.rs b/src/lib.rs +index b12146ef..1371baac 100644 +--- a/src/lib.rs ++++ b/src/lib.rs +@@ -14,6 +14,7 @@ pub mod era; + pub mod file_utils; + pub mod grid_layout; + pub mod io_engine; ++pub mod ioctl; + pub mod math; + pub mod pack; + pub mod pdata; +diff --git a/src/thin/trim.rs b/src/thin/trim.rs +index 0d1fb590..b92a4bbd 100644 +--- a/src/thin/trim.rs ++++ b/src/thin/trim.rs +@@ -8,6 +8,7 @@ use std::sync::Arc; + use crate::commands::engine::*; + use crate::file_utils::file_size; + use crate::io_engine::*; ++use crate::ioctl::{self, *}; + use crate::pdata::btree_walker::*; + use crate::pdata::space_map::common::*; + use crate::pdata::unpack::unpack; +@@ -132,15 +133,11 @@ impl<'a> Iterator for RangeIterator<'a> { + + //------------------------------------------ + +-const BLKDISCARD: u32 = 0x1277; +-fn ioctl_blkdiscard(fd: i32, range: &[u64; 2]) -> std::io::Result<()> { +- #[cfg(target_env = "musl")] +- type RequestType = libc::c_int; +- #[cfg(not(target_env = "musl"))] +- type RequestType = libc::c_ulong; ++const BLKDISCARD: ioctl::RequestType = crate::request_code_none!(0x12, 119); + ++fn ioctl_blkdiscard(fd: i32, range: &[u64; 2]) -> std::io::Result<()> { + unsafe { +- if libc::ioctl(fd, BLKDISCARD as RequestType, range) == 0 { ++ if libc::ioctl(fd, BLKDISCARD, range) == 0 { + Ok(()) + } else { + Err(std::io::Error::last_os_error()) +-- +2.41.0 + diff --git a/0003-file_utils-Verify-ioctl-request-code-in-tests.patch b/0003-file_utils-Verify-ioctl-request-code-in-tests.patch new file mode 100644 index 0000000..7e37307 --- /dev/null +++ b/0003-file_utils-Verify-ioctl-request-code-in-tests.patch @@ -0,0 +1,120 @@ +From 38e497f4200a0d2fcb043941d4a5792c76e47bbb Mon Sep 17 00:00:00 2001 +From: Ming-Hung Tsai +Date: Wed, 30 Aug 2023 18:11:45 +0800 +Subject: [PATCH 3/3] [file_utils] Verify ioctl request code in tests + +(cherry picked from commit f049fda90bbf74ab26bfd38e26e7c92de8f50e30) +--- + src/ioctl.rs | 3 ++ + src/ioctl/tests.rs | 86 ++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 89 insertions(+) + create mode 100644 src/ioctl/tests.rs + +diff --git a/src/ioctl.rs b/src/ioctl.rs +index 84933648..221bd4e9 100644 +--- a/src/ioctl.rs ++++ b/src/ioctl.rs +@@ -1,5 +1,8 @@ + /* Rust port of kernel include/uapi/asm-generic/ioctl.h */ + ++#[cfg(test)] ++mod tests; ++ + //------------------------------------------ + + #[cfg(target_env = "musl")] +diff --git a/src/ioctl/tests.rs b/src/ioctl/tests.rs +new file mode 100644 +index 00000000..17a395df +--- /dev/null ++++ b/src/ioctl/tests.rs +@@ -0,0 +1,86 @@ ++use crate::ioctl::*; ++ ++//------------------------------------------ ++ ++#[cfg(any( ++ target_arch = "mips", ++ target_arch = "mips64", ++ target_arch = "powerpc", ++ target_arch = "powerpc64", ++ target_arch = "powerpc64le", ++ target_arch = "sparc", ++ target_arch = "sparc64" ++))] ++mod expected { ++ use super::RequestType; ++ pub const BLKDISCARD: RequestType = 0x20001277; ++ ++ #[cfg(target_pointer_width = "32")] ++ mod sized { ++ use super::RequestType; ++ pub const BLKBSZSET: RequestType = 0x80041271; ++ pub const BLKGETSIZE64: RequestType = 0x40041272; ++ } ++ ++ #[cfg(target_pointer_width = "64")] ++ mod sized { ++ use super::RequestType; ++ pub const BLKBSZSET: RequestType = 0x80081271; ++ pub const BLKGETSIZE64: RequestType = 0x40081272; ++ } ++ ++ pub use sized::*; ++} ++ ++#[cfg(not(any( ++ target_arch = "mips", ++ target_arch = "mips64", ++ target_arch = "powerpc", ++ target_arch = "powerpc64", ++ target_arch = "powerpc64le", ++ target_arch = "sparc", ++ target_arch = "sparc64" ++)))] ++mod expected { ++ use super::RequestType; ++ pub const BLKDISCARD: RequestType = 0x1277; ++ ++ #[cfg(target_pointer_width = "32")] ++ mod sized { ++ use super::RequestType; ++ pub const BLKBSZSET: RequestType = 0x40041271; ++ pub const BLKGETSIZE64: RequestType = 0x80041272; ++ } ++ ++ #[cfg(target_pointer_width = "64")] ++ mod sized { ++ use super::RequestType; ++ pub const BLKBSZSET: RequestType = 0x40081271; ++ pub const BLKGETSIZE64: RequestType = 0x80081272; ++ } ++ ++ pub use sized::*; ++} ++ ++#[test] ++fn test_ioc_none() { ++ assert_eq!(crate::request_code_none!(0x12, 119), expected::BLKDISCARD); ++} ++ ++#[test] ++fn test_ioc_read_usize() { ++ assert_eq!( ++ crate::request_code_read!(0x12, 114, usize), ++ expected::BLKGETSIZE64 ++ ); ++} ++ ++#[test] ++fn test_ioc_write_usize() { ++ assert_eq!( ++ crate::request_code_write!(0x12, 113, usize), ++ expected::BLKBSZSET ++ ); ++} ++ ++//------------------------------------------ +-- +2.41.0 + diff --git a/device-mapper-persistent-data.spec b/device-mapper-persistent-data.spec index 756981b..75e4952 100644 --- a/device-mapper-persistent-data.spec +++ b/device-mapper-persistent-data.spec @@ -10,7 +10,7 @@ Summary: Device-mapper Persistent Data Tools Name: device-mapper-persistent-data Version: 1.0.6 -Release: 1%{?dist}%{?release_suffix} +Release: 2%{?dist}%{?release_suffix} License: GPLv3+ #ExcludeArch: %%{ix86} URL: https://github.com/jthornber/thin-provisioning-tools @@ -18,6 +18,8 @@ URL: https://github.com/jthornber/thin-provisioning-tools Source0: https://github.com/jthornber/thin-provisioning-tools/archive/v%{version}%{?version_suffix}.tar.gz Source1: dmpd106-vendor.tar.gz Patch1: 0001-Tweak-cargo.toml-to-work-with-vendor-directory.patch +Patch2: 0002-file_utils-Fix-the-ioctl-request-code-for-the-powerp.patch +Patch3: 0003-file_utils-Verify-ioctl-request-code-in-tests.patch %if %{defined rhel} BuildRequires: rust-toolset @@ -116,6 +118,9 @@ make DESTDIR=%{buildroot} MANDIR=%{_mandir} install #% {_sbindir}/thin_show_duplicates %changelog +* Thu Aug 31 2023 Marian Csontos - 1.0.6-2 +- Fix broken installation on ppc64le caused by incorrect ioctl call. + * Wed Aug 09 2023 Marian Csontos - 1.0.6-1 - Update to latest upstream release 1.0.6.