bcachefs: Fix btree_trans leak in bch2_readahead()
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 20 May 2024 07:03:29 +0000 (03:03 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 22 May 2024 23:01:17 +0000 (19:01 -0400)
Reported-by: syzbot+d797fe78808e968d6c84@syzkaller.appspotmail.com
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs-io-buffered.c

index b0a33fabadf81cf920f7644d8cb29b4b5faf21b6..6b69e5cd68dd514bc51c3d7ae65b7977fad7fb3d 100644 (file)
@@ -257,7 +257,6 @@ void bch2_readahead(struct readahead_control *ractl)
        struct bch_inode_info *inode = to_bch_ei(ractl->mapping->host);
        struct bch_fs *c = inode->v.i_sb->s_fs_info;
        struct bch_io_opts opts;
-       struct btree_trans *trans = bch2_trans_get(c);
        struct folio *folio;
        struct readpages_iter readpages_iter;
 
@@ -269,6 +268,7 @@ void bch2_readahead(struct readahead_control *ractl)
 
        bch2_pagecache_add_get(inode);
 
+       struct btree_trans *trans = bch2_trans_get(c);
        while ((folio = readpage_iter_peek(&readpages_iter))) {
                unsigned n = min_t(unsigned,
                                   readpages_iter.folios.nr -
@@ -289,10 +289,10 @@ void bch2_readahead(struct readahead_control *ractl)
                           &readpages_iter);
                bch2_trans_unlock(trans);
        }
+       bch2_trans_put(trans);
 
        bch2_pagecache_add_put(inode);
 
-       bch2_trans_put(trans);
        darray_exit(&readpages_iter.folios);
 }