Skip to content

Commit 45f4ed5

Browse files
authored
Merge pull request coreos#928 from HuijingHei/reuse-parent-devices
update: pass `RootContext` to `run_update()`
2 parents 3a0b897 + 36d3a9a commit 45f4ed5

File tree

4 files changed

+26
-16
lines changed

4 files changed

+26
-16
lines changed

src/bios.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ use anyhow::{bail, Result};
22
#[cfg(target_arch = "powerpc64")]
33
use std::borrow::Cow;
44
use std::io::prelude::*;
5-
use std::os::unix::io::AsRawFd;
65
use std::path::Path;
76
use std::process::Command;
87

98
use crate::blockdev;
9+
use crate::bootupd::RootContext;
1010
use crate::component::*;
1111
use crate::model::*;
1212
use crate::packagesystem;
@@ -176,15 +176,24 @@ impl Component for Bios {
176176
get_component_update(sysroot, self)
177177
}
178178

179-
fn run_update(&self, sysroot: &openat::Dir, _: &InstalledContent) -> Result<InstalledContent> {
180-
let updatemeta = self.query_update(sysroot)?.expect("update available");
181-
let dest_fd = format!("/proc/self/fd/{}", sysroot.as_raw_fd());
182-
let dest_root = std::fs::read_link(dest_fd)?;
183-
let device = blockdev::get_single_device(&dest_root)?;
179+
fn run_update(&self, sysroot: &RootContext, _: &InstalledContent) -> Result<InstalledContent> {
180+
let updatemeta = self
181+
.query_update(&sysroot.sysroot)?
182+
.expect("update available");
184183

185-
let dest_root = dest_root.to_string_lossy().into_owned();
186-
self.run_grub_install(&dest_root, &device)?;
187-
log::debug!("Install grub modules on {device}");
184+
let mut parent_devices = sysroot.devices.iter();
185+
let Some(parent) = parent_devices.next() else {
186+
anyhow::bail!("Failed to find parent device");
187+
};
188+
189+
if let Some(next) = parent_devices.next() {
190+
anyhow::bail!(
191+
"Found multiple parent devices {parent} and {next}; not currently supported"
192+
);
193+
}
194+
195+
self.run_grub_install(sysroot.path.as_str(), &parent)?;
196+
log::debug!("Install grub modules on {parent}");
188197

189198
let adopted_from = None;
190199
Ok(InstalledContent {

src/bootupd.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ fn ensure_writable_boot() -> Result<()> {
217217

218218
/// daemon implementation of component update
219219
pub(crate) fn update(name: &str, rootcxt: &RootContext) -> Result<ComponentUpdateResult> {
220-
let mut state = SavedState::load_from_disk(&rootcxt.path)?.unwrap_or_default();
220+
let mut state = SavedState::load_from_disk("/")?.unwrap_or_default();
221221
let component = component::new_from_name(name)?;
222222
let inst = if let Some(inst) = state.installed.get(name) {
223223
inst.clone()
@@ -244,7 +244,7 @@ pub(crate) fn update(name: &str, rootcxt: &RootContext) -> Result<ComponentUpdat
244244
.context("Failed to update state")?;
245245

246246
let newinst = component
247-
.run_update(&state_guard.sysroot, &inst)
247+
.run_update(rootcxt, &inst)
248248
.with_context(|| format!("Failed to update {}", component.name()))?;
249249
state.installed.insert(component.name().into(), newinst);
250250
pending_container.remove(component.name());
@@ -260,7 +260,7 @@ pub(crate) fn update(name: &str, rootcxt: &RootContext) -> Result<ComponentUpdat
260260
/// daemon implementation of component adoption
261261
pub(crate) fn adopt_and_update(name: &str, rootcxt: &RootContext) -> Result<ContentMetadata> {
262262
let sysroot = &rootcxt.sysroot;
263-
let mut state = SavedState::load_from_disk(&rootcxt.path)?.unwrap_or_default();
263+
let mut state = SavedState::load_from_disk("/")?.unwrap_or_default();
264264
let component = component::new_from_name(name)?;
265265
if state.installed.contains_key(name) {
266266
anyhow::bail!("Component {} is already installed", name);
@@ -414,7 +414,6 @@ pub(crate) fn print_status(status: &Status) -> Result<()> {
414414
pub struct RootContext {
415415
pub sysroot: openat::Dir,
416416
pub path: Utf8PathBuf,
417-
#[allow(dead_code)]
418417
pub devices: Vec<String>,
419418
}
420419

src/component.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use openat_ext::OpenatDirExt;
1010
use serde::{Deserialize, Serialize};
1111
use std::path::{Path, PathBuf};
1212

13-
use crate::model::*;
13+
use crate::{bootupd::RootContext, model::*};
1414

1515
#[derive(Serialize, Deserialize, Debug)]
1616
#[serde(rename_all = "kebab-case")]
@@ -66,7 +66,7 @@ pub(crate) trait Component {
6666
/// Used on the client to run an update.
6767
fn run_update(
6868
&self,
69-
sysroot: &openat::Dir,
69+
sysroot: &RootContext,
7070
current: &InstalledContent,
7171
) -> Result<InstalledContent>;
7272

src/efi.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use rustix::fd::BorrowedFd;
1919
use walkdir::WalkDir;
2020
use widestring::U16CString;
2121

22+
use crate::bootupd::RootContext;
2223
use crate::filetree;
2324
use crate::model::*;
2425
use crate::ostreeutil;
@@ -330,13 +331,14 @@ impl Component for Efi {
330331

331332
fn run_update(
332333
&self,
333-
sysroot: &openat::Dir,
334+
sysroot: &RootContext,
334335
current: &InstalledContent,
335336
) -> Result<InstalledContent> {
336337
let currentf = current
337338
.filetree
338339
.as_ref()
339340
.ok_or_else(|| anyhow::anyhow!("No filetree for installed EFI found!"))?;
341+
let sysroot = &sysroot.sysroot;
340342
let updatemeta = self.query_update(sysroot)?.expect("update available");
341343
let updated = sysroot
342344
.sub_dir(&component_updatedirname(self))

0 commit comments

Comments
 (0)