summaryrefslogtreecommitdiff
path: root/c_src
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2025-09-03 16:02:11 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2025-09-06 01:43:44 -0400
commit31c7a7398a28b91cb1721c2721eaf577ed187bf2 (patch)
treeee03706f989ed85d783b86d63ea9156111acbc72 /c_src
parente65dd86e419d96aaa616dcb508d3564bd5721ef6 (diff)
format: Do a 'udevadm trigger' after formatting
This causes the new filesystem UUID to be picked up; without this, mount can fail if it's a multidevice filesystem. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'c_src')
-rw-r--r--c_src/cmd_super.c8
-rw-r--r--c_src/libbcachefs.c12
2 files changed, 19 insertions, 1 deletions
diff --git a/c_src/cmd_super.c b/c_src/cmd_super.c
index 18e4df80..1f93ed25 100644
--- a/c_src/cmd_super.c
+++ b/c_src/cmd_super.c
@@ -480,6 +480,14 @@ int cmd_recover_super(int argc, char *argv[])
if (args.yes || ask_yn())
bch2_super_write(dev_fd, sb);
+ /*
+ * Ensure that 'bcachefs mount' sees the newly formatted devices when
+ * scanning by UUID in the udev database:
+ */
+ CLASS(printbuf, udevadm_cmd)();
+ prt_printf(&udevadm_cmd, "udevadm trigger --settle %s", dev_path);
+ system(udevadm_cmd.buf);
+
if (args.src_device)
printf("Recovered device will no longer have a journal, please run fsck\n");
diff --git a/c_src/libbcachefs.c b/c_src/libbcachefs.c
index ed84be1b..656c9132 100644
--- a/c_src/libbcachefs.c
+++ b/c_src/libbcachefs.c
@@ -205,7 +205,7 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs,
/* calculate block size: */
if (!opt_defined(fs_opts, block_size)) {
unsigned max_dev_block_size = 0;
-
+
darray_for_each(devs, i)
max_dev_block_size = max(max_dev_block_size, get_blocksize(i->bdev->bd_fd));
@@ -357,6 +357,16 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs,
xclose(i->bdev->bd_fd);
}
+ /*
+ * Ensure that 'bcachefs mount' sees the newly formatted devices when
+ * scanning by UUID in the udev database:
+ */
+ CLASS(printbuf, udevadm_cmd)();
+ prt_str(&udevadm_cmd, "udevadm trigger --settle");
+ darray_for_each(devs, i)
+ prt_printf(&udevadm_cmd, " %s", i->path);
+ system(udevadm_cmd.buf);
+
return sb.sb;
}