SHA256
1
0
forked from pool/os-prober
os-prober/os-prober-btrfs-always-detect-default.patch
Andrei Borzenkov 9fddefe8e1 Accepting request 349326 from home:michael-chang:branches:Base:System
- The ld file tests cost too much as it transversed all files in 
  the given wildcard directory and path, we should avoid when not
  necessary. (bsc#953987)
  * added os-prober-linux-distro-avoid-expensive-ld-file-test.patch
- Fix missing linux16/initrd16 parsing in entry result
- Fix kernelfile path if separate boot partition on btrfs 
  * modified Improve-btrfs-handling-on-os-probing-for-grub2.patch
- fix os-prober failed to detect os in btrfs root tree (bsc#957018)
  * added os-prober-btrfs-always-detect-default.patch

OBS-URL: https://build.opensuse.org/request/show/349326
OBS-URL: https://build.opensuse.org/package/show/Base:System/os-prober?expand=0&rev=65
2015-12-17 17:15:53 +00:00

133 lines
3.8 KiB
Diff

Index: os-prober-1.61/linux-boot-prober
===================================================================
--- os-prober-1.61.orig/linux-boot-prober
+++ os-prober-1.61/linux-boot-prober
@@ -67,7 +67,12 @@ if [ "$type" = btrfs ]; then
fi
if [ -z "$mpoint" ]; then
# mount the btrfs root
- if ! mount -o subvol=$subvol -t btrfs -U $UUID "$tmpmnt" 2>/dev/null; then
+
+ if [ -n "$subvol" ]; then
+ opts="-o subvol=$subvol"
+ fi
+
+ if ! mount $opts -t btrfs -U $UUID "$tmpmnt" 2>/dev/null; then
warn "error mounting btrfs subvol=$subvol UUID=$UUID"
umount "$tmpmnt/boot" 2>/dev/null
umount "$tmpmnt" 2>/dev/null
Index: os-prober-1.61/os-probes/common/50mounted-tests
===================================================================
--- os-prober-1.61.orig/os-probes/common/50mounted-tests
+++ os-prober-1.61/os-probes/common/50mounted-tests
@@ -99,6 +99,48 @@ if [ "$mounted" ]; then
fi
fi
+
+probe_subvol ()
+{
+ local subvol=$1
+ local partition=$2
+ local UUID=$3
+ local tmpmnt=$4
+
+ mounted=
+ mpoint="$(grep btrfs /proc/self/mountinfo | grep "$partition " | grep "/$subvol " | cut -d ' ' -f 5)"
+ ret=1
+
+ if [ -n "$subvol" ]; then
+ opts="-o subvol=$subvol"
+ fi
+
+ if [ -n "$mpoint" ]; then
+ if [ "x$mpoint" = "x/" ]; then
+ continue # this is the root for the running system
+ fi
+ mounted=1
+ else
+ # again, do not mount btrfs ro
+ mount -t btrfs $opts -U "$UUID" "$tmpmnt"
+ mpoint="$tmpmnt"
+ fi
+ test="/usr/lib/os-probes/mounted/90linux-distro"
+ if [ -f "$test" ] && [ -x "$test" ]; then
+ debug "running subtest $test"
+ if "$test" "$partition" "$mpoint" btrfs "UUID=$UUID" "subvol=$subvol"; then
+ debug "os found by subtest $test on subvol $subvol"
+ ret=0
+ fi
+ fi
+ if [ -z "$mounted" ]; then
+ if ! umount "$tmpmnt"; then
+ warn "failed to umount $tmpmnt"
+ fi
+ fi
+ return $ret
+}
+
# all btrfs subvol processing here. Handle both unmounted and
# mounted subvolumes.
if [ "$types" = btrfs ]; then
@@ -121,45 +163,23 @@ if [ "$types" = btrfs ]; then
rmdir "$tmpmnt" || true
exit 1
fi
- if [ -z "$subvols" ]; then
- debug "no subvols found on btrfs volume $UUID"
- exit 1
- fi
+
found=
- for subvol in $subvols; do
- debug "begin btrfs processing for $UUID subvol=$subvol"
- if [ "$subvol" != "$defaultvol" ]; then
- if echo "$rosubvols" | grep -q -x "$subvol"; then
- continue
- fi
- if echo "$sssubvols" | grep -q -x "$subvol"; then
- continue
- fi
- fi
- mounted=
- mpoint="$(grep btrfs /proc/self/mountinfo | grep "$partition " | grep "/$subvol " | cut -d ' ' -f 5)"
- if [ -n "$mpoint" ]; then
- if [ "x$mpoint" = "x/" ]; then
- continue # this is the root for the running system
- fi
- mounted=1
- else
- # again, do not mount btrfs ro
- mount -t btrfs -o subvol="$subvol" -U "$UUID" "$tmpmnt"
- mpoint="$tmpmnt"
- fi
- test="/usr/lib/os-probes/mounted/90linux-distro"
- if [ -f "$test" ] && [ -x "$test" ]; then
- debug "running subtest $test"
- if "$test" "$partition" "$mpoint" btrfs "UUID=$UUID" "subvol=$subvol"; then
- debug "os found by subtest $test on subvol $subvol"
- found=1
- fi
+ # Always probe subvol or root set as default
+ if probe_subvol "$defaultvol" "$partition" "$UUID" "$tmpmnt"; then
+ found=1
+ fi
+
+ # Probe any other OS on subvol
+ for subvol in $subvols; do
+ if echo "$rosubvols" | grep -q -x "$subvol" ||
+ echo "$sssubvols" | grep -q -x "$subvol" ||
+ echo "$defaultvol" | grep -q -x "$subvol"; then
+ continue
fi
- if [ -z "$mounted" ]; then
- if ! umount "$tmpmnt"; then
- warn "failed to umount $tmpmnt"
- fi
+ debug "begin btrfs processing for $UUID subvol=$subvol"
+ if probe_subvol "$subvol" "$partition" "$UUID" "$tmpmnt"; then
+ found=1
fi
done
if [ "$found" ]; then