POS(inode->v.i_ino, start_sector),
                        BTREE_ITER_slots|BTREE_ITER_intent);
 
-       while (!ret && bkey_lt(iter.pos, end_pos)) {
+       while (!ret) {
                s64 i_sectors_delta = 0;
                struct quota_res quota_res = { 0 };
                struct bkey_s_c k;
 
                bch2_trans_begin(trans);
 
+               if (bkey_ge(iter.pos, end_pos))
+                       break;
+
                ret = bch2_subvolume_get_snapshot(trans,
                                        inode->ei_inum.subvol, &snapshot);
                if (ret)
                        if (bch2_clamp_data_hole(&inode->v,
                                                 &hole_start,
                                                 &hole_end,
-                                                opts.data_replicas, true))
+                                                opts.data_replicas, true)) {
                                ret = drop_locks_do(trans,
                                        (bch2_clamp_data_hole(&inode->v,
                                                              &hole_start,
                                                              &hole_end,
                                                              opts.data_replicas, false), 0));
+                               if (ret)
+                                       goto bkey_err;
+                       }
                        bch2_btree_iter_set_pos(&iter, POS(iter.pos.inode, hole_start));
 
                        if (ret)
                bch2_i_sectors_acct(c, inode, "a_res, i_sectors_delta);
 
                if (bch2_mark_pagecache_reserved(inode, &hole_start,
-                                                iter.pos.offset, true))
-                       drop_locks_do(trans,
+                                                iter.pos.offset, true)) {
+                       ret = drop_locks_do(trans,
                                bch2_mark_pagecache_reserved(inode, &hole_start,
                                                             iter.pos.offset, false));
+                       if (ret)
+                               goto bkey_err;
+               }
 bkey_err:
                bch2_quota_reservation_put(c, inode, "a_res);
                if (bch2_err_matches(ret, BCH_ERR_transaction_restart))