mirror of
https://github.com/openwrt/openwrt.git
synced 2026-06-17 14:50:15 +04:00
base-files: MAJOR/MINOR not sequential, use DISKSEQ instead
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>
This commit is contained in:
committed by
Robert Marko
parent
45a7dd5547
commit
63d0b5c243
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user