]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/ec.c
Update bcachefs sources to 1a739db0b256 bcachefs; guard against overflow in btree...
[bcachefs-tools-debian] / libbcachefs / ec.c
index 76163c2ea3b3d2d747f0bc8a508c127263303679..0e5c455557a93edf6f0b4c988f4842f9bb067c10 100644 (file)
@@ -791,28 +791,22 @@ static void ec_stripe_delete_work(struct work_struct *work)
 {
        struct bch_fs *c =
                container_of(work, struct bch_fs, ec_stripe_delete_work);
-       struct btree_trans *trans = bch2_trans_get(c);
-       int ret;
-       u64 idx;
 
        while (1) {
                mutex_lock(&c->ec_stripes_heap_lock);
-               idx = stripe_idx_to_delete(c);
+               u64 idx = stripe_idx_to_delete(c);
                mutex_unlock(&c->ec_stripes_heap_lock);
 
                if (!idx)
                        break;
 
-               ret = commit_do(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
-                               ec_stripe_delete(trans, idx));
-               if (ret) {
-                       bch_err_fn(c, ret);
+               int ret = bch2_trans_do(c, NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
+                                       ec_stripe_delete(trans, idx));
+               bch_err_fn(c, ret);
+               if (ret)
                        break;
-               }
        }
 
-       bch2_trans_put(trans);
-
        bch2_write_ref_put(c, BCH_WRITE_REF_stripe_delete);
 }
 
@@ -1126,16 +1120,15 @@ static void ec_stripe_create(struct ec_stripe_new *s)
                            ec_stripe_key_update(trans,
                                        bkey_i_to_stripe(&s->new_stripe.key),
                                        !s->have_existing_stripe));
+       bch_err_msg(c, ret, "creating stripe key");
        if (ret) {
-               bch_err(c, "error creating stripe: error creating stripe key");
                goto err;
        }
 
        ret = ec_stripe_update_extents(c, &s->new_stripe);
-       if (ret) {
-               bch_err_msg(c, ret, "creating stripe: error updating pointers");
+       bch_err_msg(c, ret, "error updating extents");
+       if (ret)
                goto err;
-       }
 err:
        bch2_disk_reservation_put(c, &s->res);
 
@@ -1250,18 +1243,17 @@ static int unsigned_cmp(const void *_l, const void *_r)
 static unsigned pick_blocksize(struct bch_fs *c,
                               struct bch_devs_mask *devs)
 {
-       struct bch_dev *ca;
-       unsigned i, nr = 0, sizes[BCH_SB_MEMBERS_MAX];
+       unsigned nr = 0, sizes[BCH_SB_MEMBERS_MAX];
        struct {
                unsigned nr, size;
        } cur = { 0, 0 }, best = { 0, 0 };
 
-       for_each_member_device_rcu(ca, c, i, devs)
+       for_each_member_device_rcu(c, ca, devs)
                sizes[nr++] = ca->mi.bucket_size;
 
        sort(sizes, nr, sizeof(unsigned), unsigned_cmp, NULL);
 
-       for (i = 0; i < nr; i++) {
+       for (unsigned i = 0; i < nr; i++) {
                if (sizes[i] != cur.size) {
                        if (cur.nr > best.nr)
                                best = cur;
@@ -1344,8 +1336,6 @@ ec_new_stripe_head_alloc(struct bch_fs *c, unsigned target,
                         enum bch_watermark watermark)
 {
        struct ec_stripe_head *h;
-       struct bch_dev *ca;
-       unsigned i;
 
        h = kzalloc(sizeof(*h), GFP_KERNEL);
        if (!h)
@@ -1362,13 +1352,13 @@ ec_new_stripe_head_alloc(struct bch_fs *c, unsigned target,
        rcu_read_lock();
        h->devs = target_rw_devs(c, BCH_DATA_user, target);
 
-       for_each_member_device_rcu(ca, c, i, &h->devs)
+       for_each_member_device_rcu(c, ca, &h->devs)
                if (!ca->mi.durability)
-                       __clear_bit(i, h->devs.d);
+                       __clear_bit(ca->dev_idx, h->devs.d);
 
        h->blocksize = pick_blocksize(c, &h->devs);
 
-       for_each_member_device_rcu(ca, c, i, &h->devs)
+       for_each_member_device_rcu(c, ca, &h->devs)
                if (ca->mi.bucket_size == h->blocksize)
                        h->nr_active_devs++;
 
@@ -1833,14 +1823,7 @@ void bch2_fs_ec_flush(struct bch_fs *c)
 
 int bch2_stripes_read(struct bch_fs *c)
 {
-       struct btree_iter iter;
-       struct bkey_s_c k;
-       const struct bch_stripe *s;
-       struct stripe *m;
-       unsigned i;
-       int ret;
-
-       ret = bch2_trans_run(c,
+       int ret = bch2_trans_run(c,
                for_each_btree_key(trans, iter, BTREE_ID_stripes, POS_MIN,
                                   BTREE_ITER_PREFETCH, k, ({
                        if (k.k->type != KEY_TYPE_stripe)
@@ -1850,22 +1833,21 @@ int bch2_stripes_read(struct bch_fs *c)
                        if (ret)
                                break;
 
-                       s = bkey_s_c_to_stripe(k).v;
+                       const struct bch_stripe *s = bkey_s_c_to_stripe(k).v;
 
-                       m = genradix_ptr(&c->stripes, k.k->p.offset);
+                       struct stripe *m = genradix_ptr(&c->stripes, k.k->p.offset);
                        m->sectors      = le16_to_cpu(s->sectors);
                        m->algorithm    = s->algorithm;
                        m->nr_blocks    = s->nr_blocks;
                        m->nr_redundant = s->nr_redundant;
                        m->blocks_nonempty = 0;
 
-                       for (i = 0; i < s->nr_blocks; i++)
+                       for (unsigned i = 0; i < s->nr_blocks; i++)
                                m->blocks_nonempty += !!stripe_blockcount_get(s, i);
 
                        bch2_stripes_heap_insert(c, m, k.k->p.offset);
                        0;
                })));
-
        bch_err_fn(c, ret);
        return ret;
 }