diff options
author | Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> | 2017-03-07 20:14:50 +0100 |
---|---|---|
committer | Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> | 2017-03-07 20:39:11 +0100 |
commit | eec7fcf965763d5395c336f92cd56b193d054947 (patch) | |
tree | aa5054fbc735c86c8cfce83ef7f528e5d6781fdc | |
parent | c53a3e80170dc9d45beeeb623edfbf0bd40799a7 (diff) | |
download | devtools-eec7fcf965763d5395c336f92cd56b193d054947.tar.xz |
archbuild/makechrootpkg: Delete subvolumes in roots
The systemd package creates a subvolume at /var/lib/machines (through
tmpfiles), if it can. We need to delete this subvolume before we can
delete the parent subvolume.
Look through the root for inodes with the number 256. These identify
subvolume roots.
-rw-r--r-- | archbuild.in | 4 | ||||
-rw-r--r-- | lib/archroot.sh | 20 | ||||
-rw-r--r-- | makechrootpkg.in | 6 |
3 files changed, 23 insertions, 7 deletions
diff --git a/archbuild.in b/archbuild.in index b192788..a78353c 100644 --- a/archbuild.in +++ b/archbuild.in @@ -52,9 +52,7 @@ if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then lock 9 "$copy.lock" "Locking chroot copy '$copy'" - if is_btrfs "${copy}"; then - { type -P btrfs && btrfs subvolume delete "${copy}"; } &>/dev/null - fi + subvolume_delete_recursive "${copy}" rm -rf --one-file-system "${copy}" done exec 9>&- diff --git a/lib/archroot.sh b/lib/archroot.sh index 14417aa..989f1e1 100644 --- a/lib/archroot.sh +++ b/lib/archroot.sh @@ -20,3 +20,23 @@ check_root() { is_btrfs() { [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] } + +## +# usage : subvolume_delete_recursive( $path ) +# +# Find all btrfs subvolumes under and including $path and delete them. +## +subvolume_delete_recursive() { + local subvol + + is_btrfs "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! btrfs subvolume delete "$subvol" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + done < <(find "$1" -xdev -depth -inum 256 -print0) + + return 0 +} diff --git a/makechrootpkg.in b/makechrootpkg.in index 9e84996..dc598f7 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -97,10 +97,8 @@ create_chroot() { stat_busy "Creating clean working copy [$copy]" if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then - if [[ -d $copydir ]]; then - btrfs subvolume delete "$copydir" >/dev/null || - die "Unable to delete subvolume %s" "$copydir" - fi + subvolume_delete_recursive "$copydir" || + die "Unable to delete subvolume %s" "$copydir" btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null || die "Unable to create subvolume %s" "$copydir" else |