Prevent null dereferences when accessing dbuf kstat

In arc_buf_info(), the arc_buf_t may have no header.  If not, don't try
to fetch the arc buffer stats and instead just zero them.

The null dereferences were observed while accessing the dbuf kstat with
awk on a system in which millions of small files were being created in
order to overflow the system's metadata limit.

Signed-off-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Closes #4837
This commit is contained in:
Tim Chase 2016-07-10 09:09:02 -05:00 committed by Ned Bass
parent 91f81c42f0
commit e871059bc4
1 changed files with 7 additions and 3 deletions

View File

@ -1451,6 +1451,13 @@ arc_buf_info(arc_buf_t *ab, arc_buf_info_t *abi, int state_index)
l2arc_buf_hdr_t *l2hdr = NULL; l2arc_buf_hdr_t *l2hdr = NULL;
arc_state_t *state = NULL; arc_state_t *state = NULL;
memset(abi, 0, sizeof (arc_buf_info_t));
if (hdr == NULL)
return;
abi->abi_flags = hdr->b_flags;
if (HDR_HAS_L1HDR(hdr)) { if (HDR_HAS_L1HDR(hdr)) {
l1hdr = &hdr->b_l1hdr; l1hdr = &hdr->b_l1hdr;
state = l1hdr->b_state; state = l1hdr->b_state;
@ -1458,9 +1465,6 @@ arc_buf_info(arc_buf_t *ab, arc_buf_info_t *abi, int state_index)
if (HDR_HAS_L2HDR(hdr)) if (HDR_HAS_L2HDR(hdr))
l2hdr = &hdr->b_l2hdr; l2hdr = &hdr->b_l2hdr;
memset(abi, 0, sizeof (arc_buf_info_t));
abi->abi_flags = hdr->b_flags;
if (l1hdr) { if (l1hdr) {
abi->abi_datacnt = l1hdr->b_datacnt; abi->abi_datacnt = l1hdr->b_datacnt;
abi->abi_access = l1hdr->b_arc_access; abi->abi_access = l1hdr->b_arc_access;