|
2 | 2 |
|
3 | 3 | use crate::bootloader::Bootloader; |
4 | 4 | use crate::bootupd::list_dev_current_root; |
5 | | -use crate::efi::Efi; |
6 | 5 | use crate::freezethaw::fsfreeze_thaw_cycle; |
7 | 6 | use crate::model::SavedState; |
8 | 7 | use crate::util::SignalTerminationGuard; |
@@ -133,7 +132,24 @@ impl SavedState { |
133 | 132 | } |
134 | 133 | } |
135 | 134 |
|
| 135 | + #[cfg(any(target_arch = "powerpc64", target_arch = "s390x"))] |
136 | 136 | Bootloader::GrubCC => { |
| 137 | + let arch = if cfg!(target_arch = "powerpc64") { |
| 138 | + "powerpc64" |
| 139 | + } else { |
| 140 | + "s390x" |
| 141 | + }; |
| 142 | + |
| 143 | + anyhow::bail!("Only Grub is supported for {arch}"); |
| 144 | + } |
| 145 | + |
| 146 | + #[cfg(any( |
| 147 | + target_arch = "x86_64", |
| 148 | + target_arch = "aarch64", |
| 149 | + target_arch = "riscv64" |
| 150 | + ))] |
| 151 | + Bootloader::GrubCC => { |
| 152 | + use crate::efi::Efi; |
137 | 153 | let efi = Efi::default(); |
138 | 154 |
|
139 | 155 | let device = get_parent_device(&root)?; |
@@ -202,27 +218,54 @@ pub(crate) struct StateLockGuard { |
202 | 218 | } |
203 | 219 |
|
204 | 220 | impl StateLockGuard { |
205 | | - /// Atomically replace the on-disk state with a new version. |
| 221 | + fn write_grub_statefile(&self, state: &SavedState) -> Result<()> { |
| 222 | + let subdir = self.sysroot.open_dir(SavedState::STATEFILE_DIR)?; |
| 223 | + |
| 224 | + subdir |
| 225 | + .atomic_write_with_perms( |
| 226 | + SavedState::STATEFILE_NAME, |
| 227 | + serde_json::to_vec(state).context("Serializing state")?, |
| 228 | + Permissions::from_mode(0o644), |
| 229 | + ) |
| 230 | + .context("Writing state file")?; |
| 231 | + |
| 232 | + return Ok(()); |
| 233 | + } |
| 234 | + |
| 235 | + #[cfg(any(target_arch = "powerpc64", target_arch = "s390x"))] |
206 | 236 | #[context("Updating state")] |
207 | 237 | pub(crate) fn update_state( |
208 | 238 | &mut self, |
209 | 239 | state: &SavedState, |
210 | 240 | bootloader: Bootloader, |
211 | 241 | ) -> Result<()> { |
212 | | - if bootloader == Bootloader::Grub { |
213 | | - let subdir = self.sysroot.open_dir(SavedState::STATEFILE_DIR)?; |
| 242 | + let arch = if cfg!(target_arch = "powerpc64") { |
| 243 | + "powerpc64" |
| 244 | + } else { |
| 245 | + "s390x" |
| 246 | + }; |
214 | 247 |
|
215 | | - subdir |
216 | | - .atomic_write_with_perms( |
217 | | - SavedState::STATEFILE_NAME, |
218 | | - serde_json::to_vec(state).context("Serializing state")?, |
219 | | - Permissions::from_mode(0o644), |
220 | | - ) |
221 | | - .context("Writing state file")?; |
| 248 | + if bootloader != Bootloader::Grub { |
| 249 | + anyhow::anyhow!("Found bootloader: {bootloader}. Only Grub is supported for {arch}"); |
| 250 | + } |
222 | 251 |
|
223 | | - return Ok(()); |
| 252 | + self.write_grub_statefile(state) |
| 253 | + } |
| 254 | + |
| 255 | + /// Atomically replace the on-disk state with a new version. |
| 256 | + #[cfg(not(any(target_arch = "powerpc64", target_arch = "s390x")))] |
| 257 | + #[context("Updating state")] |
| 258 | + pub(crate) fn update_state( |
| 259 | + &mut self, |
| 260 | + state: &SavedState, |
| 261 | + bootloader: Bootloader, |
| 262 | + ) -> Result<()> { |
| 263 | + if bootloader == Bootloader::Grub { |
| 264 | + return self.write_grub_statefile(state); |
224 | 265 | } |
225 | 266 |
|
| 267 | + use crate::efi::Efi; |
| 268 | + |
226 | 269 | let device = get_parent_device(&self.sysroot)?; |
227 | 270 | let all_esps = device |
228 | 271 | .find_colocated_esps() |
|
0 commit comments