]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Remove all existing partition devices before running sfdisk
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Sun, 21 Aug 2022 07:41:22 +0000 (09:41 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Sun, 21 Aug 2022 09:37:20 +0000 (11:37 +0200)
Hopefully helps to avoid race conditions in loop device handling.

mkosi/backend.py

index fcc8ab795802ee313546dce38251ecb2e183fda8..f06cd02237c7b5d94221f0281d2f10190651aca5 100644 (file)
@@ -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: