summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-08-05 13:02:39 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:10 -0400
commit3737e0ddfbce4791a6415fa685e235b03924ff01 (patch)
treee277824d73f9e53eb07352ecc7df7b560caa4b2a /fs
parente3637266024de9bafa64f315d7d03cf0291ace6a (diff)
downloadlwn-3737e0ddfbce4791a6415fa685e235b03924ff01.tar.gz
lwn-3737e0ddfbce4791a6415fa685e235b03924ff01.zip
bcachefs: Fix an unhandled transaction restart
__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>
Diffstat (limited to 'fs')
-rw-r--r--fs/bcachefs/fs-io.c9
-rw-r--r--fs/bcachefs/io.c9
2 files changed, 18 insertions, 0 deletions
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c
index 30e5acd2e97c..9ac10b72d1cf 100644
--- a/fs/bcachefs/fs-io.c
+++ b/fs/bcachefs/fs-io.c
@@ -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));
diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c
index f293876e0bbc..30d9b6e4abf7 100644
--- a/fs/bcachefs/io.c
+++ b/fs/bcachefs/io.c
@@ -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));