]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Update the MOS directory on spa_upgrade_errlog()
authorGeorge Amanakis <gamanakis@gmail.com>
Tue, 19 Sep 2023 00:06:35 +0000 (02:06 +0200)
committerGitHub <noreply@github.com>
Tue, 19 Sep 2023 00:06:35 +0000 (17:06 -0700)
spa_upgrade_errlog() does not update the MOS directory when the
head_errlog feature is enabled. In this case if spa_errlog_sync() is not
called, the MOS dir references the old errlog_last and errlog_sync
objects. Thus when doing a scrub a panic will occur:

Call Trace:
 dump_stack+0x6d/0x8b
 panic+0x101/0x2e3
 spl_panic+0xcf/0x102 [spl]
 delete_errlog+0x124/0x130 [zfs]
 spa_errlog_sync+0x256/0x260 [zfs]
 spa_sync_iterate_to_convergence+0xe5/0x250 [zfs]
 spa_sync+0x2f7/0x670 [zfs]
 txg_sync_thread+0x22d/0x2d0 [zfs]
 thread_generic_wrapper+0x83/0xa0 [spl]
 kthread+0x104/0x140
 ret_from_fork+0x1f/0x40

Fix this by updating the related MOS directory objects in
spa_upgrade_errlog().

Reviewed-by: Mark Maybee <mark.maybee@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: George Amanakis <gamanakis@gmail.com>
Closes #15279
Closes #15277

module/zfs/spa_errlog.c

index 2e5c22c11490148430308bfc1a2ae0f1ef5e9380..5dd08f597f338f0086e99691074e404d19cabcb8 100644 (file)
@@ -930,12 +930,21 @@ spa_upgrade_errlog(spa_t *spa, dmu_tx_t *tx)
        if (spa->spa_errlog_last != 0) {
                sync_upgrade_errlog(spa, spa->spa_errlog_last, &newobj, tx);
                spa->spa_errlog_last = newobj;
+
+               (void) zap_update(spa->spa_meta_objset,
+                   DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_ERRLOG_LAST,
+                   sizeof (uint64_t), 1, &spa->spa_errlog_last, tx);
        }
 
        if (spa->spa_errlog_scrub != 0) {
                sync_upgrade_errlog(spa, spa->spa_errlog_scrub, &newobj, tx);
                spa->spa_errlog_scrub = newobj;
+
+               (void) zap_update(spa->spa_meta_objset,
+                   DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_ERRLOG_SCRUB,
+                   sizeof (uint64_t), 1, &spa->spa_errlog_scrub, tx);
        }
+
        mutex_exit(&spa->spa_errlog_lock);
 }