]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
base-files: MAJOR/MINOR not sequential, use DISKSEQ instead 18962/head
authorClemens Hopfer <openwrt@wireloss.net>
Fri, 30 May 2025 12:03:40 +0000 (14:03 +0200)
committerRobert Marko <robimarko@gmail.com>
Fri, 3 Apr 2026 18:40:49 +0000 (20:40 +0200)
Export the unique, monotonic DISKSEQ sequence drive number instead of its
major/minor numbers to identify the boot disk and directly match the partition
in export_partdevice with PARTN.

The MINOR blockdevice numbers are not guaranteed sequential across disks, it
can happen that disks enumerate before their partitions are probed, resulting
in interleaved MINOR numbers breaking the partition offset calculation:

major minor  #blocks  name
 259        0  250059096 nvme0n1
 259        2       8192 nvme0n1p1
 259        3     491520 nvme0n1p2
 259        4        239 nvme0n1p128
 259        1  250059096 nvme1n1
 259        5  250057728 nvme1n1p1

Signed-off-by: Clemens Hopfer <openwrt@wireloss.net>
Link: https://github.com/openwrt/openwrt/pull/18962
Signed-off-by: Robert Marko <robimarko@gmail.com>
package/base-files/files/lib/upgrade/common.sh
target/linux/stm32/base-files/lib/upgrade/platform.sh

index af1182cb16a383afb978138434f80ceac57f41d9..ba2e364775d628c5410150cbe72f0a4fb9d39db1 100644 (file)
@@ -167,7 +167,7 @@ part_magic_fat() {
 
 export_bootdevice() {
        local cmdline uuid blockdev uevent line class
-       local MAJOR MINOR DEVNAME DEVTYPE
+       local MAJOR MINOR DEVNAME DEVTYPE DISKSEQ PARTN
        local rootpart="$(cmdline_get_var root)"
 
        case "$rootpart" in
@@ -216,8 +216,7 @@ export_bootdevice() {
                while read line; do
                        export -n "$line"
                done < "$uevent"
-               export BOOTDEV_MAJOR=$MAJOR
-               export BOOTDEV_MINOR=$MINOR
+               export BOOTDEV_DISKSEQ=$DISKSEQ
                return 0
        fi
 
@@ -225,16 +224,18 @@ export_bootdevice() {
 }
 
 export_partdevice() {
-       local var="$1" offset="$2"
-       local uevent line MAJOR MINOR DEVNAME DEVTYPE
+       local var="$1" partn="$2"
+       local uevent line MAJOR MINOR DEVNAME DEVTYPE DISKSEQ PARTN
 
        for uevent in /sys/class/block/*/uevent; do
                while read line; do
                        export -n "$line"
                done < "$uevent"
-               if [ "$BOOTDEV_MAJOR" = "$MAJOR" -a $(($BOOTDEV_MINOR + $offset)) = "$MINOR" -a -b "/dev/$DEVNAME" ]; then
-                       export "$var=$DEVNAME"
-                       return 0
+               if [ "$BOOTDEV_DISKSEQ" = "$DISKSEQ" -a -b "/dev/$DEVNAME" ]; then
+                       if [ "$PARTN" = "$partn" -a "$DEVTYPE" = "partition" ] || [ "$partn" = "0" -a "$DEVTYPE" = "disk" ]; then
+                               export "$var=$DEVNAME"
+                               return 0
+                       fi
                fi
        done
 
index 4cd88ab6bd383edc27e0eacc3085bbc698edfdb0..92e5bb5d2b1283a87973f9b02e4a4d9d859150b4 100644 (file)
@@ -31,8 +31,7 @@ export_bootdevice() {
                while read line; do
                        export -n "$line"
                done < "$uevent"
-               export BOOTDEV_MAJOR=$MAJOR
-               export BOOTDEV_MINOR=$MINOR
+               export BOOTDEV_DISKSEQ=$DISKSEQ
                return 0
        fi