]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/io.c
Update bcachefs sources to b964c6cba8 bcachefs: Change lockrestart_do() to always...
[bcachefs-tools-debian] / libbcachefs / io.c
index 092ece2c8bdee20594ad57fc34148acf4b7a87f7..a59b291a4806ce799bc8cf349362400adb710827 100644 (file)
@@ -235,8 +235,12 @@ int bch2_sum_sector_overwrites(struct btree_trans *trans,
                         * writing to, because i_size could be up to one block
                         * less:
                         */
-                       if (!bkey_cmp(old.k->p, new->k.p))
+                       if (!bkey_cmp(old.k->p, new->k.p)) {
                                old = bch2_btree_iter_next(iter);
+                               ret = bkey_err(old);
+                               if (ret)
+                                       break;
+                       }
 
                        if (old.k && !bkey_err(old) &&
                            old.k->p.inode == extent_iter->pos.inode &&
@@ -362,14 +366,13 @@ int bch2_fpunch_at(struct btree_trans *trans, struct btree_iter *iter,
        struct bkey_s_c k;
        int ret = 0, ret2 = 0;
 
-       while ((k = bch2_btree_iter_peek(iter)).k &&
+       while ((bch2_trans_begin(trans),
+               (k = bch2_btree_iter_peek(iter)).k) &&
               bkey_cmp(iter->pos, end) < 0) {
                struct disk_reservation disk_res =
                        bch2_disk_reservation_init(c, 0);
                struct bkey_i delete;
 
-               bch2_trans_begin(trans);
-
                ret = bkey_err(k);
                if (ret)
                        goto btree_err;
@@ -2270,12 +2273,13 @@ void __bch2_read(struct bch_fs *c, struct bch_read_bio *rbio,
 
        bch2_bkey_buf_init(&sk);
        bch2_trans_init(&trans, c, 0, 0);
-retry:
-       bch2_trans_begin(&trans);
 
        iter = bch2_trans_get_iter(&trans, BTREE_ID_extents,
                                   POS(inode, bvec_iter.bi_sector),
                                   BTREE_ITER_SLOTS);
+retry:
+       bch2_trans_begin(&trans);
+
        while (1) {
                unsigned bytes, sectors, offset_into_extent;
                enum btree_id data_btree = BTREE_ID_extents;
@@ -2331,19 +2335,20 @@ retry:
                swap(bvec_iter.bi_size, bytes);
                bio_advance_iter(&rbio->bio, &bvec_iter, bytes);
        }
-       bch2_trans_iter_put(&trans, iter);
 
        if (ret == -EINTR || ret == READ_RETRY || ret == READ_RETRY_AVOID)
                goto retry;
 
+       bch2_trans_iter_put(&trans, iter);
+       bch2_trans_exit(&trans);
+       bch2_bkey_buf_exit(&sk, c);
+
        if (ret) {
                bch_err_inum_ratelimited(c, inode,
                                         "read error %i from btree lookup", ret);
                rbio->bio.bi_status = BLK_STS_IOERR;
                bch2_rbio_done(rbio);
        }
-       bch2_trans_exit(&trans);
-       bch2_bkey_buf_exit(&sk, c);
 }
 
 void bch2_fs_io_exit(struct bch_fs *c)