l2arc: do not call trim_map_free() for blocks with zero b_asize
b_asize can be zero if the block is compressed into an empty block (ZIO_COMPRESS_EMPTY) and the trim code asserts that meaningless zero-sized trimming is not attempted. The logic for calling trim_map_free() is extracted into a new function l2arc_trim() to minimize code duplication. PR: 203473 Reported by: Willem Jan Withagen <wjw@digiware.nl> Tested by: Willem Jan Withagen <wjw@digiware.nl> MFC after: 11 days
This commit is contained in:
parent
323b92baff
commit
abc37121c4
@ -1131,6 +1131,24 @@ static boolean_t l2arc_compress_buf(arc_buf_hdr_t *);
|
|||||||
static void l2arc_decompress_zio(zio_t *, arc_buf_hdr_t *, enum zio_compress);
|
static void l2arc_decompress_zio(zio_t *, arc_buf_hdr_t *, enum zio_compress);
|
||||||
static void l2arc_release_cdata_buf(arc_buf_hdr_t *);
|
static void l2arc_release_cdata_buf(arc_buf_hdr_t *);
|
||||||
|
|
||||||
|
static void
|
||||||
|
l2arc_trim(const arc_buf_hdr_t *hdr)
|
||||||
|
{
|
||||||
|
l2arc_dev_t *dev = hdr->b_l2hdr.b_dev;
|
||||||
|
|
||||||
|
ASSERT(HDR_HAS_L2HDR(hdr));
|
||||||
|
ASSERT(MUTEX_HELD(&dev->l2ad_mtx));
|
||||||
|
|
||||||
|
if (hdr->b_l2hdr.b_daddr == L2ARC_ADDR_UNSET)
|
||||||
|
return;
|
||||||
|
if (hdr->b_l2hdr.b_asize != 0) {
|
||||||
|
trim_map_free(dev->l2ad_vdev, hdr->b_l2hdr.b_daddr,
|
||||||
|
hdr->b_l2hdr.b_asize, 0);
|
||||||
|
} else {
|
||||||
|
ASSERT3U(hdr->b_l2hdr.b_compress, ==, ZIO_COMPRESS_EMPTY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static uint64_t
|
static uint64_t
|
||||||
buf_hash(uint64_t spa, const dva_t *dva, uint64_t birth)
|
buf_hash(uint64_t spa, const dva_t *dva, uint64_t birth)
|
||||||
{
|
{
|
||||||
@ -2403,10 +2421,7 @@ arc_hdr_destroy(arc_buf_hdr_t *hdr)
|
|||||||
* want to re-destroy the header's L2 portion.
|
* want to re-destroy the header's L2 portion.
|
||||||
*/
|
*/
|
||||||
if (HDR_HAS_L2HDR(hdr)) {
|
if (HDR_HAS_L2HDR(hdr)) {
|
||||||
if (hdr->b_l2hdr.b_daddr != L2ARC_ADDR_UNSET)
|
l2arc_trim(hdr);
|
||||||
trim_map_free(dev->l2ad_vdev,
|
|
||||||
hdr->b_l2hdr.b_daddr,
|
|
||||||
hdr->b_l2hdr.b_asize, 0);
|
|
||||||
arc_hdr_l2hdr_destroy(hdr);
|
arc_hdr_l2hdr_destroy(hdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4776,10 +4791,7 @@ arc_release(arc_buf_t *buf, void *tag)
|
|||||||
* to acquire the l2ad_mtx.
|
* to acquire the l2ad_mtx.
|
||||||
*/
|
*/
|
||||||
if (HDR_HAS_L2HDR(hdr)) {
|
if (HDR_HAS_L2HDR(hdr)) {
|
||||||
if (hdr->b_l2hdr.b_daddr != L2ARC_ADDR_UNSET)
|
l2arc_trim(hdr);
|
||||||
trim_map_free(hdr->b_l2hdr.b_dev->l2ad_vdev,
|
|
||||||
hdr->b_l2hdr.b_daddr,
|
|
||||||
hdr->b_l2hdr.b_asize, 0);
|
|
||||||
arc_hdr_l2hdr_destroy(hdr);
|
arc_hdr_l2hdr_destroy(hdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5966,8 +5978,7 @@ top:
|
|||||||
* Error - drop L2ARC entry.
|
* Error - drop L2ARC entry.
|
||||||
*/
|
*/
|
||||||
list_remove(buflist, hdr);
|
list_remove(buflist, hdr);
|
||||||
trim_map_free(hdr->b_l2hdr.b_dev->l2ad_vdev,
|
l2arc_trim(hdr);
|
||||||
hdr->b_l2hdr.b_daddr, hdr->b_l2hdr.b_asize, 0);
|
|
||||||
hdr->b_flags &= ~ARC_FLAG_HAS_L2HDR;
|
hdr->b_flags &= ~ARC_FLAG_HAS_L2HDR;
|
||||||
|
|
||||||
ARCSTAT_INCR(arcstat_l2_asize, -hdr->b_l2hdr.b_asize);
|
ARCSTAT_INCR(arcstat_l2_asize, -hdr->b_l2hdr.b_asize);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user