Skip to content

Commit 52df04f

Browse files
author
Kent Overstreet
committed
bcachefs: More BCH_SB_MEMBER_INVALID support
Signed-off-by: Kent Overstreet <[email protected]>
1 parent df88feb commit 52df04f

File tree

4 files changed

+17
-9
lines changed

4 files changed

+17
-9
lines changed

fs/bcachefs/buckets.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,13 @@ static int bch2_check_fix_ptr(struct btree_trans *trans,
100100

101101
struct bch_dev *ca = bch2_dev_tryget(c, p.ptr.dev);
102102
if (!ca) {
103-
if (fsck_err(trans, ptr_to_invalid_device,
104-
"pointer to missing device %u\n"
105-
"while marking %s",
106-
p.ptr.dev,
107-
(printbuf_reset(&buf),
108-
bch2_bkey_val_to_text(&buf, c, k), buf.buf)))
103+
if (fsck_err_on(p.ptr.dev != BCH_SB_MEMBER_INVALID,
104+
trans, ptr_to_invalid_device,
105+
"pointer to missing device %u\n"
106+
"while marking %s",
107+
p.ptr.dev,
108+
(printbuf_reset(&buf),
109+
bch2_bkey_val_to_text(&buf, c, k), buf.buf)))
109110
*do_update = true;
110111
return 0;
111112
}
@@ -562,7 +563,7 @@ static int bch2_trigger_pointer(struct btree_trans *trans,
562563
struct bch_fs *c = trans->c;
563564
struct bch_dev *ca = bch2_dev_tryget(c, p.ptr.dev);
564565
if (unlikely(!ca)) {
565-
if (insert)
566+
if (insert && p.ptr.dev != BCH_SB_MEMBER_INVALID)
566567
ret = -EIO;
567568
goto err;
568569
}

fs/bcachefs/ec.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@ static inline bool __bch2_ptr_matches_stripe(const struct bch_extent_ptr *stripe
9797
const struct bch_extent_ptr *data_ptr,
9898
unsigned sectors)
9999
{
100-
return data_ptr->dev == stripe_ptr->dev &&
100+
return (data_ptr->dev == stripe_ptr->dev ||
101+
data_ptr->dev == BCH_SB_MEMBER_INVALID ||
102+
stripe_ptr->dev == BCH_SB_MEMBER_INVALID) &&
101103
data_ptr->gen == stripe_ptr->gen &&
102104
data_ptr->offset >= stripe_ptr->offset &&
103105
data_ptr->offset < stripe_ptr->offset + sectors;

fs/bcachefs/extents.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,11 @@ void bch2_bkey_drop_ptr_noerror(struct bkey_s k, struct bch_extent_ptr *ptr)
787787
union bch_extent_entry *entry = to_entry(ptr), *next;
788788
bool drop_crc = true;
789789

790+
if (k.k->type == KEY_TYPE_stripe) {
791+
ptr->dev = BCH_SB_MEMBER_INVALID;
792+
return;
793+
}
794+
790795
EBUG_ON(ptr < &ptrs.start->ptr ||
791796
ptr >= &ptrs.end->ptr);
792797
EBUG_ON(ptr->type != 1 << BCH_EXTENT_ENTRY_ptr);

fs/bcachefs/replicas.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ bool bch2_have_enough_devs(struct bch_fs *c, struct bch_devs_mask devs,
796796
nr_online += test_bit(e->devs[i], devs.d);
797797

798798
struct bch_dev *ca = bch2_dev_rcu(c, e->devs[i]);
799-
nr_failed += ca && ca->mi.state == BCH_MEMBER_STATE_failed;
799+
nr_failed += !ca || ca->mi.state == BCH_MEMBER_STATE_failed;
800800
}
801801
rcu_read_unlock();
802802

0 commit comments

Comments
 (0)