Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 676324 Details for
Bug 888341
grub2 does not detect multi btrfs pools/volumes
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
updates patch adding btrfs support
os-prober-fix-btrfs-1.336.patch (text/plain), 21.29 KB, created by
Gene Czarcinski
on 2013-01-10 13:53:31 UTC
(
hide
)
Description:
updates patch adding btrfs support
Filename:
MIME Type:
Creator:
Gene Czarcinski
Created:
2013-01-10 13:53:31 UTC
Size:
21.29 KB
patch
obsolete
>diff -uNr os-prober-1.56-orig-1/common.sh os-prober-1.56/common.sh >--- os-prober-1.56-orig-1/common.sh 2013-01-10 08:33:45.200766262 -0500 >+++ os-prober-1.56/common.sh 2013-01-10 08:34:43.644058934 -0500 >@@ -127,6 +127,7 @@ > done > } > >+# add forth parameter to pickup btrfs subvol info > parsefstab () { > while read -r line; do > case "$line" in >@@ -137,12 +138,22 @@ > set -f > set -- $line > set +f >- printf '%s %s %s\n' "$1" "$2" "$3" >+ printf '%s %s %s %s\n' "$1" "$2" "$3" "$4" > ;; > esac > done > } > >+#check_btrfs_mounted $bootsv $bootuuid) >+check_btrfs_mounted () { >+ bootsv="$1" >+ bootuuid="$2" >+ bootdev=$(blkid | grep "$bootuuid" | cut -d ':' -f 1) >+ bindfrom=$(grep " btrfs " /proc/self/mountinfo | >+ grep " $bootdev " | grep " /$bootsv " | cut -d ' ' -f 5) >+ printf "%s" "$bindfrom" >+} >+ > unescape_mount () { > printf %s "$1" | \ > sed 's/\\011/ /g; s/\\012/\n/g; s/\\040/ /g; s/\\134/\\/g' >diff -uNr os-prober-1.56-orig-1/common.sh.orig os-prober-1.56/common.sh.orig >--- os-prober-1.56-orig-1/common.sh.orig 1969-12-31 19:00:00.000000000 -0500 >+++ os-prober-1.56/common.sh.orig 2013-01-10 08:34:43.642058924 -0500 >@@ -0,0 +1,293 @@ >+newns () { >+ [ "$OS_PROBER_NEWNS" ] || exec /usr/lib/newns "$0" "$@" >+} >+ >+cleanup_tmpdir=false >+cleanup_ro_partitions= >+cleanup () { >+ local partition >+ for partition in $cleanup_ro_partitions; do >+ blockdev --setrw "$partition" >+ done >+ if $cleanup_tmpdir; then >+ rm -rf "$OS_PROBER_TMP" >+ fi >+} >+ >+require_tmpdir() { >+ if [ -z "$OS_PROBER_TMP" ]; then >+ if type mktemp >/dev/null 2>&1; then >+ export OS_PROBER_TMP="$(mktemp -d /tmp/os-prober.XXXXXX)" >+ cleanup_tmpdir=: >+ trap cleanup EXIT HUP INT QUIT TERM >+ else >+ export OS_PROBER_TMP=/tmp >+ fi >+ fi >+} >+ >+count_for() { >+ _labelprefix="$1" >+ _result=$(grep "^${_labelprefix} " /var/lib/os-prober/labels 2>/dev/null || true) >+ >+ if [ -z "$_result" ]; then >+ return >+ else >+ echo "$_result" | cut -d' ' -f2 >+ fi >+} >+ >+count_next_label() { >+ require_tmpdir >+ >+ _labelprefix="$1" >+ _cfor="$(count_for "${_labelprefix}")" >+ >+ if [ -z "$_cfor" ]; then >+ echo "${_labelprefix} 1" >> /var/lib/os-prober/labels >+ else >+ sed "s/^${_labelprefix} ${_cfor}/${_labelprefix} $(($_cfor + 1))/" /var/lib/os-prober/labels > "$OS_PROBER_TMP/os-prober.tmp" >+ mv "$OS_PROBER_TMP/os-prober.tmp" /var/lib/os-prober/labels >+ fi >+ >+ echo "${_labelprefix}${_cfor}" >+} >+ >+progname= >+cache_progname() { >+ case $progname in >+ '') >+ progname="$(basename "$0")" >+ ;; >+ esac >+} >+ >+log() { >+ cache_progname >+ logger -t "$progname" "$@" >+} >+ >+error() { >+ log "error: $@" >+} >+ >+warn() { >+ log "warning: $@" >+} >+ >+debug() { >+ if [ -n "$OS_PROBER_ENABLE_DEBUG" ]; then >+ log "debug: $@" >+ fi >+} >+ >+result () { >+ log "result:" "$@" >+ echo "$@" >+} >+ >+# shim to make it easier to use os-prober outside d-i >+if ! type mapdevfs >/dev/null 2>&1; then >+ mapdevfs () { >+ readlink -f "$1" >+ } >+fi >+ >+item_in_dir () { >+ if [ "$1" = "-q" ]; then >+ q="-q" >+ shift 1 >+ else >+ q="" >+ fi >+ [ -d "$2" ] || return 1 >+ # find files with any case >+ ls -1 "$2" | grep $q -i "^$1$" >+} >+ >+# We can't always tell the filesystem type up front, but if we have the >+# information then we should use it. Note that we can't use block-attr here >+# as it's only available in udebs. >+fs_type () { >+ if (export PATH="/lib/udev:$PATH"; type vol_id) >/dev/null 2>&1; then >+ PATH="/lib/udev:$PATH" vol_id --type "$1" 2>/dev/null >+ elif type blkid >/dev/null 2>&1; then >+ blkid -o value -s TYPE "$1" 2>/dev/null >+ else >+ return 0 >+ fi >+} >+ >+parse_proc_mounts () { >+ while read -r line; do >+ set -f >+ set -- $line >+ set +f >+ printf '%s %s %s\n' "$(mapdevfs "$1")" "$2" "$3" >+ done >+} >+ >+parsefstab () { >+ while read -r line; do >+ case "$line" in >+ "#"*) >+ : >+ ;; >+ *) >+ set -f >+ set -- $line >+ set +f >+ printf '%s %s %s\n' "$1" "$2" "$3" >+ ;; >+ esac >+ done >+} >+ >+unescape_mount () { >+ printf %s "$1" | \ >+ sed 's/\\011/ /g; s/\\012/\n/g; s/\\040/ /g; s/\\134/\\/g' >+} >+ >+ro_partition () { >+ if type blockdev >/dev/null 2>&1 && \ >+ [ "$(blockdev --getro "$1")" = 0 ] && \ >+ blockdev --setro "$1"; then >+ cleanup_ro_partitions="${cleanup_ro_partitions:+$cleanup_ro_partitions }$1" >+ trap cleanup EXIT HUP INT QUIT TERM >+ fi >+} >+ >+find_label () { >+ local output >+ if type blkid >/dev/null 2>&1; then >+ # Hopefully everyone has blkid by now >+ output="$(blkid -o device -t LABEL="$1")" || return 1 >+ echo "$output" | head -n1 >+ elif [ -h "/dev/disk/by-label/$1" ]; then >+ # Last-ditch fallback >+ readlink -f "/dev/disk/by-label/$1" >+ else >+ return 1 >+ fi >+} >+ >+find_uuid () { >+ local output >+ if type blkid >/dev/null 2>&1; then >+ # Hopefully everyone has blkid by now >+ output="$(blkid -o device -t UUID="$1")" || return 1 >+ echo "$output" | head -n1 >+ elif [ -h "/dev/disk/by-uuid/$1" ]; then >+ # Last-ditch fallback >+ readlink -f "/dev/disk/by-uuid/$1" >+ else >+ return 1 >+ fi >+} >+ >+# Sets $mountboot as output variable. (We do this rather than requiring a >+# subshell so that we can run ro_partition without the cleanup trap firing >+# when the subshell exits.) >+linux_mount_boot () { >+ partition="$1" >+ tmpmnt="$2" >+ >+ bootpart="" >+ mounted="" >+ lvboot="" >+ if [ -e "$tmpmnt/etc/fstab" ]; then >+ # Try to mount any /boot partition. >+ bootmnt=$(parsefstab < "$tmpmnt/etc/fstab" | grep " /boot ") || true >+ if [ -n "$bootmnt" ]; then >+ set -f >+ set -- $bootmnt >+ set +f >+ boottomnt="" >+ >+ # Try to map labels and UUIDs ourselves if possible, >+ # so that we can check whether they're already >+ # mounted somewhere else. >+ tmppart="$1" >+ if echo "$1" | grep -q "^/dev/mapper/"; then >+ lvboot="$tmppart" >+ elif echo "$1" | grep -q "LABEL="; then >+ label="$(echo "$1" | cut -d = -f 2)" >+ if tmppart="$(find_label "$label")"; then >+ debug "mapped LABEL=$label to $tmppart" >+ else >+ debug "found boot partition LABEL=$label for Linux system on $partition, but cannot map to existing device" >+ mountboot="$partition 0" >+ return >+ fi >+ elif echo "$1" | grep -q "UUID="; then >+ uuid="$(echo "$1" | cut -d = -f 2)" >+ if tmppart="$(find_uuid "$uuid")"; then >+ debug "mapped UUID=$uuid to $tmppart" >+ else >+ debug "found boot partition UUID=$uuid for Linux system on $partition, but cannot map to existing device" >+ mountboot="$partition 0" >+ return >+ fi >+ fi >+ shift >+ set -- "$(mapdevfs "$tmppart")" "$@" >+ >+ if grep -q "^$1 " "$OS_PROBER_TMP/mounted-map"; then >+ bindfrom="$(grep "^$1 " "$OS_PROBER_TMP/mounted-map" | head -n1 | cut -d " " -f 2)" >+ bindfrom="$(unescape_mount "$bindfrom")" >+ if [ "$bindfrom" != "$tmpmnt/boot" ]; then >+ if mount --bind "$bindfrom" "$tmpmnt/boot"; then >+ mounted=1 >+ bootpart="$1" >+ else >+ debug "failed to bind-mount $bindfrom onto $tmpmnt/boot" >+ fi >+ fi >+ fi >+ if [ "$mounted" ]; then >+ : >+ elif [ -e "$1" ]; then >+ bootpart="$1" >+ boottomnt="$1" >+ elif [ -e "$tmpmnt/$1" ]; then >+ bootpart="$1" >+ boottomnt="$tmpmnt/$1" >+ elif [ -e "/target/$1" ]; then >+ bootpart="$1" >+ boottomnt="/target/$1" >+ else >+ bootpart="" >+ fi >+ >+ if [ ! "$mounted" ]; then >+ if [ -z "$bootpart" ]; then >+ debug "found boot partition $1 for linux system on $partition, but cannot map to existing device" >+ else >+ debug "found boot partition $bootpart for linux system on $partition" >+ if type grub-mount >/dev/null 2>&1 && \ >+ grub-mount "$boottomnt" "$tmpmnt/boot" 2>/dev/null; then >+ mounted=1 >+ else >+ ro_partition "$boottomnt" >+ if mount -o ro "$boottomnt" "$tmpmnt/boot" -t "$3"; then >+ mounted=1 >+ else >+ error "failed to mount $boottomnt on $tmpmnt/boot" >+ fi >+ fi >+ fi >+ fi >+ fi >+ fi >+ if [ -n "$lvboot" ]; then >+ bootpart="$lvboot" >+ fi >+ if [ -z "$bootpart" ]; then >+ bootpart="$partition" >+ fi >+ if [ -z "$mounted" ]; then >+ mounted=0 >+ fi >+ >+ mountboot="$bootpart $mounted" >+} >diff -uNr os-prober-1.56-orig-1/linux-boot-prober os-prober-1.56/linux-boot-prober >--- os-prober-1.56-orig-1/linux-boot-prober 2012-03-27 10:39:42.000000000 -0400 >+++ os-prober-1.56/linux-boot-prober 2013-01-10 08:34:43.644058934 -0500 >@@ -5,16 +5,143 @@ > > newns "$@" > require_tmpdir >+ERR="n" >+ >+tmpmnt=/var/lib/os-prober/mount >+if [ ! -d "$tmpmnt" ]; then >+ mkdir "$tmpmnt" >+fi >+ >+mounted= >+bootmnt= >+bootsv= >+bootuuid= > > grep "^/dev/" /proc/mounts | parse_proc_mounts >"$OS_PROBER_TMP/mounted-map" || true > >-partition="$1" >+if [ -z "$1" ]; then >+ ERR=y >+elif [ "$1" = btrfs -a -z "$2" ]; then >+ ERR=y >+elif [ "$1" = btrfs -a -z "$3" ]; then >+ ERR=y >+elif [ "$1" = btrfs ]; then >+ type=btrfs >+ echo "$2" | grep -q "^UUID=" || ERR=y >+ echo "$3" | grep -q "^subvol=" || ERR=y >+ export "$2" >+ export "$3" >+ partition=$(blkid | grep "$UUID" | cut -d ':' -f 1 | tr '\n' ' ' | cut -d ' ' -f 1) >+ debug "btrfs: partition=$partition, UUID=$UUID, subvol=$subvol" >+else >+ 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 > exit 1 > fi > >+if [ "$type" = btrfs ]; then >+ # handle all of the btrfs stuff here >+ if [ ! -e "/proc/self/mountinfo" ]; then >+ warn "/proc/self/mountinfo does not exist, exiting" >+ umount "$tmpmnt" 2>/dev/null >+ rmdir "$tmpmnt" 2>/dev/null >+ exit 1 >+ fi >+ mpoint=$(grep "btrfs" /proc/self/mountinfo | grep " /$subvol " | grep " $partition " | cut -d ' ' -f 5) >+ if [ "$mpoint" = "/" ]; then >+ warn "specifying active root not valid, exiting" >+ umount "$tmpmnt" 2>/dev/null >+ rmdir "$tmpmnt" 2>/dev/null >+ exit 1 >+ fi >+ if [ "$mpoint" = "$tmpmnt" ]; then >+ warn "btrfs subvol=$subvool, UUID=$UUID, already mounted on $tmpmnt **ERROR**" >+ umount "$tmpmnt" 2>/dev/null >+ rmdir "$tmpmnt" 2>/dev/null >+ exit 1 >+ fi >+ if [ -z "$mpoint" ]; then >+ # mount the btrfs root >+ if ! mount -o subvol=$subvol -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 >+ rmdir "$tmpmnt" 2>/dev/null >+ exit 1 >+ fi >+ else >+ # bind-mount >+ if ! mount -o bind "$mpoint" "$tmpmnt" 2>/dev/null; then >+ warn "error mounting btrfs bindfrom=$mpoint subvol=$subvol UUID=$UUID" >+ umount "$tmpmnt/boot" 2>/dev/null >+ umount "$tmpmnt" 2>/dev/null >+ rmdir "$tmpmnt" 2>/dev/null >+ exit 1 >+ fi >+ fi >+ debug "mounted btrfs $partition, subvol=$subvol on $tmpmnt" >+ if [ ! -e "$tmpmnt/etc/fstab" ]; then >+ warn "btrfs subvol=$subvol not root" >+ umount "$tmpmnt" 2>/dev/null >+ rmdir "$tmpmnt" 2>/dev/null >+ exit 1 >+ fi >+ bootmnt=$(parsefstab < "$tmpmnt/etc/fstab" | grep " /boot ") || true >+ if [ -z "$bootmnt" ]; then >+ # /boot is part of the root >+ bootpart="$partition" >+ bootsv="$subvol" >+ elif echo "$bootmnt" | cut -d ' ' -f 3 | grep -q "btrfs"; then >+ # separate btrfs /boot subvolume >+ bootsv=$(echo "$bootmnt" | cut -d ' ' -f 4 | grep "^subvol=" | sed "s/subvol=//" ) >+ bootuuid=$(echo "$bootmnt" | cut -d ' ' -f 1 | grep "^UUID=" | sed "s/UUID=//" ) >+ debug "mounting btrfs $tmpmnt/boot UUID=$bootuuid subvol=$bootsv" >+ bindfrom=$(check_btrfs_mounted $bootsv $bootuuid) >+ if [ -n "$bindfrom" ]; then >+ # already mounted some place >+ if ! mount -o bind $bindfrom "$tmpmnt/boot" 2>/dev/null; then >+ warn "error bind mounting btrfs boot subvol=$bootsv, from=$bindfrom" >+ umount "$tmpmnt/boot" 2>/dev/null >+ umount "$tmpmnt" 2>/dev/null >+ rmdir "$tmpmnt" 2>/dev/null >+ exit 1 >+ fi >+ elif ! mount -o subvol=$bootsv -t btrfs -U $bootuuid "$tmpmnt/boot" 2>/dev/null; then >+ warn "error mounting btrfs boot partition subvol=$bootsv, UUID=$bootuuid" >+ umount "$tmpmnt/boot" 2>/dev/null >+ umount "$tmpmnt" 2>/dev/null >+ rmdir "$tmpmnt" 2>/dev/null >+ exit 1 >+ fi >+ bootpart=$(grep " btrfs " /proc/self/mountinfo | grep " /$bootsv " | cut -d ' ' -f 10) >+ else >+ # non-btrfs partition or logical volume >+ linux_mount_boot $partition $tmpmnt >+ bootpart="${mountboot%% *}" >+ bootsv= >+ fi >+ >+ test="/usr/lib/linux-boot-probes/mounted/40grub2" >+ if [ -f $test ] && [ -x $test ]; then >+ debug "running $test $partition $bootpart $tmpmnt $type $subvol $bootsv" >+ if $test "$partition" "$bootpart" "$tmpmnt" "$type" "$subvol" "$bootsv"; then >+ debug "$test succeeded" >+ fi >+ fi >+ umount "$tmpmnt/boot" 2>/dev/null || true >+ if ! umount "$tmpmnt" 2>/dev/null; then >+ warn "problem umount $tmpmnt" >+ fi >+ rmdir "$tmpmnt" 2>/dev/null || true >+ >+ exit 0 >+fi >+ > if ! mapped="$(mapdevfs "$partition")"; then > log "Device '$partition' does not exist; skipping" > continue >@@ -22,8 +149,8 @@ > > 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 -uNr os-prober-1.56-orig-1/linux-boot-probes/mounted/common/40grub2 os-prober-1.56/linux-boot-probes/mounted/common/40grub2 >--- os-prober-1.56-orig-1/linux-boot-probes/mounted/common/40grub2 2012-09-17 13:32:52.000000000 -0400 >+++ os-prober-1.56/linux-boot-probes/mounted/common/40grub2 2013-01-10 08:34:43.644058934 -0500 >@@ -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" > bootpart="$2" > mpoint="$3" > type="$4" >+rootsv="$5" >+bootsv="$6" > > found_item=0 > > entry_result () { >+ if [ "x$type" = "xbtrfs" -a "$rootsv" = "$bootsv" ]; then >+ # trim off the leading subvol >+ kernelfile=$(echo "$kernel" | cut -d '/' -f 2- | cut -d '/' -f 2-) >+ else >+ kernelfile=$kernel >+ fi > if [ "$ignore_item" = 0 ] && \ > [ -n "$kernel" ] && \ >- [ -e "$mpoint/$kernel" ]; then >+ [ -e "$mpoint/$kernelfile" ]; then > result "$rootpart:$bootpart:$title:$kernel:$initrd:$parameters" > found_item=1 > fi >diff -uNr os-prober-1.56-orig-1/os-prober os-prober-1.56/os-prober >--- os-prober-1.56-orig-1/os-prober 2013-01-10 08:33:45.193766227 -0500 >+++ os-prober-1.56/os-prober 2013-01-10 08:34:43.645058939 -0500 >@@ -64,9 +64,12 @@ > > # 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 | > 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 btrfs | cut -d ':' -f 1 > } > > parse_proc_swaps () { >@@ -124,6 +127,8 @@ > grep "^md" /proc/mdstat | cut -d: -f2- | 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" >@@ -142,7 +147,26 @@ > 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. >+ type=$(blkid -o value -s TYPE $mapped) >+ if [ "$type" = btrfs ]; then >+ uuid=$(blkid -o value -s UUID $mapped) >+ if grep -q "^$uuid" "$OS_PROBER_TMP/btrfs-vols" ; then >+ continue >+ fi >+ debug "btrfs volume uuid=$uuid partition=$partition" >+ echo "$uuid" >>"$OS_PROBER_TMP/btrfs-vols" >+ test="/usr/lib/os-probes/50mounted-tests" >+ if [ -f "$test" ] && [ -x "$test" ]; then >+ debug "running $test on btrfs $partition" >+ if "$test" btrfs "$uuid" "$partition"; then >+ debug "os detected by $test" >+ continue >+ fi >+ fi >+ >+ elif ! grep -q "^$mapped " "$OS_PROBER_TMP/mounted-map" ; then > for test in /usr/lib/os-probes/*; do > if [ -f "$test" ] && [ -x "$test" ]; then > debug "running $test on $partition" >diff -uNr os-prober-1.56-orig-1/os-probes/common/50mounted-tests os-prober-1.56/os-probes/common/50mounted-tests >--- os-prober-1.56-orig-1/os-probes/common/50mounted-tests 2012-09-17 11:08:12.000000000 -0400 >+++ os-prober-1.56/os-probes/common/50mounted-tests 2013-01-10 08:34:43.645058939 -0500 >@@ -1,20 +1,36 @@ > #!/bin/sh > # Sub-tests that require a mounted partition. > set -e >-partition="$1" > > . /usr/share/os-prober/common.sh > >-types="$(fs_type "$partition")" || types=NOT-DETECTED >+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" >+else >+ partition="$1" >+ types="$(fs_type "$partition")" || types=NOT-DETECTED >+fi >+ > if [ "$types" = NOT-DETECTED ]; then > debug "$1 type not recognised; skipping" >- exit 0 >+ exit 1 >+elif [ "x$types" = "x" ]; then >+ exit 1 >+elif [ "$types" = LVM2_member ]; then >+ debug "skipping LVM2 Volume Group on $partition" >+ 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" = ntfs ]; then > if type ntfs-3g >/dev/null 2>&1; then > types='ntfs-3g ntfs' >@@ -23,7 +39,7 @@ > 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 >@@ -46,6 +62,76 @@ > fi > > mounted= >+ >+# all btrfs processing here. Handle both unmounted and >+# mounted subvolumes. >+if [ "$types" = btrfs ]; then >+ partition="$BTRFSDEV" >+ debug "begin btrfs processing for $UUID" >+ # note that the btrfs volume must not be mounted ro >+ if mount -t btrfs -U "$UUID" "$tmpmnt" 2>/dev/null; then >+ debug "btrfs volume $UUID mounted" >+ else >+ warn "cannot mount btrfs volume $UUID, exiting" >+ rmdir "$tmpmnt" || true >+ exit 1 >+ fi >+ # besides regular subvols, get ro and snapshot so thet can be excluded >+ subvols=$(btrfs subvolume list "$tmpmnt" | cut -d ' ' -f 9) >+ rosubvols=$(btrfs subvolume list -r "$tmpmnt" | cut -d ' ' -f 9) >+ sssubvols=$(btrfs subvolume list -s "$tmpmnt" | cut -d ' ' -f 9) >+ if ! umount "$tmpmnt"; then >+ warn "failed to umount btrfs volume on $tmpmnt" >+ 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 echo "$rosubvols" | grep -q -x "$subvol"; then >+ continue >+ 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 >+ fi >+ if [ -z "$mounted" ]; then >+ if ! umount "$tmpmnt"; then >+ warn "failed to umount $tmpmnt" >+ fi >+ fi >+ done >+ rmdir "$tmpmnt" || true >+ if [ "$found" ]; then >+ exit 0 >+ else >+ exit 1 >+ 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 -uNr os-prober-1.56-orig-1/os-probes/mounted/common/90linux-distro os-prober-1.56/os-probes/mounted/common/90linux-distro >--- os-prober-1.56-orig-1/os-probes/mounted/common/90linux-distro 2013-01-10 08:33:45.197766247 -0500 >+++ os-prober-1.56/os-probes/mounted/common/90linux-distro 2013-01-10 08:34:43.645058939 -0500 >@@ -7,6 +7,8 @@ > 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 >@@ -128,7 +130,11 @@ > fi > > label="$(count_next_label "$short")" >- result "$partition:$long:$label:linux" >+ if [ "x$type" = "xbtrfs" -a "x$uuid" != "x" -a "x$subvol" != "x" ]; then >+ result "$partition:$long:$label:linux:$type:$uuid:$subvol" >+ else >+ result "$partition:$long:$label:linux" >+ fi > exit 0 > else > exit 1 >diff -uNr os-prober-1.56-orig-1/README.btrfs os-prober-1.56/README.btrfs >--- os-prober-1.56-orig-1/README.btrfs 1969-12-31 19:00:00.000000000 -0500 >+++ os-prober-1.56/README.btrfs 2013-01-10 08:34:43.645058939 -0500 >@@ -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> >+
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 888341
:
667344
|
667345
|
667844
|
670472
|
672110
| 676324 |
1026442