diff options
Diffstat (limited to 'os-prober-btrfsfix.patch')
-rw-r--r-- | os-prober-btrfsfix.patch | 295 |
1 files changed, 121 insertions, 174 deletions
diff --git a/os-prober-btrfsfix.patch b/os-prober-btrfsfix.patch index 1047d249f929..d7179debaa51 100644 --- a/os-prober-btrfsfix.patch +++ b/os-prober-btrfsfix.patch @@ -1,11 +1,11 @@ -diff --git a/common.sh b/common.sh -index c2c5f46..8fb3c5f 100644 ---- a/common.sh -+++ b/common.sh +Index: os-prober/common.sh +=================================================================== +--- os-prober.orig/common.sh ++++ os-prober/common.sh @@ -155,6 +155,7 @@ parse_proc_mounts () { done } - + +# add forth parameter to pickup btrfs subvol info parsefstab () { while read -r line; do @@ -20,7 +20,7 @@ index c2c5f46..8fb3c5f 100644 esac done } - + +#check_btrfs_mounted $bootsv $bootuuid) +check_btrfs_mounted () { + bootsv="$1" @@ -34,12 +34,12 @@ index c2c5f46..8fb3c5f 100644 unescape_mount () { printf %s "$1" | \ sed 's/\\011/ /g; s/\\012/\n/g; s/\\040/ /g; s/\\134/\\/g' -diff --git a/linux-boot-prober b/linux-boot-prober -index e32dc84..2a60fa2 100755 ---- a/linux-boot-prober -+++ b/linux-boot-prober +Index: os-prober/linux-boot-prober +=================================================================== +--- os-prober.orig/linux-boot-prober ++++ os-prober/linux-boot-prober @@ -5,16 +5,143 @@ set -e - + newns "$@" require_tmpdir +ERR="n" @@ -53,9 +53,9 @@ index e32dc84..2a60fa2 100755 +bootmnt= +bootsv= +bootuuid= - + grep "^/dev/" /proc/mounts | parse_proc_mounts >"$OS_PROBER_TMP/mounted-map" || true - + -partition="$1" +if [ -z "$1" ]; then + ERR=y @@ -75,14 +75,14 @@ index e32dc84..2a60fa2 100755 + partition="$1" + type=other +fi - + -if [ -z "$partition" ]; then +if [ "x$ERR" != xn ]; then echo "usage: linux-boot-prober partition" >&2 -+ echo " linux-boot-prober btrfs UUID=<> subvol=<>" >&2 ++ echo " linux-boot-prober partition | btrfs UUID=<> subvol=<>" >&2 exit 1 fi - + +if [ "$type" = btrfs ]; then + # handle all of the btrfs stuff here + if [ ! -e "/proc/self/mountinfo" ]; then @@ -184,24 +184,14 @@ index e32dc84..2a60fa2 100755 if ! mapped="$(mapdevfs "$partition")"; then log "Device '$partition' does not exist; skipping" continue -@@ -22,8 +149,8 @@ fi - - if ! grep -q "^$mapped " "$OS_PROBER_TMP/mounted-map"; then - for test in /usr/lib/linux-boot-probes/*; do -- debug "running $test" - if [ -x $test ] && [ -f $test ]; then -+ debug "running $test" - if $test "$partition"; then - debug "linux detected by $test" - break -diff --git a/linux-boot-probes/mounted/common/40grub2 b/linux-boot-probes/mounted/common/40grub2 -index 885614e..db5cbfd 100755 ---- a/linux-boot-probes/mounted/common/40grub2 -+++ b/linux-boot-probes/mounted/common/40grub2 -@@ -2,17 +2,30 @@ +Index: os-prober/linux-boot-probes/mounted/common/40grub2 +=================================================================== +--- os-prober.orig/linux-boot-probes/mounted/common/40grub2 ++++ os-prober/linux-boot-probes/mounted/common/40grub2 +@@ -2,17 +2,27 @@ . /usr/share/os-prober/common.sh set -e - + +# add support for btrfs with no separate /boot +# that is, rootsv = bootsv partition="$1" @@ -210,16 +200,13 @@ index 885614e..db5cbfd 100755 type="$4" +rootsv="$5" +bootsv="$6" - + found_item=0 - + entry_result () { -+ if [ "x$type" = "xbtrfs" -a "$partition" = "$bootpart" ]; then ++ if [ "x$type" = "xbtrfs" -a "$rootsv" = "$bootsv" ]; then + # trim off the leading subvol + kernelfile=$(echo "$kernel" | cut -d '/' -f 2- | cut -d '/' -f 2-) -+ if [ "x$rootsv" != "x$bootsv" ]; then -+ kernelfile="/boot/$kernelfile" -+ fi + else + kernelfile=$kernel + fi @@ -230,37 +217,33 @@ index 885614e..db5cbfd 100755 result "$rootpart:$bootpart:$title:$kernel:$initrd:$parameters" found_item=1 fi -diff --git a/os-prober b/os-prober -index 8852887..482c3c2 100755 ---- a/os-prober -+++ b/os-prober -@@ -76,9 +76,12 @@ partitions () { - - # Also detect OSes on LVM volumes (assumes LVM is active) - if type lvs >/dev/null 2>&1; then -- echo "$(LVM_SUPPRESS_FD_WARNINGS=1 log_output lvs --noheadings --separator : -o vg_name,lv_name | -+ echo "$(LVM_SUPPRESS_FD_WARNINGS=1 log_output lvs --noheadings --separator : -o vg_name,lv_name 2>/dev/null | +Index: os-prober/os-prober +=================================================================== +--- os-prober.orig/os-prober ++++ os-prober/os-prober +@@ -79,6 +79,9 @@ partitions () { + echo "$(LVM_SUPPRESS_FD_WARNINGS=1 log_output lvs --noheadings --separator : -o vg_name,lv_name | sed "s|-|--|g;s|^[[:space:]]*\(.*\):\(.*\)$|/dev/mapper/\1-\2|")" fi + + # now lets make sure we got all of the btrfs partitions and disks -+ blkid | grep 'TYPE="btrfs"' | cut -d ':' -f 1 ++ blkid | grep btrfs | cut -d ':' -f 1 } - + parse_proc_swaps () { -@@ -136,6 +139,8 @@ if [ -f /proc/mdstat ] ; then - grep "^md" /proc/mdstat | cut -d: -f2- | parse_proc_mdstat >"$OS_PROBER_TMP/raided-map" || true +@@ -137,6 +140,8 @@ if [ -f /proc/mdstat ] ; then + grep "^md" /proc/mdstat | parse_proc_mdstat >"$OS_PROBER_TMP/raided-map" || true fi - + +: >"$OS_PROBER_TMP/btrfs-vols" + for partition in $(partitions); do if ! mapped="$(mapdevfs "$partition")"; then log "Device '$partition' does not exist; skipping" -@@ -154,7 +159,26 @@ for partition in $(partitions); do +@@ -155,7 +160,26 @@ for partition in $(partitions); do continue fi - + - if ! grep -q "^$mapped " "$OS_PROBER_TMP/mounted-map" ; then + # do btrfs processing here; both mounted and unmounted will + # be handled by 50mounted-tests so we can do a subvol only once. @@ -277,7 +260,7 @@ index 8852887..482c3c2 100755 + debug "running $test on btrfs $partition" + if "$test" btrfs "$uuid" "$partition"; then + debug "os detected by $test" -+ continue ++ continue + fi + fi + @@ -285,59 +268,34 @@ index 8852887..482c3c2 100755 for test in /usr/lib/os-probes/*; do if [ -f "$test" ] && [ -x "$test" ]; then debug "running $test on $partition" -diff --git a/os-probes/common/50mounted-tests b/os-probes/common/50mounted-tests -index 2951ef9..e33eb82 100755 ---- a/os-probes/common/50mounted-tests -+++ b/os-probes/common/50mounted-tests -@@ -19,19 +19,31 @@ do_unmount() { +Index: os-prober/os-probes/common/50mounted-tests +=================================================================== +--- os-prober.orig/os-probes/common/50mounted-tests ++++ os-prober/os-probes/common/50mounted-tests +@@ -19,7 +19,19 @@ do_unmount() { rmdir "$tmpmnt" || true } - + -types="$(fs_type "$partition")" +if [ "x$1" = xbtrfs ]; then -+ types=btrfs -+ if [ -z "$2" -o -z "$3" ]; then -+ debug "missing btrfs parameters, exiting" -+ exit 1 -+ fi -+ UUID="$2" -+ BTRFSDEV="$3" ++ types=btrfs ++ if [ -z "$2" -o -z "$3" ]; then ++ debug "missing btrfs parameters, exiting" ++ exit 1 ++ fi ++ UUID="$2" ++ BTRFSDEV="$3" +else -+ partition="$1" -+ types="$(fs_type "$partition")" || types=NOT-DETECTED ++ partition="$1" ++ types="$(fs_type "$partition")" +fi + if [ "$types" = NOT-DETECTED ]; then debug "$1 type not recognised; skipping" -- exit 0 -+ exit 1 - elif [ "$types" = swap ]; then - debug "$1 is a swap partition; skipping" -- exit 0 -+ exit 1 - elif [ "$types" = crypto_LUKS ]; then - debug "$1 is a LUKS partition; skipping" -- exit 0 -+ exit 1 - elif [ "$types" = LVM2_member ]; then - debug "$1 is an LVM member; skipping" -- exit 0 -+ exit 1 - elif [ "$types" = ntfs ]; then - if type ntfs-3g >/dev/null 2>&1; then - types='ntfs-3g ntfs' -@@ -40,7 +52,7 @@ elif [ -z "$types" ]; then - if type cryptsetup >/dev/null 2>&1 && \ - cryptsetup luksDump "$partition" >/dev/null 2>&1; then - debug "$1 is a LUKS partition; skipping" -- exit 0 -+ exit 1 - fi - for type in $(grep -v nodev /proc/filesystems); do - # hfsplus filesystems are mountable as hfs. Try hfs last so -@@ -63,6 +75,108 @@ if [ ! -d "$tmpmnt" ]; then + exit 0 +@@ -66,6 +78,76 @@ if [ ! -d "$tmpmnt" ]; then fi - + mounted= + +# all btrfs processing here. Handle both unmounted and @@ -362,77 +320,45 @@ index 2951ef9..e33eb82 100755 + rmdir "$tmpmnt" || true + exit 1 + fi -+ ++ if [ -z "$subvols" ]; then ++ debug "no subvols found on btrfs volume $UUID" ++ exit 1 ++ fi + found= -+ mounted= -+ -+ mpoint="$(grep btrfs /proc/self/mountinfo | grep "$partition " | cut -d ' ' -f 5)" -+ if [ -n "$mpoint" -a "x$mpoint" = "x/" ]; then -+ debug "This is the root for the running system" #running system must be done elsewhere -+ else -+ #partition was not root of running system, so lets look for bootable subvols -+ if [ -n "$mpoint" ] ; then -+ mounted=1 #partition was already mounted,so lets not unmount it when done -+ else -+ # again, do not mount btrfs ro -+ mount -t btrfs -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"; then -+ debug "os found by subtest $test on $partition" -+ found=1 ++ for subvol in $subvols; do ++ debug "begin btrfs processing for $UUID subvol=$subvol" ++ if echo "$rosubvols" | grep -q -x "$subvol"; then ++ continue + fi -+ fi -+ if [ -z "$mounted" ]; then -+ if ! umount "$tmpmnt"; then -+ warn "failed to umount $tmpmnt" ++ if echo "$sssubvols" | grep -q -x "$subvol"; then ++ continue + fi -+ fi -+ fi -+ -+ if [ -z "$subvols" ]; then -+ debug "no subvols found on btrfs volume $UUID" -+ else -+ found= -+ for subvol in $subvols; do -+ debug "begin btrfs processing for $UUID subvol=$subvol" -+ if echo "$rosubvols" | grep -q -x "$subvol"; then -+ continue ++ 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 -+ if echo "$sssubvols" | grep -q -x "$subvol"; then -+ continue -+ 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 ++ 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 -+ if [ -z "$mounted" ]; then -+ if ! umount "$tmpmnt"; then -+ warn "failed to umount $tmpmnt" -+ fi ++ fi ++ if [ -z "$mounted" ]; then ++ if ! umount "$tmpmnt"; then ++ warn "failed to umount $tmpmnt" + fi -+ done -+ fi ++ fi ++ done + rmdir "$tmpmnt" || true + if [ "$found" ]; then + exit 0 @@ -441,25 +367,25 @@ index 2951ef9..e33eb82 100755 + fi +fi + - if type grub-mount >/dev/null 2>&1 && \ - type grub-probe >/dev/null 2>&1 && \ - grub-mount "$partition" "$tmpmnt" 2>/dev/null; then -diff --git a/os-probes/mounted/common/90linux-distro b/os-probes/mounted/common/90linux-distro -index badfbb1..9bc5154 100755 ---- a/os-probes/mounted/common/90linux-distro -+++ b/os-probes/mounted/common/90linux-distro + if type grub2-mount >/dev/null 2>&1 && \ + type grub2-probe >/dev/null 2>&1 && \ + grub2-mount "$partition" "$tmpmnt" 2>/dev/null; then +Index: os-prober/os-probes/mounted/common/90linux-distro +=================================================================== +--- os-prober.orig/os-probes/mounted/common/90linux-distro ++++ os-prober/os-probes/mounted/common/90linux-distro @@ -7,6 +7,8 @@ set -e partition="$1" dir="$2" type="$3" +uuid="$4" +subvol="$5" - + # This test is inaccurate, but given separate / and /boot partitions and the # fact that only some architectures have ld-linux.so, I can't see anything -@@ -143,7 +145,11 @@ if (ls "$dir"/lib*/ld*.so* && [ -d "$dir/boot" ] || ls "$dir"/usr/lib*/ld*.so*) +@@ -143,7 +145,11 @@ if (ls "$dir"/lib*/ld*.so* && [ -d "$dir fi - + label="$(count_next_label "$short")" - result "$partition:$long:$label:linux" + if [ "x$type" = "xbtrfs" -a "x$uuid" != "x" -a "x$subvol" != "x" ]; then @@ -470,3 +396,24 @@ index badfbb1..9bc5154 100755 exit 0 else exit 1 +Index: os-prober/README.btrfs +=================================================================== +--- /dev/null ++++ os-prober/README.btrfs +@@ -0,0 +1,15 @@ ++BTRFS is a new filesystem which combines the filesystem with logical volume ++management (subvolumes). For further information, see: ++ https://btrfs.wiki.kernel.org/index.php/Main_Page ++ https://btrfs.wiki.kernel.org/index.php/FAQ ++ ++In order to support BTRFS, a number of changes were necessary to os-prober, ++os-probes/common/50mounted-tests, os-probes/mounted/common/90linux-distro, ++linux-boot-prober, and linux-boot-probes/common/50mounted-tests. ++ ++The biggest impact will be to grub2 where there is additional information ++output by os-prober and where, if a BTRFS subvolume is being used for root, ++the parameters for linux-boot-prober have changed. ++ ++Sun 30 Dec 2012 11:49:52 AM EST Gene Czarcinski <gene@czarc.net> ++ + |