while (data_opts.kill_ptrs) {
                unsigned i = 0, drop = __fls(data_opts.kill_ptrs);
 
-               bch2_bkey_drop_ptrs(bkey_i_to_s(n), ptr, i++ == drop);
+               bch2_bkey_drop_ptrs_noerror(bkey_i_to_s(n), ptr, i++ == drop);
                data_opts.kill_ptrs ^= 1U << drop;
        }
 
 
 
        bkey_reassemble(n, k);
 
-       bch2_bkey_drop_ptrs(bkey_i_to_s(n), ptr, ptr->dev != dev);
+       bch2_bkey_drop_ptrs_noerror(bkey_i_to_s(n), ptr, ptr->dev != dev);
        ec_ptr = bch2_bkey_has_device(bkey_i_to_s(n), dev);
        BUG_ON(!ec_ptr);
 
 
 
 void bch2_bkey_drop_ptr(struct bkey_s k, struct bch_extent_ptr *ptr)
 {
+       if (k.k->type != KEY_TYPE_stripe) {
+               struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(k.s_c);
+               const union bch_extent_entry *entry;
+               struct extent_ptr_decoded p;
+
+               bkey_for_each_ptr_decode(k.k, ptrs, p, entry)
+                       if (p.ptr.dev == ptr->dev && p.has_ec) {
+                               ptr->dev = BCH_SB_MEMBER_INVALID;
+                               return;
+                       }
+       }
+
        bool have_dirty = bch2_bkey_dirty_devs(k.s_c).nr;
 
        bch2_bkey_drop_ptr_noerror(k, ptr);
 
 void bch2_bkey_drop_device_noerror(struct bkey_s k, unsigned dev)
 {
-       struct bch_extent_ptr *ptr = bch2_bkey_has_device(k, dev);
-
-       if (ptr)
-               bch2_bkey_drop_ptr_noerror(k, ptr);
+       bch2_bkey_drop_ptrs_noerror(k, ptr, ptr->dev == dev);
 }
 
 const struct bch_extent_ptr *bch2_bkey_has_device_c(struct bkey_s_c k, unsigned dev)
 
 unsigned bch2_extent_ptr_durability(struct bch_fs *, struct extent_ptr_decoded *);
 unsigned bch2_bkey_durability(struct bch_fs *, struct bkey_s_c);
 
-void bch2_bkey_drop_device(struct bkey_s, unsigned);
-void bch2_bkey_drop_device_noerror(struct bkey_s, unsigned);
-
 const struct bch_extent_ptr *bch2_bkey_has_device_c(struct bkey_s_c, unsigned);
 
 static inline struct bch_extent_ptr *bch2_bkey_has_device(struct bkey_s k, unsigned dev)
 void bch2_bkey_drop_ptr_noerror(struct bkey_s, struct bch_extent_ptr *);
 void bch2_bkey_drop_ptr(struct bkey_s, struct bch_extent_ptr *);
 
+void bch2_bkey_drop_device_noerror(struct bkey_s, unsigned);
+void bch2_bkey_drop_device(struct bkey_s, unsigned);
+
+#define bch2_bkey_drop_ptrs_noerror(_k, _ptr, _cond)                   \
+do {                                                                   \
+       __label__ _again;                                               \
+       struct bkey_ptrs _ptrs;                                         \
+_again:                                                                        \
+       _ptrs = bch2_bkey_ptrs(_k);                                     \
+                                                                       \
+       bkey_for_each_ptr(_ptrs, _ptr)                                  \
+               if (_cond) {                                            \
+                       bch2_bkey_drop_ptr_noerror(_k, _ptr);           \
+                       goto _again;                                    \
+               }                                                       \
+} while (0)
+
 #define bch2_bkey_drop_ptrs(_k, _ptr, _cond)                           \
 do {                                                                   \
        __label__ _again;                                               \