On Mon, Jan 13, 2025 at 05:24:26AM +0100, Christoph Hellwig wrote: > Commit 32dd4f9c506b ("xfs: remove a superflous hash lookup when inserting > new buffers") converted xfs_buf_find_insert to use > rhashtable_lookup_get_insert_fast and thus an operation that returns the > existing buffer when an insert would duplicate the hash key. But this > code path misses the check for a buffer with a reference count of zero, > which could lead to reusing an about to be freed buffer. Fix this by > using the same atomic_inc_not_zero pattern as xfs_buf_insert. > > Fixes: 32dd4f9c506b ("xfs: remove a superflous hash lookup when inserting new buffers") > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Cc: <stable@xxxxxxxxxxxxxxx> # v6.0 and with that added, Reviewed-by: "Darrick J. Wong" <djwong@xxxxxxxxxx> --D > --- > fs/xfs/xfs_buf.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 6f313fbf7669..f80e39fde53b 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -664,9 +664,8 @@ xfs_buf_find_insert( > spin_unlock(&bch->bc_lock); > goto out_free_buf; > } > - if (bp) { > + if (bp && atomic_inc_not_zero(&bp->b_hold)) { > /* found an existing buffer */ > - atomic_inc(&bp->b_hold); > spin_unlock(&bch->bc_lock); > error = xfs_buf_find_lock(bp, flags); > if (error) > -- > 2.45.2 >