core: swap priority can be negative

Negative priorities are useful for swap targets which should be only used as
last resort.
This commit is contained in:
Topi Miettinen
2019-12-03 20:36:37 +02:00
committed by Zbigniew Jędrzejewski-Szmek
parent 09e4b620e7
commit 7477451b69
4 changed files with 13 additions and 11 deletions

View File

@@ -117,7 +117,8 @@ static void swap_init(Unit *u) {
s->exec_context.std_output = u->manager->default_std_output;
s->exec_context.std_error = u->manager->default_std_error;
s->parameters_proc_swaps.priority = s->parameters_fragment.priority = -1;
s->parameters_proc_swaps.priority = s->parameters_fragment.priority = 0;
s->parameters_fragment.priority_set = false;
s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
@@ -433,6 +434,7 @@ static int swap_setup_unit(
SWAP(u)->from_proc_swaps = true;
p->priority = priority;
p->priority_set = true;
unit_add_to_dbus_queue(u);
return 0;
@@ -766,15 +768,15 @@ static void swap_enter_activating(Swap *s) {
s->control_command = s->exec_command + SWAP_EXEC_ACTIVATE;
if (s->from_fragment) {
int priority = -1;
int priority = 0;
r = fstab_find_pri(s->parameters_fragment.options, &priority);
if (r < 0)
log_warning_errno(r, "Failed to parse swap priority \"%s\", ignoring: %m", s->parameters_fragment.options);
else if (r == 1 && s->parameters_fragment.priority >= 0)
else if (r == 1 && s->parameters_fragment.priority_set)
log_warning("Duplicate swap priority configuration by Priority and Options fields.");
if (r <= 0 && s->parameters_fragment.priority >= 0) {
if (r <= 0 && s->parameters_fragment.priority_set) {
if (s->parameters_fragment.options)
r = asprintf(&opts, "%s,pri=%i", s->parameters_fragment.options, s->parameters_fragment.priority);
else

View File

@@ -33,6 +33,7 @@ typedef struct SwapParameters {
char *what;
char *options;
int priority;
bool priority_set;
} SwapParameters;
struct Swap {

View File

@@ -186,8 +186,7 @@ int fstab_extract_values(const char *opts, const char *name, char ***values) {
int fstab_find_pri(const char *options, int *ret) {
_cleanup_free_ char *opt = NULL;
int r;
unsigned pri;
int r, pri;
assert(ret);
@@ -197,14 +196,11 @@ int fstab_find_pri(const char *options, int *ret) {
if (r == 0 || !opt)
return 0;
r = safe_atou(opt, &pri);
r = safe_atoi(opt, &pri);
if (r < 0)
return r;
if ((int) pri < 0)
return -ERANGE;
*ret = (int) pri;
*ret = pri;
return 1;
}

View File

@@ -100,6 +100,9 @@ static void test_fstab_find_pri(void) {
assert_se(fstab_find_pri("pri=11", &pri) == 1);
assert_se(pri == 11);
assert_se(fstab_find_pri("pri=-2", &pri) == 1);
assert_se(pri == -2);
assert_se(fstab_find_pri("opt,pri=12,opt", &pri) == 1);
assert_se(pri == 12);