mirror of
https://github.com/systemd/systemd
synced 2024-10-04 15:21:01 +00:00
hibernate-resume-config: expose get_efi_hibernate_location
This commit is contained in:
parent
667b0c48f2
commit
9fa0f584ec
|
@ -28,20 +28,7 @@ static KernelHibernateLocation* kernel_hibernate_location_free(KernelHibernateLo
|
|||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(KernelHibernateLocation*, kernel_hibernate_location_free);
|
||||
|
||||
typedef struct EFIHibernateLocation {
|
||||
char *device;
|
||||
|
||||
sd_id128_t uuid;
|
||||
uint64_t offset;
|
||||
|
||||
char *kernel_version;
|
||||
char *id;
|
||||
char *image_id;
|
||||
char *version_id;
|
||||
char *image_version;
|
||||
} EFIHibernateLocation;
|
||||
|
||||
static EFIHibernateLocation* efi_hibernate_location_free(EFIHibernateLocation *e) {
|
||||
EFIHibernateLocation* efi_hibernate_location_free(EFIHibernateLocation *e) {
|
||||
if (!e)
|
||||
return NULL;
|
||||
|
||||
|
@ -55,8 +42,6 @@ static EFIHibernateLocation* efi_hibernate_location_free(EFIHibernateLocation *e
|
|||
return mfree(e);
|
||||
}
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(EFIHibernateLocation*, efi_hibernate_location_free);
|
||||
|
||||
void hibernate_info_done(HibernateInfo *info) {
|
||||
assert(info);
|
||||
|
||||
|
@ -140,7 +125,7 @@ static bool validate_efi_hibernate_location(EFIHibernateLocation *e) {
|
|||
|
||||
if (!streq_ptr(id, e->id) ||
|
||||
!streq_ptr(image_id, e->image_id)) {
|
||||
log_notice("HibernateLocation system identifier doesn't match currently running system, not resuming from it.");
|
||||
log_notice("HibernateLocation system identifier doesn't match currently running system, would not resume from it.");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -152,8 +137,9 @@ static bool validate_efi_hibernate_location(EFIHibernateLocation *e) {
|
|||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int get_efi_hibernate_location(EFIHibernateLocation **ret) {
|
||||
int get_efi_hibernate_location(EFIHibernateLocation **ret) {
|
||||
|
||||
static const JsonDispatch dispatch_table[] = {
|
||||
{ "uuid", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(EFIHibernateLocation, uuid), JSON_MANDATORY },
|
||||
|
@ -171,8 +157,6 @@ static int get_efi_hibernate_location(EFIHibernateLocation **ret) {
|
|||
_cleanup_free_ char *location_str = NULL;
|
||||
int r;
|
||||
|
||||
assert(ret);
|
||||
|
||||
if (!is_efi_boot())
|
||||
goto skip;
|
||||
|
||||
|
@ -211,15 +195,18 @@ static int get_efi_hibernate_location(EFIHibernateLocation **ret) {
|
|||
if (asprintf(&e->device, "/dev/disk/by-uuid/" SD_ID128_UUID_FORMAT_STR, SD_ID128_FORMAT_VAL(e->uuid)) < 0)
|
||||
return log_oom();
|
||||
|
||||
*ret = TAKE_PTR(e);
|
||||
if (ret)
|
||||
*ret = TAKE_PTR(e);
|
||||
return 1;
|
||||
|
||||
skip:
|
||||
*ret = NULL;
|
||||
if (ret)
|
||||
*ret = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void compare_hibernate_location_and_warn(const HibernateInfo *info) {
|
||||
#if ENABLE_EFI
|
||||
int r;
|
||||
|
||||
assert(info);
|
||||
|
@ -243,8 +230,8 @@ void compare_hibernate_location_and_warn(const HibernateInfo *info) {
|
|||
if (info->cmdline->offset != info->efi->offset)
|
||||
log_warning("resume_offset=%" PRIu64 " doesn't match with EFI HibernateLocation offset %" PRIu64 ", proceeding anyway with resume_offset=.",
|
||||
info->cmdline->offset, info->efi->offset);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int acquire_hibernate_info(HibernateInfo *ret) {
|
||||
_cleanup_(hibernate_info_done) HibernateInfo i = {};
|
||||
|
@ -254,11 +241,9 @@ int acquire_hibernate_info(HibernateInfo *ret) {
|
|||
if (r < 0)
|
||||
return r;
|
||||
|
||||
#if ENABLE_EFI
|
||||
r = get_efi_hibernate_location(&i.efi);
|
||||
if (r < 0)
|
||||
return r;
|
||||
#endif
|
||||
|
||||
if (i.cmdline) {
|
||||
i.device = i.cmdline->device;
|
||||
|
|
|
@ -5,8 +5,27 @@
|
|||
|
||||
#include "sd-id128.h"
|
||||
|
||||
#include "macro.h"
|
||||
|
||||
typedef struct KernelHibernateLocation KernelHibernateLocation;
|
||||
typedef struct EFIHibernateLocation EFIHibernateLocation;
|
||||
|
||||
typedef struct EFIHibernateLocation {
|
||||
char *device;
|
||||
|
||||
sd_id128_t uuid;
|
||||
uint64_t offset;
|
||||
|
||||
char *kernel_version;
|
||||
char *id;
|
||||
char *image_id;
|
||||
char *version_id;
|
||||
char *image_version;
|
||||
} EFIHibernateLocation;
|
||||
|
||||
EFIHibernateLocation* efi_hibernate_location_free(EFIHibernateLocation *e);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(EFIHibernateLocation*, efi_hibernate_location_free);
|
||||
|
||||
int get_efi_hibernate_location(EFIHibernateLocation **ret);
|
||||
|
||||
typedef struct HibernateInfo {
|
||||
const char *device;
|
||||
|
@ -20,14 +39,4 @@ void hibernate_info_done(HibernateInfo *info);
|
|||
|
||||
int acquire_hibernate_info(HibernateInfo *ret);
|
||||
|
||||
#if ENABLE_EFI
|
||||
|
||||
void compare_hibernate_location_and_warn(const HibernateInfo *info);
|
||||
|
||||
#else
|
||||
|
||||
static inline void compare_hibernate_location_and_warn(const HibernateInfo *info) {
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue