bcachefs: bch2_folio_set() -> for_each_btree_key_in_subvolume_upto
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 17 Jul 2024 17:34:35 +0000 (13:34 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 9 Sep 2024 13:41:48 +0000 (09:41 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs-io-pagecache.c

index a9cc5ca..af3a245 100644 (file)
@@ -182,18 +182,11 @@ static void __bch2_folio_set(struct folio *folio,
 int bch2_folio_set(struct bch_fs *c, subvol_inum inum,
                   struct folio **fs, unsigned nr_folios)
 {
-       struct btree_trans *trans;
-       struct btree_iter iter;
-       struct bkey_s_c k;
-       struct bch_folio *s;
        u64 offset = folio_sector(fs[0]);
-       unsigned folio_idx;
-       u32 snapshot;
        bool need_set = false;
-       int ret;
 
-       for (folio_idx = 0; folio_idx < nr_folios; folio_idx++) {
-               s = bch2_folio_create(fs[folio_idx], GFP_KERNEL);
+       for (unsigned folio_idx = 0; folio_idx < nr_folios; folio_idx++) {
+               struct bch_folio *s = bch2_folio_create(fs[folio_idx], GFP_KERNEL);
                if (!s)
                        return -ENOMEM;
 
@@ -203,53 +196,40 @@ int bch2_folio_set(struct bch_fs *c, subvol_inum inum,
        if (!need_set)
                return 0;
 
-       folio_idx = 0;
-       trans = bch2_trans_get(c);
-retry:
-       bch2_trans_begin(trans);
-
-       ret = bch2_subvolume_get_snapshot(trans, inum.subvol, &snapshot);
-       if (ret)
-               goto err;
-
-       for_each_btree_key_norestart(trans, iter, BTREE_ID_extents,
-                          SPOS(inum.inum, offset, snapshot),
-                          BTREE_ITER_slots, k, ret) {
-               unsigned nr_ptrs = bch2_bkey_nr_ptrs_fully_allocated(k);
-               unsigned state = bkey_to_sector_state(k);
-
-               while (folio_idx < nr_folios) {
-                       struct folio *folio = fs[folio_idx];
-                       u64 folio_start = folio_sector(folio);
-                       u64 folio_end   = folio_end_sector(folio);
-                       unsigned folio_offset = max(bkey_start_offset(k.k), folio_start) -
-                               folio_start;
-                       unsigned folio_len = min(k.k->p.offset, folio_end) -
-                               folio_offset - folio_start;
-
-                       BUG_ON(k.k->p.offset < folio_start);
-                       BUG_ON(bkey_start_offset(k.k) > folio_end);
-
-                       if (!bch2_folio(folio)->uptodate)
-                               __bch2_folio_set(folio, folio_offset, folio_len, nr_ptrs, state);
-
-                       if (k.k->p.offset < folio_end)
-                               break;
-                       folio_idx++;
-               }
-
-               if (folio_idx == nr_folios)
-                       break;
-       }
-
-       offset = iter.pos.offset;
-       bch2_trans_iter_exit(trans, &iter);
-err:
-       if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
-               goto retry;
-       bch2_trans_put(trans);
+       unsigned folio_idx = 0;
+
+       return bch2_trans_run(c,
+               for_each_btree_key_in_subvolume_upto(trans, iter, BTREE_ID_extents,
+                                  POS(inum.inum, offset),
+                                  POS(inum.inum, U64_MAX),
+                                  inum.subvol, BTREE_ITER_slots, k, ({
+                       unsigned nr_ptrs = bch2_bkey_nr_ptrs_fully_allocated(k);
+                       unsigned state = bkey_to_sector_state(k);
+
+                       while (folio_idx < nr_folios) {
+                               struct folio *folio = fs[folio_idx];
+                               u64 folio_start = folio_sector(folio);
+                               u64 folio_end   = folio_end_sector(folio);
+                               unsigned folio_offset = max(bkey_start_offset(k.k), folio_start) -
+                                       folio_start;
+                               unsigned folio_len = min(k.k->p.offset, folio_end) -
+                                       folio_offset - folio_start;
+
+                               BUG_ON(k.k->p.offset < folio_start);
+                               BUG_ON(bkey_start_offset(k.k) > folio_end);
+
+                               if (!bch2_folio(folio)->uptodate)
+                                       __bch2_folio_set(folio, folio_offset, folio_len, nr_ptrs, state);
+
+                               if (k.k->p.offset < folio_end)
+                                       break;
+                               folio_idx++;
+                       }
 
-       return ret;
+                       if (folio_idx == nr_folios)
+                               break;
+                       0;
+               })));
 }
 
 void bch2_bio_page_state_set(struct bio *bio, struct bkey_s_c k)