@ -175,25 +175,44 @@ static const struct efi_block_io block_io_disk_template = {
} ;
/*
* Find filesystem from a device - path . The passed in path ' p ' probably
* contains one or more / File ( name ) nodes , so the comparison stops at
* the first / File ( ) node , and returns the pointer to that via ' rp ' .
* This is mostly intended to be a helper to map a device - path to an
* efi_file_handle object .
* Get the simple file system protocol for a file device path .
*
* The full path provided is split into device part and into a file
* part . The device part is used to find the handle on which the
* simple file system protocol is installed .
*
* @ full_path device path including device and file
* @ return simple file system protocol
*/
struct efi_simple_file_system_protocol *
efi_fs_from_path ( struct efi_device_path * fp )
efi_fs_from_path ( struct efi_device_path * full_ path )
{
struct efi_object * efiobj ;
struct efi_disk_obj * diskobj ;
struct efi_handler * handler ;
struct efi_device_path * device_path ;
struct efi_device_path * file_path ;
efi_status_t ret ;
efiobj = efi_dp_find_obj ( fp , NULL ) ;
/* Split the path into a device part and a file part */
ret = efi_dp_split_file_path ( full_path , & device_path , & file_path ) ;
if ( ret ! = EFI_SUCCESS )
return NULL ;
efi_free_pool ( file_path ) ;
/* Get the EFI object for the partition */
efiobj = efi_dp_find_obj ( device_path , NULL ) ;
efi_free_pool ( device_path ) ;
if ( ! efiobj )
return NULL ;
diskobj = container_of ( efiobj , struct efi_disk_obj , parent ) ;
/* Find the simple file system protocol */
ret = efi_search_protocol ( efiobj , & efi_simple_file_system_protocol_guid ,
& handler ) ;
if ( ret ! = EFI_SUCCESS )
return NULL ;
return diskobj - > volume ;
/* Return the simple file system protocol for the partition */
return handler - > protocol_interface ;
}
/*