]> granicus.if.org Git - zfs/commit
hdr_recl calls zthr_wakeup() on destroyed zthr
authorSerapheim Dimitropoulos <serapheim@delphix.com>
Thu, 18 Jul 2019 19:55:29 +0000 (12:55 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 18 Jul 2019 19:55:29 +0000 (12:55 -0700)
commit1c44a5c97fabc669885df84c3e9b6b5e16f0cd35
tree20a8f88392e42656969419159cde37efc3c19633
parentbac15c11983e72cfd8ce10512aa9d227135bbca0
hdr_recl calls zthr_wakeup() on destroyed zthr

There exists a race condition were hdr_recl() calls
zthr_wakeup() on a destroyed zthr. The timeline is the
following:

[1] hdr_recl() runs first and goes intro zthr_wakeup()
    because arc_initialized is set.
[2] arc_fini() is called by another thread, zeroes
    that flag, destroying the zthr, and goes into
    buf_init().
[3] hdr_recl() tries to enter the destroyed mutex
    and we blow up.

This patch ensures that the ARC's zthrs are not offloaded
any new work once arc_initialized is set and then destroys
them after all of the ARC state has been deleted.

Reviewed by: Matt Ahrens <matt@delphix.com>
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Serapheim Dimitropoulos <serapheim@delphix.com>
Closes #9047
module/zfs/arc.c