diff --git a/debian/patches/sd-boot-fix-menu-ordering-with-boot-counting.patch b/debian/patches/sd-boot-fix-menu-ordering-with-boot-counting.patch new file mode 100644 index 0000000000000000000000000000000000000000..d9cf2d9c9531219a3d366c6bb2ae8679f1cf3ef8 --- /dev/null +++ b/debian/patches/sd-boot-fix-menu-ordering-with-boot-counting.patch @@ -0,0 +1,86 @@ +From e6190e2882e1d6772a9e586fcc65c91d406e52fb Mon Sep 17 00:00:00 2001 +From: Daniel Fullmer <danielrf12@gmail.com> +Date: Thu, 23 Apr 2020 14:47:56 -0400 +Subject: sd-boot: fix menu ordering with boot counting + +systemd-boot selects the last valid entry by default, not the first. + +Fixes: #15256 + +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 +@@ -99,9 +99,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 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 +@@ -391,10 +391,10 @@ + considered 'good' from then on.</para> + + <para>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.</para> + + <para>The <citerefentry><refentrytitle>kernel-install</refentrytitle><manvolnum>8</manvolnum></citerefentry> 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 +@@ -1479,11 +1479,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) +@@ -1493,17 +1493,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; + } diff --git a/debian/patches/series b/debian/patches/series index 77b26816e56ed704075cc435f3cd070d30bf03e1..cc677bc417c49a2bef9ce96c6059294876e40e18 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -80,3 +80,4 @@ apertis/journalctl-port-flush-sync-rotate-to-use-varlink-method-c.patch apertis/journald-add-API-to-move-logging-from-var-to-run-again.patch apertis/journalctl-add-new-relinquish-and-smart-relinquish-option.patch apertis/units-automatically-revert-to-run-logging-on-shutdown-if-.patch +sd-boot-fix-menu-ordering-with-boot-counting.patch