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