diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-08-05 13:02:39 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:10 -0400 |
commit | 3737e0ddfbce4791a6415fa685e235b03924ff01 (patch) | |
tree | e277824d73f9e53eb07352ecc7df7b560caa4b2a /fs | |
parent | e3637266024de9bafa64f315d7d03cf0291ace6a (diff) | |
download | lwn-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.c | 9 | ||||
-rw-r--r-- | fs/bcachefs/io.c | 9 |
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)); |