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

bcachefs: bch_dev->dev

Add a field to bch_dev for the dev_t of the underlying block device -
this fixes a null ptr deref in tracepoints.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>

authored by

Kent Overstreet and committed by
Kent Overstreet
eacb2574 d8601afc

+11 -5
+1
fs/bcachefs/bcachefs.h
··· 432 432 struct bch_sb_handle disk_sb; 433 433 struct bch_sb *sb_read_scratch; 434 434 int sb_write_error; 435 + dev_t dev; 435 436 436 437 struct bch_devs_mask self; 437 438
+4 -1
fs/bcachefs/chardev.c
··· 568 568 if (!capable(CAP_SYS_ADMIN)) 569 569 return -EPERM; 570 570 571 + if (!dev) 572 + return -EINVAL; 573 + 571 574 for_each_online_member(ca, c, i) 572 - if (ca->disk_sb.bdev->bd_dev == dev) { 575 + if (ca->dev == dev) { 573 576 percpu_ref_put(&ca->io_ref); 574 577 return i; 575 578 }
+3 -1
fs/bcachefs/super.c
··· 1257 1257 ca->disk_sb = *sb; 1258 1258 memset(sb, 0, sizeof(*sb)); 1259 1259 1260 + ca->dev = ca->disk_sb.bdev->bd_dev; 1261 + 1260 1262 percpu_ref_reinit(&ca->io_ref); 1261 1263 1262 1264 return 0; ··· 1877 1875 1878 1876 rcu_read_lock(); 1879 1877 for_each_member_device_rcu(ca, c, i, NULL) 1880 - if (ca->disk_sb.bdev->bd_dev == dev) 1878 + if (ca->dev == dev) 1881 1879 goto found; 1882 1880 ca = ERR_PTR(-ENOENT); 1883 1881 found:
+3 -3
fs/bcachefs/trace.h
··· 387 387 ), 388 388 389 389 TP_fast_assign( 390 - __entry->dev = ca->disk_sb.bdev->bd_dev; 390 + __entry->dev = ca->dev; 391 391 __entry->found = found; 392 392 __entry->inc_gen = inc_gen; 393 393 __entry->inc_gen_skipped = inc_gen_skipped; ··· 409 409 ), 410 410 411 411 TP_fast_assign( 412 - __entry->dev = ca->disk_sb.bdev->bd_dev; 412 + __entry->dev = ca->dev; 413 413 __entry->offset = offset, 414 414 __entry->sectors = sectors; 415 415 ), ··· 431 431 ), 432 432 433 433 TP_fast_assign( 434 - __entry->dev = ca->disk_sb.bdev->bd_dev; 434 + __entry->dev = ca->dev; 435 435 __entry->reserve = reserve; 436 436 ), 437 437