From 51e1865d25f971b38a492e55d6b37f7ef141c141 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Thu, 4 Mar 2021 15:50:41 -0500 Subject: initial commit --- Makefile | 6 +++++ btrfs_mount | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 Makefile create mode 100755 btrfs_mount diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..645e09a --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +all: + +sudo = $(shell [ $$(id -u) = 0 ] || echo sudo) + +install: + $(sudo) install btrfs_mount -t /sbin diff --git a/btrfs_mount b/btrfs_mount new file mode 100755 index 0000000..50303d1 --- /dev/null +++ b/btrfs_mount @@ -0,0 +1,74 @@ +#!/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 "$@" -- cgit v1.2.3