[systemd] Backport fixes and hwdb changes
Zbigniew Jędrzejewski-Szmek
zbyszek at fedoraproject.org
Wed Dec 4 00:18:25 UTC 2013
commit d66047d7762505e704eabbcd277ea1134afc0eee
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date: Tue Dec 3 19:08:42 2013 -0500
Backport fixes and hwdb changes
Virt patch which had to be backed-out is enabled again, along with the
patch to fix the compilation issues.
...pport-yearly-and-annually-names-the-same-.patch | 38 +++
...a-bit-more-conservative-with-pre-allocati.patch | 57 ++++
...-manager-don-t-do-plymouth-in-a-container.patch | 26 ++
0119-nspawn-add-new-drop-capability-switch.patch | 82 +++++
...ind-make-running-PID-1-in-valgrind-useful.patch | 59 ++++
...i-boot-generator-don-t-mount-boot-eagerly.patch | 22 ++
...-database-of-Bluetooth-company-identifier.patch | 327 ++++++++++++++++++++
...n-appending-to-journal-file-allocate-larg.patch | 81 +++++
0124-journal-make-table-const.patch | 44 +++
...ep-statistics-on-how-of-we-hit-miss-the-m.patch | 92 ++++++
...imize-bisection-logic-a-bit-by-caching-th.patch | 246 +++++++++++++++
...-iteration-when-we-go-backwards-from-the-.patch | 24 ++
...ow-journal_file_copy_entry-to-work-on-non.patch | 26 ++
0129-journal-simplify-pre-allocation-logic.patch | 60 ++++
...ntion-how-long-we-needed-to-flush-to-var-.patch | 56 ++++
...tomount-log-info-about-triggering-process.patch | 26 ++
...t-split-detect_vm-into-separate-functions.patch | 205 ++++++++++++
...-database-of-Bluetooth-company-identifier.patch | 147 +++++++++
0134-sysfs-show.c-return-negative-error.patch | 23 ++
...k-if-return-value-from-ttyname_r-is-0-ins.patch | 28 ++
...-docs-remove-unneeded-the-s-in-gudev-docs.patch | 38 +++
...tly-say-when-multiple-units-can-be-specif.patch | 235 ++++++++++++++
0138-systemd-treat-reload-failure-as-failure.patch | 90 ++++++
...l-silently-in-sd_j_sendv-if-journal-is-un.patch | 34 ++
systemd.spec | 35 ++-
25 files changed, 2099 insertions(+), 2 deletions(-)
---
diff --git a/0116-calendar-support-yearly-and-annually-names-the-same-.patch b/0116-calendar-support-yearly-and-annually-names-the-same-.patch
new file mode 100644
index 0000000..a9a71c8
--- /dev/null
+++ b/0116-calendar-support-yearly-and-annually-names-the-same-.patch
@@ -0,0 +1,38 @@
+From ad792a7d7a407e2bcdf3553290c97d3642fdaf01 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 19 Nov 2013 01:13:42 +0100
+Subject: [PATCH] calendar: support 'yearly' and 'annually' names the same way
+ as cron
+
+---
+ src/shared/calendarspec.c | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+diff --git a/src/shared/calendarspec.c b/src/shared/calendarspec.c
+index 7979e23..7075159 100644
+--- a/src/shared/calendarspec.c
++++ b/src/shared/calendarspec.c
+@@ -686,6 +686,23 @@ int calendar_spec_from_string(const char *p, CalendarSpec **spec) {
+ if (r < 0)
+ goto fail;
+
++ } else if (strcaseeq(p, "anually") || strcaseeq(p, "yearly")) {
++ r = const_chain(1, &c->month);
++ if (r < 0)
++ goto fail;
++ r = const_chain(1, &c->day);
++ if (r < 0)
++ goto fail;
++ r = const_chain(0, &c->hour);
++ if (r < 0)
++ goto fail;
++ r = const_chain(0, &c->minute);
++ if (r < 0)
++ goto fail;
++ r = const_chain(0, &c->second);
++ if (r < 0)
++ goto fail;
++
+ } else if (strcaseeq(p, "weekly")) {
+
+ c->weekdays_bits = 1;
diff --git a/0117-hashmap-be-a-bit-more-conservative-with-pre-allocati.patch b/0117-hashmap-be-a-bit-more-conservative-with-pre-allocati.patch
new file mode 100644
index 0000000..8d2b4ae
--- /dev/null
+++ b/0117-hashmap-be-a-bit-more-conservative-with-pre-allocati.patch
@@ -0,0 +1,57 @@
+From 48335b715e811ba56f7c03199efb85a664762f5d Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 19 Nov 2013 21:02:59 +0100
+Subject: [PATCH] hashmap: be a bit more conservative with pre-allocating hash
+ tables and items
+
+---
+ src/shared/hashmap.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/src/shared/hashmap.c b/src/shared/hashmap.c
+index f06fce6..8f5957b 100644
+--- a/src/shared/hashmap.c
++++ b/src/shared/hashmap.c
+@@ -66,13 +66,14 @@ static void *first_hashmap_tile = NULL;
+ static struct pool *first_entry_pool = NULL;
+ static void *first_entry_tile = NULL;
+
+-static void* allocate_tile(struct pool **first_pool, void **first_tile, size_t tile_size) {
++static void* allocate_tile(struct pool **first_pool, void **first_tile, size_t tile_size, unsigned at_least) {
+ unsigned i;
+
+ /* When a tile is released we add it to the list and simply
+ * place the next pointer at its offset 0. */
+
+ assert(tile_size >= sizeof(void*));
++ assert(at_least > 0);
+
+ if (*first_tile) {
+ void *r;
+@@ -88,7 +89,7 @@ static void* allocate_tile(struct pool **first_pool, void **first_tile, size_t t
+ struct pool *p;
+
+ n = *first_pool ? (*first_pool)->n_tiles : 0;
+- n = MAX(512U, n * 2);
++ n = MAX(at_least, n * 2);
+ size = PAGE_ALIGN(ALIGN(sizeof(struct pool)) + n*tile_size);
+ n = (size - ALIGN(sizeof(struct pool))) / tile_size;
+
+@@ -191,7 +192,7 @@ Hashmap *hashmap_new(hash_func_t hash_func, compare_func_t compare_func) {
+ size = ALIGN(sizeof(Hashmap)) + INITIAL_N_BUCKETS * sizeof(struct hashmap_entry*);
+
+ if (b) {
+- h = allocate_tile(&first_hashmap_pool, &first_hashmap_tile, size);
++ h = allocate_tile(&first_hashmap_pool, &first_hashmap_tile, size, 8);
+ if (!h)
+ return NULL;
+
+@@ -476,7 +477,7 @@ int hashmap_put(Hashmap *h, const void *key, void *value) {
+ hash = bucket_hash(h, key);
+
+ if (h->from_pool)
+- e = allocate_tile(&first_entry_pool, &first_entry_tile, sizeof(struct hashmap_entry));
++ e = allocate_tile(&first_entry_pool, &first_entry_tile, sizeof(struct hashmap_entry), 64U);
+ else
+ e = new(struct hashmap_entry, 1);
+
diff --git a/0118-manager-don-t-do-plymouth-in-a-container.patch b/0118-manager-don-t-do-plymouth-in-a-container.patch
new file mode 100644
index 0000000..1628994
--- /dev/null
+++ b/0118-manager-don-t-do-plymouth-in-a-container.patch
@@ -0,0 +1,26 @@
+From c74cf7621353d765a89e800c5a040fefa79e7915 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Wed, 20 Nov 2013 03:44:11 +0100
+Subject: [PATCH] manager: don't do plymouth in a container
+
+Given that plymouth listens on an abstract namespace socket and if
+CLONE_NEWNET is not used the abstract namespace is shared with the host
+we might actually end up send plymouth data to the host.
+---
+ src/core/manager.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/core/manager.c b/src/core/manager.c
+index ce32baf..944c196 100644
+--- a/src/core/manager.c
++++ b/src/core/manager.c
+@@ -1966,6 +1966,9 @@ void manager_send_unit_plymouth(Manager *m, Unit *u) {
+ if (m->running_as != SYSTEMD_SYSTEM)
+ return;
+
++ if (detect_container(NULL) > 0)
++ return;
++
+ if (u->type != UNIT_SERVICE &&
+ u->type != UNIT_MOUNT &&
+ u->type != UNIT_SWAP)
diff --git a/0119-nspawn-add-new-drop-capability-switch.patch b/0119-nspawn-add-new-drop-capability-switch.patch
new file mode 100644
index 0000000..8289870
--- /dev/null
+++ b/0119-nspawn-add-new-drop-capability-switch.patch
@@ -0,0 +1,82 @@
+From c3f82c64d86432c7d4b0c3abf61b70fd88f1d9dd Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Wed, 20 Nov 2013 22:10:42 +0100
+Subject: [PATCH] nspawn: add new --drop-capability= switch
+
+---
+ man/systemd-nspawn.xml | 10 ++++++++++
+ src/nspawn/nspawn.c | 12 ++++++++++--
+ 2 files changed, 20 insertions(+), 2 deletions(-)
+
+diff --git a/man/systemd-nspawn.xml b/man/systemd-nspawn.xml
+index ba9e516..c1a5cad 100644
+--- a/man/systemd-nspawn.xml
++++ b/man/systemd-nspawn.xml
+@@ -304,6 +304,16 @@
+ </varlistentry>
+
+ <varlistentry>
++ <term><option>--drop-capability=</option></term>
++
++ <listitem><para>Specify one or more
++ additional capabilities to drop for
++ the container. This allows running the
++ container with fewer capabilities than
++ the default (see above).</para></listitem>
++ </varlistentry>
++
++ <varlistentry>
+ <term><option>--link-journal=</option></term>
+
+ <listitem><para>Control whether the
+diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
+index 85bbadf..7346253 100644
+--- a/src/nspawn/nspawn.c
++++ b/src/nspawn/nspawn.c
+@@ -130,6 +130,7 @@ static int help(void) {
+ " --read-only Mount the root directory read-only\n"
+ " --capability=CAP In addition to the default, retain specified\n"
+ " capability\n"
++ " --drop-capability=CAP Drop the specified capability from the default set\n"
+ " --link-journal=MODE Link up guest journal, one of no, auto, guest, host\n"
+ " -j Equivalent to --link-journal=host\n"
+ " --bind=PATH[:PATH] Bind mount a file or directory from the host into\n"
+@@ -148,6 +149,7 @@ static int parse_argv(int argc, char *argv[]) {
+ ARG_UUID,
+ ARG_READ_ONLY,
+ ARG_CAPABILITY,
++ ARG_DROP_CAPABILITY,
+ ARG_LINK_JOURNAL,
+ ARG_BIND,
+ ARG_BIND_RO
+@@ -163,6 +165,7 @@ static int parse_argv(int argc, char *argv[]) {
+ { "uuid", required_argument, NULL, ARG_UUID },
+ { "read-only", no_argument, NULL, ARG_READ_ONLY },
+ { "capability", required_argument, NULL, ARG_CAPABILITY },
++ { "drop-capability", required_argument, NULL, ARG_DROP_CAPABILITY },
+ { "link-journal", required_argument, NULL, ARG_LINK_JOURNAL },
+ { "bind", required_argument, NULL, ARG_BIND },
+ { "bind-ro", required_argument, NULL, ARG_BIND_RO },
+@@ -247,7 +250,8 @@ static int parse_argv(int argc, char *argv[]) {
+ arg_read_only = true;
+ break;
+
+- case ARG_CAPABILITY: {
++ case ARG_CAPABILITY:
++ case ARG_DROP_CAPABILITY: {
+ char *state, *word;
+ size_t length;
+
+@@ -266,7 +270,11 @@ static int parse_argv(int argc, char *argv[]) {
+ }
+
+ free(t);
+- arg_retain |= 1ULL << (uint64_t) cap;
++
++ if (c == ARG_CAPABILITY)
++ arg_retain |= 1ULL << (uint64_t) cap;
++ else
++ arg_retain &= ~(1ULL << (uint64_t) cap);
+ }
+
+ break;
diff --git a/0120-valgrind-make-running-PID-1-in-valgrind-useful.patch b/0120-valgrind-make-running-PID-1-in-valgrind-useful.patch
new file mode 100644
index 0000000..edf2c66
--- /dev/null
+++ b/0120-valgrind-make-running-PID-1-in-valgrind-useful.patch
@@ -0,0 +1,59 @@
+From 246592d8f7eaf899ec6292cac4985f7bcc8b65fd Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Wed, 20 Nov 2013 22:11:10 +0100
+Subject: [PATCH] valgrind: make running PID 1 in valgrind useful
+
+Since valgrind only generates useful output on exit() (rather than
+exec()) we need to explicitly exit when valgrind is detected.
+
+Conflicts:
+ src/core/main.c
+---
+ configure.ac | 2 +-
+ src/core/main.c | 13 +++++++++++++
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index 9904e25..6232cf8 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -814,7 +814,7 @@ AC_DEFINE_UNQUOTED(TELINIT, ["$TELINIT"], [Path to telinit])
+
+ AC_SUBST(TELINIT)
+
+-AC_CHECK_HEADERS_ONCE([valgrind/memcheck.h])
++AC_CHECK_HEADERS_ONCE([valgrind/memcheck.h valgrind/valgrind.h])
+
+ # ------------------------------------------------------------------------------
+ have_myhostname=no
+diff --git a/src/core/main.c b/src/core/main.c
+index 00fd394..58c3a9e 100644
+--- a/src/core/main.c
++++ b/src/core/main.c
+@@ -34,6 +34,10 @@
+ #include <sys/prctl.h>
+ #include <sys/mount.h>
+
++#ifdef HAVE_VALGRIND_VALGRIND_H
++#include <valgrind/valgrind.h>
++#endif
++
+ #include "manager.h"
+ #include "log.h"
+ #include "load-fragment.h"
+@@ -1855,6 +1859,15 @@ finish:
+ if (fds)
+ fdset_free(fds);
+
++#ifdef HAVE_VALGRIND_VALGRIND_H
++ /* If we are PID 1 and running under valgrind, then let's exit
++ * here explicitly. valgrind will only generate nice output on
++ * exit(), not on exec(), hence let's do the former not the
++ * latter here. */
++ if (getpid() == 1 && RUNNING_ON_VALGRIND)
++ return 0;
++#endif
++
+ if (shutdown_verb) {
+ const char * command_line[] = {
+ SYSTEMD_SHUTDOWN_BINARY_PATH,
diff --git a/0121-efi-boot-generator-don-t-mount-boot-eagerly.patch b/0121-efi-boot-generator-don-t-mount-boot-eagerly.patch
new file mode 100644
index 0000000..7a7c376
--- /dev/null
+++ b/0121-efi-boot-generator-don-t-mount-boot-eagerly.patch
@@ -0,0 +1,22 @@
+From 1530d333580859301dc57ca1a602d1ccd9cd594f Mon Sep 17 00:00:00 2001
+From: Tom Gundersen <teg at jklm.no>
+Date: Thu, 21 Nov 2013 12:35:46 +0100
+Subject: [PATCH] efi-boot-generator: don't mount /boot eagerly
+
+---
+ src/efi-boot-generator/efi-boot-generator.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/efi-boot-generator/efi-boot-generator.c b/src/efi-boot-generator/efi-boot-generator.c
+index 05b95ed..5e5c682 100644
+--- a/src/efi-boot-generator/efi-boot-generator.c
++++ b/src/efi-boot-generator/efi-boot-generator.c
+@@ -82,7 +82,7 @@ int main(int argc, char *argv[]) {
+ "[Mount]\n"
+ "Where=/boot\n"
+ "What=/dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n"
+- "Options=umask=0077\n",
++ "Options=umask=0077,noauto\n",
+ SD_ID128_FORMAT_VAL(id));
+
+ free(name);
diff --git a/0122-hwdb-Update-database-of-Bluetooth-company-identifier.patch b/0122-hwdb-Update-database-of-Bluetooth-company-identifier.patch
new file mode 100644
index 0000000..1b80365
--- /dev/null
+++ b/0122-hwdb-Update-database-of-Bluetooth-company-identifier.patch
@@ -0,0 +1,327 @@
+From 542aea95d13a4e88add77b3a473557dc2f47bb61 Mon Sep 17 00:00:00 2001
+From: Marcel Holtmann <marcel at holtmann.org>
+Date: Sat, 21 Sep 2013 11:45:05 -0700
+Subject: [PATCH] hwdb: Update database of Bluetooth company identifiers
+
+---
+ hwdb/20-bluetooth-vendor-product.hwdb | 209 +++++++++++++++++++++++++++++++---
+ 1 file changed, 193 insertions(+), 16 deletions(-)
+
+diff --git a/hwdb/20-bluetooth-vendor-product.hwdb b/hwdb/20-bluetooth-vendor-product.hwdb
+index c8cb322..faecf42 100644
+--- a/hwdb/20-bluetooth-vendor-product.hwdb
++++ b/hwdb/20-bluetooth-vendor-product.hwdb
+@@ -46,7 +46,7 @@ bluetooth:v000D*
+ ID_VENDOR_FROM_DATABASE=Texas Instruments Inc.
+
+ bluetooth:v000E*
+- ID_VENDOR_FROM_DATABASE=Ceva, Inc. (formerly Parthus Technologies Inc.)
++ ID_VENDOR_FROM_DATABASE=Ceva, Inc. (formerly Parthus Technologies, Inc.)
+
+ bluetooth:v000F*
+ ID_VENDOR_FROM_DATABASE=Broadcom Corporation
+@@ -55,7 +55,7 @@ bluetooth:v0010*
+ ID_VENDOR_FROM_DATABASE=Mitel Semiconductor
+
+ bluetooth:v0011*
+- ID_VENDOR_FROM_DATABASE=Widcomm, Inc.
++ ID_VENDOR_FROM_DATABASE=Widcomm, Inc
+
+ bluetooth:v0012*
+ ID_VENDOR_FROM_DATABASE=Zeevo, Inc.
+@@ -73,13 +73,13 @@ bluetooth:v0016*
+ ID_VENDOR_FROM_DATABASE=KC Technology Inc.
+
+ bluetooth:v0017*
+- ID_VENDOR_FROM_DATABASE=Newlogic
++ ID_VENDOR_FROM_DATABASE=NewLogic
+
+ bluetooth:v0018*
+ ID_VENDOR_FROM_DATABASE=Transilica, Inc.
+
+ bluetooth:v0019*
+- ID_VENDOR_FROM_DATABASE=Rohde & Schwartz GmbH & Co. KG
++ ID_VENDOR_FROM_DATABASE=Rohde & Schwarz GmbH & Co. KG
+
+ bluetooth:v001A*
+ ID_VENDOR_FROM_DATABASE=TTPCom Limited
+@@ -151,7 +151,7 @@ bluetooth:v0030*
+ ID_VENDOR_FROM_DATABASE=ST Microelectronics
+
+ bluetooth:v0031*
+- ID_VENDOR_FROM_DATABASE=Synopsys
++ ID_VENDOR_FROM_DATABASE=Synopsis
+
+ bluetooth:v0032*
+ ID_VENDOR_FROM_DATABASE=Red-M (Communications) Ltd
+@@ -190,16 +190,16 @@ bluetooth:v003D*
+ ID_VENDOR_FROM_DATABASE=IPextreme, Inc.
+
+ bluetooth:v003E*
+- ID_VENDOR_FROM_DATABASE=Systems and Chips, Inc
++ ID_VENDOR_FROM_DATABASE=Systems and Chips, Inc.
+
+ bluetooth:v003F*
+- ID_VENDOR_FROM_DATABASE=Bluetooth SIG, Inc
++ ID_VENDOR_FROM_DATABASE=Bluetooth SIG, Inc.
+
+ bluetooth:v0040*
+ ID_VENDOR_FROM_DATABASE=Seiko Epson Corporation
+
+ bluetooth:v0041*
+- ID_VENDOR_FROM_DATABASE=Integrated Silicon Solution Taiwain, Inc.
++ ID_VENDOR_FROM_DATABASE=Integrated Silicon Solution Taiwan, Inc.
+
+ bluetooth:v0042*
+ ID_VENDOR_FROM_DATABASE=CONWISE Technology Corporation Ltd
+@@ -244,7 +244,7 @@ bluetooth:v004F*
+ ID_VENDOR_FROM_DATABASE=APT Licensing Ltd.
+
+ bluetooth:v0050*
+- ID_VENDOR_FROM_DATABASE=SiRF Technology, Inc.
++ ID_VENDOR_FROM_DATABASE=SiRF Technology
+
+ bluetooth:v0051*
+ ID_VENDOR_FROM_DATABASE=Tzero Technologies, Inc.
+@@ -379,7 +379,7 @@ bluetooth:v007C*
+ ID_VENDOR_FROM_DATABASE=A & R Cambridge
+
+ bluetooth:v007D*
+- ID_VENDOR_FROM_DATABASE=Seers Technology Co. Ltd.
++ ID_VENDOR_FROM_DATABASE=Seers Technology Co. Ltd
+
+ bluetooth:v007E*
+ ID_VENDOR_FROM_DATABASE=Sports Tracking Technologies Ltd.
+@@ -406,7 +406,7 @@ bluetooth:v0085*
+ ID_VENDOR_FROM_DATABASE=BlueRadios, Inc.
+
+ bluetooth:v0086*
+- ID_VENDOR_FROM_DATABASE=equinux AG
++ ID_VENDOR_FROM_DATABASE=equinox AG
+
+ bluetooth:v0087*
+ ID_VENDOR_FROM_DATABASE=Garmin International, Inc.
+@@ -421,7 +421,7 @@ bluetooth:v008A*
+ ID_VENDOR_FROM_DATABASE=Jawbone
+
+ bluetooth:v008B*
+- ID_VENDOR_FROM_DATABASE=Topcon Positioning Systems, LLC
++ ID_VENDOR_FROM_DATABASE=Topcorn Positioning Systems, LLC
+
+ bluetooth:v008C*
+ ID_VENDOR_FROM_DATABASE=Qualcomm Labs, Inc.
+@@ -433,13 +433,13 @@ bluetooth:v008E*
+ ID_VENDOR_FROM_DATABASE=Quintic Corp.
+
+ bluetooth:v008F*
+- ID_VENDOR_FROM_DATABASE=Stollmann E+V GmbH
++ ID_VENDOR_FROM_DATABASE=Stollman E+V GmbH
+
+ bluetooth:v0090*
+ ID_VENDOR_FROM_DATABASE=Funai Electric Co., Ltd.
+
+ bluetooth:v0091*
+- ID_VENDOR_FROM_DATABASE=Advanced PANMOBIL systems GmbH & Co. KG
++ ID_VENDOR_FROM_DATABASE=Advanced PANMOBIL Systems GmbH & Co. KG
+
+ bluetooth:v0092*
+ ID_VENDOR_FROM_DATABASE=ThinkOptics, Inc.
+@@ -460,7 +460,7 @@ bluetooth:v0097*
+ ID_VENDOR_FROM_DATABASE=Bluetrek Technologies Limited
+
+ bluetooth:v0098*
+- ID_VENDOR_FROM_DATABASE=zero1.tv GmbH
++ ID_VENDOR_FROM_DATABASE=zer01.tv GmbH
+
+ bluetooth:v0099*
+ ID_VENDOR_FROM_DATABASE=i.Tech Dynamic Global Distribution Ltd.
+@@ -511,7 +511,7 @@ bluetooth:v00A8*
+ ID_VENDOR_FROM_DATABASE=ARP Devices Limited
+
+ bluetooth:v00A9*
+- ID_VENDOR_FROM_DATABASE=Magneti Marelli S.p.A.
++ ID_VENDOR_FROM_DATABASE=Magneti Marelli S.p.A
+
+ bluetooth:v00AA*
+ ID_VENDOR_FROM_DATABASE=CAEN RFID srl
+@@ -539,3 +539,180 @@ bluetooth:v00B1*
+
+ bluetooth:v00B2*
+ ID_VENDOR_FROM_DATABASE=Bekey A/S
++
++bluetooth:v00B3*
++ ID_VENDOR_FROM_DATABASE=Clarinox Technologies Pty. Ltd.
++
++bluetooth:v00B4*
++ ID_VENDOR_FROM_DATABASE=BDE Technology Co., Ltd.
++
++bluetooth:v00B5*
++ ID_VENDOR_FROM_DATABASE=Swirl Networks
++
++bluetooth:v00B6*
++ ID_VENDOR_FROM_DATABASE=Meso international
++
++bluetooth:v00B7*
++ ID_VENDOR_FROM_DATABASE=TreLab Ltd
++
++bluetooth:v00B8*
++ ID_VENDOR_FROM_DATABASE=Qualcomm Innovation Center, Inc. (QuIC)
++
++bluetooth:v00B9*
++ ID_VENDOR_FROM_DATABASE=Johnson Controls, Inc.
++
++bluetooth:v00BA*
++ ID_VENDOR_FROM_DATABASE=Starkey Laboratories Inc.
++
++bluetooth:v00BB*
++ ID_VENDOR_FROM_DATABASE=S-Power Electronics Limited
++
++bluetooth:v00BC*
++ ID_VENDOR_FROM_DATABASE=Ace Sensor Inc
++
++bluetooth:v00BD*
++ ID_VENDOR_FROM_DATABASE=Aplix Corporation
++
++bluetooth:v00BE*
++ ID_VENDOR_FROM_DATABASE=AAMP of America
++
++bluetooth:v00BF*
++ ID_VENDOR_FROM_DATABASE=Stalmart Technology Limited
++
++bluetooth:v00C0*
++ ID_VENDOR_FROM_DATABASE=AMICCOM Electronics Corporation
++
++bluetooth:v00C1*
++ ID_VENDOR_FROM_DATABASE=Shenzhen Excelsecu Data Technology Co.,Ltd
++
++bluetooth:v00C2*
++ ID_VENDOR_FROM_DATABASE=Geneq Inc.
++
++bluetooth:v00C3*
++ ID_VENDOR_FROM_DATABASE=adidas AG
++
++bluetooth:v00C4*
++ ID_VENDOR_FROM_DATABASE=LG Electronics
++
++bluetooth:v00C5*
++ ID_VENDOR_FROM_DATABASE=Onset Computer Corporation
++
++bluetooth:v00C6*
++ ID_VENDOR_FROM_DATABASE=Selfly BV
++
++bluetooth:v00C7*
++ ID_VENDOR_FROM_DATABASE=Quuppa Oy.
++
++bluetooth:v00C8*
++ ID_VENDOR_FROM_DATABASE=GeLo Inc
++
++bluetooth:v00C9*
++ ID_VENDOR_FROM_DATABASE=Evluma
++
++bluetooth:v00CA*
++ ID_VENDOR_FROM_DATABASE=MC10
++
++bluetooth:v00CB*
++ ID_VENDOR_FROM_DATABASE=Binauric SE
++
++bluetooth:v00CC*
++ ID_VENDOR_FROM_DATABASE=Beats Electronics
++
++bluetooth:v00CD*
++ ID_VENDOR_FROM_DATABASE=Microchip Technology Inc.
++
++bluetooth:v00CE*
++ ID_VENDOR_FROM_DATABASE=Elgato Systems GmbH
++
++bluetooth:v00CF*
++ ID_VENDOR_FROM_DATABASE=ARCHOS SA
++
++bluetooth:v00D1*
++ ID_VENDOR_FROM_DATABASE=Polar Electro Europe B.V.
++
++bluetooth:v00D2*
++ ID_VENDOR_FROM_DATABASE=Dialog Semiconductor B.V.
++
++bluetooth:v00D3*
++ ID_VENDOR_FROM_DATABASE=Taixingbang Technology (HK) Co,. LTD.
++
++bluetooth:v00D4*
++ ID_VENDOR_FROM_DATABASE=Kawantech
++
++bluetooth:v00D5*
++ ID_VENDOR_FROM_DATABASE=Austco Communication Systems
++
++bluetooth:v00D6*
++ ID_VENDOR_FROM_DATABASE=Timex Group USA, Inc.
++
++bluetooth:v00D7*
++ ID_VENDOR_FROM_DATABASE=Qualcomm Technologies, Inc.
++
++bluetooth:v00D8*
++ ID_VENDOR_FROM_DATABASE=Qualcomm Connected Experiences, Inc.
++
++bluetooth:v00D9*
++ ID_VENDOR_FROM_DATABASE=Voyetra Turtle Beach
++
++bluetooth:v00DA*
++ ID_VENDOR_FROM_DATABASE=txtr GmbH
++
++bluetooth:v00DB*
++ ID_VENDOR_FROM_DATABASE=Biosentronics
++
++bluetooth:v00DC*
++ ID_VENDOR_FROM_DATABASE=Procter & Gamble
++
++bluetooth:v00DD*
++ ID_VENDOR_FROM_DATABASE=Hosiden Corporation
++
++bluetooth:v00DE*
++ ID_VENDOR_FROM_DATABASE=Muzik LLC
++
++bluetooth:v00DF*
++ ID_VENDOR_FROM_DATABASE=Misfit Wearables Corp
++
++bluetooth:v00E0*
++ ID_VENDOR_FROM_DATABASE=Google
++
++bluetooth:v00E1*
++ ID_VENDOR_FROM_DATABASE=Danlers Ltd
++
++bluetooth:v00E2*
++ ID_VENDOR_FROM_DATABASE=Semilink Inc
++
++bluetooth:v00E3*
++ ID_VENDOR_FROM_DATABASE=inMusic Brands, Inc
++
++bluetooth:v00E4*
++ ID_VENDOR_FROM_DATABASE=L.S. Research Inc.
++
++bluetooth:v00E5*
++ ID_VENDOR_FROM_DATABASE=Eden Software Consultants Ltd.
++
++bluetooth:v00E6*
++ ID_VENDOR_FROM_DATABASE=Freshtemp
++
++bluetooth:v00E7*
++ ID_VENDOR_FROM_DATABASE=KS Technologies
++
++bluetooth:v00E8*
++ ID_VENDOR_FROM_DATABASE=ACTS Technologies
++
++bluetooth:v00E9*
++ ID_VENDOR_FROM_DATABASE=Vtrack Systems
++
++bluetooth:v00EA*
++ ID_VENDOR_FROM_DATABASE=Nielsen-Kellerman Company
++
++bluetooth:v00EB*
++ ID_VENDOR_FROM_DATABASE=Server Technology, Inc.
++
++bluetooth:v00EC*
++ ID_VENDOR_FROM_DATABASE=BioResearch Associates
++
++bluetooth:v00ED*
++ ID_VENDOR_FROM_DATABASE=Jolly Logic, LLC
++
++bluetooth:v00EE*
++ ID_VENDOR_FROM_DATABASE=Above Average Outcomes, Inc.
diff --git a/0123-journal-when-appending-to-journal-file-allocate-larg.patch b/0123-journal-when-appending-to-journal-file-allocate-larg.patch
new file mode 100644
index 0000000..183ee4b
--- /dev/null
+++ b/0123-journal-when-appending-to-journal-file-allocate-larg.patch
@@ -0,0 +1,81 @@
+From c0658e1948c301177b1527227be0c18932cd7cce Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 26 Nov 2013 18:39:42 +0100
+Subject: [PATCH] journal: when appending to journal file, allocate larger
+ blocks at once
+
+(cherry picked from commit a676e66535e12458ea6d366a653f8dd60f982504)
+
+Conflicts:
+ src/journal/journal-file.c
+---
+ src/journal/journal-file.c | 26 +++++++++++++++++---------
+ 1 file changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
+index 425e38a..d1b8433 100644
+--- a/src/journal/journal-file.c
++++ b/src/journal/journal-file.c
+@@ -68,6 +68,9 @@
+ /* How many entries to keep in the entry array chain cache at max */
+ #define CHAIN_CACHE_MAX 20
+
++/* How much to increase the journal file size at once each time we allocate something new. */
++#define FILE_SIZE_INCREASE (8ULL*1024ULL*1024ULL) /* 8MB */
++
+ int journal_file_set_online(JournalFile *f) {
+ assert(f);
+
+@@ -218,8 +221,7 @@ static int journal_file_refresh_header(JournalFile *f) {
+ journal_file_set_online(f);
+
+ /* Sync the online state to disk */
+- msync(f->header, PAGE_ALIGN(sizeof(Header)), MS_SYNC);
+- fdatasync(f->fd);
++ fsync(f->fd);
+
+ return 0;
+ }
+@@ -313,7 +315,7 @@ static int journal_file_verify_header(JournalFile *f) {
+ }
+
+ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size) {
+- uint64_t old_size, new_size;
++ uint64_t old_size, new_size, file_size;
+ int r;
+
+ assert(f);
+@@ -333,12 +335,10 @@ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size)
+ if (new_size <= old_size)
+ return 0;
+
+- if (f->metrics.max_size > 0 &&
+- new_size > f->metrics.max_size)
++ if (f->metrics.max_size > 0 && new_size > f->metrics.max_size)
+ return -E2BIG;
+
+- if (new_size > f->metrics.min_size &&
+- f->metrics.keep_free > 0) {
++ if (new_size > f->metrics.min_size && f->metrics.keep_free > 0) {
+ struct statvfs svfs;
+
+ if (fstatvfs(f->fd, &svfs) >= 0) {
+@@ -363,8 +363,16 @@ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size)
+ if (r != 0)
+ return -r;
+
+- if (fstat(f->fd, &f->last_stat) < 0)
+- return -errno;
++ /* Increase the file size a bit further than this, so that we
++ * we can create larger memory maps to cache */
++ file_size = ((new_size+FILE_SIZE_INCREASE-1) / FILE_SIZE_INCREASE) * FILE_SIZE_INCREASE;
++ if (file_size > (uint64_t) f->last_stat.st_size) {
++ if (file_size > new_size)
++ ftruncate(f->fd, file_size);
++
++ if (fstat(f->fd, &f->last_stat) < 0)
++ return -errno;
++ }
+
+ f->header->arena_size = htole64(new_size - le64toh(f->header->header_size));
+
diff --git a/0124-journal-make-table-const.patch b/0124-journal-make-table-const.patch
new file mode 100644
index 0000000..64a317c
--- /dev/null
+++ b/0124-journal-make-table-const.patch
@@ -0,0 +1,44 @@
+From 1ae9614a4373029f3f2464cf4d8e61641f1a50a6 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 26 Nov 2013 18:40:23 +0100
+Subject: [PATCH] journal: make table const
+
+(cherry picked from commit b8e891e699e1336c5527f8203e4e8f67c9bbeb84)
+---
+ src/journal/journal-file.c | 2 +-
+ src/journal/journal-file.h | 8 ++++----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
+index d1b8433..d3bdaea 100644
+--- a/src/journal/journal-file.c
++++ b/src/journal/journal-file.c
+@@ -401,7 +401,7 @@ static int journal_file_move_to(JournalFile *f, int context, bool keep_always, u
+
+ static uint64_t minimum_header_size(Object *o) {
+
+- static uint64_t table[] = {
++ static const uint64_t table[] = {
+ [OBJECT_DATA] = sizeof(DataObject),
+ [OBJECT_FIELD] = sizeof(FieldObject),
+ [OBJECT_ENTRY] = sizeof(EntryObject),
+diff --git a/src/journal/journal-file.h b/src/journal/journal-file.h
+index 5cc2c2d..50bdb67 100644
+--- a/src/journal/journal-file.h
++++ b/src/journal/journal-file.h
+@@ -54,11 +54,11 @@ typedef struct JournalFile {
+
+ int flags;
+ int prot;
+- bool writable;
+- bool compress;
+- bool seal;
++ bool writable:1;
++ bool compress:1;
++ bool seal:1;
+
+- bool tail_entry_monotonic_valid;
++ bool tail_entry_monotonic_valid:1;
+
+ direction_t last_direction;
+
diff --git a/0125-journald-keep-statistics-on-how-of-we-hit-miss-the-m.patch b/0125-journald-keep-statistics-on-how-of-we-hit-miss-the-m.patch
new file mode 100644
index 0000000..527be5c
--- /dev/null
+++ b/0125-journald-keep-statistics-on-how-of-we-hit-miss-the-m.patch
@@ -0,0 +1,92 @@
+From dd186998dd408c54ffe30df1cc35422e645e0ca2 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 26 Nov 2013 18:58:44 +0100
+Subject: [PATCH] journald: keep statistics on how of we hit/miss the mmap
+ cache
+
+(cherry picked from commit bf807d4dbf27c783db8dfd7f4eca321ae4be5b00)
+---
+ src/journal/mmap-cache.c | 25 +++++++++++++++++++++++--
+ src/journal/mmap-cache.h | 3 +++
+ src/journal/sd-journal.c | 4 +++-
+ 3 files changed, 29 insertions(+), 3 deletions(-)
+
+diff --git a/src/journal/mmap-cache.c b/src/journal/mmap-cache.c
+index 03b57be..42a8a7d 100644
+--- a/src/journal/mmap-cache.c
++++ b/src/journal/mmap-cache.c
+@@ -72,6 +72,9 @@ struct MMapCache {
+ int n_ref;
+ unsigned n_windows;
+
++ unsigned n_hit, n_missed;
++
++
+ Hashmap *fds;
+ Hashmap *contexts;
+
+@@ -542,13 +545,19 @@ int mmap_cache_get(
+
+ /* Check whether the current context is the right one already */
+ r = try_context(m, fd, prot, context, keep_always, offset, size, ret);
+- if (r != 0)
++ if (r != 0) {
++ m->n_hit ++;
+ return r;
++ }
+
+ /* Search for a matching mmap */
+ r = find_mmap(m, fd, prot, context, keep_always, offset, size, ret);
+- if (r != 0)
++ if (r != 0) {
++ m->n_hit ++;
+ return r;
++ }
++
++ m->n_missed++;
+
+ /* Create a new mmap */
+ return add_mmap(m, fd, prot, context, keep_always, offset, size, st, ret);
+@@ -578,3 +587,15 @@ void mmap_cache_close_context(MMapCache *m, unsigned context) {
+
+ context_free(c);
+ }
++
++unsigned mmap_cache_get_hit(MMapCache *m) {
++ assert(m);
++
++ return m->n_hit;
++}
++
++unsigned mmap_cache_get_missed(MMapCache *m) {
++ assert(m);
++
++ return m->n_missed;
++}
+diff --git a/src/journal/mmap-cache.h b/src/journal/mmap-cache.h
+index 0c42fb8..912336d 100644
+--- a/src/journal/mmap-cache.h
++++ b/src/journal/mmap-cache.h
+@@ -34,3 +34,6 @@ MMapCache* mmap_cache_unref(MMapCache *m);
+ int mmap_cache_get(MMapCache *m, int fd, int prot, unsigned context, bool keep_always, uint64_t offset, size_t size, struct stat *st, void **ret);
+ void mmap_cache_close_fd(MMapCache *m, int fd);
+ void mmap_cache_close_context(MMapCache *m, unsigned context);
++
++unsigned mmap_cache_get_hit(MMapCache *m);
++unsigned mmap_cache_get_missed(MMapCache *m);
+diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c
+index 9676f0f..52abbe9 100644
+--- a/src/journal/sd-journal.c
++++ b/src/journal/sd-journal.c
+@@ -1831,8 +1831,10 @@ _public_ void sd_journal_close(sd_journal *j) {
+ if (j->inotify_fd >= 0)
+ close_nointr_nofail(j->inotify_fd);
+
+- if (j->mmap)
++ if (j->mmap) {
++ log_debug("mmap cache statistics: %u hit, %u miss", mmap_cache_get_hit(j->mmap), mmap_cache_get_missed(j->mmap));
+ mmap_cache_unref(j->mmap);
++ }
+
+ free(j->path);
+ free(j->unique_field);
diff --git a/0126-journal-optimize-bisection-logic-a-bit-by-caching-th.patch b/0126-journal-optimize-bisection-logic-a-bit-by-caching-th.patch
new file mode 100644
index 0000000..41a159e
--- /dev/null
+++ b/0126-journal-optimize-bisection-logic-a-bit-by-caching-th.patch
@@ -0,0 +1,246 @@
+From a460644e808ed7671e28ef8231ee590317371fed Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 26 Nov 2013 20:37:53 +0100
+Subject: [PATCH] journal: optimize bisection logic a bit by caching the last
+ position
+
+This way we can do a quick restart limiting a bit how wildly we need to
+jump around during the bisection process.
+
+(cherry picked from commit f268980d2cee694fa4118a71402a47c316af0425)
+---
+ src/journal/journal-file.c | 134 +++++++++++++++++++++++++++++++++------------
+ 1 file changed, 99 insertions(+), 35 deletions(-)
+
+diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
+index d3bdaea..02f7554 100644
+--- a/src/journal/journal-file.c
++++ b/src/journal/journal-file.c
+@@ -1366,6 +1366,7 @@ typedef struct ChainCacheItem {
+ uint64_t array; /* the cached array */
+ uint64_t begin; /* the first item in the cached array */
+ uint64_t total; /* the total number of items in all arrays before this one in the chain */
++ uint64_t last_index; /* the last index we looked at, to optimize locality when bisecting */
+ } ChainCacheItem;
+
+ static void chain_cache_put(
+@@ -1374,7 +1375,8 @@ static void chain_cache_put(
+ uint64_t first,
+ uint64_t array,
+ uint64_t begin,
+- uint64_t total) {
++ uint64_t total,
++ uint64_t last_index) {
+
+ if (!ci) {
+ /* If the chain item to cache for this chain is the
+@@ -1402,12 +1404,14 @@ static void chain_cache_put(
+ ci->array = array;
+ ci->begin = begin;
+ ci->total = total;
++ ci->last_index = last_index;
+ }
+
+-static int generic_array_get(JournalFile *f,
+- uint64_t first,
+- uint64_t i,
+- Object **ret, uint64_t *offset) {
++static int generic_array_get(
++ JournalFile *f,
++ uint64_t first,
++ uint64_t i,
++ Object **ret, uint64_t *offset) {
+
+ Object *o;
+ uint64_t p = 0, a, t = 0;
+@@ -1448,7 +1452,7 @@ static int generic_array_get(JournalFile *f,
+
+ found:
+ /* Let's cache this item for the next invocation */
+- chain_cache_put(f->chain_cache, ci, first, a, o->entry_array.items[0], t);
++ chain_cache_put(f->chain_cache, ci, first, a, o->entry_array.items[0], t, i);
+
+ r = journal_file_move_to_object(f, OBJECT_ENTRY, p, &o);
+ if (r < 0)
+@@ -1463,11 +1467,12 @@ found:
+ return 1;
+ }
+
+-static int generic_array_get_plus_one(JournalFile *f,
+- uint64_t extra,
+- uint64_t first,
+- uint64_t i,
+- Object **ret, uint64_t *offset) {
++static int generic_array_get_plus_one(
++ JournalFile *f,
++ uint64_t extra,
++ uint64_t first,
++ uint64_t i,
++ Object **ret, uint64_t *offset) {
+
+ Object *o;
+
+@@ -1498,17 +1503,18 @@ enum {
+ TEST_RIGHT
+ };
+
+-static int generic_array_bisect(JournalFile *f,
+- uint64_t first,
+- uint64_t n,
+- uint64_t needle,
+- int (*test_object)(JournalFile *f, uint64_t p, uint64_t needle),
+- direction_t direction,
+- Object **ret,
+- uint64_t *offset,
+- uint64_t *idx) {
+-
+- uint64_t a, p, t = 0, i = 0, last_p = 0;
++static int generic_array_bisect(
++ JournalFile *f,
++ uint64_t first,
++ uint64_t n,
++ uint64_t needle,
++ int (*test_object)(JournalFile *f, uint64_t p, uint64_t needle),
++ direction_t direction,
++ Object **ret,
++ uint64_t *offset,
++ uint64_t *idx) {
++
++ uint64_t a, p, t = 0, i = 0, last_p = 0, last_index = (uint64_t) -1;
+ bool subtract_one = false;
+ Object *o, *array = NULL;
+ int r;
+@@ -1533,7 +1539,7 @@ static int generic_array_bisect(JournalFile *f,
+ return r;
+
+ if (r == TEST_LEFT) {
+- /* OK, what we are looking for is right of th
++ /* OK, what we are looking for is right of the
+ * begin of this EntryArray, so let's jump
+ * straight to previously cached array in the
+ * chain */
+@@ -1541,6 +1547,7 @@ static int generic_array_bisect(JournalFile *f,
+ a = ci->array;
+ n -= ci->total;
+ t = ci->total;
++ last_index = ci->last_index;
+ }
+ }
+
+@@ -1571,6 +1578,60 @@ static int generic_array_bisect(JournalFile *f,
+ if (r == TEST_RIGHT) {
+ left = 0;
+ right -= 1;
++
++ if (last_index != (uint64_t) -1) {
++ assert(last_index <= right);
++
++ /* If we cached the last index we
++ * looked at, let's try to not to jump
++ * too wildly around and see if we can
++ * limit the range to look at early to
++ * the immediate neighbors of the last
++ * index we looked at. */
++
++ if (last_index > 0) {
++ uint64_t x = last_index - 1;
++
++ p = le64toh(array->entry_array.items[x]);
++ if (p <= 0)
++ return -EBADMSG;
++
++ r = test_object(f, p, needle);
++ if (r < 0)
++ return r;
++
++ if (r == TEST_FOUND)
++ r = direction == DIRECTION_DOWN ? TEST_RIGHT : TEST_LEFT;
++
++ if (r == TEST_RIGHT)
++ right = x;
++ else
++ left = x + 1;
++ }
++
++ if (last_index < right) {
++ uint64_t y = last_index + 1;
++
++ p = le64toh(array->entry_array.items[y]);
++ if (p <= 0)
++ return -EBADMSG;
++
++ r = test_object(f, p, needle);
++ if (r < 0)
++ return r;
++
++ if (r == TEST_FOUND)
++ r = direction == DIRECTION_DOWN ? TEST_RIGHT : TEST_LEFT;
++
++ if (r == TEST_RIGHT)
++ right = y;
++ else
++ left = y + 1;
++ }
++
++ last_index = (uint64_t) -1;
++ }
++
+ for (;;) {
+ if (left == right) {
+ if (direction == DIRECTION_UP)
+@@ -1581,8 +1642,8 @@ static int generic_array_bisect(JournalFile *f,
+ }
+
+ assert(left < right);
+-
+ i = (left + right) / 2;
++
+ p = le64toh(array->entry_array.items[i]);
+ if (p <= 0)
+ return -EBADMSG;
+@@ -1615,6 +1676,7 @@ static int generic_array_bisect(JournalFile *f,
+
+ n -= k;
+ t += k;
++ last_index = (uint64_t) -1;
+ a = le64toh(array->entry_array.next_entry_array_offset);
+ }
+
+@@ -1625,7 +1687,7 @@ found:
+ return 0;
+
+ /* Let's cache this item for the next invocation */
+- chain_cache_put(f->chain_cache, ci, first, a, array->entry_array.items[0], t);
++ chain_cache_put(f->chain_cache, ci, first, a, array->entry_array.items[0], t, i + (subtract_one ? -1 : 0));
+
+ if (subtract_one && i == 0)
+ p = last_p;
+@@ -1650,16 +1712,18 @@ found:
+ return 1;
+ }
+
+-static int generic_array_bisect_plus_one(JournalFile *f,
+- uint64_t extra,
+- uint64_t first,
+- uint64_t n,
+- uint64_t needle,
+- int (*test_object)(JournalFile *f, uint64_t p, uint64_t needle),
+- direction_t direction,
+- Object **ret,
+- uint64_t *offset,
+- uint64_t *idx) {
++
++static int generic_array_bisect_plus_one(
++ JournalFile *f,
++ uint64_t extra,
++ uint64_t first,
++ uint64_t n,
++ uint64_t needle,
++ int (*test_object)(JournalFile *f, uint64_t p, uint64_t needle),
++ direction_t direction,
++ Object **ret,
++ uint64_t *offset,
++ uint64_t *idx) {
+
+ int r;
+ bool step_back = false;
diff --git a/0127-journal-fix-iteration-when-we-go-backwards-from-the-.patch b/0127-journal-fix-iteration-when-we-go-backwards-from-the-.patch
new file mode 100644
index 0000000..29c2fbe
--- /dev/null
+++ b/0127-journal-fix-iteration-when-we-go-backwards-from-the-.patch
@@ -0,0 +1,24 @@
+From 6ddc0196df2400e440e4bddbcc4ce32c636a7ec1 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Wed, 27 Nov 2013 00:58:39 +0100
+Subject: [PATCH] journal: fix iteration when we go backwards from the
+ beginning of an array chain element
+
+(cherry picked from commit e5462cd80e5328a769137c261c93931ea0c27bab)
+---
+ src/journal/journal-file.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
+index 02f7554..4e22e08 100644
+--- a/src/journal/journal-file.c
++++ b/src/journal/journal-file.c
+@@ -1687,7 +1687,7 @@ found:
+ return 0;
+
+ /* Let's cache this item for the next invocation */
+- chain_cache_put(f->chain_cache, ci, first, a, array->entry_array.items[0], t, i + (subtract_one ? -1 : 0));
++ chain_cache_put(f->chain_cache, ci, first, a, array->entry_array.items[0], t, subtract_one ? (i > 0 ? i-1 : (uint64_t) -1) : i);
+
+ if (subtract_one && i == 0)
+ p = last_p;
diff --git a/0128-journal-allow-journal_file_copy_entry-to-work-on-non.patch b/0128-journal-allow-journal_file_copy_entry-to-work-on-non.patch
new file mode 100644
index 0000000..db5c630
--- /dev/null
+++ b/0128-journal-allow-journal_file_copy_entry-to-work-on-non.patch
@@ -0,0 +1,26 @@
+From 00a827da3737dc95c2561292c03468fc96f53f14 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Wed, 27 Nov 2013 00:59:07 +0100
+Subject: [PATCH] journal: allow journal_file_copy_entry() to work on non-local
+ files
+
+(cherry picked from commit 248c78c79c5cca9b981800d816a77591e504066a)
+---
+ src/journal/journal-file.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
+index 4e22e08..e0abddf 100644
+--- a/src/journal/journal-file.c
++++ b/src/journal/journal-file.c
+@@ -2739,10 +2739,6 @@ int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint6
+ ts.monotonic = le64toh(o->entry.monotonic);
+ ts.realtime = le64toh(o->entry.realtime);
+
+- if (to->tail_entry_monotonic_valid &&
+- ts.monotonic < le64toh(to->header->tail_entry_monotonic))
+- return -EINVAL;
+-
+ n = journal_file_entry_n_items(o);
+ items = alloca(sizeof(EntryItem) * n);
+
diff --git a/0129-journal-simplify-pre-allocation-logic.patch b/0129-journal-simplify-pre-allocation-logic.patch
new file mode 100644
index 0000000..e37d415
--- /dev/null
+++ b/0129-journal-simplify-pre-allocation-logic.patch
@@ -0,0 +1,60 @@
+From ab3ada57a761fde9050d7452f6bd9d897b9067ec Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Wed, 27 Nov 2013 01:44:52 +0100
+Subject: [PATCH] journal: simplify pre-allocation logic
+
+let's just do a single fallocate() as far as possible, and don't
+distuingish between allocated space and file size.
+
+This way we can save a syscall for each append, which makes quite some
+benefits.
+
+(cherry picked from commit eda4b58b50509dc8ad0428a46e20f6c5cf516d58)
+---
+ src/journal/journal-file.c | 19 ++++++++-----------
+ 1 file changed, 8 insertions(+), 11 deletions(-)
+
+diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
+index e0abddf..090cf97 100644
+--- a/src/journal/journal-file.c
++++ b/src/journal/journal-file.c
+@@ -315,7 +315,7 @@ static int journal_file_verify_header(JournalFile *f) {
+ }
+
+ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size) {
+- uint64_t old_size, new_size, file_size;
++ uint64_t old_size, new_size;
+ int r;
+
+ assert(f);
+@@ -356,6 +356,11 @@ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size)
+ }
+ }
+
++ /* Increase by larger blocks at once */
++ new_size = ((new_size+FILE_SIZE_INCREASE-1) / FILE_SIZE_INCREASE) * FILE_SIZE_INCREASE;
++ if (f->metrics.max_size > 0 && new_size > f->metrics.max_size)
++ new_size = f->metrics.max_size;
++
+ /* Note that the glibc fallocate() fallback is very
+ inefficient, hence we try to minimize the allocation area
+ as we can. */
+@@ -363,16 +368,8 @@ static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size)
+ if (r != 0)
+ return -r;
+
+- /* Increase the file size a bit further than this, so that we
+- * we can create larger memory maps to cache */
+- file_size = ((new_size+FILE_SIZE_INCREASE-1) / FILE_SIZE_INCREASE) * FILE_SIZE_INCREASE;
+- if (file_size > (uint64_t) f->last_stat.st_size) {
+- if (file_size > new_size)
+- ftruncate(f->fd, file_size);
+-
+- if (fstat(f->fd, &f->last_stat) < 0)
+- return -errno;
+- }
++ if (fstat(f->fd, &f->last_stat) < 0)
++ return -errno;
+
+ f->header->arena_size = htole64(new_size - le64toh(f->header->header_size));
+
diff --git a/0130-journald-mention-how-long-we-needed-to-flush-to-var-.patch b/0130-journald-mention-how-long-we-needed-to-flush-to-var-.patch
new file mode 100644
index 0000000..2fe9226
--- /dev/null
+++ b/0130-journald-mention-how-long-we-needed-to-flush-to-var-.patch
@@ -0,0 +1,56 @@
+From f201d0f2ca7adcfcbb854a83ff9a75b40ace7967 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Wed, 27 Nov 2013 01:54:25 +0100
+Subject: [PATCH] journald: mention how long we needed to flush to /var in the
+ logs
+
+(cherry picked from commit fbb634117d0b0ebd5b105e65b141e75ae9af7f8f)
+---
+ src/journal/journald-server.c | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
+index e03e413..a0a8e9c 100644
+--- a/src/journal/journald-server.c
++++ b/src/journal/journald-server.c
+@@ -968,9 +968,12 @@ static int system_journal_open(Server *s) {
+ }
+
+ int server_flush_to_var(Server *s) {
+- int r;
+ sd_id128_t machine;
+ sd_journal *j = NULL;
++ char ts[FORMAT_TIMESPAN_MAX];
++ usec_t start;
++ unsigned n = 0;
++ int r;
+
+ assert(s);
+
+@@ -988,6 +991,8 @@ int server_flush_to_var(Server *s) {
+
+ log_debug("Flushing to /var...");
+
++ start = now(CLOCK_MONOTONIC);
++
+ r = sd_id128_get_machine(&machine);
+ if (r < 0)
+ return r;
+@@ -1007,6 +1012,8 @@ int server_flush_to_var(Server *s) {
+ f = j->current_file;
+ assert(f && f->current_offset > 0);
+
++ n++;
++
+ r = journal_file_move_to_object(f, OBJECT_ENTRY, f->current_offset, &o);
+ if (r < 0) {
+ log_error("Can't read entry: %s", strerror(-r));
+@@ -1050,6 +1057,8 @@ finish:
+
+ sd_journal_close(j);
+
++ server_driver_message(s, SD_ID128_NULL, "Time spent on flushing to /var is %s for %u entries.", format_timespan(ts, sizeof(ts), now(CLOCK_MONOTONIC) - start, 0), n);
++
+ return r;
+ }
+
diff --git a/0131-automount-log-info-about-triggering-process.patch b/0131-automount-log-info-about-triggering-process.patch
new file mode 100644
index 0000000..0cf8a97
--- /dev/null
+++ b/0131-automount-log-info-about-triggering-process.patch
@@ -0,0 +1,26 @@
+From e64e35b2f24f0a2979d435a752d2ab141c5a0cc2 Mon Sep 17 00:00:00 2001
+From: Kay Sievers <kay at vrfy.org>
+Date: Thu, 28 Nov 2013 01:25:10 +0100
+Subject: [PATCH] automount: log info about triggering process
+
+Conflicts:
+ src/core/automount.c
+---
+ src/core/automount.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/core/automount.c b/src/core/automount.c
+index d1379e0..203104e 100644
+--- a/src/core/automount.c
++++ b/src/core/automount.c
+@@ -776,8 +776,8 @@ static void automount_fd_event(Unit *u, int fd, uint32_t events, Watch *w) {
+ _cleanup_free_ char *p = NULL;
+
+ get_process_comm(packet.v5_packet.pid, &p);
+- log_debug_unit(u->id,
+- "Got direct mount request on %s, triggered by %lu (%s)",
++ log_info_unit(u->id,
++ "Got automount request for %s, triggered by %lu (%s)",
+ a->where, (unsigned long) packet.v5_packet.pid, strna(p));
+ } else
+ log_debug_unit(u->id, "Got direct mount request on %s", a->where);
diff --git a/0132-virt-split-detect_vm-into-separate-functions.patch b/0132-virt-split-detect_vm-into-separate-functions.patch
new file mode 100644
index 0000000..a0c1028
--- /dev/null
+++ b/0132-virt-split-detect_vm-into-separate-functions.patch
@@ -0,0 +1,205 @@
+From 4931213c9f9fed23c4a103eda1ee19aa06b9f613 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
+Date: Thu, 28 Nov 2013 13:34:08 -0500
+Subject: [PATCH] virt: split detect_vm into separate functions
+
+It didn't build on arm. Let's simplify it a bit by
+splitting x86 specific parts out, which should also make
+things easier when arm virtualization support is added.
+---
+ src/shared/virt.c | 140 +++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 81 insertions(+), 59 deletions(-)
+
+diff --git a/src/shared/virt.c b/src/shared/virt.c
+index 537ccda..4e18638 100644
+--- a/src/shared/virt.c
++++ b/src/shared/virt.c
+@@ -27,30 +27,10 @@
+ #include "virt.h"
+ #include "fileio.h"
+
+-/* Returns a short identifier for the various VM implementations */
+-int detect_vm(const char **id) {
+- _cleanup_free_ char *cpuinfo_contents = NULL;
+- int r;
+-
+-#if defined(__i386__) || defined(__x86_64__)
++static int detect_vm_cpuid(const char **_id) {
+
+ /* Both CPUID and DMI are x86 specific interfaces... */
+-
+- static const char *const dmi_vendors[] = {
+- "/sys/class/dmi/id/sys_vendor",
+- "/sys/class/dmi/id/board_vendor",
+- "/sys/class/dmi/id/bios_vendor"
+- };
+-
+- static const char dmi_vendor_table[] =
+- "QEMU\0" "qemu\0"
+- /* http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 */
+- "VMware\0" "vmware\0"
+- "VMW\0" "vmware\0"
+- "Microsoft Corporation\0" "microsoft\0"
+- "innotek GmbH\0" "oracle\0"
+- "Xen\0" "xen\0"
+- "Bochs\0" "bochs\0";
++#if defined(__i386__) || defined(__x86_64__)
+
+ static const char cpuid_vendor_table[] =
+ "XenVMMXenVMM\0" "xen\0"
+@@ -60,40 +40,13 @@ int detect_vm(const char **id) {
+ /* http://msdn.microsoft.com/en-us/library/ff542428.aspx */
+ "Microsoft Hv\0" "microsoft\0";
+
+- static __thread int cached_found = -1;
+- static __thread const char *cached_id = NULL;
+-
+ uint32_t eax, ecx;
+ union {
+ uint32_t sig32[3];
+ char text[13];
+ } sig = {};
+- unsigned i;
+ const char *j, *k;
+ bool hypervisor;
+- _cleanup_free_ char *hvtype = NULL;
+- const char *_id = NULL;
+-
+- if (_likely_(cached_found >= 0)) {
+-
+- if (id)
+- *id = cached_id;
+-
+- return cached_found;
+- }
+-
+- /* Try high-level hypervisor sysfs file first:
+- *
+- * https://bugs.freedesktop.org/show_bug.cgi?id=61491 */
+- r = read_one_line_file("/sys/hypervisor/type", &hvtype);
+- if (r >= 0) {
+- if (streq(hvtype, "xen")) {
+- _id = "xen";
+- r = 1;
+- goto finish;
+- }
+- } else if (r != -ENOENT)
+- return r;
+
+ /* http://lwn.net/Articles/301888/ */
+
+@@ -136,14 +89,44 @@ int detect_vm(const char **id) {
+
+ NULSTR_FOREACH_PAIR(j, k, cpuid_vendor_table)
+ if (streq(sig.text, j)) {
+- _id = k;
+- r = 1;
+- goto finish;
++ *_id = k;
++ return 1;
+ }
++
++ *_id = "other";
++ return 0;
+ }
++#endif
++
++ return 0;
++}
++
++static int detect_vm_dmi(const char **_id) {
++
++ /* Both CPUID and DMI are x86 specific interfaces... */
++#if defined(__i386__) || defined(__x86_64__)
++
++ static const char *const dmi_vendors[] = {
++ "/sys/class/dmi/id/sys_vendor",
++ "/sys/class/dmi/id/board_vendor",
++ "/sys/class/dmi/id/bios_vendor"
++ };
++
++ static const char dmi_vendor_table[] =
++ "QEMU\0" "qemu\0"
++ /* http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 */
++ "VMware\0" "vmware\0"
++ "VMW\0" "vmware\0"
++ "Microsoft Corporation\0" "microsoft\0"
++ "innotek GmbH\0" "oracle\0"
++ "Xen\0" "xen\0"
++ "Bochs\0" "bochs\0";
++ unsigned i;
+
+ for (i = 0; i < ELEMENTSOF(dmi_vendors); i++) {
+ _cleanup_free_ char *s = NULL;
++ const char *j, *k;
++ int r;
+
+ r = read_one_line_file(dmi_vendors[i], &s);
+ if (r < 0) {
+@@ -155,20 +138,59 @@ int detect_vm(const char **id) {
+
+ NULSTR_FOREACH_PAIR(j, k, dmi_vendor_table)
+ if (startswith(s, j)) {
+- _id = k;
+- r = 1;
+- goto finish;
++ *_id = k;
++ return 1;
+ }
+ }
++#endif
+
+- if (hypervisor || hvtype) {
+- _id = "other";
++ return 0;
++}
++
++/* Returns a short identifier for the various VM implementations */
++int detect_vm(const char **id) {
++ _cleanup_free_ char *hvtype = NULL, *cpuinfo_contents = NULL;
++ static __thread int cached_found = -1;
++ static __thread const char *cached_id = NULL;
++ const char *_id = NULL;
++ int r;
++
++ if (_likely_(cached_found >= 0)) {
++
++ if (id)
++ *id = cached_id;
++
++ return cached_found;
++ }
++
++ /* Try high-level hypervisor sysfs file first:
++ *
++ * https://bugs.freedesktop.org/show_bug.cgi?id=61491 */
++ r = read_one_line_file("/sys/hypervisor/type", &hvtype);
++ if (r >= 0) {
++ if (streq(hvtype, "xen")) {
++ _id = "xen";
++ r = 1;
++ goto finish;
++ }
++ } else if (r != -ENOENT)
++ return r;
++
++ /* this will set _id to "other" and return 0 for unknown hypervisors */
++ r = detect_vm_cpuid(&_id);
++ if (r != 0)
++ goto finish;
++
++ r = detect_vm_dmi(&_id);
++ if (r != 0)
++ goto finish;
++
++ if (_id) {
++ /* "other" */
+ r = 1;
+ goto finish;
+ }
+
+-#endif
+-
+ /* Detect User-Mode Linux by reading /proc/cpuinfo */
+ r = read_full_file("/proc/cpuinfo", &cpuinfo_contents, NULL);
+ if (r < 0)
diff --git a/0133-hwdb-Update-database-of-Bluetooth-company-identifier.patch b/0133-hwdb-Update-database-of-Bluetooth-company-identifier.patch
new file mode 100644
index 0000000..adbd9ad
--- /dev/null
+++ b/0133-hwdb-Update-database-of-Bluetooth-company-identifier.patch
@@ -0,0 +1,147 @@
+From 123cc4b594188a5caed955e77228a37001ee451f Mon Sep 17 00:00:00 2001
+From: Marcel Holtmann <marcel at holtmann.org>
+Date: Fri, 29 Nov 2013 07:26:47 -0800
+Subject: [PATCH] hwdb: Update database of Bluetooth company identifiers
+
+---
+ hwdb/20-bluetooth-vendor-product.hwdb | 109 +++++++++++++++++++++++++++++++++-
+ 1 file changed, 107 insertions(+), 2 deletions(-)
+
+diff --git a/hwdb/20-bluetooth-vendor-product.hwdb b/hwdb/20-bluetooth-vendor-product.hwdb
+index faecf42..dcc25bb 100644
+--- a/hwdb/20-bluetooth-vendor-product.hwdb
++++ b/hwdb/20-bluetooth-vendor-product.hwdb
+@@ -366,6 +366,9 @@ bluetooth:v0077*
+ bluetooth:v0078*
+ ID_VENDOR_FROM_DATABASE=Nike, Inc.
+
++bluetooth:v0078p0001*
++ ID_PRODUCT_FROM_DATABASE=Nike+ FuelBand
++
+ bluetooth:v0079*
+ ID_VENDOR_FROM_DATABASE=lesswire AG
+
+@@ -457,7 +460,7 @@ bluetooth:v0096*
+ ID_VENDOR_FROM_DATABASE=ODM Technology, Inc.
+
+ bluetooth:v0097*
+- ID_VENDOR_FROM_DATABASE=Bluetrek Technologies Limited
++ ID_VENDOR_FROM_DATABASE=ConnecteDevice Ltd.
+
+ bluetooth:v0098*
+ ID_VENDOR_FROM_DATABASE=zer01.tv GmbH
+@@ -634,7 +637,7 @@ bluetooth:v00D2*
+ ID_VENDOR_FROM_DATABASE=Dialog Semiconductor B.V.
+
+ bluetooth:v00D3*
+- ID_VENDOR_FROM_DATABASE=Taixingbang Technology (HK) Co,. LTD.
++ ID_VENDOR_FROM_DATABASE=Taixingbang Technology (HK) Co,. LTD.
+
+ bluetooth:v00D4*
+ ID_VENDOR_FROM_DATABASE=Kawantech
+@@ -716,3 +719,105 @@ bluetooth:v00ED*
+
+ bluetooth:v00EE*
+ ID_VENDOR_FROM_DATABASE=Above Average Outcomes, Inc.
++
++bluetooth:v00EF*
++ ID_VENDOR_FROM_DATABASE=Bitsplitters GmbH
++
++bluetooth:v00F0*
++ ID_VENDOR_FROM_DATABASE=PayPal, Inc.
++
++bluetooth:v00F1*
++ ID_VENDOR_FROM_DATABASE=Witron Technology Limited
++
++bluetooth:v00F2*
++ ID_VENDOR_FROM_DATABASE=Morse Project Inc.
++
++bluetooth:v00F3*
++ ID_VENDOR_FROM_DATABASE=Kent Displays Inc.
++
++bluetooth:v00F4*
++ ID_VENDOR_FROM_DATABASE=Nautilus Inc.
++
++bluetooth:v00F5*
++ ID_VENDOR_FROM_DATABASE=Smartifier Oy
++
++bluetooth:v00F6*
++ ID_VENDOR_FROM_DATABASE=Elcometer Limited
++
++bluetooth:v00F7*
++ ID_VENDOR_FROM_DATABASE=VSN Technologies Inc.
++
++bluetooth:v00F8*
++ ID_VENDOR_FROM_DATABASE=AceUni Corp., Ltd.
++
++bluetooth:v00F9*
++ ID_VENDOR_FROM_DATABASE=StickNFind
++
++bluetooth:v00FA*
++ ID_VENDOR_FROM_DATABASE=Crystal Code AB
++
++bluetooth:v00FB*
++ ID_VENDOR_FROM_DATABASE=KOUKAAM a.s.
++
++bluetooth:v00FC*
++ ID_VENDOR_FROM_DATABASE=Delphi Corporation
++
++bluetooth:v00FD*
++ ID_VENDOR_FROM_DATABASE=ValenceTech Limited
++
++bluetooth:v00FE*
++ ID_VENDOR_FROM_DATABASE=Reserved
++
++bluetooth:v00FF*
++ ID_VENDOR_FROM_DATABASE=Typo Products, LLC
++
++bluetooth:v0100*
++ ID_VENDOR_FROM_DATABASE=TomTom International BV
++
++bluetooth:v0101*
++ ID_VENDOR_FROM_DATABASE=Fugoo, Inc
++
++bluetooth:v0102*
++ ID_VENDOR_FROM_DATABASE=Keiser Corporation
++
++bluetooth:v0103*
++ ID_VENDOR_FROM_DATABASE=Bang & Olufsen A/S
++
++bluetooth:v0104*
++ ID_VENDOR_FROM_DATABASE=PLUS Locations Systems Pty Ltd
++
++bluetooth:v0105*
++ ID_VENDOR_FROM_DATABASE=Ubiquitous Computing Technology Corporation
++
++bluetooth:v0106*
++ ID_VENDOR_FROM_DATABASE=Innovative Yachtter Solutions
++
++bluetooth:v0107*
++ ID_VENDOR_FROM_DATABASE=William Demant Holding A/S
++
++bluetooth:v0108*
++ ID_VENDOR_FROM_DATABASE=Chicony Electronics Co., Ltd.
++
++bluetooth:v0109*
++ ID_VENDOR_FROM_DATABASE=Atus BV
++
++bluetooth:v010A*
++ ID_VENDOR_FROM_DATABASE=Codegate Ltd.
++
++bluetooth:v010B*
++ ID_VENDOR_FROM_DATABASE=ERi, Inc.
++
++bluetooth:v010C*
++ ID_VENDOR_FROM_DATABASE=Transducers Direct, LLC
++
++bluetooth:v010D*
++ ID_VENDOR_FROM_DATABASE=Fujitsu Ten Limited
++
++bluetooth:v010E*
++ ID_VENDOR_FROM_DATABASE=Audi AG
++
++bluetooth:v010F*
++ ID_VENDOR_FROM_DATABASE=HiSilicon Technologies Co., Ltd.
++
++bluetooth:v0110*
++ ID_VENDOR_FROM_DATABASE=Nippon Seiki Co., Ltd.
diff --git a/0134-sysfs-show.c-return-negative-error.patch b/0134-sysfs-show.c-return-negative-error.patch
new file mode 100644
index 0000000..d94a211
--- /dev/null
+++ b/0134-sysfs-show.c-return-negative-error.patch
@@ -0,0 +1,23 @@
+From cd0e1552ad5d5dffdd0f8a01fa9b451d3e14a60d Mon Sep 17 00:00:00 2001
+From: Thomas Hindoe Paaboel Andersen <phomes at gmail.com>
+Date: Sat, 30 Nov 2013 21:59:40 +0100
+Subject: [PATCH] sysfs-show.c: return negative error
+
+introduced in 1ca208fb4f93e5869704af1812cbff7130a2fc03
+---
+ src/login/sysfs-show.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/login/sysfs-show.c b/src/login/sysfs-show.c
+index 7c1adfa..f7d11dd 100644
+--- a/src/login/sysfs-show.c
++++ b/src/login/sysfs-show.c
+@@ -164,7 +164,7 @@ int show_sysfs(const char *seat, const char *prefix, unsigned n_columns) {
+
+ e = udev_enumerate_new(udev);
+ if (!e)
+- return ENOMEM;
++ return -ENOMEM;
+
+ if (!streq(seat, "seat0"))
+ r = udev_enumerate_add_match_tag(e, seat);
diff --git a/0135-util.c-check-if-return-value-from-ttyname_r-is-0-ins.patch b/0135-util.c-check-if-return-value-from-ttyname_r-is-0-ins.patch
new file mode 100644
index 0000000..20deb99
--- /dev/null
+++ b/0135-util.c-check-if-return-value-from-ttyname_r-is-0-ins.patch
@@ -0,0 +1,28 @@
+From 05175fd678f6f7f09ff9543cd11bbd7ebf14fe58 Mon Sep 17 00:00:00 2001
+From: Thomas Hindoe Paaboel Andersen <phomes at gmail.com>
+Date: Sat, 30 Nov 2013 23:45:31 +0100
+Subject: [PATCH] util.c: check if return value from ttyname_r is > 0 instead
+ of != 0
+
+We must return a negative error code from getttyname_malloc but
+that would not be the case if ttyname_r returned a negative value.
+
+ttyname_r should only return EBADF, ENOTTY, or ERANGE so it should
+be safe to change.
+---
+ src/shared/util.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/shared/util.c b/src/shared/util.c
+index 3fc080a..1510c5e 100644
+--- a/src/shared/util.c
++++ b/src/shared/util.c
+@@ -2561,7 +2561,7 @@ int getttyname_malloc(int fd, char **r) {
+ assert(r);
+
+ k = ttyname_r(fd, path, sizeof(path));
+- if (k != 0)
++ if (k > 0)
+ return -k;
+
+ char_array_0(path);
diff --git a/0136-docs-remove-unneeded-the-s-in-gudev-docs.patch b/0136-docs-remove-unneeded-the-s-in-gudev-docs.patch
new file mode 100644
index 0000000..8669be8
--- /dev/null
+++ b/0136-docs-remove-unneeded-the-s-in-gudev-docs.patch
@@ -0,0 +1,38 @@
+From bbf5b0815c2561c3a98903160f3193953ba962c6 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
+Date: Sat, 30 Nov 2013 20:27:54 -0500
+Subject: [PATCH] docs: remove unneeded the's in gudev docs
+
+https://bugs.freedesktop.org/show_bug.cgi?id=72164
+---
+ src/libudev/libudev-device.c | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/src/libudev/libudev-device.c b/src/libudev/libudev-device.c
+index a644904..161181a 100644
+--- a/src/libudev/libudev-device.c
++++ b/src/libudev/libudev-device.c
+@@ -980,9 +980,8 @@ static struct udev_device *device_new_from_parent(struct udev_device *udev_devic
+ * Find the next parent device, and fill in information from the sys
+ * device and the udev database entry.
+ *
+- * The returned the device is not referenced. It is attached to the
+- * child device, and will be cleaned up when the child device
+- * is cleaned up.
++ * Returned device is not referenced. It is attached to the child
++ * device, and will be cleaned up when the child device is cleaned up.
+ *
+ * It is not necessarily just the upper level directory, empty or not
+ * recognized sys directories are ignored.
+@@ -1016,9 +1015,8 @@ _public_ struct udev_device *udev_device_get_parent(struct udev_device *udev_dev
+ * If devtype is #NULL, only subsystem is checked, and any devtype will
+ * match.
+ *
+- * The returned the device is not referenced. It is attached to the
+- * child device, and will be cleaned up when the child device
+- * is cleaned up.
++ * Returned device is not referenced. It is attached to the child
++ * device, and will be cleaned up when the child device is cleaned up.
+ *
+ * It can be called as many times as needed, without caring about
+ * references.
diff --git a/0137-man-explicitly-say-when-multiple-units-can-be-specif.patch b/0137-man-explicitly-say-when-multiple-units-can-be-specif.patch
new file mode 100644
index 0000000..f4cbb4a
--- /dev/null
+++ b/0137-man-explicitly-say-when-multiple-units-can-be-specif.patch
@@ -0,0 +1,235 @@
+From 06c5b7a9f3d47834ea4dbbfb24f169b6893dd338 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
+Date: Sat, 30 Nov 2013 21:23:01 -0500
+Subject: [PATCH] man: explicitly say when multiple units can be specified
+
+itistoday> how do you specify multiple dependencies in a unit file? i've been
+ googling and can't find this basic thing :-\
+itistoday> do you use a comma, or use multiple After= statements?
+---
+ man/systemd.unit.xml | 128 ++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 70 insertions(+), 58 deletions(-)
+
+diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
+index 5c8b8e8..029392c 100644
+--- a/man/systemd.unit.xml
++++ b/man/systemd.unit.xml
+@@ -410,10 +410,12 @@
+ of the other units gets deactivated or
+ its activation fails, this unit will
+ be deactivated. This option may be
+- specified more than once, in which
+- case requirement dependencies for all
+- listed names are created. Note that
+- requirement dependencies do not
++ specified more than once or multiple
++ space-separated units may be specified
++ in one option in which case
++ requirement dependencies for all
++ listed names will be created. Note
++ that requirement dependencies do not
+ influence the order in which services
+ are started or stopped. This has to be
+ configured independently with the
+@@ -476,22 +478,23 @@
+ <term><varname>RequisiteOverridable=</varname></term>
+
+ <listitem><para>Similar to
+- <varname>Requires=</varname>
+- and <varname>RequiresOverridable=</varname>, respectively. However,
+- if a unit listed here is not started
+- already it will not be started and the
+- transaction fails
+- immediately.</para></listitem>
++ <varname>Requires=</varname> and
++ <varname>RequiresOverridable=</varname>,
++ respectively. However, if the units
++ listed here are not started already
++ they will not be started and the
++ transaction will fail immediately.
++ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>Wants=</varname></term>
+
+ <listitem><para>A weaker version of
+- <varname>Requires=</varname>. A unit
++ <varname>Requires=</varname>. Units
+ listed in this option will be started
+ if the configuring unit is. However,
+- if the listed unit fails to start up
++ if the listed units fail to start
+ or cannot be added to the transaction
+ this has no impact on the validity of
+ the transaction as a whole. This is
+@@ -501,8 +504,8 @@
+
+ <para>Note that dependencies of this
+ type may also be configured outside of
+- the unit configuration file by
+- adding a symlink to a
++ the unit configuration file by adding
++ symlinks to a
+ <filename>.wants/</filename> directory
+ accompanying the unit file. For
+ details see above.</para></listitem>
+@@ -534,7 +537,7 @@
+ of units. When systemd stops or restarts
+ the units listed here, the action is
+ propagated to this unit.
+- Note that this is a one way dependency -
++ Note that this is a one way dependency —
+ changes to this unit do not affect the
+ listed units.
+ </para></listitem>
+@@ -543,12 +546,12 @@
+ <varlistentry>
+ <term><varname>Conflicts=</varname></term>
+
+- <listitem><para>Configures negative
++ <listitem><para>A space-separated list
++ of unit names. Configures negative
+ requirement dependencies. If a unit
+- has a
+- <varname>Conflicts=</varname> setting
+- on another unit, starting the former
+- will stop the latter and vice
++ has a <varname>Conflicts=</varname>
++ setting on another unit, starting the
++ former will stop the latter and vice
+ versa. Note that this setting is
+ independent of and orthogonal to the
+ <varname>After=</varname> and
+@@ -575,7 +578,8 @@
+ <term><varname>Before=</varname></term>
+ <term><varname>After=</varname></term>
+
+- <listitem><para>Configures ordering
++ <listitem><para>A space-separated list
++ of unit names. Configures ordering
+ dependencies between units. If a unit
+ <filename>foo.service</filename>
+ contains a setting
+@@ -624,18 +628,18 @@
+ type <varname>After=</varname> or
+ <varname>Before=</varname>. If two
+ units have no ordering dependencies
+- between them, they are shut down
+- or started up simultaneously, and
+- no ordering takes
++ between them, they are shut down or
++ started up simultaneously, and no
++ ordering takes
+ place. </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>OnFailure=</varname></term>
+
+- <listitem><para>Lists one or more
+- units that are activated when this
+- unit enters the
++ <listitem><para>A space-separated list
++ of one or more units that are
++ activated when this unit enters the
+ <literal>failed</literal>
+ state.</para></listitem>
+ </varlistentry>
+@@ -644,16 +648,17 @@
+ <term><varname>PropagatesReloadTo=</varname></term>
+ <term><varname>ReloadPropagatedFrom=</varname></term>
+
+- <listitem><para>Lists one or more
+- units where reload requests on the
+- unit will be propagated to/on the
+- other unit will be propagated
+- from. Issuing a reload request on a
+- unit will automatically also enqueue a
+- reload request on all units that the
+- reload request shall be propagated to
+- via these two
+- settings.</para></listitem>
++ <listitem><para>A space-separated list
++ of one or more units where reload
++ requests on this unit will be
++ propagated to, or reload requests on
++ the other unit will be propagated to
++ this unit, respectively. Issuing a
++ reload request on a unit will
++ automatically also enqueue a reload
++ request on all units that the reload
++ request shall be propagated to via
++ these two settings.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+@@ -1089,32 +1094,34 @@
+ <varlistentry>
+ <term><varname>Alias=</varname></term>
+
+- <listitem><para>Additional names this
+- unit shall be installed under. The
+- names listed here must have the same
+- suffix (i.e. type) as the unit file
+- name. This option may be specified
+- more than once, in which case all
+- listed names are used. At installation
+- time,
+- <command>systemctl enable</command>
+- will create symlinks from these names
+- to the unit filename.</para></listitem>
++ <listitem><para>A space-seperated list
++ of additional names this unit shall be
++ installed under. The names listed here
++ must have the same suffix (i.e. type)
++ as the unit file name. This option may
++ be specified more than once, in which
++ case all listed names are used. At
++ installation time, <command>systemctl
++ enable</command> will create symlinks
++ from these names to the unit
++ filename.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>WantedBy=</varname></term>
+ <term><varname>RequiredBy=</varname></term>
+
+- <listitem><para>A symbolic link is
+- created in the
+- <filename>.wants/</filename> or
+- <filename>.requires/</filename> directory
+- of the listed unit when this unit is
+- activated by <command>systemctl
+- enable</command>. This has the effect
+- that a dependency of type
+- <varname>Wants=</varname> or
++ <listitem><para>This option may be
++ used more than once, or a
++ space-separated list of unit names may
++ be given. A symbolic link is created
++ in the <filename>.wants/</filename> or
++ <filename>.requires/</filename>
++ directory of each of the listed units
++ when this unit is installed by
++ <command>systemctl enable</command>.
++ This has the effect that a dependency
++ of type <varname>Wants=</varname> or
+ <varname>Requires=</varname> is added
+ from the listed unit to the current
+ unit. The primary result is that the
+@@ -1160,7 +1167,12 @@
+ and <command>systemctl
+ disable</command> will automatically
+ install/uninstall units listed in this option as
+- well.</para></listitem>
++ well.</para>
++
++ <para>This option may be used more
++ than once, or a space-separated list
++ of unit names may be
++ given.</para></listitem>
+ </varlistentry>
+ </variablelist>
+
diff --git a/0138-systemd-treat-reload-failure-as-failure.patch b/0138-systemd-treat-reload-failure-as-failure.patch
new file mode 100644
index 0000000..be0b057
--- /dev/null
+++ b/0138-systemd-treat-reload-failure-as-failure.patch
@@ -0,0 +1,90 @@
+From 99e4b98b064042a2c1cea103941a7895b183821e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
+Date: Mon, 2 Dec 2013 21:52:51 -0500
+Subject: [PATCH] systemd: treat reload failure as failure
+
+systemctl reload "suceeded" on stopped units, but it is documented
+to fail in this case.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1036845
+---
+ src/core/job.c | 11 +++++++----
+ src/core/job.h | 3 ++-
+ src/core/unit.c | 5 ++++-
+ 3 files changed, 13 insertions(+), 6 deletions(-)
+
+diff --git a/src/core/job.c b/src/core/job.c
+index dc3bc12..7d2b994 100644
+--- a/src/core/job.c
++++ b/src/core/job.c
+@@ -528,7 +528,7 @@ int job_run_and_invalidate(Job *j) {
+ else if (t == UNIT_ACTIVATING)
+ r = -EAGAIN;
+ else
+- r = -ENOEXEC;
++ r = -EBADR;
+ break;
+ }
+
+@@ -557,8 +557,10 @@ int job_run_and_invalidate(Job *j) {
+ if (j) {
+ if (r == -EALREADY)
+ r = job_finish_and_invalidate(j, JOB_DONE, true);
+- else if (r == -ENOEXEC)
++ else if (r == -EBADR)
+ r = job_finish_and_invalidate(j, JOB_SKIPPED, true);
++ else if (r == -ENOEXEC)
++ r = job_finish_and_invalidate(j, JOB_INVALID, true);
+ else if (r == -EAGAIN) {
+ j->state = JOB_WAITING;
+ m->n_running_jobs--;
+@@ -784,7 +786,7 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) {
+ goto finish;
+ }
+
+- if (result == JOB_FAILED)
++ if (result == JOB_FAILED || result == JOB_INVALID)
+ j->manager->n_failed_jobs ++;
+
+ job_uninstall(j);
+@@ -1143,7 +1145,8 @@ static const char* const job_result_table[_JOB_RESULT_MAX] = {
+ [JOB_TIMEOUT] = "timeout",
+ [JOB_FAILED] = "failed",
+ [JOB_DEPENDENCY] = "dependency",
+- [JOB_SKIPPED] = "skipped"
++ [JOB_SKIPPED] = "skipped",
++ [JOB_INVALID] = "invalid",
+ };
+
+ DEFINE_STRING_TABLE_LOOKUP(job_result, JobResult);
+diff --git a/src/core/job.h b/src/core/job.h
+index d90bc96..4237529 100644
+--- a/src/core/job.h
++++ b/src/core/job.h
+@@ -97,7 +97,8 @@ enum JobResult {
+ JOB_TIMEOUT, /* JobTimeout elapsed */
+ JOB_FAILED, /* Job failed */
+ JOB_DEPENDENCY, /* A required dependency job did not result in JOB_DONE */
+- JOB_SKIPPED, /* JOB_RELOAD of inactive unit; negative result of JOB_VERIFY_ACTIVE */
++ JOB_SKIPPED, /* Negative result of JOB_VERIFY_ACTIVE */
++ JOB_INVALID, /* JOB_RELOAD of inactive unit */
+ _JOB_RESULT_MAX,
+ _JOB_RESULT_INVALID = -1
+ };
+diff --git a/src/core/unit.c b/src/core/unit.c
+index b65e798..6c2c4a0 100644
+--- a/src/core/unit.c
++++ b/src/core/unit.c
+@@ -1239,8 +1239,11 @@ int unit_reload(Unit *u) {
+ if (state == UNIT_RELOADING)
+ return -EALREADY;
+
+- if (state != UNIT_ACTIVE)
++ if (state != UNIT_ACTIVE) {
++ log_warning_unit(u->id, "Unit %s cannot be reloaded because it is inactive.",
++ u->id);
+ return -ENOEXEC;
++ }
+
+ if ((following = unit_following(u))) {
+ log_debug_unit(u->id, "Redirecting reload request from %s to %s.",
diff --git a/0139-journal-fail-silently-in-sd_j_sendv-if-journal-is-un.patch b/0139-journal-fail-silently-in-sd_j_sendv-if-journal-is-un.patch
new file mode 100644
index 0000000..5cbb239
--- /dev/null
+++ b/0139-journal-fail-silently-in-sd_j_sendv-if-journal-is-un.patch
@@ -0,0 +1,34 @@
+From 9c6964b0a23852353aaa0ca0c30586c3f19502b7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek at in.waw.pl>
+Date: Tue, 3 Dec 2013 08:07:32 -0500
+Subject: [PATCH] journal: fail silently in sd_j_sendv() if journal is
+ unavailable
+
+"syslog(3) and sd_journal_print() may largely be used interchangeably
+functionality-wise" according to sd_journal_print(3). This socket
+should be always available except in rare circumstatances, and we
+don't random applications to fail on logging, so let's do what syslog
+did. The alternative of forcing all callers to do error handling for
+this rare case doesn't really have any benefits, since if they can't
+log there isn't much they can do anyway.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1023041
+---
+ src/journal/journal-send.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c
+index d00e26f..d99ff0c 100644
+--- a/src/journal/journal-send.c
++++ b/src/journal/journal-send.c
+@@ -305,6 +305,10 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) {
+ if (k >= 0)
+ return 0;
+
++ /* Fail silently if the journal is not available */
++ if (errno == ENOENT)
++ return 0;
++
+ if (errno != EMSGSIZE && errno != ENOBUFS)
+ return -errno;
+
diff --git a/systemd.spec b/systemd.spec
index 6ebf7fb..759cdad 100644
--- a/systemd.spec
+++ b/systemd.spec
@@ -16,7 +16,7 @@
Name: systemd
Url: http://www.freedesktop.org/wiki/Software/systemd
Version: 208
-Release: 6%{?gitcommit:.git%{gitcommit}}%{?dist}
+Release: 7%{?gitcommit:.git%{gitcommit}}%{?dist}
# For a breakdown of the licensing, see README
License: LGPLv2+ and MIT and GPLv2+
Summary: A System and Service Manager
@@ -97,7 +97,7 @@ Patch057: 0057-libudev-default-log_priority-to-INFO.patch
Patch058: 0058-nspawn-only-pass-in-slice-setting-if-it-is-set.patch
Patch059: 0059-zsh-completion-add-systemd-run.patch
Patch060: 0060-man-explain-NAME-in-systemctl-man-page.patch
-#Patch061: 0061-virt-move-caching-of-virtualization-check-results-in.patch
+Patch061: 0061-virt-move-caching-of-virtualization-check-results-in.patch
Patch062: 0062-systemctl-fix-typo-in-help-text.patch
Patch063: 0063-analyze-plot-place-the-text-on-the-side-with-most-sp.patch
Patch064: 0064-detect_virtualization-returns-NULL-pass-empty-string.patch
@@ -152,6 +152,30 @@ Patch112: 0112-tmpfiles-adjust-excludes-for-the-new-per-service-pri.patch
Patch113: 0113-core-socket-fix-SO_REUSEPORT.patch
Patch114: 0114-localed-match-converted-keymaps-before-legacy.patch
Patch115: 0115-keymap-Add-Toshiba-Satellite-U940.patch
+Patch116: 0116-calendar-support-yearly-and-annually-names-the-same-.patch
+Patch117: 0117-hashmap-be-a-bit-more-conservative-with-pre-allocati.patch
+Patch118: 0118-manager-don-t-do-plymouth-in-a-container.patch
+Patch119: 0119-nspawn-add-new-drop-capability-switch.patch
+Patch120: 0120-valgrind-make-running-PID-1-in-valgrind-useful.patch
+Patch121: 0121-efi-boot-generator-don-t-mount-boot-eagerly.patch
+Patch122: 0122-hwdb-Update-database-of-Bluetooth-company-identifier.patch
+Patch123: 0123-journal-when-appending-to-journal-file-allocate-larg.patch
+Patch124: 0124-journal-make-table-const.patch
+Patch125: 0125-journald-keep-statistics-on-how-of-we-hit-miss-the-m.patch
+Patch126: 0126-journal-optimize-bisection-logic-a-bit-by-caching-th.patch
+Patch127: 0127-journal-fix-iteration-when-we-go-backwards-from-the-.patch
+Patch128: 0128-journal-allow-journal_file_copy_entry-to-work-on-non.patch
+Patch129: 0129-journal-simplify-pre-allocation-logic.patch
+Patch130: 0130-journald-mention-how-long-we-needed-to-flush-to-var-.patch
+Patch131: 0131-automount-log-info-about-triggering-process.patch
+Patch132: 0132-virt-split-detect_vm-into-separate-functions.patch
+Patch133: 0133-hwdb-Update-database-of-Bluetooth-company-identifier.patch
+Patch134: 0134-sysfs-show.c-return-negative-error.patch
+Patch135: 0135-util.c-check-if-return-value-from-ttyname_r-is-0-ins.patch
+Patch136: 0136-docs-remove-unneeded-the-s-in-gudev-docs.patch
+Patch137: 0137-man-explicitly-say-when-multiple-units-can-be-specif.patch
+Patch138: 0138-systemd-treat-reload-failure-as-failure.patch
+Patch139: 0139-journal-fail-silently-in-sd_j_sendv-if-journal-is-un.patch
# kernel-install patch for grubby, drop if grubby is obsolete
Patch1000: kernel-install-grubby.patch
@@ -800,6 +824,13 @@ getent passwd systemd-journal-gateway >/dev/null 2>&1 || useradd -r -l -u 191 -g
%{_datadir}/systemd/gatewayd
%changelog
+* Tue Dec 03 2013 Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl> - 208-7
+- Backport patches (#1023041, #1036845, #1006386?)
+- HWDB update
+- Some small new features: nspawn --drop-capability=, running PID 1 under
+ valgrind, "yearly" and "annually" in calendar specifications
+- Some small documentation and logging updates
+
* Tue Nov 19 2013 Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl> - 208-6
- Bump version to stay ahead of f20
More information about the scm-commits
mailing list