public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/rust-bootupd] f44: Revert PR #1139 to fix UEFI ostree installs
@ 2026-09-14 10:20 Adam Williamson
0 siblings, 0 replies; only message in thread
From: Adam Williamson @ 2026-09-14 10:20 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/rust-bootupd
Branch : f44
Commit : 4ddb9068221689f572b7ceef9b16392b7058171b
Author : Adam Williamson <awilliam@redhat.com>
Date : 2026-08-21T20:59:05-07:00
Stats : +528/-0 in 5 file(s)
URL : https://src.fedoraproject.org/rpms/rust-bootupd/c/4ddb9068221689f572b7ceef9b16392b7058171b?branch=f44
Log:
Revert PR #1139 to fix UEFI ostree installs
See https://github.com/coreos/bootupd/issues/1139
---
diff --git a/0001-Revert-Fix-grub-static-config-install.patch b/0001-Revert-Fix-grub-static-config-install.patch
new file mode 100644
index 0000000..c9750fe
--- /dev/null
+++ b/0001-Revert-Fix-grub-static-config-install.patch
@@ -0,0 +1,171 @@
+From cd7b27e6c4dfcd28848fa98f19981e9d5af9451a Mon Sep 17 00:00:00 2001
+From: Adam Williamson <awilliam@redhat.com>
+Date: Fri, 21 Aug 2026 15:08:18 -0700
+Subject: [PATCH 1/4] Revert "Fix grub static config install"
+
+This reverts commit 883c7a888d16991672cf9b9d06ff74a4d2b11297.
+---
+ src/bios.rs | 2 +-
+ src/bootupd.rs | 25 -------------------------
+ src/efi.rs | 11 +++--------
+ src/grubconfigs.rs | 21 ++++++---------------
+ 4 files changed, 10 insertions(+), 49 deletions(-)
+
+diff --git a/src/bios.rs b/src/bios.rs
+index 1263d8a..a638df6 100644
+--- a/src/bios.rs
++++ b/src/bios.rs
+@@ -211,7 +211,7 @@ impl Component for Bios {
+ .context("Failed to backup GRUB config")?;
+ }
+
+- crate::grubconfigs::install(&destdir, None, None, true, None)?;
++ crate::grubconfigs::install(&destdir, None, None, true)?;
+
+ // Remove the real config if it is symlink and will not
+ // if /boot/grub2/grub.cfg is file
+diff --git a/src/bootupd.rs b/src/bootupd.rs
+index bdad9ff..72266a3 100644
+--- a/src/bootupd.rs
++++ b/src/bootupd.rs
+@@ -276,36 +276,11 @@ pub(crate) fn install(opts: &InstallOpts, devices: &[Device], configs: ConfigMod
+ Some(uuid) => {
+ let meta = get_static_config_meta()?;
+ state.static_configs = Some(meta);
+-
+- let mut esp_dir = None;
+-
+- #[cfg(efi_arch)]
+- {
+- for c in &target_components {
+- use crate::efi::Efi;
+-
+- if let Some(efi) = c.as_any().downcast_ref::<Efi>() {
+- let mounted_esp_path = efi.get_esp_mountpoint();
+- let mounted_esp_path = mounted_esp_path.as_ref().ok_or_else(|| {
+- anyhow!("Mounted ESP not found to install static grub config")
+- })?;
+-
+- esp_dir = Some(
+- Dir::open_ambient_dir(mounted_esp_path, ambient_authority())
+- .context("Opening mounted ESP dir")?,
+- );
+-
+- break;
+- }
+- }
+- }
+-
+ crate::grubconfigs::install(
+ sysroot,
+ Some(&source_root_dir),
+ installed_efi_vendor.as_deref(),
+ uuid,
+- esp_dir.as_ref(),
+ )?;
+ }
+ // On other architectures, assume that there's nothing to do.
+diff --git a/src/efi.rs b/src/efi.rs
+index 834e35f..4c9d2cc 100644
+--- a/src/efi.rs
++++ b/src/efi.rs
+@@ -181,11 +181,6 @@ impl Efi {
+ }
+ }
+
+- /// Returns the ESP's mountpoint if present
+- pub(crate) fn get_esp_mountpoint(&self) -> std::cell::Ref<'_, Option<PathBuf>> {
+- self.mountpoint.borrow()
+- }
+-
+ /// Checks if we have already mounted the ESP
+ /// If not, checks if the ESP is mounted at common mountpoints, i.e. /boot, /boot/efi
+ /// Else, mounts the ESP at a temp path
+@@ -374,7 +369,7 @@ impl Component for Efi {
+
+ // Backup "/boot/efi/EFI/{vendor}/grub.cfg" to "/boot/efi/EFI/{vendor}/grub.cfg.bak"
+ // Replace "/boot/efi/EFI/{vendor}/grub.cfg" with new static "grub.cfg"
+- fn migrate_static_grub_config(&self, sysroot_path: &str, dest_efi_dir: &Dir) -> Result<()> {
++ fn migrate_static_grub_config(&self, sysroot_path: &str, destdir: &Dir) -> Result<()> {
+ let sysroot = Dir::open_ambient_dir(sysroot_path, ambient_authority())
+ .with_context(|| format!("Opening {sysroot_path}"))?;
+ let Some(vendor) = self.get_efi_vendor(&Path::new(sysroot_path))? else {
+@@ -382,7 +377,7 @@ impl Component for Efi {
+ };
+
+ // destdir is /boot/efi/EFI
+- let efidir = dest_efi_dir
++ let efidir = destdir
+ .open_dir(&vendor)
+ .with_context(|| format!("Opening EFI/{}", vendor))?;
+
+@@ -397,7 +392,7 @@ impl Component for Efi {
+ .context("Failed to backup GRUB config")?;
+ }
+
+- grubconfigs::install(&sysroot, None, Some(&vendor), true, Some(&efidir))?;
++ grubconfigs::install(&sysroot, None, Some(&vendor), true)?;
+ // Synchronize the filesystem containing /boot/efi/EFI/{vendor} to disk.
+ fsfreeze_thaw_cycle(efidir.reopen_as_ownedfd()?)?;
+
+diff --git a/src/grubconfigs.rs b/src/grubconfigs.rs
+index f06180e..476f934 100644
+--- a/src/grubconfigs.rs
++++ b/src/grubconfigs.rs
+@@ -34,7 +34,6 @@ pub(crate) fn install(
+ src_root: Option<&Dir>,
+ installed_efi_vendor: Option<&str>,
+ write_uuid: bool,
+- mounted_esp: Option<&Dir>,
+ ) -> Result<()> {
+ let bootdir = &target_root.open_dir("boot").context("Opening /boot")?;
+ let boot_is_mount = {
+@@ -44,7 +43,6 @@ pub(crate) fn install(
+ root_dev != boot_dev
+ };
+
+- // This is in /sysroot/boot
+ if !bootdir.exists(GRUB2DIR) {
+ let mut dir_options = DirBuilder::new();
+ dir_options.recursive(true).mode(0o700);
+@@ -132,16 +130,16 @@ pub(crate) fn install(
+
+ if let Some(vendordir) = installed_efi_vendor {
+ log::debug!("vendordir={:?}", &vendordir);
+- let vendor = PathBuf::from("EFI").join(vendordir);
++ let vendor = PathBuf::from(vendordir);
+ let target = &vendor.join("grub.cfg");
+-
+- if let Some(efidir) = mounted_esp {
++ let dest_efidir = target_root
++ .open_dir_optional("boot/efi/EFI")
++ .context("Opening /boot/efi/EFI")?;
++ if let Some(efidir) = dest_efidir {
+ configdir
+ .copy("grub-static-efi.cfg", &efidir, target)
+ .context("Copying static EFI")?;
+-
+ println!("Installed: {target:?}");
+-
+ if let Some(uuid_path) = uuid_path {
+ let target = &vendor.join(uuid_path);
+ grub2dir
+@@ -218,14 +216,7 @@ mod tests {
+ std::fs::create_dir_all(tdp.join("boot/grub2"))?;
+ std::fs::create_dir_all(tdp.join("boot/efi/EFI/BOOT"))?;
+ std::fs::create_dir_all(tdp.join("boot/efi/EFI/fedora"))?;
+- install(
+- &td,
+- None,
+- Some("fedora"),
+- false,
+- Some(&td.open_dir("boot/efi").unwrap()),
+- )
+- .unwrap();
++ install(&td, None, Some("fedora"), false).unwrap();
+
+ assert!(td.exists("boot/grub2/grub.cfg"));
+ assert!(td.exists("boot/efi/EFI/fedora/grub.cfg"));
+--
+2.55.0
+
diff --git a/0002-Revert-component-Add-as_any-method-for-downcasting.patch b/0002-Revert-component-Add-as_any-method-for-downcasting.patch
new file mode 100644
index 0000000..7ef29a9
--- /dev/null
+++ b/0002-Revert-component-Add-as_any-method-for-downcasting.patch
@@ -0,0 +1,66 @@
+From fa7905a4c9296e09a4daf12b73cf45dd6c226327 Mon Sep 17 00:00:00 2001
+From: Adam Williamson <awilliam@redhat.com>
+Date: Fri, 21 Aug 2026 15:08:22 -0700
+Subject: [PATCH 2/4] Revert "component: Add `as_any` method for downcasting"
+
+This reverts commit d59fb20db75c553a750b45830ddd671cd5cae702.
+---
+ src/bios.rs | 4 ----
+ src/component.rs | 3 ---
+ src/efi.rs | 4 ----
+ 3 files changed, 11 deletions(-)
+
+diff --git a/src/bios.rs b/src/bios.rs
+index a638df6..03a3408 100644
+--- a/src/bios.rs
++++ b/src/bios.rs
+@@ -99,10 +99,6 @@ impl Bios {
+ }
+
+ impl Component for Bios {
+- fn as_any(&self) -> &dyn std::any::Any {
+- self
+- }
+-
+ fn name(&self) -> &'static str {
+ self.component_type().into()
+ }
+diff --git a/src/component.rs b/src/component.rs
+index 73043c3..23a14b5 100644
+--- a/src/component.rs
++++ b/src/component.rs
+@@ -10,7 +10,6 @@ use cap_std::{ambient_authority, fs::Permissions};
+ use cap_std_ext::dirext::CapStdExtDirExt;
+ use fn_error_context::context;
+ use serde::{Deserialize, Serialize};
+-use std::any::Any;
+ use std::path::{Path, PathBuf};
+
+ use bootc_internal_blockdev::Device;
+@@ -54,8 +53,6 @@ impl std::fmt::Display for ComponentType {
+ /// handles installing bootloader files during image builds, applying updates at runtime,
+ /// and optionally adopting existing installations not originally managed by bootupd.
+ pub(crate) trait Component {
+- fn as_any(&self) -> &dyn Any;
+-
+ /// Returns the name of the component; this will be used for serialization
+ /// and should remain stable.
+ fn name(&self) -> &'static str;
+diff --git a/src/efi.rs b/src/efi.rs
+index 4c9d2cc..d1d911c 100644
+--- a/src/efi.rs
++++ b/src/efi.rs
+@@ -330,10 +330,6 @@ fn skip_systemd_bootloaders() -> bool {
+ }
+
+ impl Component for Efi {
+- fn as_any(&self) -> &dyn std::any::Any {
+- self
+- }
+-
+ fn name(&self) -> &'static str {
+ self.component_type().into()
+ }
+--
+2.55.0
+
diff --git a/0003-Revert-esp-Update-unmount-method.patch b/0003-Revert-esp-Update-unmount-method.patch
new file mode 100644
index 0000000..e156277
--- /dev/null
+++ b/0003-Revert-esp-Update-unmount-method.patch
@@ -0,0 +1,76 @@
+From 7dfcb94b589e88fc61a589ee3184fd075b018d91 Mon Sep 17 00:00:00 2001
+From: Adam Williamson <awilliam@redhat.com>
+Date: Fri, 21 Aug 2026 15:09:02 -0700
+Subject: [PATCH 3/4] Revert "esp: Update `unmount` method"
+
+This reverts commit 85053a8a72aad8082097566871a08bf5a9e4b271.
+---
+ src/efi.rs | 28 ++++++++++++++++++++++++----
+ 1 file changed, 24 insertions(+), 4 deletions(-)
+
+diff --git a/src/efi.rs b/src/efi.rs
+index d1d911c..72ac5d5 100644
+--- a/src/efi.rs
++++ b/src/efi.rs
+@@ -93,6 +93,9 @@ pub(crate) fn is_efi_booted() -> Result<bool> {
+ #[derive(Default, Debug)]
+ pub(crate) struct Efi {
+ mountpoint: RefCell<Option<PathBuf>>,
++ /// Whether the above mountpoint was already mounted or not
++ /// Won't unmount if it was already mounted
++ was_mounted: RefCell<bool>,
+ /// Guard for ESP mounted at a temporary location
+ tempmount_guard: RefCell<Option<TempMount>>,
+ }
+@@ -149,6 +152,7 @@ impl Efi {
+
+ // Only borrow mutably if we found a mount point
+ log::debug!("Reusing existing mount point {mnt:?}");
++ *self.was_mounted.borrow_mut() = true;
+ *self.mountpoint.borrow_mut() = Some(mnt.clone());
+ Ok(Some(mnt))
+ }
+@@ -159,7 +163,9 @@ impl Efi {
+ match self.search_common_esp_mountpoints(root)? {
+ Some(mnt) => {
+ log::debug!("Mounted at {:?}", mnt);
++ *self.was_mounted.borrow_mut() = true;
+ *self.mountpoint.borrow_mut() = Some(mnt.clone());
++
+ Ok(mnt)
+ }
+ None => {
+@@ -198,12 +204,26 @@ impl Efi {
+ }
+
+ pub(crate) fn unmount(&self) -> Result<()> {
+- if let Some(tmpmount) = self.tempmount_guard.borrow_mut().take() {
+- drop(tmpmount);
+- log::trace!("Dropped tempmount");
++ if *self.was_mounted.borrow() {
++ log::debug!("Mountpoint was already mounted, won't unmount");
++ return Ok(());
+ }
+
+- *self.mountpoint.borrow_mut() = None;
++ *self.was_mounted.borrow_mut() = false;
++
++ if let Some(mount) = self.mountpoint.borrow_mut().take() {
++ if let Some(tmpmount) = self.tempmount_guard.borrow_mut().take() {
++ drop(tmpmount);
++ log::trace!("Dropped tempmount");
++ return Ok(());
++ }
++
++ Command::new("umount")
++ .arg(&mount)
++ .run_inherited()
++ .with_context(|| format!("Failed to unmount {mount:?}"))?;
++ log::trace!("Unmounted");
++ }
+
+ Ok(())
+ }
+--
+2.55.0
+
diff --git a/0004-Revert-esp-TempMount-ESP-if-not-already-mounted.patch b/0004-Revert-esp-TempMount-ESP-if-not-already-mounted.patch
new file mode 100644
index 0000000..5192b89
--- /dev/null
+++ b/0004-Revert-esp-TempMount-ESP-if-not-already-mounted.patch
@@ -0,0 +1,207 @@
+From e8eeb12e79330385a15f765d1cf7ee8ac3516736 Mon Sep 17 00:00:00 2001
+From: Adam Williamson <awilliam@redhat.com>
+Date: Fri, 21 Aug 2026 15:09:07 -0700
+Subject: [PATCH 4/4] Revert "esp: TempMount ESP if not already mounted"
+
+This reverts commit 150ae3281407f315d131674e0e5cc758c4ee0746.
+---
+ src/efi.rs | 123 +++++++++++++++++++++--------------------------------
+ 1 file changed, 48 insertions(+), 75 deletions(-)
+
+diff --git a/src/efi.rs b/src/efi.rs
+index 72ac5d5..fceecd9 100644
+--- a/src/efi.rs
++++ b/src/efi.rs
+@@ -10,7 +10,6 @@ use std::path::{Path, PathBuf};
+ use std::process::Command;
+
+ use anyhow::{bail, Context, Result};
+-use bootc_internal_mount::tempmount::TempMount;
+ use bootc_internal_utils::CommandRunExt;
+ use camino::{Utf8Path, Utf8PathBuf};
+ use cap_std::ambient_authority;
+@@ -19,8 +18,6 @@ use cap_std_ext::cap_std;
+ use cap_std_ext::dirext::CapStdExtDirExt;
+ use fn_error_context::context;
+ use os_release::OsRelease;
+-use rustix::mount::MountFlags;
+-use rustix::path::Arg;
+ use rustix::{fd::AsFd, fd::BorrowedFd, fs::StatVfsMountFlags};
+ use walkdir::WalkDir;
+ use widestring::U16CString;
+@@ -96,25 +93,13 @@ pub(crate) struct Efi {
+ /// Whether the above mountpoint was already mounted or not
+ /// Won't unmount if it was already mounted
+ was_mounted: RefCell<bool>,
+- /// Guard for ESP mounted at a temporary location
+- tempmount_guard: RefCell<Option<TempMount>>,
+-}
+-
+-/// Mount flags shared by all ESP mounts: non-executable, no setuid.
+-const ESP_MOUNT_FLAGS: MountFlags =
+- MountFlags::from_bits_retain(MountFlags::NOEXEC.bits() | MountFlags::NOSUID.bits());
+-
+-/// FAT mount options: owner-only permissions on files (0600) and dirs (0700).
+-const ESP_MOUNT_DATA: &std::ffi::CStr = c"fmask=0177,dmask=0077";
+-
+-/// Mount the ESP from the provided device into a temporary directory.
+-fn mount_esp(device: &str) -> Result<TempMount> {
+- TempMount::mount_dev(device, "vfat", ESP_MOUNT_FLAGS, Some(ESP_MOUNT_DATA))
+ }
+
+ impl Efi {
+- #[context("Searching common ESP mountpoints")]
+- fn search_common_esp_mountpoints(&self, root: &Path) -> Result<Option<PathBuf>> {
++ // Get mounted point for esp
++ pub(crate) fn get_mounted_esp(&self, root: &Path) -> Result<Option<PathBuf>> {
++ // First check all potential mount points without holding the borrow
++ let mut found_mount = None;
+ for &mnt in ESP_MOUNTS.iter() {
+ let path = root.join(mnt);
+ if !path.exists() {
+@@ -134,63 +119,59 @@ impl Efi {
+ continue;
+ }
+ util::ensure_writable_mount(&path)?;
+- return Ok(Some(path));
++ *self.was_mounted.borrow_mut() = true;
++ found_mount = Some(path);
++ break;
+ }
+ }
+
+- Ok(None)
+- }
+-
+- /// Get mounted point for ESP
+- /// NOTE: This function only searches the common ESP mountpoints and returns
+- /// the path of the mountpoint, if there is one
+- #[context("Getting mounted ESP")]
+- pub(crate) fn get_mounted_esp(&self, root: &Path) -> Result<Option<PathBuf>> {
+- let Some(mnt) = self.search_common_esp_mountpoints(root)? else {
+- return Ok(None);
+- };
+-
+ // Only borrow mutably if we found a mount point
+- log::debug!("Reusing existing mount point {mnt:?}");
+- *self.was_mounted.borrow_mut() = true;
+- *self.mountpoint.borrow_mut() = Some(mnt.clone());
+- Ok(Some(mnt))
++ if let Some(mnt) = found_mount {
++ log::debug!("Reusing existing mount point {mnt:?}");
++ *self.mountpoint.borrow_mut() = Some(mnt.clone());
++ Ok(Some(mnt))
++ } else {
++ Ok(None)
++ }
+ }
+
+- /// Mount the passed esp_device, return mount point
+- #[context("Mounting ESP device at {}", root.display())]
++ // Mount the passed esp_device, return mount point
+ pub(crate) fn mount_esp_device(&self, root: &Path, esp_device: &Path) -> Result<PathBuf> {
+- match self.search_common_esp_mountpoints(root)? {
+- Some(mnt) => {
+- log::debug!("Mounted at {:?}", mnt);
+- *self.was_mounted.borrow_mut() = true;
+- *self.mountpoint.borrow_mut() = Some(mnt.clone());
++ let mut mountpoint = None;
+
+- Ok(mnt)
++ for &mnt in ESP_MOUNTS.iter() {
++ let mnt = root.join(mnt);
++ if !mnt.exists() {
++ continue;
+ }
+- None => {
+- // If the ESP isn't already mounted at /boot, /boot/efi mount it at a temporary point
+- // This is so that we don't shadow existing files in the above directories
+- let esp_mount = mount_esp(
+- esp_device
+- .as_str()
+- .context("Converting esp_device path to str")?,
+- )
+- .context("Creating temp ESP mount")?;
+-
+- let mnt_path = esp_mount.dir.path().to_path_buf();
+- *self.mountpoint.borrow_mut() = Some(mnt_path.clone());
+- *self.tempmount_guard.borrow_mut() = Some(esp_mount);
+
+- Ok(mnt_path)
++ // Check if the target is already a mounted ESP (e.g. the host
++ // already has the ESP mounted when running install-to-filesystem).
++ let st = rustix::fs::statfs(&mnt)?;
++ if st.f_type == libc::MSDOS_SUPER_MAGIC {
++ if is_mount_point(&mnt)? {
++ log::debug!("ESP already mounted at {mnt:?}, reusing");
++ mountpoint = Some(mnt);
++ *self.was_mounted.borrow_mut() = true;
++ break;
++ }
+ }
++
++ std::process::Command::new("mount")
++ .arg(&esp_device)
++ .arg(&mnt)
++ .run_inherited()
++ .with_context(|| format!("Failed to mount {:?}", esp_device))?;
++ log::debug!("Mounted at {mnt:?}");
++ mountpoint = Some(mnt);
++ break;
+ }
++ let mnt = mountpoint.ok_or_else(|| anyhow::anyhow!("No mount point found"))?;
++ *self.mountpoint.borrow_mut() = Some(mnt.clone());
++ Ok(mnt)
+ }
+
+- /// Checks if we have already mounted the ESP
+- /// If not, checks if the ESP is mounted at common mountpoints, i.e. /boot, /boot/efi
+- /// Else, mounts the ESP at a temp path
+- #[context("Ensuring mounted ESP")]
++ // Firstly check if esp is already mounted, then mount the passed esp device
+ pub(crate) fn ensure_mounted_esp(&self, root: &Path, esp_device: &Path) -> Result<PathBuf> {
+ if let Some(mountpoint) = self.mountpoint.borrow().as_deref() {
+ return Ok(mountpoint.to_owned());
+@@ -204,27 +185,14 @@ impl Efi {
+ }
+
+ pub(crate) fn unmount(&self) -> Result<()> {
+- if *self.was_mounted.borrow() {
+- log::debug!("Mountpoint was already mounted, won't unmount");
+- return Ok(());
+- }
+-
+ *self.was_mounted.borrow_mut() = false;
+-
+ if let Some(mount) = self.mountpoint.borrow_mut().take() {
+- if let Some(tmpmount) = self.tempmount_guard.borrow_mut().take() {
+- drop(tmpmount);
+- log::trace!("Dropped tempmount");
+- return Ok(());
+- }
+-
+ Command::new("umount")
+ .arg(&mount)
+ .run_inherited()
+ .with_context(|| format!("Failed to unmount {mount:?}"))?;
+ log::trace!("Unmounted");
+ }
+-
+ Ok(())
+ }
+
+@@ -783,6 +751,11 @@ impl Component for Efi {
+
+ impl Drop for Efi {
+ fn drop(&mut self) {
++ if *self.was_mounted.borrow() {
++ log::debug!("mountpoint was already mounted. Won't unmount",);
++ return;
++ }
++
+ log::debug!("Unmounting {:?}", self.mountpoint);
+ let _ = self.unmount();
+ }
+--
+2.55.0
+
diff --git a/rust-bootupd.spec b/rust-bootupd.spec
index bd8dc6b..370012e 100644
--- a/rust-bootupd.spec
+++ b/rust-bootupd.spec
@@ -11,6 +11,14 @@ License: Apache-2.0
URL: https://github.com/coreos/bootupd
Source0: %{crates_source}
Source1: %{url}/releases/download/v%{version}/bootupd-%{version}-vendor.tar.zstd
+# Revert https://github.com/coreos/bootupd/pull/1126
+# to fix UEFI installs - see
+# https://github.com/coreos/bootupd/issues/1139
+Patch: 0001-Revert-Fix-grub-static-config-install.patch
+Patch: 0002-Revert-component-Add-as_any-method-for-downcasting.patch
+Patch: 0003-Revert-esp-Update-unmount-method.patch
+Patch: 0004-Revert-esp-TempMount-ESP-if-not-already-mounted.patch
+
ExcludeArch: %{ix86}
# For now, see upstream
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-09-14 10:20 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-14 10:20 [rpms/rust-bootupd] f44: Revert PR #1139 to fix UEFI ostree installs Adam Williamson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox