Skip to content

Commit

Permalink
Add missing arc_free_cksum() to arc_release()
Browse files Browse the repository at this point in the history
The arc layer tracks checksums of its data in the arc header
so that it can ensure that buffers haven't changed when they're
not supposed to. This checksum is only maintained while there
is an uncompressed buffer still attached to the header.
Unfortunately there is a missing call to arc_free_cksum() in
arc_release() that can trigger ASSERTs. This has not been a
common issue because the checksums are only maintained for
debug builds and triggering the bug requires writing a block
(and therefore calling arc_release()) while a compressed buffer
is still being used on a debug build. This simply corrects the
issue.

Reviewed-by: George Melikov <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Tom Caputi <[email protected]>
Closes #6105
  • Loading branch information
Tom Caputi authored and behlendorf committed May 10, 2017
1 parent 2946a1a commit f486f58
Showing 1 changed file with 4 additions and 0 deletions.
4 changes: 4 additions & 0 deletions module/zfs/arc.c
Original file line number Diff line number Diff line change
Expand Up @@ -5691,6 +5691,10 @@ arc_release(arc_buf_t *buf, void *tag)
arc_cksum_verify(buf);
arc_buf_unwatch(buf);

/* if this is the last uncompressed buf free the checksum */
if (!arc_hdr_has_uncompressed_buf(hdr))
arc_cksum_free(hdr);

mutex_exit(hash_lock);

/*
Expand Down

0 comments on commit f486f58

Please sign in to comment.