struct sort_iter *iter;
        struct btree_node *sorted;
        struct bkey_packed *k;
+       struct bch_extent_ptr *ptr;
        struct bset *i;
        bool used_mempool, blacklisted;
        unsigned u64s;
                        bset_encrypt(c, i, b->written << 9);
 
                        if (btree_node_is_extents(b) &&
-                           !BTREE_NODE_NEW_EXTENT_OVERWRITE(b->data))
+                           !BTREE_NODE_NEW_EXTENT_OVERWRITE(b->data)) {
                                set_btree_node_old_extent_overwrite(b);
+                               set_btree_node_need_rewrite(b);
+                       }
 
                        sectors = vstruct_sectors(b->data, c->block_bits);
                } else {
        set_needs_whiteout(btree_bset_first(b), true);
 
        btree_node_reset_sib_u64s(b);
+
+       bkey_for_each_ptr(bch2_bkey_ptrs(bkey_i_to_s(&b->key)), ptr) {
+               struct bch_dev *ca = bch_dev_bkey_exists(c, ptr->dev);
+
+               if (ca->mi.state != BCH_MEMBER_STATE_RW)
+                       set_btree_node_need_rewrite(b);
+       }
 out:
        mempool_free(iter, &c->fill_iter);
        return retry_read;
 
        BTREE_NODE_dying,
        BTREE_NODE_fake,
        BTREE_NODE_old_extent_overwrite,
+       BTREE_NODE_need_rewrite,
 };
 
 BTREE_FLAG(read_in_flight);
 BTREE_FLAG(dying);
 BTREE_FLAG(fake);
 BTREE_FLAG(old_extent_overwrite);
+BTREE_FLAG(need_rewrite);
 
 static inline struct btree_write *btree_current_write(struct btree *b)
 {
 
                SET_BTREE_NODE_NEW_EXTENT_OVERWRITE(b->data, true);
 
        if (btree_node_is_extents(b) &&
-           !BTREE_NODE_NEW_EXTENT_OVERWRITE(b->data))
+           !BTREE_NODE_NEW_EXTENT_OVERWRITE(b->data)) {
                set_btree_node_old_extent_overwrite(b);
+               set_btree_node_need_rewrite(b);
+       }
 
        bch2_btree_build_aux_trees(b);
 
        bch2_btree_cache_cannibalize_unlock(c);
 
        set_btree_node_fake(b);
+       set_btree_node_need_rewrite(b);
        b->c.level      = 0;
        b->c.btree_id   = id;
 
 
        struct bch_fs *c = trans->c;
        struct btree *b = iter_l(iter)->b;
 
-       if (unlikely(btree_node_fake(b)))
-               return BTREE_INSERT_BTREE_NODE_FULL;
-
-       /*
-        * old bch2_extent_sort_fix_overlapping() algorithm won't work with new
-        * style extent updates:
-        */
-       if (unlikely(btree_node_old_extent_overwrite(b)))
-               return BTREE_INSERT_BTREE_NODE_FULL;
-
-       if (unlikely(u64s > bch_btree_keys_u64s_remaining(c, b)))
+       if (unlikely(btree_node_need_rewrite(b)) ||
+           unlikely(u64s > bch_btree_keys_u64s_remaining(c, b)))
                return BTREE_INSERT_BTREE_NODE_FULL;
 
        return BTREE_INSERT_OK;