Commit 24f755e4 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong

xfs: split xfs_buf_rele for cached vs uncached buffers

xfs_buf_rele is a bit confusing because it mixes up handling of normal
cached and the special uncached buffers without much explanation.
Split the handling into two different helpers, and use a clearly named
helper that checks the hash key to distinguish the two cases instead
of checking the pag pointer.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
parent 6a701eb8
...@@ -60,6 +60,11 @@ xfs_buf_submit( ...@@ -60,6 +60,11 @@ xfs_buf_submit(
return __xfs_buf_submit(bp, !(bp->b_flags & XBF_ASYNC)); return __xfs_buf_submit(bp, !(bp->b_flags & XBF_ASYNC));
} }
static inline bool xfs_buf_is_uncached(struct xfs_buf *bp)
{
return bp->b_rhash_key == XFS_BUF_DADDR_NULL;
}
static inline int static inline int
xfs_buf_is_vmapped( xfs_buf_is_vmapped(
struct xfs_buf *bp) struct xfs_buf *bp)
...@@ -996,12 +1001,19 @@ xfs_buf_hold( ...@@ -996,12 +1001,19 @@ xfs_buf_hold(
atomic_inc(&bp->b_hold); atomic_inc(&bp->b_hold);
} }
/* static void
* Release a hold on the specified buffer. If the hold count is 1, the buffer is xfs_buf_rele_uncached(
* placed on LRU or freed (depending on b_lru_ref). struct xfs_buf *bp)
*/ {
void ASSERT(list_empty(&bp->b_lru));
xfs_buf_rele( if (atomic_dec_and_test(&bp->b_hold)) {
xfs_buf_ioacct_dec(bp);
xfs_buf_free(bp);
}
}
static void
xfs_buf_rele_cached(
struct xfs_buf *bp) struct xfs_buf *bp)
{ {
struct xfs_perag *pag = bp->b_pag; struct xfs_perag *pag = bp->b_pag;
...@@ -1010,15 +1022,6 @@ xfs_buf_rele( ...@@ -1010,15 +1022,6 @@ xfs_buf_rele(
trace_xfs_buf_rele(bp, _RET_IP_); trace_xfs_buf_rele(bp, _RET_IP_);
if (!pag) {
ASSERT(list_empty(&bp->b_lru));
if (atomic_dec_and_test(&bp->b_hold)) {
xfs_buf_ioacct_dec(bp);
xfs_buf_free(bp);
}
return;
}
ASSERT(atomic_read(&bp->b_hold) > 0); ASSERT(atomic_read(&bp->b_hold) > 0);
/* /*
...@@ -1086,6 +1089,19 @@ xfs_buf_rele( ...@@ -1086,6 +1089,19 @@ xfs_buf_rele(
xfs_buf_free(bp); xfs_buf_free(bp);
} }
/*
* Release a hold on the specified buffer.
*/
void
xfs_buf_rele(
struct xfs_buf *bp)
{
trace_xfs_buf_rele(bp, _RET_IP_);
if (xfs_buf_is_uncached(bp))
xfs_buf_rele_uncached(bp);
else
xfs_buf_rele_cached(bp);
}
/* /*
* Lock a buffer object, if it is not already locked. * Lock a buffer object, if it is not already locked.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment