Lines Matching refs:ob
78 static void bch2_open_bucket_hash_add(struct bch_fs *c, struct open_bucket *ob) in bch2_open_bucket_hash_add() argument
80 open_bucket_idx_t idx = ob - c->open_buckets; in bch2_open_bucket_hash_add()
81 open_bucket_idx_t *slot = open_bucket_hashslot(c, ob->dev, ob->bucket); in bch2_open_bucket_hash_add()
83 ob->hash = *slot; in bch2_open_bucket_hash_add()
87 static void bch2_open_bucket_hash_remove(struct bch_fs *c, struct open_bucket *ob) in bch2_open_bucket_hash_remove() argument
89 open_bucket_idx_t idx = ob - c->open_buckets; in bch2_open_bucket_hash_remove()
90 open_bucket_idx_t *slot = open_bucket_hashslot(c, ob->dev, ob->bucket); in bch2_open_bucket_hash_remove()
97 *slot = ob->hash; in bch2_open_bucket_hash_remove()
98 ob->hash = 0; in bch2_open_bucket_hash_remove()
101 void __bch2_open_bucket_put(struct bch_fs *c, struct open_bucket *ob) in __bch2_open_bucket_put() argument
103 struct bch_dev *ca = ob_dev(c, ob); in __bch2_open_bucket_put()
105 if (ob->ec) { in __bch2_open_bucket_put()
106 ec_stripe_new_put(c, ob->ec, STRIPE_REF_io); in __bch2_open_bucket_put()
111 spin_lock(&ob->lock); in __bch2_open_bucket_put()
113 ob->valid = false; in __bch2_open_bucket_put()
114 ob->data_type = 0; in __bch2_open_bucket_put()
116 spin_unlock(&ob->lock); in __bch2_open_bucket_put()
120 bch2_open_bucket_hash_remove(c, ob); in __bch2_open_bucket_put()
122 ob->freelist = c->open_buckets_freelist; in __bch2_open_bucket_put()
123 c->open_buckets_freelist = ob - c->open_buckets; in __bch2_open_bucket_put()
136 struct open_bucket *ob; in bch2_open_bucket_write_error() local
139 open_bucket_for_each(c, obs, ob, i) in bch2_open_bucket_write_error()
140 if (ob->dev == dev && ob->ec) in bch2_open_bucket_write_error()
141 bch2_ec_bucket_cancel(c, ob); in bch2_open_bucket_write_error()
146 struct open_bucket *ob; in bch2_open_bucket_alloc() local
150 ob = c->open_buckets + c->open_buckets_freelist; in bch2_open_bucket_alloc()
151 c->open_buckets_freelist = ob->freelist; in bch2_open_bucket_alloc()
152 atomic_set(&ob->pin, 1); in bch2_open_bucket_alloc()
153 ob->data_type = 0; in bch2_open_bucket_alloc()
156 return ob; in bch2_open_bucket_alloc()
159 static void open_bucket_free_unused(struct bch_fs *c, struct open_bucket *ob) in open_bucket_free_unused() argument
166 bch2_dev_rcu(c, ob->dev)->nr_partial_buckets++; in open_bucket_free_unused()
169 ob->on_partial_list = true; in open_bucket_free_unused()
171 ob - c->open_buckets; in open_bucket_free_unused()
216 struct open_bucket *ob; in __try_alloc_bucket() local
257 ob = bch2_open_bucket_alloc(c); in __try_alloc_bucket()
259 spin_lock(&ob->lock); in __try_alloc_bucket()
261 ob->valid = true; in __try_alloc_bucket()
262 ob->sectors_free = ca->mi.bucket_size; in __try_alloc_bucket()
263 ob->dev = ca->dev_idx; in __try_alloc_bucket()
264 ob->gen = a->gen; in __try_alloc_bucket()
265 ob->bucket = bucket; in __try_alloc_bucket()
266 spin_unlock(&ob->lock); in __try_alloc_bucket()
269 bch2_open_bucket_hash_add(c, ob); in __try_alloc_bucket()
275 return ob; in __try_alloc_bucket()
287 struct open_bucket *ob; in try_alloc_bucket() local
301 ob = ERR_PTR(-EIO); in try_alloc_bucket()
310 ob = ERR_PTR(ret); in try_alloc_bucket()
318 ob = NULL; in try_alloc_bucket()
328 ob = ERR_PTR(-EIO); in try_alloc_bucket()
341 ob = ERR_PTR(-EIO); in try_alloc_bucket()
353 ob = ERR_PTR(ret); in try_alloc_bucket()
363 ob = NULL; in try_alloc_bucket()
368 ob = __try_alloc_bucket(c, ca, b, watermark, a, s, cl); in try_alloc_bucket()
369 if (!ob) in try_alloc_bucket()
376 return ob; in try_alloc_bucket()
394 struct open_bucket *ob = NULL; in bch2_bucket_alloc_early() local
455 ob = __try_alloc_bucket(trans->c, ca, k.k->p.offset, watermark, a, s, cl); in bch2_bucket_alloc_early()
459 if (ob) in bch2_bucket_alloc_early()
466 if (!ob && ret) in bch2_bucket_alloc_early()
467 ob = ERR_PTR(ret); in bch2_bucket_alloc_early()
469 if (!ob && alloc_start > first_bucket) { in bch2_bucket_alloc_early()
476 return ob; in bch2_bucket_alloc_early()
487 struct open_bucket *ob = NULL; in bch2_bucket_alloc_freelist() local
525 ob = try_alloc_bucket(trans, ca, watermark, in bch2_bucket_alloc_freelist()
527 if (ob) { in bch2_bucket_alloc_freelist()
533 if (ob || ret) in bch2_bucket_alloc_freelist()
539 if (!ob && ret) in bch2_bucket_alloc_freelist()
540 ob = ERR_PTR(ret); in bch2_bucket_alloc_freelist()
542 if (!ob && alloc_start > ca->mi.first_bucket) { in bch2_bucket_alloc_freelist()
549 return ob; in bch2_bucket_alloc_freelist()
558 struct open_bucket *ob) in trace_bucket_alloc2() argument
580 if (!IS_ERR(ob)) { in trace_bucket_alloc2()
581 prt_printf(&buf, "allocated\t%llu\n", ob->bucket); in trace_bucket_alloc2()
584 prt_printf(&buf, "err\t%s\n", bch2_err_str(PTR_ERR(ob))); in trace_bucket_alloc2()
611 struct open_bucket *ob = NULL; in bch2_bucket_alloc_trans() local
640 ob = ERR_PTR(-BCH_ERR_freelist_empty); in bch2_bucket_alloc_trans()
647 ob = likely(freespace) in bch2_bucket_alloc_trans()
654 if (!ob && s.btree_bitmap != BTREE_BITMAP_ANY) { in bch2_bucket_alloc_trans()
659 if (!ob && freespace && c->curr_recovery_pass <= BCH_RECOVERY_PASS_check_alloc_info) { in bch2_bucket_alloc_trans()
664 if (!ob) in bch2_bucket_alloc_trans()
665 ob = ERR_PTR(-BCH_ERR_no_buckets_found); in bch2_bucket_alloc_trans()
667 if (!IS_ERR(ob)) in bch2_bucket_alloc_trans()
668 ob->data_type = data_type; in bch2_bucket_alloc_trans()
670 if (!IS_ERR(ob)) in bch2_bucket_alloc_trans()
672 else if (!bch2_err_matches(PTR_ERR(ob), BCH_ERR_transaction_restart)) in bch2_bucket_alloc_trans()
675 if (!IS_ERR(ob) in bch2_bucket_alloc_trans()
678 trace_bucket_alloc2(c, ca, watermark, data_type, cl, usage, &s, ob); in bch2_bucket_alloc_trans()
680 return ob; in bch2_bucket_alloc_trans()
689 struct open_bucket *ob; in bch2_bucket_alloc() local
692 PTR_ERR_OR_ZERO(ob = bch2_bucket_alloc_trans(trans, ca, watermark, in bch2_bucket_alloc()
694 return ob; in bch2_bucket_alloc()
756 struct open_bucket *ob) in add_new_bucket() argument
758 unsigned durability = ob_dev(c, ob)->mi.durability; in add_new_bucket()
762 __clear_bit(ob->dev, devs_may_alloc->d); in add_new_bucket()
766 ob_push(c, ptrs, ob); in add_new_bucket()
770 if (ob->ec) in add_new_bucket()
796 struct open_bucket *ob; in bch2_bucket_alloc_set_trans() local
808 ob = bch2_bucket_alloc_trans(trans, ca, watermark, data_type, in bch2_bucket_alloc_set_trans()
810 if (!IS_ERR(ob)) in bch2_bucket_alloc_set_trans()
814 if (IS_ERR(ob)) { in bch2_bucket_alloc_set_trans()
815 ret = PTR_ERR(ob); in bch2_bucket_alloc_set_trans()
823 have_cache, ob)) { in bch2_bucket_alloc_set_trans()
855 struct open_bucket *ob; in bucket_alloc_from_stripe() local
878 ob = c->open_buckets + h->s->blocks[ec_idx]; in bucket_alloc_from_stripe()
879 if (ob->dev == devs_sorted.devs[i] && in bucket_alloc_from_stripe()
885 ob->ec_idx = ec_idx; in bucket_alloc_from_stripe()
886 ob->ec = h->s; in bucket_alloc_from_stripe()
891 have_cache, ob); in bucket_alloc_from_stripe()
903 struct open_bucket *ob) in want_bucket() argument
905 struct bch_dev *ca = ob_dev(c, ob); in want_bucket()
907 if (!test_bit(ob->dev, devs_may_alloc->d)) in want_bucket()
910 if (ob->data_type != wp->data_type) in want_bucket()
917 if (ec != (ob->ec != NULL)) in want_bucket()
933 struct open_bucket *ob; in bucket_alloc_set_writepoint() local
937 open_bucket_for_each(c, &wp->ptrs, ob, i) { in bucket_alloc_set_writepoint()
939 have_cache, ec, ob)) in bucket_alloc_set_writepoint()
942 have_cache, ob); in bucket_alloc_set_writepoint()
944 ob_push(c, &ptrs_skip, ob); in bucket_alloc_set_writepoint()
971 struct open_bucket *ob = c->open_buckets + c->open_buckets_partial[i]; in bucket_alloc_set_partial() local
973 if (want_bucket(c, wp, devs_may_alloc, have_cache, ec, ob)) { in bucket_alloc_set_partial()
974 struct bch_dev *ca = ob_dev(c, ob); in bucket_alloc_set_partial()
986 ob->on_partial_list = false; in bucket_alloc_set_partial()
989 bch2_dev_rcu(c, ob->dev)->nr_partial_buckets--; in bucket_alloc_set_partial()
994 have_cache, ob); in bucket_alloc_set_partial()
1019 struct open_bucket *ob; in __open_bucket_add_buckets() local
1030 open_bucket_for_each(c, ptrs, ob, i) in __open_bucket_add_buckets()
1031 __clear_bit(ob->dev, devs.d); in __open_bucket_add_buckets()
1121 static bool should_drop_bucket(struct open_bucket *ob, struct bch_fs *c, in should_drop_bucket() argument
1125 return ob->ec != NULL; in should_drop_bucket()
1127 bool drop = ob->dev == ca->dev_idx; in should_drop_bucket()
1131 if (!drop && ob->ec) { in should_drop_bucket()
1134 mutex_lock(&ob->ec->lock); in should_drop_bucket()
1135 nr_blocks = bkey_i_to_stripe(&ob->ec->new_stripe.key)->v.nr_blocks; in should_drop_bucket()
1138 if (!ob->ec->blocks[i]) in should_drop_bucket()
1141 ob2 = c->open_buckets + ob->ec->blocks[i]; in should_drop_bucket()
1144 mutex_unlock(&ob->ec->lock); in should_drop_bucket()
1157 struct open_bucket *ob; in bch2_writepoint_stop() local
1161 open_bucket_for_each(c, &wp->ptrs, ob, i) in bch2_writepoint_stop()
1162 if (should_drop_bucket(ob, c, ca, ec)) in bch2_writepoint_stop()
1163 bch2_open_bucket_put(c, ob); in bch2_writepoint_stop()
1165 ob_push(c, &ptrs, ob); in bch2_writepoint_stop()
1188 bch2_open_buckets_put(c, &a->ob); in bch2_open_buckets_stop()
1195 struct open_bucket *ob = in bch2_open_buckets_stop() local
1198 if (should_drop_bucket(ob, c, ca, ec)) { in bch2_open_buckets_stop()
1203 ob->on_partial_list = false; in bch2_open_buckets_stop()
1206 bch2_dev_rcu(c, ob->dev)->nr_partial_buckets--; in bch2_open_buckets_stop()
1210 bch2_open_bucket_put(c, ob); in bch2_open_buckets_stop()
1270 struct open_bucket *ob; in try_decrease_writepoints() local
1291 open_bucket_for_each(c, &wp->ptrs, ob, i) in try_decrease_writepoints()
1292 open_bucket_free_unused(c, ob); in try_decrease_writepoints()
1362 struct open_bucket *ob; in deallocate_extra_replicas() local
1365 open_bucket_for_each(c, ptrs, ob, i) { in deallocate_extra_replicas()
1366 unsigned d = ob_dev(c, ob)->mi.durability; in deallocate_extra_replicas()
1370 ob_push(c, ptrs_no_use, ob); in deallocate_extra_replicas()
1372 ob_push(c, &ptrs2, ob); in deallocate_extra_replicas()
1396 struct open_bucket *ob; in bch2_alloc_sectors_start_trans() local
1483 open_bucket_for_each(c, &wp->ptrs, ob, i) in bch2_alloc_sectors_start_trans()
1484 open_bucket_free_unused(c, ob); in bch2_alloc_sectors_start_trans()
1490 open_bucket_for_each(c, &wp->ptrs, ob, i) in bch2_alloc_sectors_start_trans()
1491 wp->sectors_free = min(wp->sectors_free, ob->sectors_free); in bch2_alloc_sectors_start_trans()
1497 open_bucket_for_each(c, &wp->ptrs, ob, i) in bch2_alloc_sectors_start_trans()
1499 ob_push(c, &ptrs, ob); in bch2_alloc_sectors_start_trans()
1501 open_bucket_free_unused(c, ob); in bch2_alloc_sectors_start_trans()
1520 struct bch_extent_ptr bch2_ob_ptr(struct bch_fs *c, struct open_bucket *ob) in bch2_ob_ptr() argument
1522 struct bch_dev *ca = ob_dev(c, ob); in bch2_ob_ptr()
1526 .gen = ob->gen, in bch2_ob_ptr()
1527 .dev = ob->dev, in bch2_ob_ptr()
1528 .offset = bucket_to_sector(ca, ob->bucket) + in bch2_ob_ptr()
1530 ob->sectors_free, in bch2_ob_ptr()
1563 struct open_bucket *ob; in bch2_fs_allocator_foreground_init() local
1572 for (ob = c->open_buckets + 1; in bch2_fs_allocator_foreground_init()
1573 ob < c->open_buckets + ARRAY_SIZE(c->open_buckets); ob++) { in bch2_fs_allocator_foreground_init()
1574 spin_lock_init(&ob->lock); in bch2_fs_allocator_foreground_init()
1577 ob->freelist = c->open_buckets_freelist; in bch2_fs_allocator_foreground_init()
1578 c->open_buckets_freelist = ob - c->open_buckets; in bch2_fs_allocator_foreground_init()
1596 void bch2_open_bucket_to_text(struct printbuf *out, struct bch_fs *c, struct open_bucket *ob) in bch2_open_bucket_to_text() argument
1598 struct bch_dev *ca = ob_dev(c, ob); in bch2_open_bucket_to_text()
1599 unsigned data_type = ob->data_type; in bch2_open_bucket_to_text()
1603 ob - c->open_buckets, in bch2_open_bucket_to_text()
1604 atomic_read(&ob->pin)); in bch2_open_bucket_to_text()
1607 ob->dev, ob->bucket, ob->gen, in bch2_open_bucket_to_text()
1608 ca->mi.bucket_size - ob->sectors_free, ca->mi.bucket_size); in bch2_open_bucket_to_text()
1609 if (ob->ec) in bch2_open_bucket_to_text()
1610 prt_printf(out, " ec idx %llu", ob->ec->idx); in bch2_open_bucket_to_text()
1611 if (ob->on_partial_list) in bch2_open_bucket_to_text()
1619 struct open_bucket *ob; in bch2_open_buckets_to_text() local
1623 for (ob = c->open_buckets; in bch2_open_buckets_to_text()
1624 ob < c->open_buckets + ARRAY_SIZE(c->open_buckets); in bch2_open_buckets_to_text()
1625 ob++) { in bch2_open_buckets_to_text()
1626 spin_lock(&ob->lock); in bch2_open_buckets_to_text()
1627 if (ob->valid && (!ca || ob->dev == ca->dev_idx)) in bch2_open_buckets_to_text()
1628 bch2_open_bucket_to_text(out, c, ob); in bch2_open_buckets_to_text()
1629 spin_unlock(&ob->lock); in bch2_open_buckets_to_text()
1660 struct open_bucket *ob; in bch2_write_point_to_text() local
1677 open_bucket_for_each(c, &wp->ptrs, ob, i) in bch2_write_point_to_text()
1678 bch2_open_bucket_to_text(out, c, ob); in bch2_write_point_to_text()