Skip to content

Commit f27bc36

Browse files
composefs-backend: Deleting staged deployment
Signed-off-by: Pragyan Poudyal <[email protected]>
1 parent 55bad42 commit f27bc36

File tree

1 file changed

+39
-10
lines changed

1 file changed

+39
-10
lines changed

crates/lib/src/bootc_composefs/delete.rs

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)