@@ -20,8 +20,8 @@ use crate::{
2020 status:: { composefs_deployment_status, get_sorted_uki_boot_entries} ,
2121 } ,
2222 composefs_consts:: {
23- BOOT_LOADER_ENTRIES , COMPOSEFS_STAGED_DEPLOYMENT_FNAME , COMPOSEFS_TRANSIENT_STATE_DIR ,
24- STATE_DIR_RELATIVE , USER_CFG_STAGED ,
23+ COMPOSEFS_STAGED_DEPLOYMENT_FNAME , COMPOSEFS_TRANSIENT_STATE_DIR , STATE_DIR_RELATIVE ,
24+ TYPE1_ENT_PATH , TYPE1_ENT_PATH_STAGED , USER_CFG_STAGED ,
2525 } ,
2626 parsers:: bls_config:: { parse_bls_config, BLSConfigType } ,
2727 spec:: { Bootloader , DeploymentEntry } ,
@@ -34,11 +34,24 @@ struct ObjectRefs {
3434}
3535
3636#[ fn_error_context:: context( "Deleting Type1 Entry {}" , depl. deployment. verity) ]
37- fn delete_type1_entries ( depl : & DeploymentEntry , boot_dir : & Dir ) -> Result < ( ) > {
37+ fn delete_type1_entries (
38+ depl : & DeploymentEntry ,
39+ boot_dir : & Dir ,
40+ deleting_staged : bool ,
41+ ) -> Result < ( ) > {
42+ let entries_dir_path = if deleting_staged {
43+ TYPE1_ENT_PATH_STAGED
44+ } else {
45+ TYPE1_ENT_PATH
46+ } ;
47+
3848 let entries_dir = boot_dir
39- . open_dir ( BOOT_LOADER_ENTRIES )
49+ . open_dir ( entries_dir_path )
4050 . context ( "Opening entries dir" ) ?;
4151
52+ // We reuse kernel + initrd if they're the same for two deployments
53+ // We don't want to delete the (being deleted) deployment's kernel + initrd
54+ // if it's in use by any other deployment
4255 let should_del_kernel = match & depl. deployment . boot_digest {
4356 Some ( digest) => find_vmlinuz_initrd_duplicates ( & digest) ?
4457 . is_some_and ( |vec| vec. iter ( ) . any ( |digest| * digest != depl. deployment . verity ) ) ,
@@ -97,6 +110,12 @@ fn delete_type1_entries(depl: &DeploymentEntry, boot_dir: &Dir) -> Result<()> {
97110 }
98111 }
99112
113+ if deleting_staged {
114+ boot_dir
115+ . remove_dir_all ( TYPE1_ENT_PATH_STAGED )
116+ . context ( "Removing staged entries dir" ) ?;
117+ }
118+
100119 Ok ( ( ) )
101120}
102121
@@ -158,7 +177,15 @@ fn delete_uki(uki_id: &str, esp_mnt: &Dir) -> Result<()> {
158177}
159178
160179#[ fn_error_context:: context( "Removing Grub Menuentry" ) ]
161- fn remove_grub_menucfg_entry ( id : & str , boot_dir : & Dir ) -> Result < ( ) > {
180+ fn remove_grub_menucfg_entry ( id : & str , boot_dir : & Dir , deleting_staged : bool ) -> Result < ( ) > {
181+ let grub_dir = boot_dir. open_dir ( "grub2" ) . context ( "Opening grub2" ) ?;
182+
183+ if deleting_staged {
184+ return grub_dir
185+ . remove_file ( USER_CFG_STAGED )
186+ . context ( "Deleting staged Menuentry" ) ;
187+ }
188+
162189 let mut string = String :: new ( ) ;
163190 let menuentries = get_sorted_uki_boot_entries ( boot_dir, & mut string) ?;
164191
@@ -174,8 +201,6 @@ fn remove_grub_menucfg_entry(id: &str, boot_dir: &Dir) -> Result<()> {
174201 buffer. write_all ( entry. to_string ( ) . as_bytes ( ) ) ?;
175202 }
176203
177- let grub_dir = boot_dir. open_dir ( "grub2" ) . context ( "Opening grub2" ) ?;
178-
179204 grub_dir
180205 . atomic_write ( USER_CFG_STAGED , buffer)
181206 . with_context ( || format ! ( "Writing to {USER_CFG_STAGED}" ) ) ?;
@@ -192,7 +217,7 @@ fn delete_depl_boot_entries(deployment: &DeploymentEntry, deleting_staged: bool)
192217 . context ( "Opening boot dir" ) ?;
193218
194219 match deployment. deployment . boot_type {
195- BootType :: Bls => delete_type1_entries ( deployment, & boot_dir) ,
220+ BootType :: Bls => delete_type1_entries ( deployment, & boot_dir, deleting_staged ) ,
196221
197222 BootType :: Uki => {
198223 let device = get_sysroot_parent_dev ( ) ?;
@@ -201,7 +226,11 @@ fn delete_depl_boot_entries(deployment: &DeploymentEntry, deleting_staged: bool)
201226
202227 delete_uki ( & deployment. deployment . verity , & esp_mount. fd ) ?;
203228
204- remove_grub_menucfg_entry ( & deployment. deployment . verity , & boot_dir)
229+ remove_grub_menucfg_entry (
230+ & deployment. deployment . verity ,
231+ & boot_dir,
232+ deleting_staged,
233+ )
205234 }
206235 }
207236 }
@@ -213,7 +242,7 @@ fn delete_depl_boot_entries(deployment: &DeploymentEntry, deleting_staged: bool)
213242 let esp_mount = TempMount :: mount_dev ( & esp_part) ?;
214243
215244 // For Systemd UKI as well, we use .conf files
216- delete_type1_entries ( deployment, & esp_mount. fd )
245+ delete_type1_entries ( deployment, & esp_mount. fd , deleting_staged )
217246 }
218247 }
219248}
0 commit comments