From: Daan De Meyer Date: Sun, 21 Aug 2022 07:41:22 +0000 (+0200) Subject: Remove all existing partition devices before running sfdisk X-Git-Tag: v14~67^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ff493550baba4370d552aeaa99ea3119f7de0c34;p=thirdparty%2Fmkosi.git Remove all existing partition devices before running sfdisk Hopefully helps to avoid race conditions in loop device handling. --- diff --git a/mkosi/backend.py b/mkosi/backend.py index fcc8ab795..f06cd0223 100644 --- a/mkosi/backend.py +++ b/mkosi/backend.py @@ -6,6 +6,7 @@ import argparse import contextlib import dataclasses import enum +import errno import math import os import platform @@ -36,7 +37,7 @@ from typing import ( cast, ) -from .syscall import ioctl_partition_add +from .syscall import ioctl_partition_add, ioctl_partition_remove PathString = Union[Path, str] @@ -409,6 +410,15 @@ class PartitionTable: if quiet: cmd += ["--quiet"] + if device.is_block_device(): + with open(device, 'rb+') as f: + for p in self.partitions.values(): + try: + ioctl_partition_remove(f.fileno(), p.number) + except OSError as e: + if e.errno != errno.ENXIO: + raise + try: run(cmd, input=spec.encode("utf-8")) except subprocess.CalledProcessError: