@@ -20,7 +20,7 @@ use walkdir::WalkDir;
2020use widestring:: U16CString ;
2121
2222use crate :: bootupd:: RootContext ;
23- use crate :: filetree;
23+ use crate :: { blockdev , filetree} ;
2424use crate :: model:: * ;
2525use crate :: ostreeutil;
2626use crate :: util:: { self , CommandRunExt } ;
@@ -306,7 +306,6 @@ impl Component for Efi {
306306 } )
307307 }
308308
309- // TODO: Remove dest_root; it was never actually used
310309 fn install (
311310 & self ,
312311 src_root : & openat:: Dir ,
@@ -320,18 +319,22 @@ impl Component for Efi {
320319 log:: debug!( "Found metadata {}" , meta. version) ;
321320 let srcdir_name = component_updatedirname ( self ) ;
322321 let ft = crate :: filetree:: FileTree :: new_from_dir ( & src_root. sub_dir ( & srcdir_name) ?) ?;
323- let destdir = & self . ensure_mounted_esp ( Path :: new ( dest_root) ) ?;
324-
325- let destd = & openat:: Dir :: open ( destdir)
326- . with_context ( || format ! ( "opening dest dir {}" , destdir. display( ) ) ) ?;
322+ // get esp device via /dev/disk/by-partlabel
323+ let esp_device = self
324+ . get_esp_device ( )
325+ . ok_or_else ( || anyhow:: anyhow!( "Failed to find ESP device" ) ) ?;
326+ let destpath = & self . ensure_mounted_esp ( Path :: new ( dest_root) , & esp_device) ?;
327+
328+ let destd = & openat:: Dir :: open ( destpath)
329+ . with_context ( || format ! ( "opening dest dir {}" , destpath. display( ) ) ) ?;
327330 validate_esp ( destd) ?;
328331
329332 // TODO - add some sort of API that allows directly setting the working
330333 // directory to a file descriptor.
331334 std:: process:: Command :: new ( "cp" )
332335 . args ( [ "-rp" , "--reflink=auto" ] )
333336 . arg ( & srcdir_name)
334- . arg ( destdir )
337+ . arg ( destpath )
335338 . current_dir ( format ! ( "/proc/self/fd/{}" , src_root. as_raw_fd( ) ) )
336339 . run ( ) ?;
337340 if update_firmware {
@@ -355,15 +358,31 @@ impl Component for Efi {
355358 . filetree
356359 . as_ref ( )
357360 . ok_or_else ( || anyhow:: anyhow!( "No filetree for installed EFI found!" ) ) ?;
358- let sysroot = & sysroot. sysroot ;
359- let updatemeta = self . query_update ( sysroot ) ?. expect ( "update available" ) ;
360- let updated = sysroot
361+ let sysroot_dir = & sysroot. sysroot ;
362+ let updatemeta = self . query_update ( sysroot_dir ) ?. expect ( "update available" ) ;
363+ let updated = sysroot_dir
361364 . sub_dir ( & component_updatedirname ( self ) )
362365 . context ( "opening update dir" ) ?;
363366 let updatef = filetree:: FileTree :: new_from_dir ( & updated) . context ( "reading update dir" ) ?;
364- let diff = currentf. diff ( & updatef) ?;
365- self . ensure_mounted_esp ( Path :: new ( "/" ) ) ?;
366- let destdir = self . open_esp ( ) . context ( "opening EFI dir" ) ?;
367+ let diff = currentf. diff ( & updatef) ?;
368+
369+ let Some ( esp_devices) = blockdev:: find_colocated_esps ( & sysroot. devices ) ? else {
370+ anyhow:: bail!( "Failed to find all esp devices" ) ;
371+ } ;
372+ let mut devices = esp_devices. iter ( ) ;
373+ let Some ( esp) = devices. next ( ) else {
374+ anyhow:: bail!( "Failed to find esp device" ) ;
375+ } ;
376+
377+ if let Some ( next_esp) = devices. next ( ) {
378+ anyhow:: bail!(
379+ "Found multiple esp devices {esp} and {next_esp}; not currently supported"
380+ ) ;
381+ }
382+ let destpath = & self . ensure_mounted_esp ( sysroot. path . as_ref ( ) , Path :: new ( & esp) ) ?;
383+
384+ let destdir = & openat:: Dir :: open ( & destpath. join ( "EFI" ) )
385+ . with_context ( || format ! ( "opening EFI dir {}" , destpath. display( ) ) ) ?;
367386 validate_esp ( & destdir) ?;
368387 log:: trace!( "applying diff: {}" , & diff) ;
369388 filetree:: apply_diff ( & updated, & destdir, & diff, None )
0 commit comments