blob: 50303d1173b22c66640fd602377b78d346fbb480 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#!/bin/dash
usage()
{
echo "usage: $0 [--unscan] [btrfs options] <btrfs filesystem> <mountpoint>"
}
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 "$@"
|