@@ -85,6 +85,7 @@ UserRecord* user_record_new(void) {
8585 .fido2_user_verification_permitted = -1 ,
8686 .drop_caches = -1 ,
8787 .auto_resize_mode = _AUTO_RESIZE_MODE_INVALID ,
88+ .rebalance_weight = REBALANCE_WEIGHT_UNSET ,
8889 };
8990
9091 return h ;
@@ -984,6 +985,36 @@ static int dispatch_auto_resize_mode(const char *name, JsonVariant *variant, Jso
984985 return 0 ;
985986}
986987
988+ static int dispatch_rebalance_weight (const char * name , JsonVariant * variant , JsonDispatchFlags flags , void * userdata ) {
989+ uint64_t * rebalance_weight = userdata ;
990+ uintmax_t u ;
991+
992+ assert_se (rebalance_weight );
993+
994+ if (json_variant_is_null (variant )) {
995+ * rebalance_weight = REBALANCE_WEIGHT_UNSET ;
996+ return 0 ;
997+ }
998+
999+ if (json_variant_is_boolean (variant )) {
1000+ * rebalance_weight = json_variant_boolean (variant ) ? REBALANCE_WEIGHT_DEFAULT : REBALANCE_WEIGHT_OFF ;
1001+ return 0 ;
1002+ }
1003+
1004+ if (!json_variant_is_unsigned (variant ))
1005+ return json_log (variant , flags , SYNTHETIC_ERRNO (EINVAL ), "JSON field '%s' is not an unsigned integer, boolean or null." , strna (name ));
1006+
1007+ u = json_variant_unsigned (variant );
1008+ if (u >= REBALANCE_WEIGHT_MIN && u <= REBALANCE_WEIGHT_MAX )
1009+ * rebalance_weight = (uint64_t ) u ;
1010+ else if (u == 0 )
1011+ * rebalance_weight = REBALANCE_WEIGHT_OFF ;
1012+ else
1013+ return json_log (variant , flags , SYNTHETIC_ERRNO (ERANGE ), "Rebalance weight is out of valid range %" PRIu64 "…%" PRIu64 "." , REBALANCE_WEIGHT_MIN , REBALANCE_WEIGHT_MAX );
1014+
1015+ return 0 ;
1016+ }
1017+
9871018static int dispatch_privileged (const char * name , JsonVariant * variant , JsonDispatchFlags flags , void * userdata ) {
9881019
9891020 static const JsonDispatch privileged_dispatch_table [] = {
@@ -1177,6 +1208,7 @@ static int dispatch_per_machine(const char *name, JsonVariant *variant, JsonDisp
11771208 { "luksExtraMountOptions" , JSON_VARIANT_STRING , json_dispatch_string , offsetof(UserRecord , luks_extra_mount_options ), 0 },
11781209 { "dropCaches" , JSON_VARIANT_BOOLEAN , json_dispatch_tristate , offsetof(UserRecord , drop_caches ), 0 },
11791210 { "autoResizeMode" , _JSON_VARIANT_TYPE_INVALID , dispatch_auto_resize_mode , offsetof(UserRecord , auto_resize_mode ), 0 },
1211+ { "rebalanceWeight" , _JSON_VARIANT_TYPE_INVALID , dispatch_rebalance_weight , offsetof(UserRecord , rebalance_weight ), 0 },
11801212 { "rateLimitIntervalUSec" , JSON_VARIANT_UNSIGNED , json_dispatch_uint64 , offsetof(UserRecord , ratelimit_interval_usec ), 0 },
11811213 { "rateLimitBurst" , JSON_VARIANT_UNSIGNED , json_dispatch_uint64 , offsetof(UserRecord , ratelimit_burst ), 0 },
11821214 { "enforcePasswordPolicy" , JSON_VARIANT_BOOLEAN , json_dispatch_tristate , offsetof(UserRecord , enforce_password_policy ), 0 },
@@ -1528,6 +1560,7 @@ int user_record_load(UserRecord *h, JsonVariant *v, UserRecordLoadFlags load_fla
15281560 { "luksExtraMountOptions" , JSON_VARIANT_STRING , json_dispatch_string , offsetof(UserRecord , luks_extra_mount_options ), 0 },
15291561 { "dropCaches" , JSON_VARIANT_BOOLEAN , json_dispatch_tristate , offsetof(UserRecord , drop_caches ), 0 },
15301562 { "autoResizeMode" , _JSON_VARIANT_TYPE_INVALID , dispatch_auto_resize_mode , offsetof(UserRecord , auto_resize_mode ), 0 },
1563+ { "rebalanceWeight" , _JSON_VARIANT_TYPE_INVALID , dispatch_rebalance_weight , offsetof(UserRecord , rebalance_weight ), 0 },
15311564 { "service" , JSON_VARIANT_STRING , json_dispatch_string , offsetof(UserRecord , service ), JSON_SAFE },
15321565 { "rateLimitIntervalUSec" , JSON_VARIANT_UNSIGNED , json_dispatch_uint64 , offsetof(UserRecord , ratelimit_interval_usec ), 0 },
15331566 { "rateLimitBurst" , JSON_VARIANT_UNSIGNED , json_dispatch_uint64 , offsetof(UserRecord , ratelimit_burst ), 0 },
@@ -1939,6 +1972,15 @@ AutoResizeMode user_record_auto_resize_mode(UserRecord *h) {
19391972 return user_record_storage (h ) == USER_LUKS ? AUTO_RESIZE_SHRINK_AND_GROW : AUTO_RESIZE_OFF ;
19401973}
19411974
1975+ uint64_t user_record_rebalance_weight (UserRecord * h ) {
1976+ assert (h );
1977+
1978+ if (h -> rebalance_weight == REBALANCE_WEIGHT_UNSET )
1979+ return REBALANCE_WEIGHT_DEFAULT ;
1980+
1981+ return h -> rebalance_weight ;
1982+ }
1983+
19421984uint64_t user_record_ratelimit_next_try (UserRecord * h ) {
19431985 assert (h );
19441986
0 commit comments