@@ -215,16 +215,15 @@ fn ensure_writable_boot() -> Result<()> {
215
215
}
216
216
217
217
/// daemon implementation of component update
218
- pub ( crate ) fn update ( name : & str ) -> Result < ComponentUpdateResult > {
218
+ pub ( crate ) fn update ( name : & str , sysroot : & openat :: Dir ) -> Result < ComponentUpdateResult > {
219
219
let mut state = SavedState :: load_from_disk ( "/" ) ?. unwrap_or_default ( ) ;
220
220
let component = component:: new_from_name ( name) ?;
221
221
let inst = if let Some ( inst) = state. installed . get ( name) {
222
222
inst. clone ( )
223
223
} else {
224
224
anyhow:: bail!( "Component {} is not installed" , name) ;
225
225
} ;
226
- let sysroot = openat:: Dir :: open ( "/" ) ?;
227
- let update = component. query_update ( & sysroot) ?;
226
+ let update = component. query_update ( sysroot) ?;
228
227
let update = match update. as_ref ( ) {
229
228
Some ( p) if inst. meta . can_upgrade_to ( p) => p,
230
229
_ => return Ok ( ComponentUpdateResult :: AtLatestVersion ) ,
@@ -235,6 +234,7 @@ pub(crate) fn update(name: &str) -> Result<ComponentUpdateResult> {
235
234
let mut pending_container = state. pending . take ( ) . unwrap_or_default ( ) ;
236
235
let interrupted = pending_container. get ( component. name ( ) ) . cloned ( ) ;
237
236
pending_container. insert ( component. name ( ) . into ( ) , update. clone ( ) ) ;
237
+ let sysroot = sysroot. try_clone ( ) ?;
238
238
let mut state_guard =
239
239
SavedState :: acquire_write_lock ( sysroot) . context ( "Failed to acquire write lock" ) ?;
240
240
state_guard
@@ -256,8 +256,7 @@ pub(crate) fn update(name: &str) -> Result<ComponentUpdateResult> {
256
256
}
257
257
258
258
/// 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 > {
261
260
let mut state = SavedState :: load_from_disk ( "/" ) ?. unwrap_or_default ( ) ;
262
261
let component = component:: new_from_name ( name) ?;
263
262
if state. installed . contains_key ( name) {
@@ -269,6 +268,7 @@ pub(crate) fn adopt_and_update(name: &str) -> Result<ContentMetadata> {
269
268
let Some ( update) = component. query_update ( & sysroot) ? else {
270
269
anyhow:: bail!( "Component {} has no available update" , name) ;
271
270
} ;
271
+ let sysroot = sysroot. try_clone ( ) ?;
272
272
let mut state_guard =
273
273
SavedState :: acquire_write_lock ( sysroot) . context ( "Failed to acquire write lock" ) ?;
274
274
@@ -408,7 +408,7 @@ pub(crate) fn print_status(status: &Status) -> Result<()> {
408
408
Ok ( ( ) )
409
409
}
410
410
411
- pub ( crate ) fn client_run_update ( ) -> Result < ( ) > {
411
+ pub ( crate ) fn client_run_update ( sysroot : & openat :: Dir ) -> Result < ( ) > {
412
412
crate :: try_fail_point!( "update" ) ;
413
413
let status: Status = status ( ) ?;
414
414
if status. components . is_empty ( ) && status. adoptable . is_empty ( ) {
@@ -421,7 +421,7 @@ pub(crate) fn client_run_update() -> Result<()> {
421
421
ComponentUpdatable :: Upgradable => { }
422
422
_ => continue ,
423
423
} ;
424
- match update ( name) ? {
424
+ match update ( name, sysroot ) ? {
425
425
ComponentUpdateResult :: AtLatestVersion => {
426
426
// Shouldn't happen unless we raced with another client
427
427
eprintln ! (
@@ -449,7 +449,7 @@ pub(crate) fn client_run_update() -> Result<()> {
449
449
}
450
450
for ( name, adoptable) in status. adoptable . iter ( ) {
451
451
if adoptable. confident {
452
- let r: ContentMetadata = adopt_and_update ( name) ?;
452
+ let r: ContentMetadata = adopt_and_update ( name, sysroot ) ?;
453
453
println ! ( "Adopted and updated: {}: {}" , name, r. version) ;
454
454
updated = true ;
455
455
} else {
@@ -462,13 +462,13 @@ pub(crate) fn client_run_update() -> Result<()> {
462
462
Ok ( ( ) )
463
463
}
464
464
465
- pub ( crate ) fn client_run_adopt_and_update ( ) -> Result < ( ) > {
465
+ pub ( crate ) fn client_run_adopt_and_update ( sysroot : & openat :: Dir ) -> Result < ( ) > {
466
466
let status: Status = status ( ) ?;
467
467
if status. adoptable . is_empty ( ) {
468
468
println ! ( "No components are adoptable." ) ;
469
469
} else {
470
470
for ( name, _) in status. adoptable . iter ( ) {
471
- let r: ContentMetadata = adopt_and_update ( name) ?;
471
+ let r: ContentMetadata = adopt_and_update ( name, sysroot ) ?;
472
472
println ! ( "Adopted and updated: {}: {}" , name, r. version) ;
473
473
}
474
474
}
@@ -656,7 +656,8 @@ mod tests {
656
656
fn test_failpoint_update ( ) {
657
657
let guard = fail:: FailScenario :: setup ( ) ;
658
658
fail:: cfg ( "update" , "return" ) . unwrap ( ) ;
659
- let r = client_run_update ( ) ;
659
+ let sysroot = openat:: Dir :: open ( "/" ) . expect ( "open /" ) ;
660
+ let r = client_run_update ( & sysroot) ;
660
661
assert_eq ! ( r. is_err( ) , true ) ;
661
662
guard. teardown ( ) ;
662
663
}
0 commit comments