]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: bch_dev->dev
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 3 Jan 2022 02:45:35 +0000 (21:45 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:21 +0000 (17:09 -0400)
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>
fs/bcachefs/bcachefs.h
fs/bcachefs/chardev.c
fs/bcachefs/super.c
fs/bcachefs/trace.h

index 7771b4a4bb87b49e183eedcd14c8eeb6188c7aa6..7c48ebed1d358fb6315cd53d9354b61fec84073b 100644 (file)
@@ -432,6 +432,7 @@ struct bch_dev {
        struct bch_sb_handle    disk_sb;
        struct bch_sb           *sb_read_scratch;
        int                     sb_write_error;
+       dev_t                   dev;
 
        struct bch_devs_mask    self;
 
index aae9a2db8b0dce4143f5e1c51d3458cc6ac0bf95..6cd0a2739ce5068f6bfbbf905adaa6bf75fda194 100644 (file)
@@ -568,8 +568,11 @@ static long bch2_ioctl_disk_get_idx(struct bch_fs *c,
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
 
+       if (!dev)
+               return -EINVAL;
+
        for_each_online_member(ca, c, i)
-               if (ca->disk_sb.bdev->bd_dev == dev) {
+               if (ca->dev == dev) {
                        percpu_ref_put(&ca->io_ref);
                        return i;
                }
index d92bb50d0960c7c2da3c368821307f53ed3ef46f..b0c2a8b847ef0dcfe2ed6eb4d3b5c9aa4f9837c6 100644 (file)
@@ -1257,6 +1257,8 @@ static int __bch2_dev_attach_bdev(struct bch_dev *ca, struct bch_sb_handle *sb)
        ca->disk_sb = *sb;
        memset(sb, 0, sizeof(*sb));
 
+       ca->dev = ca->disk_sb.bdev->bd_dev;
+
        percpu_ref_reinit(&ca->io_ref);
 
        return 0;
@@ -1875,7 +1877,7 @@ struct bch_dev *bch2_dev_lookup(struct bch_fs *c, const char *path)
 
        rcu_read_lock();
        for_each_member_device_rcu(ca, c, i, NULL)
-               if (ca->disk_sb.bdev->bd_dev == dev)
+               if (ca->dev == dev)
                        goto found;
        ca = ERR_PTR(-ENOENT);
 found:
index a1122fa3ccc6b401df472f813268908c7067c1db..ff67e8572ea4d28432c342356fb846f0a4035146 100644 (file)
@@ -387,7 +387,7 @@ TRACE_EVENT(alloc_scan,
        ),
 
        TP_fast_assign(
-               __entry->dev            = ca->disk_sb.bdev->bd_dev;
+               __entry->dev            = ca->dev;
                __entry->found          = found;
                __entry->inc_gen        = inc_gen;
                __entry->inc_gen_skipped = inc_gen_skipped;
@@ -409,7 +409,7 @@ TRACE_EVENT(invalidate,
        ),
 
        TP_fast_assign(
-               __entry->dev            = ca->disk_sb.bdev->bd_dev;
+               __entry->dev            = ca->dev;
                __entry->offset         = offset,
                __entry->sectors        = sectors;
        ),
@@ -431,7 +431,7 @@ DECLARE_EVENT_CLASS(bucket_alloc,
        ),
 
        TP_fast_assign(
-               __entry->dev            = ca->disk_sb.bdev->bd_dev;
+               __entry->dev            = ca->dev;
                __entry->reserve        = reserve;
        ),