@@ -745,35 +745,36 @@ pub(crate) async fn stage(
745
745
#[ context( "Rolling back UKI" ) ]
746
746
pub ( crate ) fn rollback_composefs_uki ( current : & BootEntry , rollback : & BootEntry ) -> Result < ( ) > {
747
747
let user_cfg_name = "grub2/user.cfg.staged" ;
748
- let user_cfg_path = PathBuf :: from ( "/sysroot/boot" ) . join ( user_cfg_name) ;
748
+ let user_cfg_path = PathBuf :: from ( "boot" ) . join ( user_cfg_name) ;
749
+ let sysroot = & Dir :: open_ambient_dir ( "/sysroot" , cap_std:: ambient_authority ( ) ) ?;
749
750
750
751
let efi_uuid_source = get_efi_uuid_source ( ) ;
751
752
752
- // TODO: Need to check if user.cfg.staged exists
753
- let mut usr_cfg = std:: fs:: OpenOptions :: new ( )
754
- . write ( true )
755
- . create ( true )
756
- . truncate ( true )
757
- . open ( user_cfg_path)
758
- . with_context ( || format ! ( "Opening {user_cfg_name}" ) ) ?;
759
-
760
- usr_cfg. write ( efi_uuid_source. as_bytes ( ) ) ?;
761
-
762
- let verity = if let Some ( composefs) = & rollback. composefs {
753
+ let rollback_verity = if let Some ( composefs) = & rollback. composefs {
763
754
composefs. verity . clone ( )
764
755
} else {
765
756
// Shouldn't really happen
766
757
anyhow:: bail!( "Verity not found for rollback deployment" )
767
758
} ;
768
- usr_cfg . write ( get_user_config ( todo ! ( ) , & verity ) . as_bytes ( ) ) ? ;
759
+ let rollback_config = get_user_config ( todo ! ( ) , & rollback_verity ) . as_bytes ( ) ;
769
760
770
- let verity = if let Some ( composefs) = & current. composefs {
761
+ let current_verity = if let Some ( composefs) = & current. composefs {
771
762
composefs. verity . clone ( )
772
763
} else {
773
764
// Shouldn't really happen
774
765
anyhow:: bail!( "Verity not found for booted deployment" )
775
766
} ;
776
- usr_cfg. write ( get_user_config ( todo ! ( ) , & verity) . as_bytes ( ) ) ?;
767
+ let current_config = get_user_config ( todo ! ( ) , & current_verity) . as_bytes ( ) ;
768
+
769
+ // TODO: Need to check if user.cfg.staged exists
770
+ sysroot
771
+ . atomic_replace_with ( user_cfg_path, |w| {
772
+ write ! ( w, "{efi_uuid_source}" ) ?;
773
+ w. write_all ( rollback_config) ?;
774
+ w. write_all ( current_config) ?;
775
+ Ok ( ( ) )
776
+ } )
777
+ . with_context ( || format ! ( "Writing {user_cfg_name}" ) ) ?;
777
778
778
779
Ok ( ( ) )
779
780
}
0 commit comments