bcachefs: Fix an unhandled transaction restart
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 5 Aug 2021 17:02:39 +0000 (13:02 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:10 +0000 (17:09 -0400)
__bch2_read() -> __bch2_read_extent() -> bch2_bucket_io_time_reset() may
cause a transaction restart, which we don't return an error for because
it doesn't prevent us from making forward progress on the read we're
submitting.

Instead, change __bch2_read() and bchfs_read() to check for transaction
restarts.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/fs-io.c
fs/bcachefs/io.c

index 30e5acd2e97c4ca6ab71618e3ae91935b19cd5e2..9ac10b72d1cf0a5d0c01def5a075c364c48aa593 100644 (file)
@@ -791,6 +791,15 @@ retry:
                unsigned bytes, sectors, offset_into_extent;
                enum btree_id data_btree = BTREE_ID_extents;
 
+               /*
+                * read_extent -> io_time_reset may cause a transaction restart
+                * without returning an error, we need to check for that here:
+                */
+               if (!bch2_trans_relock(trans)) {
+                       ret = -EINTR;
+                       break;
+               }
+
                bch2_btree_iter_set_pos(iter,
                                POS(inum, rbio->bio.bi_iter.bi_sector));
 
index f293876e0bbc00032bf26385d1e7dc19b31b8f4e..30d9b6e4abf74482e788f59bd9e5bc128d8fce4e 100644 (file)
@@ -2288,6 +2288,15 @@ retry:
                unsigned bytes, sectors, offset_into_extent;
                enum btree_id data_btree = BTREE_ID_extents;
 
+               /*
+                * read_extent -> io_time_reset may cause a transaction restart
+                * without returning an error, we need to check for that here:
+                */
+               if (!bch2_trans_relock(&trans)) {
+                       ret = -EINTR;
+                       break;
+               }
+
                bch2_btree_iter_set_pos(iter,
                                POS(inode, bvec_iter.bi_sector));