Bug: https://bugs.gentoo.org/891871 --- a/common.sh +++ b/common.sh @@ -172,11 +172,11 @@ done } -#check_btrfs_mounted $bootsv $bootuuid) +#check_btrfs_mounted $bootsv $bootsig) check_btrfs_mounted () { bootsv="$1" - bootuuid="$2" - bootdev=$(blkid | grep "$bootuuid" | cut -d ':' -f 1) + bootsig="$2" + bootdev=$(blkid | grep "$bootsig" | cut -d ':' -f 1) bindfrom=$(grep " btrfs " /proc/self/mountinfo | grep " $bootdev " | grep " /$bootsv " | cut -d ' ' -f 5) printf "%s" "$bindfrom" --- a/linux-boot-prober +++ b/linux-boot-prober @@ -98,10 +98,10 @@ 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) + bootsv=$(echo "$bootmnt" | cut -d ' ' -f 4 | grep "\(^\|,\)subvol=" | sed "s/.*subvol=\([^,]*\).*$/\1/") + bootsig=$(echo "$bootmnt" | cut -d ' ' -f 1 | grep "^\(PART\)\?\(UUID\|LABEL\)=" | sed 's/\(.*=\)\(.*\)/\1"\2"/' ) + debug "mounting btrfs $tmpmnt/boot $bootsig subvol=$bootsv" + bindfrom=$(check_btrfs_mounted $bootsv $bootsig) if [ -n "$bindfrom" ]; then # already mounted some place if ! mount -o bind $bindfrom "$tmpmnt/boot" 2>/dev/null; then @@ -111,14 +111,14 @@ 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" + elif ! mount -o subvol=$bootsv -t btrfs $bootsig "$tmpmnt/boot" 2>/dev/null; then + warn "error mounting btrfs boot partition subvol=$bootsv, $bootsig" 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) + bootpart=$(grep " btrfs " /proc/self/mountinfo | grep " /${bootsv##/} " | cut -d ' ' -f 10) else # non-btrfs partition or logical volume linux_mount_boot $partition $tmpmnt --- a/linux-boot-probes/mounted/common/40grub2 +++ b/linux-boot-probes/mounted/common/40grub2 @@ -20,7 +20,7 @@ kernel=${kernel#${bsv}} kernelfile=$kernel initrd=${initrd#${bsv}} - if [ "x$GRUB_FS" != "xbtrfs" ]; then + if [ "x$GRUB_FS" != "xbtrfs" -o "$partition" != "$bootpart" ]; then # absolute path needed: prepend subvolume if $kernel isn't empty kernel=${kernel:+${bsv}}${kernel} # handle multiple initrd paths --- a/os-probes/common/50mounted-tests +++ b/os-probes/common/50mounted-tests @@ -85,9 +85,9 @@ 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 14) + subvols=$(btrfs subvolume list -a "$tmpmnt" | cut -d ' ' -f 9 | sed 's/\///') + rosubvols=$(btrfs subvolume list -ra "$tmpmnt" | cut -d ' ' -f 9 | sed 's/\///') + sssubvols=$(btrfs subvolume list -sa "$tmpmnt" | cut -d ' ' -f 14 | sed 's/\///') if ! umount "$tmpmnt"; then warn "failed to umount btrfs volume on $tmpmnt" rmdir "$tmpmnt" || true