@@ -2397,11 +2397,40 @@ dmu_objset_userspace_upgrade(objset_t *os)
23972397 dmu_objset_upgrade (os , dmu_objset_userspace_upgrade_cb );
23982398}
23992399
2400+ static void
2401+ dmu_objset_refresh_projectquota (objset_t * os )
2402+ {
2403+ if (!spa_feature_is_enabled (os -> os_spa , SPA_FEATURE_PROJECT_QUOTA ))
2404+ return ;
2405+
2406+ if (DMU_PROJECTUSED_DNODE (os ) != NULL )
2407+ return ;
2408+
2409+ int size = sizeof (objset_phys_t );
2410+ if (arc_buf_size (os -> os_phys_buf ) < size ) {
2411+ arc_buf_t * buf = arc_alloc_buf (os -> os_spa , & os -> os_phys_buf ,
2412+ ARC_BUFC_METADATA , size );
2413+ memset (buf -> b_data , 0 , size );
2414+ memcpy (buf -> b_data , os -> os_phys_buf -> b_data ,
2415+ arc_buf_size (os -> os_phys_buf ));
2416+ arc_buf_destroy (os -> os_phys_buf , & os -> os_phys_buf );
2417+ os -> os_phys_buf = buf ;
2418+ os -> os_phys = os -> os_phys_buf -> b_data ;
2419+ }
2420+
2421+ if (OBJSET_BUF_HAS_PROJECTUSED (os -> os_phys_buf )) {
2422+ dnode_special_open (os , & os -> os_phys -> os_projectused_dnode ,
2423+ DMU_PROJECTUSED_OBJECT , & os -> os_projectused_dnode );
2424+ }
2425+ }
2426+
24002427static int
24012428dmu_objset_id_quota_upgrade_cb (objset_t * os )
24022429{
24032430 int err = 0 ;
24042431
2432+ dmu_objset_refresh_projectquota (os );
2433+
24052434 if (dmu_objset_userobjspace_present (os ) &&
24062435 dmu_objset_projectquota_present (os ))
24072436 return (0 );
0 commit comments