HomeFreeBSD

Correct missing zil_claim() DTL updates

Description

Correct missing zil_claim() DTL updates

Commit a1d477c2 accidentally disabled DTL updates for the zil_claim()
case described at the end of vdev_stat_update() by unconditionally
disabling all DTL updates when loading. This was done to avoid
a deadlock on the vd_dtl_lock when loading the DTLs from disk.

    vdev_dtl_contains <--- Takes vd->vd_dtl_lock
    vdev_mirror_child_missing
    vdev_mirror_io_start
    zio_vdev_io_start
    __zio_execute
    arc_read
    dbuf_issue_final_prefetch
    dbuf_prefetch_impl
    dbuf_prefetch
    dmu_prefetch
    space_map_iterate
    space_map_load_length
    space_map_load
    vdev_dtl_load <--- Takes vd->vd_dtl_lock
    vdev_load
    spa_ld_load_vdev_metadata
    spa_tryimport

The missing DTL updates can be restored by moving the space_map_load()
call outside the vd_dtl_lock. A private range tree is populated by
reading the space map and then merged in to the DTL_MISSING tree
under the lock.

Furthermore, the SPA_LOAD_NONE check in vdev_dtl_contains() leads to an
additional problem. Any resilvering which occurs before SPA_LOAD_NONE
is set will incorrectly determine that there's nothing to repair. This
can result in full redundancy not being restored for some blocks.

Reviewed-by: Matt Ahrens <matt@delphix.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #11218

Details

Provenance
Brian Behlendorf <behlendorf1@llnl.gov>Authored on Nov 20 2020, 9:14 PM
GitHub <noreply@github.com>Committed on Nov 20 2020, 9:14 PM
Parents
rG8434017a276e: Track SONAME version bump in packaging
Branches
Unknown
Tags
Unknown

Event Timeline

GitHub <noreply@github.com> committed rG4d0ba9411312: Correct missing zil_claim() DTL updates (authored by Brian Behlendorf <behlendorf1@llnl.gov>).Nov 20 2020, 9:14 PM