mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Update the MOS directory on spa_upgrade_errlog()
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
This commit is contained in:
		
							parent
							
								
									c011ef8c91
								
							
						
					
					
						commit
						11943656f9
					
				@ -930,12 +930,21 @@ spa_upgrade_errlog(spa_t *spa, dmu_tx_t *tx)
 | 
				
			|||||||
	if (spa->spa_errlog_last != 0) {
 | 
						if (spa->spa_errlog_last != 0) {
 | 
				
			||||||
		sync_upgrade_errlog(spa, spa->spa_errlog_last, &newobj, tx);
 | 
							sync_upgrade_errlog(spa, spa->spa_errlog_last, &newobj, tx);
 | 
				
			||||||
		spa->spa_errlog_last = newobj;
 | 
							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) {
 | 
						if (spa->spa_errlog_scrub != 0) {
 | 
				
			||||||
		sync_upgrade_errlog(spa, spa->spa_errlog_scrub, &newobj, tx);
 | 
							sync_upgrade_errlog(spa, spa->spa_errlog_scrub, &newobj, tx);
 | 
				
			||||||
		spa->spa_errlog_scrub = newobj;
 | 
							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);
 | 
						mutex_exit(&spa->spa_errlog_lock);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user