Files
mirror_zfs/module/zfs
George Amanakis 6c6153e5b8 Avoid dirtying the final TXGs when exporting a pool
There are two codepaths than can dirty final TXGs:

1) If calling spa_export_common()->spa_unload()->
   spa_unload_log_sm_flush_all() after the spa_final_txg is set, then
   spa_sync()->spa_flush_metaslabs() may end up dirtying the final
   TXGs. Then we have the following panic:
   Call Trace:
    <TASK>
    dump_stack_lvl+0x46/0x62
    spl_panic+0xea/0x102 [spl]
    dbuf_dirty+0xcd6/0x11b0 [zfs]
    zap_lockdir_impl+0x321/0x590 [zfs]
    zap_lockdir+0xed/0x150 [zfs]
    zap_update+0x69/0x250 [zfs]
    feature_sync+0x5f/0x190 [zfs]
    space_map_alloc+0x83/0xc0 [zfs]
    spa_generate_syncing_log_sm+0x10b/0x2f0 [zfs]
    spa_flush_metaslabs+0xb2/0x350 [zfs]
    spa_sync_iterate_to_convergence+0x15a/0x320 [zfs]
    spa_sync+0x2e0/0x840 [zfs]
    txg_sync_thread+0x2b1/0x3f0 [zfs]
    thread_generic_wrapper+0x62/0xa0 [spl]
    kthread+0x127/0x150
    ret_from_fork+0x22/0x30
    </TASK>

2) Calling vdev_*_stop_all() for a second time in spa_unload() after
   spa_export_common() unnecessarily delays the final TXGs beyond what
   spa_final_txg is set at.

Fix this by performing the check and call for
spa_unload_log_sm_flush_all() before the spa_final_txg is set in
spa_export_common(). Also check if the spa_final_txg has already been
set in spa_unload() and skip those calls in this case.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: George Amanakis <gamanakis@gmail.com>
External-issue: https://www.illumos.org/issues/9081
Closes #13048 
Closes #13098
2022-02-23 16:47:33 -08:00
..
2022-02-16 17:58:56 -08:00
2021-06-09 13:05:34 -07:00
2022-02-16 17:58:56 -08:00
2020-08-20 10:30:06 -07:00
2019-07-26 10:54:14 -07:00
2019-06-19 09:48:12 -07:00
2020-08-17 15:25:37 -07:00
2021-06-09 13:05:34 -07:00
2020-11-02 11:51:12 -08:00
2021-06-24 13:12:36 -07:00
2022-02-16 17:58:56 -08:00
2020-06-18 12:21:25 -07:00
2022-02-16 17:58:56 -08:00
2017-10-11 16:54:48 -04:00
2022-02-16 17:58:56 -08:00
2020-11-13 13:51:51 -08:00
2021-09-14 12:10:17 -07:00
2019-06-19 09:48:12 -07:00
2021-09-14 14:31:01 -07:00
2020-07-29 16:35:33 -07:00
2022-02-16 17:58:56 -08:00
2020-06-18 12:21:25 -07:00
2020-06-18 12:21:25 -07:00
2021-02-20 20:16:50 -08:00
2021-06-24 13:12:36 -07:00
2021-06-10 10:50:16 -07:00
2021-06-24 13:12:36 -07:00
2019-10-09 10:36:03 -07:00
2021-11-02 09:50:30 -07:00
2021-11-02 09:50:30 -07:00
2020-11-13 13:51:51 -08:00
2020-06-18 12:21:25 -07:00
2019-09-02 17:56:41 -07:00
2022-02-16 17:58:56 -08:00
2020-10-02 17:44:10 -07:00
2020-06-18 12:20:38 -07:00
2021-11-02 09:50:30 -07:00
2021-01-20 21:27:30 -08:00
2022-02-16 17:58:56 -08:00
2022-02-16 17:58:56 -08:00
2020-06-18 12:21:25 -07:00
2020-06-18 12:21:18 -07:00