From e6190e2882e1d6772a9e586fcc65c91d406e52fb Mon Sep 17 00:00:00 2001 From: Daniel Fullmer Date: Thu, 23 Apr 2020 14:47:56 -0400 Subject: [PATCH] sd-boot: fix menu ordering with boot counting systemd-boot selects the last valid entry by default, not the first. Fixes: #15256 --- docs/AUTOMATIC_BOOT_ASSESSMENT.md | 6 +++--- man/systemd-boot.xml | 6 +++--- src/boot/efi/boot.c | 16 ++++++++-------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/AUTOMATIC_BOOT_ASSESSMENT.md b/docs/AUTOMATIC_BOOT_ASSESSMENT.md index aff203b590..83ddf28fdd 100644 --- a/docs/AUTOMATIC_BOOT_ASSESSMENT.md +++ b/docs/AUTOMATIC_BOOT_ASSESSMENT.md @@ -101,9 +101,9 @@ Here's an example walkthrough of how this all fits together. 6. If this boot also fails, on the next boot the boot loader will see the tag `+0-3`, i.e. the counter reached zero. At this point the entry will be - considered "bad", and ordered to the end of the list of entries. The next - newest boot entry is now tried, i.e. the system automatically reverted back - to an earlier version. + considered "bad", and ordered to the beginning of the list of entries. The + next newest boot entry is now tried, i.e. the system automatically reverted + back to an earlier version. The above describes the walkthrough when the selected boot entry continuously fails. Let's have a look at an alternative ending to this walkthrough. In this diff --git a/man/systemd-boot.xml b/man/systemd-boot.xml index dacd49cd7b..b666ae1e53 100644 --- a/man/systemd-boot.xml +++ b/man/systemd-boot.xml @@ -476,10 +476,10 @@ considered 'good' from then on. The boot menu takes the 'tries left' counter into account when sorting the menu entries: entries in 'bad' - state are ordered at the end of the list, and entries in 'good' or 'indeterminate' at the beginning. The user can + state are ordered at the beginning of the list, and entries in 'good' or 'indeterminate' at the end. The user can freely choose to boot any entry of the menu, including those already marked 'bad'. If the menu entry to boot is - automatically determined, this means that 'good' or 'indeterminate' entries are generally preferred (as the top item of - the menu is the one booted by default), and 'bad' entries will only be considered if there are no 'good' or + automatically determined, this means that 'good' or 'indeterminate' entries are generally preferred (as the bottom + item of the menu is the one booted by default), and 'bad' entries will only be considered if there are no 'good' or 'indeterminate' entries left. The kernel-install8 kernel diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c index 380b530fd2..1fe2a2bdc3 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c @@ -1519,11 +1519,11 @@ static VOID config_load_entries( static INTN config_entry_compare(ConfigEntry *a, ConfigEntry *b) { INTN r; - /* Order entries that have no tries left to the end of the list */ + /* Order entries that have no tries left to the beginning of the list */ if (a->tries_left != 0 && b->tries_left == 0) - return -1; - if (a->tries_left == 0 && b->tries_left != 0) return 1; + if (a->tries_left == 0 && b->tries_left != 0) + return -1; r = str_verscmp(a->id, b->id); if (r != 0) @@ -1533,17 +1533,17 @@ static INTN config_entry_compare(ConfigEntry *a, ConfigEntry *b) { b->tries_left == (UINTN) -1) return 0; - /* If both items have boot counting, and otherwise are identical, put the entry with more tries left first */ + /* If both items have boot counting, and otherwise are identical, put the entry with more tries left last */ if (a->tries_left > b->tries_left) - return -1; - if (a->tries_left < b->tries_left) return 1; + if (a->tries_left < b->tries_left) + return -1; /* If they have the same number of tries left, then let the one win which was tried fewer times so far */ if (a->tries_done < b->tries_done) - return -1; - if (a->tries_done > b->tries_done) return 1; + if (a->tries_done > b->tries_done) + return -1; return 0; }