Skip to content

Commit d5e71a9

Browse files
committed
adopt_and_update(): pass sysroot as parameter
Remove duplicated sysroot as `openat::Dir::open("/")` and pass as a parameter
1 parent ae87d30 commit d5e71a9

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

src/bootupd.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,7 @@ pub(crate) fn update(name: &str, sysroot: &openat::Dir) -> Result<ComponentUpdat
256256
}
257257

258258
/// daemon implementation of component adoption
259-
pub(crate) fn adopt_and_update(name: &str) -> Result<ContentMetadata> {
260-
let sysroot = openat::Dir::open("/")?;
259+
pub(crate) fn adopt_and_update(name: &str, sysroot: &openat::Dir) -> Result<ContentMetadata> {
261260
let mut state = SavedState::load_from_disk("/")?.unwrap_or_default();
262261
let component = component::new_from_name(name)?;
263262
if state.installed.contains_key(name) {
@@ -269,6 +268,7 @@ pub(crate) fn adopt_and_update(name: &str) -> Result<ContentMetadata> {
269268
let Some(update) = component.query_update(&sysroot)? else {
270269
anyhow::bail!("Component {} has no available update", name);
271270
};
271+
let sysroot = sysroot.try_clone()?;
272272
let mut state_guard =
273273
SavedState::acquire_write_lock(sysroot).context("Failed to acquire write lock")?;
274274

@@ -449,7 +449,7 @@ pub(crate) fn client_run_update(sysroot: &openat::Dir) -> Result<()> {
449449
}
450450
for (name, adoptable) in status.adoptable.iter() {
451451
if adoptable.confident {
452-
let r: ContentMetadata = adopt_and_update(name)?;
452+
let r: ContentMetadata = adopt_and_update(name, sysroot)?;
453453
println!("Adopted and updated: {}: {}", name, r.version);
454454
updated = true;
455455
} else {
@@ -462,13 +462,13 @@ pub(crate) fn client_run_update(sysroot: &openat::Dir) -> Result<()> {
462462
Ok(())
463463
}
464464

465-
pub(crate) fn client_run_adopt_and_update() -> Result<()> {
465+
pub(crate) fn client_run_adopt_and_update(sysroot: &openat::Dir) -> Result<()> {
466466
let status: Status = status()?;
467467
if status.adoptable.is_empty() {
468468
println!("No components are adoptable.");
469469
} else {
470470
for (name, _) in status.adoptable.iter() {
471-
let r: ContentMetadata = adopt_and_update(name)?;
471+
let r: ContentMetadata = adopt_and_update(name, sysroot)?;
472472
println!("Adopted and updated: {}: {}", name, r.version);
473473
}
474474
}

src/cli/bootupctl.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,14 @@ impl CtlCommand {
143143
/// Runner for `update` verb.
144144
fn run_adopt_and_update() -> Result<()> {
145145
ensure_running_in_systemd()?;
146-
bootupd::client_run_adopt_and_update()
146+
let sysroot = openat::Dir::open("/").context("Opening root dir")?;
147+
let dest_fd = format!("/proc/self/fd/{}", sysroot.as_raw_fd());
148+
let dest_root = std::fs::read_link(dest_fd)?;
149+
150+
let devices = crate::blockdev::get_devices(&dest_root)
151+
.with_context(|| "while looking for parent devices")?;
152+
crate::blockdev::init_parent_devices(devices);
153+
bootupd::client_run_adopt_and_update(&sysroot)
147154
}
148155

149156
/// Runner for `validate` verb.

0 commit comments

Comments
 (0)