Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcachefs: %pg is banished

not portable to userspace

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>

+52 -16
+1 -1
fs/bcachefs/disk_groups.c
··· 557 557 : NULL; 558 558 559 559 if (ca && percpu_ref_tryget(&ca->io_ref)) { 560 - prt_printf(out, "/dev/%pg", ca->disk_sb.bdev); 560 + prt_printf(out, "/dev/%s", ca->name); 561 561 percpu_ref_put(&ca->io_ref); 562 562 } else if (ca) { 563 563 prt_printf(out, "offline device %u", t.dev);
+6 -2
fs/bcachefs/super-io.c
··· 170 170 u64 max_bytes = 512 << sb->sb->layout.sb_max_size_bits; 171 171 172 172 if (new_bytes > max_bytes) { 173 - pr_err("%pg: superblock too big: want %zu but have %llu", 174 - sb->bdev, new_bytes, max_bytes); 173 + struct printbuf buf = PRINTBUF; 174 + 175 + prt_bdevname(&buf, sb->bdev); 176 + prt_printf(&buf, ": superblock too big: want %zu but have %llu", new_bytes, max_bytes); 177 + pr_err("%s", buf.buf); 178 + printbuf_exit(&buf); 175 179 return -BCH_ERR_ENOSPC_sb; 176 180 } 177 181 }
+36 -13
fs/bcachefs/super.c
··· 1083 1083 fs->sb->write_time != sb->sb->write_time) { 1084 1084 struct printbuf buf = PRINTBUF; 1085 1085 1086 - prt_printf(&buf, "Split brain detected between %pg and %pg:", 1087 - sb->bdev, fs->bdev); 1086 + prt_str(&buf, "Split brain detected between "); 1087 + prt_bdevname(&buf, sb->bdev); 1088 + prt_str(&buf, " and "); 1089 + prt_bdevname(&buf, fs->bdev); 1090 + prt_char(&buf, ':'); 1088 1091 prt_newline(&buf); 1089 1092 prt_printf(&buf, "seq=%llu but write_time different, got", le64_to_cpu(sb->sb->seq)); 1090 1093 prt_newline(&buf); 1091 1094 1092 - prt_printf(&buf, "%pg ", fs->bdev); 1095 + prt_bdevname(&buf, fs->bdev); 1096 + prt_char(&buf, ' '); 1093 1097 bch2_prt_datetime(&buf, le64_to_cpu(fs->sb->write_time));; 1094 1098 prt_newline(&buf); 1095 1099 1096 - prt_printf(&buf, "%pg ", sb->bdev); 1100 + prt_bdevname(&buf, sb->bdev); 1101 + prt_char(&buf, ' '); 1097 1102 bch2_prt_datetime(&buf, le64_to_cpu(sb->sb->write_time));; 1098 1103 prt_newline(&buf); 1099 1104 ··· 1114 1109 u64 seq_from_member = le64_to_cpu(sb->sb->seq); 1115 1110 1116 1111 if (seq_from_fs && seq_from_fs < seq_from_member) { 1117 - pr_err("Split brain detected between %pg and %pg:\n" 1118 - "%pg believes seq of %pg to be %llu, but %pg has %llu\n" 1119 - "Not using %pg", 1120 - sb->bdev, fs->bdev, 1121 - fs->bdev, sb->bdev, seq_from_fs, 1122 - sb->bdev, seq_from_member, 1123 - sb->bdev); 1112 + struct printbuf buf = PRINTBUF; 1113 + 1114 + prt_str(&buf, "Split brain detected between "); 1115 + prt_bdevname(&buf, sb->bdev); 1116 + prt_str(&buf, " and "); 1117 + prt_bdevname(&buf, fs->bdev); 1118 + prt_char(&buf, ':'); 1119 + prt_newline(&buf); 1120 + 1121 + prt_bdevname(&buf, fs->bdev); 1122 + prt_str(&buf, "believes seq of "); 1123 + prt_bdevname(&buf, sb->bdev); 1124 + prt_printf(&buf, " to be %llu, but ", seq_from_fs); 1125 + prt_bdevname(&buf, sb->bdev); 1126 + prt_printf(&buf, " has %llu\n", seq_from_member); 1127 + prt_str(&buf, "Not using "); 1128 + prt_bdevname(&buf, sb->bdev); 1129 + 1130 + pr_err("%s", buf.buf); 1131 + printbuf_exit(&buf); 1124 1132 return -BCH_ERR_device_splitbrain; 1125 1133 } 1126 1134 ··· 1382 1364 1383 1365 bch2_dev_sysfs_online(c, ca); 1384 1366 1367 + struct printbuf name = PRINTBUF; 1368 + prt_bdevname(&name, ca->disk_sb.bdev); 1369 + 1385 1370 if (c->sb.nr_devices == 1) 1386 - snprintf(c->name, sizeof(c->name), "%pg", ca->disk_sb.bdev); 1387 - snprintf(ca->name, sizeof(ca->name), "%pg", ca->disk_sb.bdev); 1371 + strlcpy(c->name, name.buf, sizeof(c->name)); 1372 + strlcpy(ca->name, name.buf, sizeof(ca->name)); 1373 + 1374 + printbuf_exit(&name); 1388 1375 1389 1376 rebalance_wakeup(c); 1390 1377 return 0;
+9
fs/bcachefs/util.h
··· 351 351 void bch2_prt_backtrace(struct printbuf *, bch_stacktrace *); 352 352 int bch2_prt_task_backtrace(struct printbuf *, struct task_struct *, unsigned); 353 353 354 + static inline void prt_bdevname(struct printbuf *out, struct block_device *bdev) 355 + { 356 + #ifdef __KERNEL__ 357 + prt_printf(out, "%pg", bdev); 358 + #else 359 + prt_str(out, bdev->name); 360 + #endif 361 + } 362 + 354 363 #define NR_QUANTILES 15 355 364 #define QUANTILE_IDX(i) inorder_to_eytzinger0(i, NR_QUANTILES) 356 365 #define QUANTILE_FIRST eytzinger0_first(NR_QUANTILES)