summaryrefslogtreecommitdiff
path: root/btrfs_mount
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 "$@"