#!/bin/dash usage() { echo "usage: $0 [--unscan] [btrfs options] " } get_prop() { local prop="$1" btrfs inspect-internal dump-super "$2" | sed -E -ne "s/^${prop} +//p" } device_count() { btrfs inspect-internal dump-super "$1" | grep -c '^dev_item.devid ' } competing_devices() { local uuid uuid=$1 btrfs filesystem show "$uuid" | sed -E -ne 's/^ devid.* //p' } remove_competition() { competing_devices "$1" | while read dev do [ "$dev" = "$source" ] || btrfs device scan -u "$dev" || true done } getend() { eval "echo \${$(($#-$1))}" } btrfs_mount() { [ $# -ge 2 ] || { usage; exit 1; } destdir=$(getend 0 "$@") source=$(getend 1 "$@") [ -e "$source" ] [ -r "$source" ] [ -d "$destdir" ] for args do case "$1" in --unscan) unscan=y;; *) set -- "$@" "$1";; esac shift done if [ "$unscan" ] then device_count=$(device_count "$source") if [ $device_count -eq 1 ] then source_uuid=$(get_prop fsid "$source") remove_competition "$source_uuid" fi fi mount "$@" } set -e btrfs_mount "$@"