diff options
| author | Kent Overstreet <kent.overstreet@linux.dev> | 2025-04-15 14:08:42 -0400 |
|---|---|---|
| committer | Kent Overstreet <kent.overstreet@linux.dev> | 2025-05-21 20:14:17 -0400 |
| commit | 040c762152f5f4fb1b13e8a46c17ecb4e670d96d (patch) | |
| tree | 65e07ba8c16b5323f7f48c28c71065ecf0568d69 /fs/bcachefs/extents.c | |
| parent | bcachefs: Simplify bch2_count_fsck_err() (diff) | |
| download | linux-040c762152f5f4fb1b13e8a46c17ecb4e670d96d.tar.gz linux-040c762152f5f4fb1b13e8a46c17ecb4e670d96d.zip | |
bcachefs: bch2_dev_missing_bkey()
Part of the ongoing project to kill off bch2_(fs|trans)_inconsistent
calls - they generally need to be replaced with either
- a fsck_err() call that can repair the error, or
- logging an error of the appropriate type in the superblock, and
flagging the appropriate recovery pass to repair the error
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/extents.c')
| -rw-r--r-- | fs/bcachefs/extents.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c index a369f978ffe6..ef116c55f0a7 100644 --- a/fs/bcachefs/extents.c +++ b/fs/bcachefs/extents.c @@ -158,7 +158,15 @@ int bch2_bkey_pick_read_device(struct bch_fs *c, struct bkey_s_c k, if (dev >= 0 && p.ptr.dev != dev) continue; - struct bch_dev *ca = bch2_dev_rcu(c, p.ptr.dev); + struct bch_dev *ca = bch2_dev_rcu_noerror(c, p.ptr.dev); + + if (unlikely(!ca && p.ptr.dev != BCH_SB_MEMBER_INVALID)) { + rcu_read_unlock(); + int ret = bch2_dev_missing_bkey(c, k, p.ptr.dev); + if (ret) + return ret; + rcu_read_lock(); + } if (p.ptr.cached && (!ca || dev_ptr_stale_rcu(ca, &p.ptr))) continue; |
