diff --git a/archbuild.in b/archbuild.in
index b192788e2517c626779ae0053e56a6c995a50011..a78353cae741b38d8990655a2c53ffe6dbc8f967 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 14417aab130591f05e2b3bb8db186e0bd5eeb2b9..989f1e1fd1f29d6ff6bf404e5b2b583725ee3f21 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 9e8499611c3ae2976805031757b5016411742aa5..dc598f70c3d4f9157bf735a5801720d3264fb21d 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