return True, support_delete
+def wait_for_udev():
+ # Run `udevadm settle` to ensure that partition change made by `sfdisk` or writing bootcode is completely reflected in userspace.
+ logging.info("Waiting for the udev event queue to empty...")
+ argv = ['udevadm', 'settle']
+ logging.debug(" ".join(argv))
+ proc = subprocess.run(argv,
+ stdout=None,
+ stderr=None)
+ if proc.returncode != 0:
+ logging.warning("udevadm settle exited without clearing the udev event queue.")
+ else:
+ logging.info("The udev event queue is empty.")
+
def mkpart(args, target):
global Device
new, support_delete = check_sfdisk()
logging.error(f"New partition table:\n" + str(target.label))
sys.exit(1)
- # Run `udevadm settle` to ensure that partition change made by `sfdisk` is completely reflected in userspace.
- logging.info("Waiting for the udev event queue to empty...")
- argv = ['udevadm', 'settle']
- logging.debug(" ".join(argv))
- proc = subprocess.run(argv,
- stdout=None,
- stderr=None)
- if proc.returncode != 0:
- logging.warning("udevadm settle exited without clearing the udev event queue.")
- else:
- logging.info("The udev event queue is empty.")
+ wait_for_udev()
for i, part in enumerate(target.part_table):
d = "/dev/" + get_partition_device(target.device, i+1)
buf = f.read(1 << 9)
proc_dd.communicate()
logging.info("Done")
+
+ # writing to sector zero might trigger kernel/udev to re-read partition table
+ if sector == 0:
+ wait_for_udev()
+
#TODO: verification
def do_fuse_file(f, name, target):