Your message dated Fri, 28 Nov 2014 06:05:04 +0000
with message-id <[email protected]>
and subject line Bug#769734: fixed in systemd 215-7
has caused the Debian Bug report #769734,
regarding systemd ignores swap discard option from /etc/fstab
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
769734: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=769734
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: systemd
Version: 215-5+b1
Severity: important
Tags: patch upstream fixed-upstream

systemd ignores the discard option from /etc/fstab for swap entries, 
interpreting only the priority options. This option is important for
virtualization with thin-provisioning, and also for SSD even if some
people are discussing its usefulness. Anyway this is supported by the
kernel and other init systems (both in Wheezy and Jessie).

The problem has been fixed upstream in version 217. I have attached the
corresponding patches, they apply fine on the debian package (with only
one fuzzy hunk). I have tested them and the resulting packages works
correctly.

I know Jessie is now frozen, but given it is a regression from Wheezy
for people switching to systemd, it would be nice if they can be
included in Jessie anyway.

-- Package-specific info:

-- System Information:
Debian Release: jessie/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.16.0-4-amd64 (SMP w/8 CPU cores)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages systemd depends on:
ii  acl             2.2.52-2
ii  adduser         3.113+nmu3
ii  initscripts     2.88dsf-58
ii  libacl1         2.2.52-2
ii  libaudit1       1:2.4-1
ii  libblkid1       2.25.2-2
ii  libc6           2.19-13
ii  libcap2         1:2.24-6
ii  libcap2-bin     1:2.24-6
ii  libcryptsetup4  2:1.6.6-3
ii  libgcrypt20     1.6.2-4
ii  libkmod2        18-3
ii  liblzma5        5.1.1alpha+20120614-2+b1
ii  libpam0g        1.1.8-3.1
ii  libselinux1     2.3-2
ii  libsystemd0     215-5+b1
ii  sysv-rc         2.88dsf-58
ii  udev            215-5+b1
ii  util-linux      2.25.2-2

Versions of packages systemd recommends:
ii  dbus            1.8.10-1
ii  libpam-systemd  215-5+b1

Versions of packages systemd suggests:
pn  systemd-ui  <none>

-- Configuration Files:
/etc/systemd/timesyncd.conf changed [not included]

-- no debconf information
>From 86b23b07c96b185126bfbf217227dad362a20c25 Mon Sep 17 00:00:00 2001
From: Jan Synacek <[email protected]>
Date: Wed, 24 Sep 2014 14:29:05 +0200
Subject: [PATCH] swap: introduce Discard property

Process possible "discard" values from /etc/fstab.
---
 man/systemd.swap.xml                  | 14 ++++++++++
 src/core/execute.c                    | 25 ++++++++++++++++++
 src/core/execute.h                    |  1 +
 src/core/load-fragment-gperf.gperf.m4 |  1 +
 src/core/swap.c                       | 49 +++++++++++++++++++++++------------
 src/core/swap.h                       |  1 +
 src/fstab-generator/fstab-generator.c | 10 +++++++
 7 files changed, 84 insertions(+), 17 deletions(-)

diff --git a/man/systemd.swap.xml b/man/systemd.swap.xml
index 62a4d08..481dc52 100644
--- a/man/systemd.swap.xml
+++ b/man/systemd.swap.xml
@@ -171,6 +171,20 @@
                         </varlistentry>
 
                         <varlistentry>
+                                <term><varname>Discard=</varname></term>
+
+                                <listitem><para>Enable discards, if the swap
+                                backing device supports the discard or trim
+                                operation. Can be one of <literal>none</literal>,
+                                <literal>once</literal>, <literal>pages</literal>
+                                or <literal>all</literal>.  Defaults to
+                                <literal>none</literal>. (See
+                                <citerefentry><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+                                for more information.)
+                                </para></listitem>
+                        </varlistentry>
+
+                        <varlistentry>
                                 <term><varname>TimeoutSec=</varname></term>
                                 <listitem><para>Configures the time to
                                 wait for the swapon command to
diff --git a/src/core/execute.c b/src/core/execute.c
index 8c9dfde..07ec7a2 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -2566,6 +2566,31 @@ int exec_command_set(ExecCommand *c, const char *path, ...) {
         return 0;
 }
 
+int exec_command_append(ExecCommand *c, const char *path, ...) {
+        va_list ap;
+        char **l;
+        int r;
+
+        assert(c);
+        assert(path);
+
+        va_start(ap, path);
+        l = strv_new_ap(path, ap);
+        va_end(ap);
+
+        if (!l)
+                return -ENOMEM;
+
+        r = strv_extend_strv(&c->argv, l);
+        if (r < 0) {
+                strv_free(l);
+                return r;
+        }
+
+        return 0;
+}
+
+
 static int exec_runtime_allocate(ExecRuntime **rt) {
 
         if (*rt)
diff --git a/src/core/execute.h b/src/core/execute.h
index 6f35736..2694315 100644
--- a/src/core/execute.h
+++ b/src/core/execute.h
@@ -233,6 +233,7 @@ void exec_command_dump(ExecCommand *c, FILE *f, const char *prefix);
 void exec_command_dump_list(ExecCommand *c, FILE *f, const char *prefix);
 void exec_command_append_list(ExecCommand **l, ExecCommand *e);
 int exec_command_set(ExecCommand *c, const char *path, ...);
+int exec_command_append(ExecCommand *c, const char *path, ...);
 
 void exec_context_init(ExecContext *c);
 void exec_context_done(ExecContext *c);
diff --git a/src/core/load-fragment-gperf.gperf.m4 b/src/core/load-fragment-gperf.gperf.m4
index 050c5d8..8805411 100644
--- a/src/core/load-fragment-gperf.gperf.m4
+++ b/src/core/load-fragment-gperf.gperf.m4
@@ -297,6 +297,7 @@ Automount.DirectoryMode,         config_parse_mode,                  0,
 m4_dnl
 Swap.What,                       config_parse_path,                  0,                             offsetof(Swap, parameters_fragment.what)
 Swap.Priority,                   config_parse_int,                   0,                             offsetof(Swap, parameters_fragment.priority)
+Swap.Discard,                    config_parse_string,                0,                             offsetof(Swap, parameters_fragment.discard)
 Swap.TimeoutSec,                 config_parse_sec,                   0,                             offsetof(Swap, timeout_usec)
 EXEC_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
 CGROUP_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
diff --git a/src/core/swap.c b/src/core/swap.c
index b88a914..2e12824 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -152,6 +152,9 @@ static void swap_done(Unit *u) {
         free(s->parameters_fragment.what);
         s->parameters_fragment.what = NULL;
 
+        free(s->parameters_fragment.discard);
+        s->parameters_fragment.discard = NULL;
+
         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
         exec_command_done_array(s->exec_command, _SWAP_EXEC_COMMAND_MAX);
         s->control_command = NULL;
@@ -602,10 +605,12 @@ static void swap_dump(Unit *u, FILE *f, const char *prefix) {
                 fprintf(f,
                         "%sPriority: %i\n"
                         "%sNoAuto: %s\n"
-                        "%sNoFail: %s\n",
+                        "%sNoFail: %s\n"
+                        "%sDiscard: %s\n",
                         prefix, p->priority,
                         prefix, yes_no(p->noauto),
-                        prefix, yes_no(p->nofail));
+                        prefix, yes_no(p->nofail),
+                        prefix, p->discard);
 
         if (s->control_pid > 0)
                 fprintf(f,
@@ -734,36 +739,46 @@ fail:
 
 static void swap_enter_activating(Swap *s) {
         int r, priority;
+        char *discard;
 
         assert(s);
 
         s->control_command_id = SWAP_EXEC_ACTIVATE;
         s->control_command = s->exec_command + SWAP_EXEC_ACTIVATE;
 
-        if (s->from_fragment)
+        if (s->from_fragment) {
                 priority = s->parameters_fragment.priority;
-        else
+                discard = s->parameters_fragment.discard;
+        } else {
                 priority = -1;
+                discard = NULL;
+        }
+
+        r = exec_command_set(s->control_command, "/sbin/swapon", NULL);
+        if (r < 0)
+                goto fail;
 
         if (priority >= 0) {
                 char p[DECIMAL_STR_MAX(int)];
 
                 sprintf(p, "%i", priority);
+                r = exec_command_append(s->control_command, "-p", p, NULL);
+                if (r < 0)
+                        goto fail;
+        }
 
-                r = exec_command_set(
-                                s->control_command,
-                                "/sbin/swapon",
-                                "-p",
-                                p,
-                                s->what,
-                                NULL);
-        } else
-                r = exec_command_set(
-                                s->control_command,
-                                "/sbin/swapon",
-                                s->what,
-                                NULL);
+        if (discard && !streq(discard, "none")) {
+                const char *discard_arg = "--discard";
+
+                if (!streq(discard, "all"))
+                        discard_arg = strappenda("--discard=", discard);
+
+                r = exec_command_append(s->control_command, discard_arg, NULL);
+                if (r < 0)
+                        goto fail;
+        }
 
+        r = exec_command_append(s->control_command, s->what, NULL);
         if (r < 0)
                 goto fail;
 
diff --git a/src/core/swap.h b/src/core/swap.h
index f2ae49b..3482d65 100644
--- a/src/core/swap.h
+++ b/src/core/swap.h
@@ -63,6 +63,7 @@ typedef enum SwapResult {
 
 typedef struct SwapParameters {
         char *what;
+        char *discard;
         int priority;
         bool noauto:1;
         bool nofail:1;
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index 2c38ab9..5569325 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -73,6 +73,8 @@ static int mount_find_pri(struct mntent *me, int *ret) {
 static int add_swap(const char *what, struct mntent *me) {
         _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL;
         _cleanup_fclose_ FILE *f = NULL;
+        char *discard = NULL;
+
         bool noauto;
         int r, pri = -1;
 
@@ -118,6 +120,14 @@ static int add_swap(const char *what, struct mntent *me) {
                 "What=%s\n",
                 what);
 
+        discard = mount_test_option(me->mnt_opts, "discard");
+        if (discard) {
+                discard = strpbrk(discard, "=");
+                fprintf(f,
+                        "Discard=%s\n",
+                        discard ? discard+1 : "all");
+        }
+
         if (pri >= 0)
                 fprintf(f,
                         "Priority=%i\n",
-- 
2.1.3

>From 4f52d3fe2da7c3449b7fbfaa7c64a83354d3b56c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <[email protected]>
Date: Sat, 27 Sep 2014 22:02:04 -0400
Subject: [PATCH] fstab-generator: properly deal with discard as non-last
 option

Previous code would only return correct results when discard
was the last option.

While at it, avoid incorrect behaviour for (invalid) 'pri' option
not followed by '=...', and also do not return -1 as the error code.
---
 src/core/swap.c                       |  2 +-
 src/fstab-generator/fstab-generator.c | 73 ++++++++++++++++++++++++++---------
 2 files changed, 55 insertions(+), 20 deletions(-)

diff --git a/src/core/swap.c b/src/core/swap.c
index 2e12824..36c9e02 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -610,7 +610,7 @@ static void swap_dump(Unit *u, FILE *f, const char *prefix) {
                         prefix, p->priority,
                         prefix, yes_no(p->noauto),
                         prefix, yes_no(p->nofail),
-                        prefix, p->discard);
+                        prefix, p->discard ?: "none");
 
         if (s->control_pid > 0)
                 fprintf(f,
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index 5569325..5dafcba 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -46,34 +46,70 @@ static int arg_root_rw = -1;
 
 
 static int mount_find_pri(struct mntent *me, int *ret) {
-        char *end, *pri;
+        char *end, *opt;
         unsigned long r;
 
         assert(me);
         assert(ret);
 
-        pri = hasmntopt(me, "pri");
-        if (!pri)
+        opt = hasmntopt(me, "pri");
+        if (!opt)
                 return 0;
 
-        pri += 4;
+        opt += strlen("pri");
+
+        if (*opt != '=')
+                return -EINVAL;
 
         errno = 0;
-        r = strtoul(pri, &end, 10);
+        r = strtoul(opt + 1, &end, 10);
         if (errno > 0)
                 return -errno;
 
-        if (end == pri || (*end != ',' && *end != 0))
+        if (end == opt + 1 || (*end != ',' && *end != 0))
                 return -EINVAL;
 
         *ret = (int) r;
         return 1;
 }
 
+static int mount_find_discard(struct mntent *me, char **ret) {
+        char *opt, *ans;
+        size_t len;
+
+        assert(me);
+        assert(ret);
+
+        opt = hasmntopt(me, "discard");
+        if (!opt)
+                return 0;
+
+        opt += strlen("discard");
+
+        if (*opt == ',' || *opt == '\0')
+                ans = strdup("all");
+        else {
+                if (*opt != '=')
+                        return -EINVAL;
+
+                len = strcspn(opt + 1, ",");
+                if (len == 0)
+                        return -EINVAL;
+
+                ans = strndup(opt + 1, len);
+        }
+
+        if (!ans)
+                return -ENOMEM;
+
+        *ret = ans;
+        return 1;
+}
+
 static int add_swap(const char *what, struct mntent *me) {
         _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL;
         _cleanup_fclose_ FILE *f = NULL;
-        char *discard = NULL;
+        _cleanup_free_ char *discard = NULL;
 
         bool noauto;
         int r, pri = -1;
@@ -89,7 +125,13 @@ static int add_swap(const char *what, struct mntent *me) {
         r = mount_find_pri(me, &pri);
         if (r < 0) {
                 log_error("Failed to parse priority");
-                return pri;
+                return r;
+        }
+
+        r = mount_find_discard(me, &discard);
+        if (r < 0) {
+                log_error("Failed to parse discard");
+                return r;
         }
 
         noauto = !!hasmntopt(me, "noauto");
@@ -120,18 +162,11 @@ static int add_swap(const char *what, struct mntent *me) {
                 "What=%s\n",
                 what);
 
-        discard = mount_test_option(me->mnt_opts, "discard");
-        if (discard) {
-                discard = strpbrk(discard, "=");
-                fprintf(f,
-                        "Discard=%s\n",
-                        discard ? discard+1 : "all");
-        }
-
         if (pri >= 0)
-                fprintf(f,
-                        "Priority=%i\n",
-                        pri);
+                fprintf(f, "Priority=%i\n", pri);
+
+        if (discard)
+                fprintf(f, "Discard=%s\n", discard);
 
         fflush(f);
         if (ferror(f)) {
-- 
2.1.3

>From cdc8982030271785d650af410230397bbb5a4be9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <[email protected]>
Date: Sun, 28 Sep 2014 10:37:52 -0400
Subject: [PATCH] core/swap: follow the configured unit by default

Phenomenon: parameters configured in /etc/fstab for swap units are
ignored. E.g. pri= settings have no effect when systemd starts swap
units. What is even more confusing, .swap units for the name used in
/etc/fstab initially show proper values for Priority=, but after
starting them, they are re-initalized from /proc/swaps and show the -1
value from /proc/swaps.

Change swap units to follow the original configured unit. This way
proper settings are used when starting the swap.
---
 src/core/swap.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/core/swap.c b/src/core/swap.c
index 36c9e02..ef90d0e 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -1208,11 +1208,25 @@ static Unit *swap_following(Unit *u) {
 
         assert(s);
 
-        if (streq_ptr(s->what, s->devnode))
+        /* If the user configured the swap through /etc/fstab or
+         * a device unit, follow that. */
+
+        if (s->from_fragment)
                 return NULL;
 
-        /* Make everybody follow the unit that's named after the swap
-         * device in the kernel */
+        LIST_FOREACH_AFTER(same_devnode, other, s)
+                if (other->from_fragment)
+                        return UNIT(other);
+
+        LIST_FOREACH_BEFORE(same_devnode, other, s)
+                if (other->from_fragment)
+                        return UNIT(other);
+
+        /* Otherwise make everybody follow the unit that's named after
+         * the swap device in the kernel */
+
+        if (streq_ptr(s->what, s->devnode))
+                return NULL;
 
         LIST_FOREACH_AFTER(same_devnode, other, s)
                 if (streq_ptr(other->what, other->devnode))
@@ -1225,6 +1239,7 @@ static Unit *swap_following(Unit *u) {
                 first = other;
         }
 
+        /* Fall back to the first on the list */
         return UNIT(first);
 }
 
-- 
2.1.3

>From 4afbccded23f5144e39a7f7b243393799186ba39 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <[email protected]>
Date: Sun, 28 Sep 2014 22:13:07 -0400
Subject: [PATCH] core/swap: advertise Discard over dbus

---
 src/core/dbus-swap.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/src/core/dbus-swap.c b/src/core/dbus-swap.c
index 93eae53..c854716 100644
--- a/src/core/dbus-swap.c
+++ b/src/core/dbus-swap.c
@@ -55,12 +55,36 @@ static int property_get_priority(
         return sd_bus_message_append(reply, "i", p);
 }
 
+static int property_get_discard(
+                sd_bus *bus,
+                const char *path,
+                const char *interface,
+                const char *property,
+                sd_bus_message *reply,
+                void *userdata,
+                sd_bus_error *error) {
+
+        Swap *s = SWAP(userdata);
+        const char *p;
+
+        assert(bus);
+        assert(reply);
+        assert(s);
+
+        if (s->from_fragment)
+                p = s->parameters_fragment.discard ?: "none";
+        else
+                p = "none";
+        return sd_bus_message_append(reply, "s", p);
+}
+
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, swap_result, SwapResult);
 
 const sd_bus_vtable bus_swap_vtable[] = {
         SD_BUS_VTABLE_START(0),
         SD_BUS_PROPERTY("What", "s", NULL, offsetof(Swap, what), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("Priority", "i", property_get_priority, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("Discard", "s", property_get_discard, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec, offsetof(Swap, timeout_usec), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid, offsetof(Swap, control_pid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Swap, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
-- 
2.1.3

>From 3018d31238caabc2e204aa161e647dc1c1b5d1c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <[email protected]>
Date: Thu, 2 Oct 2014 00:11:36 -0400
Subject: [PATCH] core/swap: only make configured units part of swap.target

We used to make all .swap units either RequiredBy=swap.target or
WantedBy=swap.target. But swap.target should be the "configured swap
units", either through /etc/fstab or non-generated .swap units. It
is surprising when systemd starts treating a swap device that was
possibly temporarily enabled as a hard dependency for other units.
So do not add dependencies with swap.target for units gleaned from
/proc/swaps.

Similarly, we added dependencies for all aliases of the device name,
which clutters up the dependency graph but does not seem to bring any
value, since the status of those following units is consistent with
the main one anyway.

This should be a fix for [1], and it seems the right thing to do
anyway.

[1] https://bugzilla.redhat.com/show_bug.cgi?id=1114786
---
 src/core/swap.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/core/swap.c b/src/core/swap.c
index ef90d0e..b2ca048 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -213,7 +213,7 @@ static int swap_add_device_links(Swap *s) {
 }
 
 static int swap_add_default_dependencies(Swap *s) {
-        bool nofail = false, noauto = false;
+        bool nofail, noauto;
         int r;
 
         assert(s);
@@ -228,23 +228,25 @@ static int swap_add_default_dependencies(Swap *s) {
         if (r < 0)
                 return r;
 
-        if (s->from_fragment) {
-                SwapParameters *p = &s->parameters_fragment;
+        if (!s->from_fragment)
+                /* The swap unit can either be for an alternative device name, in which
+                 * case we don't need to add the dependency on swap.target because this unit
+                 * is following a different unit which will have this dependency added,
+                 * or it can be derived from /proc/swaps, in which case it was started
+                 * manually, and should not become a dependency of swap.target. */
+                return 0;
 
-                nofail = p->nofail;
-                noauto = p->noauto;
-        }
+        nofail = s->parameters_fragment.nofail;
+        noauto = s->parameters_fragment.noauto;
 
         if (!noauto) {
                 if (nofail)
                         r = unit_add_dependency_by_name_inverse(UNIT(s), UNIT_WANTS, SPECIAL_SWAP_TARGET, NULL, true);
                 else
                         r = unit_add_two_dependencies_by_name_inverse(UNIT(s), UNIT_AFTER, UNIT_REQUIRES, SPECIAL_SWAP_TARGET, NULL, true);
-                if (r < 0)
-                        return r;
         }
 
-        return 0;
+        return r < 0 ? r : 0;
 }
 
 static int swap_verify(Swap *s) {
-- 
2.1.3

>From 47cb901e38cd7092576fc8e76cc4a14f39bf719d Mon Sep 17 00:00:00 2001
From: Lennart Poettering <[email protected]>
Date: Tue, 28 Oct 2014 14:24:46 +0100
Subject: [PATCH] swap: replace Discard= setting by a more generic Options=
 setting

For now, it's systemd itself that parses the options string, but as soon
as util-linux' swapon can take the option string directly with -o we
should pass it on unmodified.
---
 man/systemd.swap.xml                  | 16 +++---
 src/core/dbus-swap.c                  | 13 +++--
 src/core/load-fragment-gperf.gperf.m4 |  2 +-
 src/core/swap.c                       | 91 ++++++++++++++++++++++++++++++-----
 src/core/swap.h                       |  2 +-
 src/fstab-generator/fstab-generator.c | 56 +++------------------
 6 files changed, 103 insertions(+), 77 deletions(-)

diff --git a/man/systemd.swap.xml b/man/systemd.swap.xml
index 00fafdc..44c16e7 100644
--- a/man/systemd.swap.xml
+++ b/man/systemd.swap.xml
@@ -171,14 +171,14 @@
                         </varlistentry>
 
                         <varlistentry>
-                                <term><varname>Discard=</varname></term>
-
-                                <listitem><para>Enable discards, if the swap
-                                backing device supports the discard or trim
-                                operation. Can be one of <literal>none</literal>,
-                                <literal>once</literal>, <literal>pages</literal>
-                                or <literal>all</literal>.  Defaults to
-                                <literal>none</literal>. (See
+                                <term><varname>Options=</varname></term>
+
+                                <listitem><para>May contain an option
+                                string for the swap device. This may
+                                be used for controlling discard
+                                options among other functionality, if
+                                the swap backing device supports the
+                                discard or trim operation. (See
                                 <citerefentry><refentrytitle>swapon</refentrytitle><manvolnum>8</manvolnum></citerefentry>
                                 for more information.)
                                 </para></listitem>
diff --git a/src/core/dbus-swap.c b/src/core/dbus-swap.c
index c854716..1e7f66d 100644
--- a/src/core/dbus-swap.c
+++ b/src/core/dbus-swap.c
@@ -55,7 +55,7 @@ static int property_get_priority(
         return sd_bus_message_append(reply, "i", p);
 }
 
-static int property_get_discard(
+static int property_get_options(
                 sd_bus *bus,
                 const char *path,
                 const char *interface,
@@ -65,17 +65,16 @@ static int property_get_discard(
                 sd_bus_error *error) {
 
         Swap *s = SWAP(userdata);
-        const char *p;
+        const char *options = NULL;
 
         assert(bus);
         assert(reply);
         assert(s);
 
         if (s->from_fragment)
-                p = s->parameters_fragment.discard ?: "none";
-        else
-                p = "none";
-        return sd_bus_message_append(reply, "s", p);
+                options = s->parameters_fragment.options;
+
+        return sd_bus_message_append(reply, "s", options);
 }
 
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, swap_result, SwapResult);
@@ -84,7 +83,7 @@ const sd_bus_vtable bus_swap_vtable[] = {
         SD_BUS_VTABLE_START(0),
         SD_BUS_PROPERTY("What", "s", NULL, offsetof(Swap, what), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("Priority", "i", property_get_priority, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
-        SD_BUS_PROPERTY("Discard", "s", property_get_discard, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
+        SD_BUS_PROPERTY("Options", "s", property_get_options, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec, offsetof(Swap, timeout_usec), SD_BUS_VTABLE_PROPERTY_CONST),
         SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid, offsetof(Swap, control_pid), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
         SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Swap, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
diff --git a/src/core/load-fragment-gperf.gperf.m4 b/src/core/load-fragment-gperf.gperf.m4
index 26d40fb..ca01394 100644
--- a/src/core/load-fragment-gperf.gperf.m4
+++ b/src/core/load-fragment-gperf.gperf.m4
@@ -299,7 +299,7 @@ Automount.DirectoryMode,         config_parse_mode,                  0,
 m4_dnl
 Swap.What,                       config_parse_path,                  0,                             offsetof(Swap, parameters_fragment.what)
 Swap.Priority,                   config_parse_int,                   0,                             offsetof(Swap, parameters_fragment.priority)
-Swap.Discard,                    config_parse_string,                0,                             offsetof(Swap, parameters_fragment.discard)
+Swap.Options,                    config_parse_string,                0,                             offsetof(Swap, parameters_fragment.options)
 Swap.TimeoutSec,                 config_parse_sec,                   0,                             offsetof(Swap, timeout_usec)
 EXEC_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
 CGROUP_CONTEXT_CONFIG_ITEMS(Swap)m4_dnl
diff --git a/src/core/swap.c b/src/core/swap.c
index b2ca048..1204386 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -152,8 +152,8 @@ static void swap_done(Unit *u) {
         free(s->parameters_fragment.what);
         s->parameters_fragment.what = NULL;
 
-        free(s->parameters_fragment.discard);
-        s->parameters_fragment.discard = NULL;
+        free(s->parameters_fragment.options);
+        s->parameters_fragment.options = NULL;
 
         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
         exec_command_done_array(s->exec_command, _SWAP_EXEC_COMMAND_MAX);
@@ -608,11 +608,11 @@ static void swap_dump(Unit *u, FILE *f, const char *prefix) {
                         "%sPriority: %i\n"
                         "%sNoAuto: %s\n"
                         "%sNoFail: %s\n"
-                        "%sDiscard: %s\n",
+                        "%sOptions: %s\n",
                         prefix, p->priority,
                         prefix, yes_no(p->noauto),
                         prefix, yes_no(p->nofail),
-                        prefix, p->discard ?: "none");
+                        prefix, strempty(p->options));
 
         if (s->control_pid > 0)
                 fprintf(f,
@@ -739,9 +739,74 @@ fail:
         swap_enter_dead(s, SWAP_FAILURE_RESOURCES);
 }
 
+static int mount_find_pri(const char *options, int *ret) {
+        const char *opt;
+        char *end;
+        unsigned long r;
+
+        assert(ret);
+
+        if (!options)
+                return 0;
+
+        opt = mount_test_option(options, "pri");
+        if (!opt)
+                return 0;
+
+        opt += strlen("pri");
+        if (*opt != '=')
+                return -EINVAL;
+
+        errno = 0;
+        r = strtoul(opt + 1, &end, 10);
+        if (errno > 0)
+                return -errno;
+
+        if (end == opt + 1 || (*end != ',' && *end != 0))
+                return -EINVAL;
+
+        *ret = (int) r;
+        return 1;
+}
+
+static int mount_find_discard(const char *options, char **ret) {
+        const char *opt;
+        char *ans;
+        size_t len;
+
+        assert(ret);
+
+        if (!options)
+                return 0;
+
+        opt = mount_test_option(options, "discard");
+        if (!opt)
+                return 0;
+
+        opt += strlen("discard");
+        if (*opt == ',' || *opt == '\0')
+                ans = strdup("all");
+        else {
+                if (*opt != '=')
+                        return -EINVAL;
+
+                len = strcspn(opt + 1, ",");
+                if (len == 0)
+                        return -EINVAL;
+
+                ans = strndup(opt + 1, len);
+        }
+
+        if (!ans)
+                return -ENOMEM;
+
+        *ret = ans;
+        return 1;
+}
+
 static void swap_enter_activating(Swap *s) {
-        int r, priority;
-        char *discard;
+        _cleanup_free_ char *discard = NULL;
+        int r, priority = -1;
 
         assert(s);
 
@@ -749,11 +814,11 @@ static void swap_enter_activating(Swap *s) {
         s->control_command = s->exec_command + SWAP_EXEC_ACTIVATE;
 
         if (s->from_fragment) {
+                mount_find_discard(s->parameters_fragment.options, &discard);
+
                 priority = s->parameters_fragment.priority;
-                discard = s->parameters_fragment.discard;
-        } else {
-                priority = -1;
-                discard = NULL;
+                if (priority < 0)
+                        mount_find_pri(s->parameters_fragment.options, &priority);
         }
 
         r = exec_command_set(s->control_command, "/sbin/swapon", NULL);
@@ -770,9 +835,11 @@ static void swap_enter_activating(Swap *s) {
         }
 
         if (discard && !streq(discard, "none")) {
-                const char *discard_arg = "--discard";
+                const char *discard_arg;
 
-                if (!streq(discard, "all"))
+                if (streq(discard, "all"))
+                        discard_arg = "--discard";
+                else
                         discard_arg = strappenda("--discard=", discard);
 
                 r = exec_command_append(s->control_command, discard_arg, NULL);
diff --git a/src/core/swap.h b/src/core/swap.h
index 3482d65..053c849 100644
--- a/src/core/swap.h
+++ b/src/core/swap.h
@@ -63,7 +63,7 @@ typedef enum SwapResult {
 
 typedef struct SwapParameters {
         char *what;
-        char *discard;
+        char *options;
         int priority;
         bool noauto:1;
         bool nofail:1;
diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
index 32a8f9b..e257c12 100644
--- a/src/fstab-generator/fstab-generator.c
+++ b/src/fstab-generator/fstab-generator.c
@@ -47,7 +47,6 @@ static char *arg_usr_what = NULL;
 static char *arg_usr_fstype = NULL;
 static char *arg_usr_options = NULL;
 
-
 static int mount_find_pri(struct mntent *me, int *ret) {
         char *end, *opt;
         unsigned long r;
@@ -60,7 +59,6 @@ static int mount_find_pri(struct mntent *me, int *ret) {
                 return 0;
 
         opt += strlen("pri");
-
         if (*opt != '=')
                 return -EINVAL;
 
@@ -76,43 +74,9 @@ static int mount_find_pri(struct mntent *me, int *ret) {
         return 1;
 }
 
-static int mount_find_discard(struct mntent *me, char **ret) {
-        char *opt, *ans;
-        size_t len;
-
-        assert(me);
-        assert(ret);
-
-        opt = hasmntopt(me, "discard");
-        if (!opt)
-                return 0;
-
-        opt += strlen("discard");
-
-        if (*opt == ',' || *opt == '\0')
-                ans = strdup("all");
-        else {
-                if (*opt != '=')
-                        return -EINVAL;
-
-                len = strcspn(opt + 1, ",");
-                if (len == 0)
-                        return -EINVAL;
-
-                ans = strndup(opt + 1, len);
-        }
-
-        if (!ans)
-                return -ENOMEM;
-
-        *ret = ans;
-        return 1;
-}
-
 static int add_swap(const char *what, struct mntent *me) {
         _cleanup_free_ char *name = NULL, *unit = NULL, *lnk = NULL;
         _cleanup_fclose_ FILE *f = NULL;
-        _cleanup_free_ char *discard = NULL;
 
         bool noauto;
         int r, pri = -1;
@@ -131,12 +95,6 @@ static int add_swap(const char *what, struct mntent *me) {
                 return r;
         }
 
-        r = mount_find_discard(me, &discard);
-        if (r < 0) {
-                log_error("Failed to parse discard");
-                return r;
-        }
-
         noauto = !!hasmntopt(me, "noauto");
 
         name = unit_name_from_path(what, ".swap");
@@ -165,16 +123,18 @@ static int add_swap(const char *what, struct mntent *me) {
                 "What=%s\n",
                 what);
 
+        /* Note that we currently pass the priority field twice, once
+         * in Priority=, and once in Options= */
         if (pri >= 0)
                 fprintf(f, "Priority=%i\n", pri);
 
-        if (discard)
-                fprintf(f, "Discard=%s\n", discard);
+        if (!isempty(me->mnt_opts) && !streq(me->mnt_opts, "defaults"))
+                fprintf(f, "Options=%s\n", me->mnt_opts);
 
-        fflush(f);
-        if (ferror(f)) {
-                log_error("Failed to write unit file %s: %m", unit);
-                return -errno;
+        r = fflush_and_check(f);
+        if (r < 0) {
+                log_error("Failed to write unit file %s: %s", unit, strerror(-r));
+                return r;
         }
 
         /* use what as where, to have a nicer error message */
-- 
2.1.3


--- End Message ---
--- Begin Message ---
Source: systemd
Source-Version: 215-7

We believe that the bug you reported is fixed in the latest version of
systemd, which is due to be installed in the Debian FTP archive.

A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to [email protected],
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Martin Pitt <[email protected]> (supplier of updated systemd package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing [email protected])


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Format: 1.8
Date: Fri, 28 Nov 2014 06:43:15 +0100
Source: systemd
Binary: systemd systemd-sysv libpam-systemd libsystemd0 libsystemd-dev 
libsystemd-login0 libsystemd-login-dev libsystemd-daemon0 libsystemd-daemon-dev 
libsystemd-journal0 libsystemd-journal-dev libsystemd-id128-0 
libsystemd-id128-dev udev libudev1 libudev-dev udev-udeb libudev1-udeb 
libgudev-1.0-0 gir1.2-gudev-1.0 libgudev-1.0-dev python3-systemd systemd-dbg
Architecture: source amd64
Version: 215-7
Distribution: unstable
Urgency: medium
Maintainer: Debian systemd Maintainers 
<[email protected]>
Changed-By: Martin Pitt <[email protected]>
Description:
 gir1.2-gudev-1.0 - libgudev-1.0 introspection data
 libgudev-1.0-0 - GObject-based wrapper library for libudev
 libgudev-1.0-dev - libgudev-1.0 development files
 libpam-systemd - system and service manager - PAM module
 libsystemd-daemon-dev - systemd utility library (transitional package)
 libsystemd-daemon0 - systemd utility library (deprecated)
 libsystemd-dev - systemd utility library - development files
 libsystemd-id128-0 - systemd 128 bit ID utility library (deprecated)
 libsystemd-id128-dev - systemd 128 bit ID utility library (transitional 
package)
 libsystemd-journal-dev - systemd journal utility library (transitional package)
 libsystemd-journal0 - systemd journal utility library (deprecated)
 libsystemd-login-dev - systemd login utility library (transitional package)
 libsystemd-login0 - systemd login utility library (deprecated)
 libsystemd0 - systemd utility library
 libudev-dev - libudev development files
 libudev1   - libudev shared library
 libudev1-udeb - libudev shared library (udeb)
 python3-systemd - Python 3 bindings for systemd
 systemd    - system and service manager
 systemd-dbg - system and service manager (debug symbols)
 systemd-sysv - system and service manager - SysV links
 udev       - /dev/ and hotplug management daemon
 udev-udeb  - /dev/ and hotplug management daemon (udeb)
Closes: 674755 769734 770275 771118
Changes:
 systemd (215-7) unstable; urgency=medium
 .
   [ Martin Pitt ]
   * Add myself to Uploaders.
   * Add boot-and-services autopkgtest: Check booting with systemd-sysv and
     that the most crucial services behave as expected.
   * logind autopkgtest: Fix stderr output in waiting loop for scsi_debug.
   * Add nspawn test to boot-and-services autopkgtest.
   * Make [email protected] work out of the box: (Closes: #770275)
     - Pre-create /var/lib/container with a secure mode (0700) via tmpfiles.d.
     - Add new try-{guest,host} modes for --link-journal to silently skip
       setting up the guest journal if the host has no persistant journal.
     - Extend boot-and-services autopkgtest to cover [email protected].
   * Cherry-pick upstream patch to fix SELinux unit access check (regression
     in 215).
   * sysv-generator: Avoid wrong dependencies for failing units. Thanks to
     Michael Biebl for the patch! (Closes: #771118)
   * Cherry-pick patches to recognize and respect the "discard" mount option
     for swap devices. Thanks to Aurelien Jarno for finding and testing!
     (Closes: #769734)
 .
   [ Jon Severinsson]
   * Add /run/shm -> /dev/shm symlink in debian/tmpfiles.d/debian.conf. This
     avoids breakage in Jessie for packages which still refer to /run/shm, and
     while https://wiki.debian.org/ReleaseGoals/RunDirectory is still official.
     (LP: #1320534, Closes: #674755).
Checksums-Sha1:
 64ebf538f54ed765bcea8a68090aecc7ee6a35cb 4103 systemd_215-7.dsc
 3c3c27a3eda4b92df639f280f8c85e7944543c69 181352 systemd_215-7.debian.tar.xz
 f9217963e8a2d010ba435e687e8bd835704d3207 2532682 systemd_215-7_amd64.deb
 200affe32c5d22b10110b30eeaff801ebf766961 30196 systemd-sysv_215-7_amd64.deb
 c5f387ccfb4572802aba32cd433566c74469418e 119390 libpam-systemd_215-7_amd64.deb
 2c552b5ee8a4ba950635084ab445820c0e327cf1 83186 libsystemd0_215-7_amd64.deb
 9acc2b40d29a977384d810964f504afd48d9857c 89182 libsystemd-dev_215-7_amd64.deb
 70b468c3b2a1a48b8dc3012cd8be1cf772f4b46d 43218 
libsystemd-login0_215-7_amd64.deb
 62e63581eb230a6b29cf615ca501a13e2d3c6251 25818 
libsystemd-login-dev_215-7_amd64.deb
 b5f68a639da628270a816ae674f46428643b83d1 32422 
libsystemd-daemon0_215-7_amd64.deb
 ba57ac7b80ba25447496a33911a038b836834326 25836 
libsystemd-daemon-dev_215-7_amd64.deb
 96a1b4fb987cfcd86620b1de5e36f217f72c6167 68360 
libsystemd-journal0_215-7_amd64.deb
 f0eb9f59839d8e967df32056394df06897fa5a71 25808 
libsystemd-journal-dev_215-7_amd64.deb
 b7ec793877cbb5b84c2ad5ce0c85e142822467ca 31392 
libsystemd-id128-0_215-7_amd64.deb
 54c4df23fd867cc78fbffdec4c56c2f4863d90c5 25798 
libsystemd-id128-dev_215-7_amd64.deb
 7d6c4c386d0b9fa333e3462447af94c612274578 871552 udev_215-7_amd64.deb
 547ea175ef2505e9ede3f7ad71752a8c1a1cc788 50332 libudev1_215-7_amd64.deb
 3caf73d61bbe83746cce0bc427323674ce6ce548 23090 libudev-dev_215-7_amd64.deb
 dea21165287fc3abb89e3fe3b3019e36ff5055d0 193902 udev-udeb_215-7_amd64.udeb
 b289799bbe56c80b59391a17fe3473965e6d3b20 24746 libudev1-udeb_215-7_amd64.udeb
 81085fa8048871805caa29d456fc9cff24e6a8ae 36104 libgudev-1.0-0_215-7_amd64.deb
 accf6cd0cc658f2b0f75f44157a547274483ee04 2828 gir1.2-gudev-1.0_215-7_amd64.deb
 42bcc44a1d466a044fdccb367c0bb9a0a996167d 24482 libgudev-1.0-dev_215-7_amd64.deb
 fc14d5dc34eb28d13a6610ab8a875e335bc2e368 55610 python3-systemd_215-7_amd64.deb
 eef7a8dc7fc4bf5f64408fbb09b2248c544e9554 15861668 systemd-dbg_215-7_amd64.deb
Checksums-Sha256:
 143d7f990b83723b17409c5bf42456b5616112b4f89d46472a84a22c828a97af 4103 
systemd_215-7.dsc
 208c48ad41b32a550713cdeee5d5daabb2f7cc85172dab98feaa0ff7381460a8 181352 
systemd_215-7.debian.tar.xz
 93d2ff24f91e1a61c9d1fd244a417579f0c0f0e2fb282a08bc42164f31e4df43 2532682 
systemd_215-7_amd64.deb
 d52e81ffa3f872d9a1a5d0cafa817eeaa86b72ef5e2df632b0c4b875b1c425ab 30196 
systemd-sysv_215-7_amd64.deb
 35fe400bea0c893e2c0d73bd5826077f46298e142fa7e613fdfc5c516a272705 119390 
libpam-systemd_215-7_amd64.deb
 2b24d977017dffd0f56dbcbaa9fa7909b8b4601058b3bacdb3539c019c62fc95 83186 
libsystemd0_215-7_amd64.deb
 a011f64aec68018258b9034214a0caccca8426176138246837e78d3a24e1000f 89182 
libsystemd-dev_215-7_amd64.deb
 0fda1763232091f1096b166ed31c7e0d9aefbbdb05787333a1a06885a9fb0149 43218 
libsystemd-login0_215-7_amd64.deb
 d465d6511f92a07db228d6fefa9bcf95690de9557f42839bdb3dc58cddeeb007 25818 
libsystemd-login-dev_215-7_amd64.deb
 de61a2e4d11dce18697fe7db56aa65f8ddda4324012710e049f0243ad2b8f29c 32422 
libsystemd-daemon0_215-7_amd64.deb
 80184fbd93affdbf9caf24d012305748695be18ff00a0f541c8ce85c365323ee 25836 
libsystemd-daemon-dev_215-7_amd64.deb
 9cfa6f568da4239188bdc3a0f4c21f318317947c1375ca73c4d40750cee9b3ac 68360 
libsystemd-journal0_215-7_amd64.deb
 4295e02efa736e47cc887e09bd6470bc4aee3ccfb6f61e58121bf8595a30cd83 25808 
libsystemd-journal-dev_215-7_amd64.deb
 4f0a734399e28b12736653a82b385f002b9401e7a35845d3800899a8dea0c713 31392 
libsystemd-id128-0_215-7_amd64.deb
 394e5b83c88eb41d73e4e9068e69d79c71e607dc10c6c43c41748b1c1b529d0f 25798 
libsystemd-id128-dev_215-7_amd64.deb
 4f6738e86f6b4c880faf52baf2cbc5ae3897e86a4c3b445c3998137f98f5d82c 871552 
udev_215-7_amd64.deb
 addc777498648b3db40f5383c5a14a3c0a50b9f843f38234e0a7c4077db9a988 50332 
libudev1_215-7_amd64.deb
 e7f1b0aad1829a213ff9d23c929da85891fecc812bc557625d32084efddccd55 23090 
libudev-dev_215-7_amd64.deb
 1bc743466ccced9762818f32cd9d1ab941e866d59bdaa7c254acdce6755fe66a 193902 
udev-udeb_215-7_amd64.udeb
 11288ce46aa2bb4cb3c6c1a904a994f147218fc499255f024f1397060e375c30 24746 
libudev1-udeb_215-7_amd64.udeb
 ccb655a870b790038b5ec9828d9eed6768c03e192a21f36170f5db5f2d05d761 36104 
libgudev-1.0-0_215-7_amd64.deb
 7c3d0e702aa2bfd707d1e711865fc734f88f16db0dfe2cedb28eb316bdb5e3ca 2828 
gir1.2-gudev-1.0_215-7_amd64.deb
 87896455dc17e782d70ed949448d729a738d180ca2d88e2e7775373de7fb490a 24482 
libgudev-1.0-dev_215-7_amd64.deb
 ae01047782f29391566492b243c3bd80b50681b930e1e4faaa4cb8b782c5c299 55610 
python3-systemd_215-7_amd64.deb
 3ab376992c69c8133d61620112382ab67d4066f068d19aaec14385ad90fc3911 15861668 
systemd-dbg_215-7_amd64.deb
Files:
 471bcf066e9406cbef856641d6a20a61 4103 admin optional systemd_215-7.dsc
 e3fb8ba572c1aa2f89b3d4191b5c8a20 181352 admin optional 
systemd_215-7.debian.tar.xz
 b3287f7f19f25662b688a2fed2f913ed 2532682 admin optional systemd_215-7_amd64.deb
 43b672eb68f135e32aab5b4afe3de943 30196 admin extra systemd-sysv_215-7_amd64.deb
 992e81e9e292b63ae87aa1459c9fe5af 119390 admin optional 
libpam-systemd_215-7_amd64.deb
 ee7a288cacd47e07d0ab56be578ecafe 83186 libs optional 
libsystemd0_215-7_amd64.deb
 416b6e38b1d3c0c92bd9c65cc1194782 89182 libdevel optional 
libsystemd-dev_215-7_amd64.deb
 7fd00d31ec7be1e8a8bb76a4c11418a5 43218 oldlibs extra 
libsystemd-login0_215-7_amd64.deb
 4ca216f0930c319943e481be1474c8c4 25818 oldlibs extra 
libsystemd-login-dev_215-7_amd64.deb
 cfa3037665ff08ddbf14a882badf0691 32422 oldlibs extra 
libsystemd-daemon0_215-7_amd64.deb
 c5c3cddc476538b8e5e82548b31ee40e 25836 oldlibs extra 
libsystemd-daemon-dev_215-7_amd64.deb
 9a778fb6aa74547b5c4caa63f3ccf0c5 68360 oldlibs extra 
libsystemd-journal0_215-7_amd64.deb
 e08d3e27168a9e355f342f9264490384 25808 oldlibs extra 
libsystemd-journal-dev_215-7_amd64.deb
 341e34b1e1d6fe39451f285535a588b9 31392 oldlibs extra 
libsystemd-id128-0_215-7_amd64.deb
 f46d8f76eed6f5e339f1f5211baa324f 25798 oldlibs extra 
libsystemd-id128-dev_215-7_amd64.deb
 fff574a6bf22245e2c09429893c13890 871552 admin important udev_215-7_amd64.deb
 e26cdaf00d3156e15c03b23839acb6d8 50332 libs important libudev1_215-7_amd64.deb
 fb09cd07ecb49a004f203f7c55852509 23090 libdevel optional 
libudev-dev_215-7_amd64.deb
 0227986f59ed7715209e2988e9ac963c 193902 debian-installer optional 
udev-udeb_215-7_amd64.udeb
 fe51ed9cd454adec3493abe2a679aa63 24746 debian-installer optional 
libudev1-udeb_215-7_amd64.udeb
 f9b9fc4c8af3c69b246a09d8e49ef577 36104 libs optional 
libgudev-1.0-0_215-7_amd64.deb
 0c6364c045d92e845e8b48832f92da7f 2828 introspection optional 
gir1.2-gudev-1.0_215-7_amd64.deb
 cd5c4df1eec8e20fbeb2bec79aec7791 24482 libdevel optional 
libgudev-1.0-dev_215-7_amd64.deb
 4055ddb68a685d5c6d0db56916885b5c 55610 python optional 
python3-systemd_215-7_amd64.deb
 15a7518986cc1ff15675c1c473e25342 15861668 debug extra 
systemd-dbg_215-7_amd64.deb
Package-Type: udeb

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQIcBAEBCAAGBQJUeA6vAAoJENFO8V2v4RNH/q8QAL9Lop3zeE+vo+31S1gdC83z
1XKcKLsyDO+ktcepviTqJzN4QVIpMio/PbagAcwauipvL/q33/PmcVCmWC79/Mx/
3BuzsyMJl0I3/Zrr+pRiy4OFdww2FGhrL+PKVLnqSzQLKRux859/fvo8lavnyZgO
WKcTVUJ7AIESYdeqpf94rAbWvEB9U4TWPlEma+3A4A+iEVEnpM6pUR9GLtIBQ1HO
eINea+aPlwYFWfFHWOO0990JK8LDmQd81RwstjKLZzDQHUXkaCkmbGU8E3ZdIznJ
+VG58zwriBMeLIBtQ0rUdcKwfHUILqrbr1gQEL+1hOPTKcMTTKZEznmL4zMKmFId
5/NCcyimwI+HFkf+IB7FEnJ22Xv9S5emTEsinpLBrEESyRQsCtHXxOR8X3P+Ub7w
qnakokN/BvVXlhoV8TwpzoQ2FTpAh/eH9IdsrkA407XeqtNKIpMpjufgIfUH27+0
FJ/zSOJUvAJEcvB58EM/Yryi7KkLUrKoJfNI/qxaIh30mvtyW+7JWSB8qIykXGN2
5IeJ8XHBG24SRzaZ8dPAtqnmSX/mqhv1bC/I+o/70Rqyk3ZYuetSq+VI6ePrtKp6
BUUu0tGU9ifnKiepyQNF6Z9ZdvUWQNixfTIm6yU1Bmz7BubJJfzrlUgqPvUYqA4v
AxDD95jyQKHTjbi/xkP6
=vbmY
-----END PGP SIGNATURE-----

--- End Message ---

Reply via email to