]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: swap priority can be negative
authorTopi Miettinen <toiwoton@gmail.com>
Tue, 3 Dec 2019 18:36:37 +0000 (20:36 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 4 Dec 2019 07:57:08 +0000 (08:57 +0100)
Negative priorities are useful for swap targets which should be only used as
last resort.

src/core/swap.c
src/core/swap.h
src/shared/fstab-util.c
src/test/test-fstab-util.c

index e4b018616d90b417cd0ed3da41e5ed381efeedea..03f443daecfba8396019cb21a35ce331db543109 100644 (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
index 389faf584d425cadc1a48e4695c23b08a5131065..cb24cec7aafce8277562668eb7df627d8bec3aa0 100644 (file)
@@ -33,6 +33,7 @@ typedef struct SwapParameters {
         char *what;
         char *options;
         int priority;
+        bool priority_set;
 } SwapParameters;
 
 struct Swap {
index f90501eb9288b6ffe8ff35933ebd45bbc52bedfa..86a57e6b2ce8c2f9f304da38dc88d2cce94bf6e7 100644 (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;
 }
 
index 4cd504e45c475175773d5da5d4ea9fb0567f92d3..c1c7ec911483345cfd03c5340fa8091150504fb1 100644 (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);