Backport "miniso: handle hardlinked files"
https://github.com/coreos/coreos-installer/pull/694
This commit is contained in:
parent
5297449db5
commit
c32299f0ef
87
0001-miniso-handle-hardlinked-files.patch
Normal file
87
0001-miniso-handle-hardlinked-files.patch
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
From f8aee361291fc9505e62f9a75a60ae6e3905bcb6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jonathan Lebon <jonathan@jlebon.com>
|
||||||
|
Date: Thu, 25 Nov 2021 11:39:39 -0500
|
||||||
|
Subject: [PATCH] miniso: handle hardlinked files
|
||||||
|
|
||||||
|
On ppc64le, some files are hardlinked. The way hardlinks are represented
|
||||||
|
in ISO9660 is simply that the dirents point to the same sector and have
|
||||||
|
identical sizes. So they show up as exact copies in the table. So we can
|
||||||
|
get rid of them by deduplicating. Rust's `Vec::dedup()` makes this easy.
|
||||||
|
|
||||||
|
See: https://github.com/coreos/coreos-assembler/issues/2583
|
||||||
|
---
|
||||||
|
src/iso9660.rs | 2 +-
|
||||||
|
src/miniso.rs | 14 +++++++++-----
|
||||||
|
2 files changed, 10 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/iso9660.rs b/src/iso9660.rs
|
||||||
|
index 9f5482d..7b82fcf 100644
|
||||||
|
--- a/src/iso9660.rs
|
||||||
|
+++ b/src/iso9660.rs
|
||||||
|
@@ -221,7 +221,7 @@ pub struct File {
|
||||||
|
pub length: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
-#[derive(Debug, Serialize, Deserialize, Clone, Copy)]
|
||||||
|
+#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
|
||||||
|
pub struct Address(u32);
|
||||||
|
|
||||||
|
impl Address {
|
||||||
|
diff --git a/src/miniso.rs b/src/miniso.rs
|
||||||
|
index 63bea6c..9d2ce0b 100644
|
||||||
|
--- a/src/miniso.rs
|
||||||
|
+++ b/src/miniso.rs
|
||||||
|
@@ -47,7 +47,7 @@ impl Table {
|
||||||
|
fn new(
|
||||||
|
full_files: &HashMap<String, iso9660::File>,
|
||||||
|
minimal_files: &HashMap<String, iso9660::File>,
|
||||||
|
- ) -> Result<Self> {
|
||||||
|
+ ) -> Result<(Self, usize)> {
|
||||||
|
let mut entries: Vec<TableEntry> = Vec::new();
|
||||||
|
for (path, minimal_entry) in minimal_files {
|
||||||
|
let full_entry = full_files
|
||||||
|
@@ -67,9 +67,13 @@ impl Table {
|
||||||
|
}
|
||||||
|
|
||||||
|
entries.sort_by_key(|e| e.minimal.as_sector());
|
||||||
|
+ // drop duplicate entries (hardlinks), and calculate how many there were for reporting
|
||||||
|
+ let size = entries.len();
|
||||||
|
+ entries.dedup();
|
||||||
|
+ let hardlinks = size - entries.len();
|
||||||
|
let table = Table { entries };
|
||||||
|
table.validate().context("validating table")?;
|
||||||
|
- Ok(table)
|
||||||
|
+ Ok((table, hardlinks))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn validate(&self) -> Result<()> {
|
||||||
|
@@ -91,7 +95,7 @@ impl Table {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
+#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
|
||||||
|
struct TableEntry {
|
||||||
|
minimal: iso9660::Address,
|
||||||
|
full: iso9660::Address,
|
||||||
|
@@ -148,7 +152,7 @@ impl Data {
|
||||||
|
full_files: &HashMap<String, iso9660::File>,
|
||||||
|
minimal_files: &HashMap<String, iso9660::File>,
|
||||||
|
) -> Result<(Self, usize, u64, u64, u64)> {
|
||||||
|
- let table = Table::new(full_files, minimal_files)?;
|
||||||
|
+ let (table, hardlinks) = Table::new(full_files, minimal_files)?;
|
||||||
|
|
||||||
|
// A `ReadHasher` here would let us wrap the miniso so we calculate the digest as we read.
|
||||||
|
let digest = Sha256Digest::from_file(miniso)?;
|
||||||
|
@@ -183,7 +187,7 @@ impl Data {
|
||||||
|
copy(miniso, &mut xzw).context("copying remaining miniso bytes")?;
|
||||||
|
|
||||||
|
xzw.try_finish().context("trying to finish xz stream")?;
|
||||||
|
- let matches = table.entries.len();
|
||||||
|
+ let matches = table.entries.len() + hardlinks;
|
||||||
|
let written = xzw.total_in();
|
||||||
|
let written_compressed = xzw.total_out();
|
||||||
|
Ok((
|
||||||
|
--
|
||||||
|
2.33.1
|
||||||
|
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
Name: rust-%{crate}
|
Name: rust-%{crate}
|
||||||
Version: 0.11.0
|
Version: 0.11.0
|
||||||
Release: 1%{?dist}
|
Release: 2%{?dist}
|
||||||
Summary: Installer for Fedora CoreOS and RHEL CoreOS
|
Summary: Installer for Fedora CoreOS and RHEL CoreOS
|
||||||
|
|
||||||
# Upstream license specification: Apache-2.0
|
# Upstream license specification: Apache-2.0
|
||||||
@ -26,6 +26,8 @@ Source0: %{crates_source}
|
|||||||
%endif
|
%endif
|
||||||
Source2: https://github.com/coreos/coreos-installer-dracut/archive/%{dracutcommit}/coreos-installer-dracut-%{dracutshortcommit}.tar.gz
|
Source2: https://github.com/coreos/coreos-installer-dracut/archive/%{dracutcommit}/coreos-installer-dracut-%{dracutshortcommit}.tar.gz
|
||||||
|
|
||||||
|
Patch0: 0001-miniso-handle-hardlinked-files.patch
|
||||||
|
|
||||||
ExclusiveArch: %{rust_arches}
|
ExclusiveArch: %{rust_arches}
|
||||||
%if 0%{?rhel} && !0%{?eln}
|
%if 0%{?rhel} && !0%{?eln}
|
||||||
BuildRequires: rust-toolset
|
BuildRequires: rust-toolset
|
||||||
@ -193,6 +195,10 @@ from the initramfs.
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Nov 29 2021 Jonathan Lebon <jonathan@jlebon.com> - 0.11.0-2
|
||||||
|
- Backport "miniso: handle hardlinked files"
|
||||||
|
https://github.com/coreos/coreos-installer/pull/694
|
||||||
|
|
||||||
* Thu Nov 18 2021 Benjamin Gilbert <bgilbert@redhat.com> - 0.11.0-1
|
* Thu Nov 18 2021 Benjamin Gilbert <bgilbert@redhat.com> - 0.11.0-1
|
||||||
- New release
|
- New release
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user