forked from pool/systemd
.
OBS-URL: https://build.opensuse.org/package/show/Base:System/systemd?expand=0&rev=815
This commit is contained in:
parent
9b5ac6d35e
commit
d869ff6248
@ -1,497 +1,16 @@
|
||||
This seems to be a SUSE specific patch. Here we add the check for unmaintained
|
||||
disk like devices to be able to flush and maybe shut them down. Also we add the
|
||||
missing sync() system call for the direct halt/reboot systemctl command. Then we
|
||||
use the system halt as gfallback if poweroff fails for both the direct poweroff
|
||||
systemctl command as well as for the systemd-shutdown utility.
|
||||
|
||||
---
|
||||
Makefile.am | 11 +
|
||||
src/core/hdflush.c | 365 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
src/core/hdflush.h | 25 +++
|
||||
src/core/shutdown.c | 12 +
|
||||
src/systemctl/systemctl.c | 25 ++-
|
||||
5 files changed, 429 insertions(+), 9 deletions(-)
|
||||
systemd-209/src/core/shutdown.c | 4 ++++
|
||||
systemd-209/src/systemctl/systemctl.c | 22 +++++++++++++++-------
|
||||
2 files changed, 19 insertions(+), 7 deletions(-)
|
||||
|
||||
--- systemd-209/Makefile.am
|
||||
+++ systemd-209/Makefile.am 2014-01-28 11:06:56.000000000 +0000
|
||||
@@ -1004,7 +1004,9 @@ libsystemd_core_la_SOURCES = \
|
||||
src/core/audit-fd.c \
|
||||
src/core/audit-fd.h \
|
||||
src/core/async.c \
|
||||
- src/core/async.h
|
||||
+ src/core/async.h \
|
||||
+ src/core/hdflush.c \
|
||||
+ src/core/hdflush.h
|
||||
|
||||
if HAVE_KMOD
|
||||
libsystemd_core_la_SOURCES += \
|
||||
@@ -1522,6 +1524,8 @@ systemd_shutdown_SOURCES = \
|
||||
src/core/shutdown.c \
|
||||
src/core/mount-setup.c \
|
||||
src/core/mount-setup.h \
|
||||
+ src/core/hdflush.c \
|
||||
+ src/core/hdflush.h \
|
||||
src/core/killall.h \
|
||||
src/core/killall.c
|
||||
|
||||
@@ -1818,7 +1822,9 @@ systemd_cgroups_agent_LDADD = \
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
systemctl_SOURCES = \
|
||||
- src/systemctl/systemctl.c
|
||||
+ src/systemctl/systemctl.c \
|
||||
+ src/core/hdflush.c \
|
||||
+ src/core/hdflush.h
|
||||
|
||||
systemctl_LDADD = \
|
||||
libsystemd-units.la \
|
||||
@@ -1826,6 +1832,7 @@ systemctl_LDADD = \
|
||||
libsystemd-internal.la \
|
||||
libsystemd-logs.la \
|
||||
libsystemd-journal-internal.la \
|
||||
+ libudev-internal.la \
|
||||
libsystemd-shared.la
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
--- systemd-209/src/core/hdflush.c
|
||||
+++ systemd-209/src/core/hdflush.c 2014-01-28 10:58:56.000000000 +0000
|
||||
@@ -0,0 +1,367 @@
|
||||
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||
+
|
||||
+/***
|
||||
+ This file is part of systemd.
|
||||
+
|
||||
+ Copyright 2014 Werner Fink
|
||||
+
|
||||
+ systemd is free software; you can redistribute it and/or modify it
|
||||
+ under the terms of the GNU Lesser General Public License as published by
|
||||
+ the Free Software Foundation; either version 2.1 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ systemd is distributed in the hope that it will be useful, but
|
||||
+ WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ Lesser General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU Lesser General Public License
|
||||
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
+***/
|
||||
+
|
||||
+/*
|
||||
+ * Find all disks on the system, list out IDE, unmanaged ATA disks, and
|
||||
+ * USB sticks flush the cache of those and optional shut them down.
|
||||
+ */
|
||||
+
|
||||
+#include <libudev.h>
|
||||
+#include <limits.h>
|
||||
+#ifdef LIST_DEBUG
|
||||
+# include <stdio.h>
|
||||
+#endif
|
||||
+#include <stdlib.h>
|
||||
+#include <string.h>
|
||||
+#include <unistd.h>
|
||||
+
|
||||
+#include <sys/types.h>
|
||||
+#include <sys/stat.h>
|
||||
+#include <fcntl.h>
|
||||
+#include <errno.h>
|
||||
+
|
||||
+#include <sys/ioctl.h>
|
||||
+#include <linux/hdreg.h>
|
||||
+#include <linux/fs.h>
|
||||
+#ifdef WORDS_BIGENDIAN
|
||||
+# include <byteswap.h>
|
||||
+#endif
|
||||
+
|
||||
+#include "hdflush.h"
|
||||
+
|
||||
+/* Used in flush_cache_ext(), compare with <linux/hdreg.h> */
|
||||
+#define IDBYTES 512
|
||||
+#define MASK_EXT 0xE000 /* Bit 15 shall be zero, bit 14 shall be one, bit 13 flush cache ext */
|
||||
+#define TEST_EXT 0x6000
|
||||
+
|
||||
+/* Maybe set in list_disks() and used in do_standby_disk() */
|
||||
+#define DISK_IS_IDE 0x00000001
|
||||
+#define DISK_IS_SATA 0x00000002
|
||||
+#define DISK_EXTFLUSH 0x00000004
|
||||
+#define DISK_REMOVABLE 0x00000008
|
||||
+#define DISK_MANAGED 0x00000010
|
||||
+#define DISK_FLUSHONLY 0x00000020
|
||||
+
|
||||
+struct sysfs {
|
||||
+ struct udev *udev;
|
||||
+ struct udev_enumerate *num;
|
||||
+ struct udev_list_entry *item;
|
||||
+ char *devnode;
|
||||
+ size_t size;
|
||||
+};
|
||||
+
|
||||
+static int flush_cache_ext(const struct sysfs *sysfs);
|
||||
+
|
||||
+static struct sysfs * open_sysfs(void)
|
||||
+{
|
||||
+ static struct sysfs sysfs;
|
||||
+ sysfs.udev = udev_new();
|
||||
+ if (!sysfs.udev)
|
||||
+ goto err;
|
||||
+ sysfs.num = udev_enumerate_new(sysfs.udev);
|
||||
+ if (!sysfs.num)
|
||||
+ goto err;
|
||||
+ if (udev_enumerate_add_match_subsystem(sysfs.num, "block") < 0)
|
||||
+ goto err;
|
||||
+ if (udev_enumerate_add_match_sysname(sysfs.num, "sd?") < 0)
|
||||
+ goto err;
|
||||
+ if (udev_enumerate_add_match_sysname(sysfs.num, "hd?") < 0)
|
||||
+ goto err;
|
||||
+ if (udev_enumerate_scan_devices(sysfs.num) < 0)
|
||||
+ goto err;
|
||||
+ sysfs.item = udev_enumerate_get_list_entry(sysfs.num);
|
||||
+ sysfs.devnode = NULL;
|
||||
+ sysfs.size = 0;
|
||||
+ return &sysfs;
|
||||
+err:
|
||||
+ if (sysfs.num)
|
||||
+ udev_unref(sysfs.udev);
|
||||
+ if (sysfs.udev)
|
||||
+ udev_unref(sysfs.udev);
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static void close_sysfs(struct sysfs *sysfs)
|
||||
+{
|
||||
+ if (sysfs->num)
|
||||
+ udev_enumerate_unref(sysfs->num);
|
||||
+ if (sysfs->udev)
|
||||
+ udev_unref(sysfs->udev);
|
||||
+ if (sysfs->devnode)
|
||||
+ free(sysfs->devnode);
|
||||
+ sysfs->devnode = NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static char *list_disks(struct sysfs *sysfs, unsigned int* flags)
|
||||
+{
|
||||
+ struct udev_device *device, *parent;
|
||||
+ struct udev_list_entry *item;
|
||||
+ const char *devnode;
|
||||
+ char path[PATH_MAX];
|
||||
+
|
||||
+ device = NULL;
|
||||
+next:
|
||||
+ if (device)
|
||||
+ udev_device_unref(device);
|
||||
+ if (sysfs->devnode)
|
||||
+ free(sysfs->devnode);
|
||||
+ sysfs->devnode = NULL;
|
||||
+ sysfs->size = 0;
|
||||
+ *flags = 0;
|
||||
+
|
||||
+ if (!sysfs->item)
|
||||
+ goto empty;
|
||||
+ item = sysfs->item;
|
||||
+ sysfs->item = udev_list_entry_get_next(sysfs->item);
|
||||
+
|
||||
+ if (!(device = udev_device_new_from_syspath(sysfs->udev, udev_list_entry_get_name(item))))
|
||||
+ goto out;
|
||||
+ if (!(devnode = udev_device_get_devnode(device)))
|
||||
+ goto out;
|
||||
+ if (!(sysfs->devnode = strdup(devnode)))
|
||||
+ goto out;
|
||||
+
|
||||
+ path[0] = '\0';
|
||||
+ parent = udev_device_get_parent(device);
|
||||
+ if (parent) {
|
||||
+ const char *sysname, *devpath;
|
||||
+ struct udev_device *disk;
|
||||
+ const char *value;
|
||||
+ int ret;
|
||||
+
|
||||
+ sysname = udev_device_get_sysname(parent);
|
||||
+ devpath = udev_device_get_devpath(parent);
|
||||
+
|
||||
+ strcpy(path, "/sys");
|
||||
+ strcat(path, devpath);
|
||||
+ strcat(path, "/scsi_disk/");
|
||||
+ strcat(path, sysname);
|
||||
+
|
||||
+ disk = udev_device_new_from_syspath(sysfs->udev, path);
|
||||
+ if (disk) {
|
||||
+ value = udev_device_get_sysattr_value(disk, "manage_start_stop");
|
||||
+ udev_device_unref(disk);
|
||||
+
|
||||
+ if (value && *value != '0') {
|
||||
+ *flags = DISK_MANAGED;
|
||||
+#ifndef LIST_DEBUG
|
||||
+ goto next; /* Device managed by the kernel */
|
||||
+#endif
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ value = udev_device_get_sysattr_value(device, "size");
|
||||
+ if (value && *value)
|
||||
+ sysfs->size = (size_t)atoll(value);
|
||||
+
|
||||
+ value = udev_device_get_sysattr_value(device, "removable");
|
||||
+ if (value && *value != '0') {
|
||||
+ *flags |= DISK_REMOVABLE;
|
||||
+
|
||||
+ if ((ret = flush_cache_ext(sysfs))) {
|
||||
+ if (ret < 0)
|
||||
+ goto next;
|
||||
+ *flags |= DISK_EXTFLUSH;
|
||||
+ }
|
||||
+ goto out; /* Removable disk like USB stick */
|
||||
+ }
|
||||
+
|
||||
+ value = udev_device_get_sysname(device);
|
||||
+ if (value && *value == 'h') {
|
||||
+ *flags |= DISK_IS_IDE;
|
||||
+
|
||||
+ if ((ret = flush_cache_ext(sysfs))) {
|
||||
+ if (ret < 0)
|
||||
+ goto next;
|
||||
+ *flags |= DISK_EXTFLUSH;
|
||||
+ }
|
||||
+ goto out; /* IDE disk found */
|
||||
+ }
|
||||
+
|
||||
+ value = udev_device_get_sysattr_value(parent, "vendor");
|
||||
+ if (value && strncmp(value, "ATA", 3) == 0) {
|
||||
+ *flags |= (DISK_IS_IDE|DISK_IS_SATA);
|
||||
+
|
||||
+ if ((ret = flush_cache_ext(sysfs))) {
|
||||
+ if (ret < 0)
|
||||
+ goto next;
|
||||
+ *flags |= DISK_EXTFLUSH;
|
||||
+ }
|
||||
+ goto out; /* SATA disk to shutdown */
|
||||
+ }
|
||||
+ goto next;
|
||||
+ }
|
||||
+out:
|
||||
+ udev_device_unref(device);
|
||||
+empty:
|
||||
+ return sysfs->devnode;
|
||||
+}
|
||||
+#ifndef LIST_DEBUG
|
||||
+/*
|
||||
+ * Check IDE/(S)ATA hard disk identity for
|
||||
+ * the FLUSH CACHE EXT bit set.
|
||||
+ */
|
||||
+static int flush_cache_ext(const struct sysfs *sysfs)
|
||||
+{
|
||||
+#ifndef WIN_IDENTIFY
|
||||
+#define WIN_IDENTIFY 0xEC
|
||||
+#endif
|
||||
+ unsigned char args[4+IDBYTES];
|
||||
+ unsigned short *id = (unsigned short*)(&args[4]);
|
||||
+ int fd = -1, ret = 0;
|
||||
+
|
||||
+ if (sysfs->size < (1<<28))
|
||||
+ goto out; /* small disk */
|
||||
+
|
||||
+ if ((fd = open(sysfs->devnode, O_RDONLY|O_NONBLOCK|O_CLOEXEC)) < 0)
|
||||
+ goto out;
|
||||
+
|
||||
+ memset(&args[0], 0, sizeof(args));
|
||||
+ args[0] = WIN_IDENTIFY;
|
||||
+ args[3] = 1;
|
||||
+ if (ioctl(fd, HDIO_DRIVE_CMD, &args))
|
||||
+ goto out;
|
||||
+#ifdef WORDS_BIGENDIAN
|
||||
+# if 0
|
||||
+ {
|
||||
+ const unsigned short *end = id + IDBYTES/2;
|
||||
+ const unsigned short *from = id;
|
||||
+ unsigned short *to = id;
|
||||
+
|
||||
+ while (from < end)
|
||||
+ *to++ = bswap_16(*from++);
|
||||
+ }
|
||||
+# else
|
||||
+ id[83] = bswap_16(id[83]);
|
||||
+# endif
|
||||
+#endif
|
||||
+ if ((id[83] & MASK_EXT) == TEST_EXT)
|
||||
+ ret = 1;
|
||||
+out:
|
||||
+ if (fd >= 0)
|
||||
+ close(fd);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Put an IDE/SCSI/SATA disk in standby mode.
|
||||
+ * Code stolen from hdparm.c
|
||||
+ */
|
||||
+static int do_standby_disk(struct sysfs *sysfs, unsigned int flags)
|
||||
+{
|
||||
+#ifndef WIN_STANDBYNOW1
|
||||
+#define WIN_STANDBYNOW1 0xE0
|
||||
+#endif
|
||||
+#ifndef WIN_STANDBYNOW2
|
||||
+#define WIN_STANDBYNOW2 0x94
|
||||
+#endif
|
||||
+#ifndef WIN_FLUSH_CACHE_EXT
|
||||
+#define WIN_FLUSH_CACHE_EXT 0xEA
|
||||
+#endif
|
||||
+#ifndef WIN_FLUSH_CACHE
|
||||
+#define WIN_FLUSH_CACHE 0xE7
|
||||
+#endif
|
||||
+ unsigned char flush1[4] = {WIN_FLUSH_CACHE_EXT,0,0,0};
|
||||
+ unsigned char flush2[4] = {WIN_FLUSH_CACHE,0,0,0};
|
||||
+ unsigned char stdby1[4] = {WIN_STANDBYNOW1,0,0,0};
|
||||
+ unsigned char stdby2[4] = {WIN_STANDBYNOW2,0,0,0};
|
||||
+ int fd, ret;
|
||||
+
|
||||
+ if ((fd = open(sysfs->devnode, O_RDWR|O_NONBLOCK|O_CLOEXEC)) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ switch (flags & DISK_EXTFLUSH) {
|
||||
+ case DISK_EXTFLUSH:
|
||||
+ if ((ret = ioctl(fd, HDIO_DRIVE_CMD, &flush1)) == 0)
|
||||
+ break;
|
||||
+ /* Extend flush rejected, try standard flush */
|
||||
+ default:
|
||||
+ ret = ioctl(fd, HDIO_DRIVE_CMD, &flush2) &&
|
||||
+ ioctl(fd, BLKFLSBUF);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if ((flags & DISK_FLUSHONLY) == 0x0) {
|
||||
+ ret = ioctl(fd, HDIO_DRIVE_CMD, &stdby1) &&
|
||||
+ ioctl(fd, HDIO_DRIVE_CMD, &stdby2);
|
||||
+ }
|
||||
+
|
||||
+ close(fd);
|
||||
+
|
||||
+ if (ret)
|
||||
+ return -1;
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+#ifdef LIST_DEBUG
|
||||
+int main()
|
||||
+{
|
||||
+ char *disk;
|
||||
+ unsigned int flags;
|
||||
+ struct sysfs *sysfs = open_sysfs();
|
||||
+ if (!sysfs)
|
||||
+ goto err;
|
||||
+ while ((disk = list_disks(sysfs, &flags)))
|
||||
+ fprintf(stdout, "%s\n", sysfs->devnode);
|
||||
+ close_sysfs(sysfs);
|
||||
+err:
|
||||
+ return 0;
|
||||
+}
|
||||
+#else
|
||||
+/*
|
||||
+ * List all disks and put them in standby mode.
|
||||
+ * This has the side-effect of flushing the writecache,
|
||||
+ * which is exactly what we want on poweroff.
|
||||
+ */
|
||||
+void hddown(void)
|
||||
+{
|
||||
+ struct sysfs *sysfs;
|
||||
+ unsigned int flags;
|
||||
+ char *disk;
|
||||
+
|
||||
+ if (!(sysfs = open_sysfs()))
|
||||
+ return;
|
||||
+
|
||||
+ while ((disk = list_disks(sysfs, &flags)))
|
||||
+ do_standby_disk(sysfs, flags);
|
||||
+
|
||||
+ close_sysfs(sysfs);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * List all disks and cause them to flush their buffers.
|
||||
+ */
|
||||
+void hdflush(void)
|
||||
+{
|
||||
+ struct sysfs *sysfs;
|
||||
+ unsigned int flags;
|
||||
+ char *disk;
|
||||
+
|
||||
+ if (!(sysfs = open_sysfs()))
|
||||
+ return;
|
||||
+
|
||||
+ while ((disk = list_disks(sysfs, &flags)))
|
||||
+ do_standby_disk(sysfs, (flags|DISK_FLUSHONLY));
|
||||
+
|
||||
+ close_sysfs(sysfs);
|
||||
+}
|
||||
+#endif
|
||||
--- systemd-209/src/core/hdflush.h
|
||||
+++ systemd-209/src/core/hdflush.h 2014-01-28 11:00:08.000000000 +0000
|
||||
@@ -0,0 +1,25 @@
|
||||
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||
+
|
||||
+#pragma once
|
||||
+
|
||||
+/***
|
||||
+ This file is part of systemd.
|
||||
+
|
||||
+ Copyright 2014 Werner Fink
|
||||
+
|
||||
+ systemd is free software; you can redistribute it and/or modify it
|
||||
+ under the terms of the GNU Lesser General Public License as published by
|
||||
+ the Free Software Foundation; either version 2.1 of the License, or
|
||||
+ (at your option) any later version.
|
||||
+
|
||||
+ systemd is distributed in the hope that it will be useful, but
|
||||
+ WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ Lesser General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU Lesser General Public License
|
||||
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||
+***/
|
||||
+
|
||||
+void hdflush(void);
|
||||
+void hddown(void);
|
||||
--- systemd-209/src/core/shutdown.c
|
||||
+++ systemd-209/src/core/shutdown.c 2014-02-28 11:17:22.000000000 +0000
|
||||
@@ -40,6 +40,7 @@
|
||||
#include "missing.h"
|
||||
#include "log.h"
|
||||
#include "fileio.h"
|
||||
+#include "hdflush.h"
|
||||
#include "umount.h"
|
||||
#include "util.h"
|
||||
#include "mkdir.h"
|
||||
@@ -225,7 +226,8 @@ int main(int argc, char *argv[]) {
|
||||
_cleanup_free_ char *cgroup = NULL;
|
||||
char *arguments[3];
|
||||
unsigned retries;
|
||||
- int cmd, r;
|
||||
+ unsigned cmd;
|
||||
+ int r;
|
||||
|
||||
log_parse_environment();
|
||||
r = parse_argv(argc, argv);
|
||||
@@ -388,8 +390,13 @@ int main(int argc, char *argv[]) {
|
||||
* on reboot(), but the file systems need to be synce'd
|
||||
* explicitly in advance. So let's do this here, but not
|
||||
* needlessly slow down containers. */
|
||||
- if (!in_container)
|
||||
+ if (!in_container) {
|
||||
sync();
|
||||
+ if (cmd == RB_POWER_OFF || cmd == RB_HALT_SYSTEM)
|
||||
+ hddown();
|
||||
+ else
|
||||
+ hdflush();
|
||||
+ }
|
||||
|
||||
switch (cmd) {
|
||||
|
||||
@@ -449,6 +456,10 @@ int main(int argc, char *argv[]) {
|
||||
@@ -449,6 +449,10 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
reboot(cmd);
|
||||
+
|
||||
+ if (cmd == RB_POWER_OFF)
|
||||
+ if (cmd == (int)RB_POWER_OFF)
|
||||
+ reboot(RB_HALT_SYSTEM);
|
||||
+
|
||||
if (errno == EPERM && in_container) {
|
||||
@ -499,15 +18,7 @@ systemctl command as well as for the systemd-shutdown utility.
|
||||
* CAP_SYS_BOOT just exit, this will kill our
|
||||
--- systemd-209/src/systemctl/systemctl.c
|
||||
+++ systemd-209/src/systemctl/systemctl.c 2014-02-28 11:19:35.000000000 +0000
|
||||
@@ -67,6 +67,7 @@
|
||||
#include "logs-show.h"
|
||||
#include "socket-util.h"
|
||||
#include "fileio.h"
|
||||
+#include "hdflush.h"
|
||||
#include "env-util.h"
|
||||
#include "bus-util.h"
|
||||
#include "bus-message.h"
|
||||
@@ -93,6 +94,7 @@ static bool arg_no_pager = false;
|
||||
@@ -93,6 +93,7 @@ static bool arg_no_pager = false;
|
||||
static bool arg_no_wtmp = false;
|
||||
static bool arg_no_wall = false;
|
||||
static bool arg_no_reload = false;
|
||||
@ -515,7 +26,7 @@ systemctl command as well as for the systemd-shutdown utility.
|
||||
static bool arg_show_types = false;
|
||||
static bool arg_ignore_inhibitors = false;
|
||||
static bool arg_dry = false;
|
||||
@@ -5566,6 +5568,7 @@ static int halt_parse_argv(int argc, cha
|
||||
@@ -5578,6 +5579,7 @@ static int halt_parse_argv(int argc, cha
|
||||
{ "reboot", no_argument, NULL, ARG_REBOOT },
|
||||
{ "force", no_argument, NULL, 'f' },
|
||||
{ "wtmp-only", no_argument, NULL, 'w' },
|
||||
@ -523,7 +34,7 @@ systemctl command as well as for the systemd-shutdown utility.
|
||||
{ "no-wtmp", no_argument, NULL, 'd' },
|
||||
{ "no-wall", no_argument, NULL, ARG_NO_WALL },
|
||||
{}
|
||||
@@ -5617,10 +5620,13 @@ static int halt_parse_argv(int argc, cha
|
||||
@@ -5629,10 +5631,13 @@ static int halt_parse_argv(int argc, cha
|
||||
|
||||
case 'i':
|
||||
case 'h':
|
||||
@ -538,25 +49,25 @@ systemctl command as well as for the systemd-shutdown utility.
|
||||
case '?':
|
||||
return -EINVAL;
|
||||
|
||||
@@ -6266,16 +6272,24 @@ static int halt_now(enum action a) {
|
||||
@@ -6274,20 +6279,23 @@ done:
|
||||
|
||||
static int halt_now(enum action a) {
|
||||
|
||||
-/* Make sure C-A-D is handled by the kernel from this
|
||||
+ if (!arg_no_sync)
|
||||
+ sync();
|
||||
+
|
||||
+ /* Make sure C-A-D is handled by the kernel from this
|
||||
* point on... */
|
||||
reboot(RB_ENABLE_CAD);
|
||||
|
||||
- switch (a) {
|
||||
+ if (!arg_no_sync)
|
||||
+ sync();
|
||||
switch (a) {
|
||||
|
||||
- case ACTION_HALT:
|
||||
- log_info("Halting.");
|
||||
- reboot(RB_HALT_SYSTEM);
|
||||
- return -errno;
|
||||
+ if (a == ACTION_POWEROFF || a == ACTION_HALT)
|
||||
+ hddown();
|
||||
+ else
|
||||
+ hdflush();
|
||||
+
|
||||
+ switch (a) {
|
||||
|
||||
-
|
||||
case ACTION_POWEROFF:
|
||||
log_info("Powering off.");
|
||||
reboot(RB_POWER_OFF);
|
||||
|
@ -0,0 +1,60 @@
|
||||
From f6ba8671d83f9fce9a00045d8fa399a1c07ba7fc Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Wed, 5 Nov 2014 08:30:52 -0500
|
||||
Subject: [PATCH] login: rerun vconsole-setup when switching from vgacon to
|
||||
fbcon
|
||||
|
||||
The initialization performed by systemd-vconsole-setup is reset
|
||||
when changing console drivers (say from vgacon to fbcon), so we
|
||||
need to run it in that case.
|
||||
|
||||
See
|
||||
http://lists.freedesktop.org/archives/systemd-devel/2014-October/023919.html
|
||||
http://lists.freedesktop.org/archives/systemd-devel/2014-October/024423.html
|
||||
http://lists.freedesktop.org/archives/systemd-devel/2014-November/024881.html
|
||||
|
||||
This commit adds a udev rule to make systemd-vconsole-setup get run when
|
||||
the fbcon device becomes available.
|
||||
|
||||
(david: moved into new file 90-vconsole.rules instead of 71-seats.rules;
|
||||
build-failures are on me, not on Ray)
|
||||
---
|
||||
Makefile.am | 3 +++
|
||||
src/vconsole/90-vconsole.rules | 11 +++++++++++
|
||||
2 files changed, 14 insertions(+)
|
||||
create mode 100644 src/vconsole/90-vconsole.rules
|
||||
|
||||
diff --git Makefile.am Makefile.am
|
||||
index 3686103..f614b86 100644
|
||||
--- Makefile.am
|
||||
+++ Makefile.am
|
||||
@@ -4439,6 +4439,9 @@ rootlibexec_PROGRAMS += \
|
||||
nodist_systemunit_DATA += \
|
||||
units/systemd-vconsole-setup.service
|
||||
|
||||
+dist_udevrules_DATA += \
|
||||
+ src/vconsole/90-vconsole.rules
|
||||
+
|
||||
SYSINIT_TARGET_WANTS += \
|
||||
systemd-vconsole-setup.service
|
||||
endif
|
||||
diff --git src/vconsole/90-vconsole.rules src/vconsole/90-vconsole.rules
|
||||
new file mode 100644
|
||||
index 0000000..bf6a9ef
|
||||
--- /dev/null
|
||||
+++ src/vconsole/90-vconsole.rules
|
||||
@@ -0,0 +1,11 @@
|
||||
+# This file is part of systemd.
|
||||
+#
|
||||
+# systemd is free software; you can redistribute it and/or modify it
|
||||
+# under the terms of the GNU Lesser General Public License as published by
|
||||
+# the Free Software Foundation; either version 2.1 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+
|
||||
+# Kernel resets vconsole state when changing console drivers so run
|
||||
+# systemd-vconsole-setup when fbcon loads
|
||||
+
|
||||
+ACTION=="add", SUBSYSTEM=="graphics", KERNEL=="fbcon", RUN+="/usr/lib/systemd/systemd-vconsole-setup"
|
||||
--
|
||||
1.7.9.2
|
||||
|
70
0002-shutdown-fix-arguments-to-run-initramfs-shutdown.patch
Normal file
70
0002-shutdown-fix-arguments-to-run-initramfs-shutdown.patch
Normal file
@ -0,0 +1,70 @@
|
||||
Based on 4b5d8d0f22ae61ceb45a25391354ba53b43ee992 Mon Sep 17 00:00:00 2001
|
||||
From: Michal Schmidt <mschmidt@redhat.com>
|
||||
Date: Thu, 6 Nov 2014 22:24:13 +0100
|
||||
Subject: [PATCH] shutdown: fix arguments to /run/initramfs/shutdown
|
||||
|
||||
Our initrd interface specifies that the verb is in argv[1].
|
||||
This is where systemd passes it to systemd-shutdown, but getopt
|
||||
permutes argv[]. This confuses dracut's shutdown script:
|
||||
Shutdown called with argument '--log-level'. Rebooting!
|
||||
|
||||
getopt can be convinced to not permute argv[] by having '-' as the first
|
||||
character of optstring. Let's use it. This requires changing the way
|
||||
non-option arguments (in our case, the verb) are processed.
|
||||
|
||||
This fixes a bug where the system would reboot instead of powering off.
|
||||
---
|
||||
src/core/shutdown.c | 24 +++++++++++-------------
|
||||
1 file changed, 11 insertions(+), 13 deletions(-)
|
||||
|
||||
--- src/core/shutdown.c
|
||||
+++ src/core/shutdown.c 2014-11-10 14:14:20.869519112 +0000
|
||||
@@ -75,9 +75,9 @@ static int parse_argv(int argc, char *ar
|
||||
assert(argc >= 1);
|
||||
assert(argv);
|
||||
|
||||
- opterr = 0;
|
||||
-
|
||||
- while ((c = getopt_long(argc, argv, ":", options, NULL)) >= 0)
|
||||
+ /* "-" prevents getopt from permuting argv[] and moving the verb away
|
||||
+ * from argv[1]. Our interface to initrd promises it'll be there. */
|
||||
+ while ((c = getopt_long(argc, argv, "-", options, NULL)) >= 0)
|
||||
switch (c) {
|
||||
|
||||
case ARG_LOG_LEVEL:
|
||||
@@ -115,27 +115,25 @@ static int parse_argv(int argc, char *ar
|
||||
|
||||
break;
|
||||
|
||||
- case '?':
|
||||
- log_error("Unknown option %s.", argv[optind-1]);
|
||||
- return -EINVAL;
|
||||
+ case '\001':
|
||||
+ if (!arg_verb)
|
||||
+ arg_verb = optarg;
|
||||
+ else
|
||||
+ log_error("Excess arguments, ignoring");
|
||||
+ break;
|
||||
|
||||
- case ':':
|
||||
- log_error("Missing argument to %s.", argv[optind-1]);
|
||||
+ case '?':
|
||||
return -EINVAL;
|
||||
|
||||
default:
|
||||
assert_not_reached("Unhandled option code.");
|
||||
}
|
||||
|
||||
- if (optind >= argc) {
|
||||
+ if (!arg_verb) {
|
||||
log_error("Verb argument missing.");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- arg_verb = argv[optind];
|
||||
-
|
||||
- if (optind + 1 < argc)
|
||||
- log_error("Excess arguments, ignoring");
|
||||
return 0;
|
||||
}
|
||||
|
@ -0,0 +1,29 @@
|
||||
Based on 144b3d9e093dd9310cd9590bec039dc43a7e2ad6 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Fri, 7 Nov 2014 16:34:00 +0100
|
||||
Subject: [PATCH] utf8: when looking at the next unichar, honour the size
|
||||
parameter, in utf8_is_printable_newline()
|
||||
|
||||
---
|
||||
src/shared/utf8.c | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
--- src/shared/utf8.c
|
||||
+++ src/shared/utf8.c 2014-11-10 14:20:28.094539264 +0000
|
||||
@@ -143,9 +143,14 @@ bool utf8_is_printable_newline(const cha
|
||||
|
||||
for (p = (const uint8_t*) str; length;) {
|
||||
int encoded_len = utf8_encoded_valid_unichar((const char *)p);
|
||||
- int val = utf8_encoded_to_unichar((const char*)p);
|
||||
+ int val;
|
||||
|
||||
- if (encoded_len < 0 || val < 0 || is_unicode_control(val) ||
|
||||
+ if (encoded_len < 0 ||
|
||||
+ (size_t) encoded_len > length)
|
||||
+ return false;
|
||||
+
|
||||
+ val = utf8_encoded_to_unichar((const char*)p);
|
||||
+ if (val < 0 || is_unicode_control(val) ||
|
||||
(!newline && val == '\n'))
|
||||
return false;
|
||||
|
@ -44,7 +44,7 @@ Index: systemd-210/src/fstab-generator/fstab-generator.c
|
||||
+ }
|
||||
+
|
||||
+ if (strcmp((what + 12), name) == 0) {
|
||||
+ if (strstr(options, "noauto"))
|
||||
+ if (options && strstr(options, "noauto"))
|
||||
+ return 0;
|
||||
+
|
||||
+ return 1;
|
||||
|
@ -1,3 +1,11 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu Nov 13 12:59:05 UTC 2014 - werner@suse.de
|
||||
|
||||
- Change patch 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch
|
||||
to skip hdflush as well as hddown but only use halt as fallback
|
||||
for poweroff as well as synch in systemctl before any reboot command
|
||||
(compare with commit 4a3ad39957399c4a30fc472a804e72907ecaa4f9)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Nov 13 09:54:35 UTC 2014 - rmilasan@suse.com
|
||||
|
||||
@ -5,12 +13,25 @@ Thu Nov 13 09:54:35 UTC 2014 - rmilasan@suse.com
|
||||
'rotational' equals 0, usually SSDs (bnc#904517).
|
||||
Add 1095-set-ssd-disk-to-use-deadline-scheduler.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Nov 13 07:50:49 UTC 2014 - thomas.blume@suse.com
|
||||
|
||||
- fix systemd-fstab-generator crypttab parsing (bnc#903963)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Nov 11 19:10:35 UTC 2014 - gber@opensuse.org
|
||||
|
||||
- Add pm-utils-hooks-compat.sh in order to run pm-utils sleep hooks
|
||||
from systemd (boo#904828)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Nov 10 14:23:00 UTC 2014 - werner@suse.de
|
||||
|
||||
- Add upstream patches
|
||||
0001-login-rerun-vconsole-setup-when-switching-from-vgaco.patch
|
||||
0002-shutdown-fix-arguments-to-run-initramfs-shutdown.patch
|
||||
0003-utf8-when-looking-at-the-next-unichar-honour-the-siz.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Nov 10 12:39:35 UTC 2014 - werner@suse.de
|
||||
|
||||
|
@ -1029,6 +1029,12 @@ Patch498: 0008-journald-fix-memory-leak-on-error-path.patch
|
||||
Patch499: 0009-units-make-systemd-journald.service-Type-notify.patch
|
||||
# PATCH-FIX-UPSTREAM added at 2014/11/07
|
||||
Patch500: 0010-hwdb-Update-database-of-Bluetooth-company-identifier.patch
|
||||
# PATCH-FIX-UPSTREAM added at 2014/11/10
|
||||
Patch501: 0001-login-rerun-vconsole-setup-when-switching-from-vgaco.patch
|
||||
# PATCH-FIX-UPSTREAM added at 2014/11/10
|
||||
Patch502: 0002-shutdown-fix-arguments-to-run-initramfs-shutdown.patch
|
||||
# PATCH-FIX-UPSTREAM added at 2014/11/10
|
||||
Patch503: 0003-utf8-when-looking-at-the-next-unichar-honour-the-siz.patch
|
||||
|
||||
# UDEV PATCHES
|
||||
# ============
|
||||
@ -1888,6 +1894,9 @@ cp %{SOURCE7} m4/
|
||||
%patch498 -p0
|
||||
%patch499 -p0
|
||||
%patch500 -p0
|
||||
%patch501 -p0
|
||||
%patch502 -p0
|
||||
%patch503 -p0
|
||||
|
||||
# udev patches
|
||||
%patch1001 -p1
|
||||
|
@ -1,3 +1,11 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu Nov 13 12:59:05 UTC 2014 - werner@suse.de
|
||||
|
||||
- Change patch 0001-add-hdflush-for-reboot-or-hddown-for-poweroff.patch
|
||||
to skip hdflush as well as hddown but only use halt as fallback
|
||||
for poweroff as well as synch in systemctl before any reboot command
|
||||
(compare with commit 4a3ad39957399c4a30fc472a804e72907ecaa4f9)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Nov 13 09:54:35 UTC 2014 - rmilasan@suse.com
|
||||
|
||||
@ -5,12 +13,25 @@ Thu Nov 13 09:54:35 UTC 2014 - rmilasan@suse.com
|
||||
'rotational' equals 0, usually SSDs (bnc#904517).
|
||||
Add 1095-set-ssd-disk-to-use-deadline-scheduler.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Nov 13 07:50:49 UTC 2014 - thomas.blume@suse.com
|
||||
|
||||
- fix systemd-fstab-generator crypttab parsing (bnc#903963)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Nov 11 19:10:35 UTC 2014 - gber@opensuse.org
|
||||
|
||||
- Add pm-utils-hooks-compat.sh in order to run pm-utils sleep hooks
|
||||
from systemd (boo#904828)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Nov 10 14:23:00 UTC 2014 - werner@suse.de
|
||||
|
||||
- Add upstream patches
|
||||
0001-login-rerun-vconsole-setup-when-switching-from-vgaco.patch
|
||||
0002-shutdown-fix-arguments-to-run-initramfs-shutdown.patch
|
||||
0003-utf8-when-looking-at-the-next-unichar-honour-the-siz.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Nov 10 12:39:35 UTC 2014 - werner@suse.de
|
||||
|
||||
|
@ -1024,6 +1024,12 @@ Patch498: 0008-journald-fix-memory-leak-on-error-path.patch
|
||||
Patch499: 0009-units-make-systemd-journald.service-Type-notify.patch
|
||||
# PATCH-FIX-UPSTREAM added at 2014/11/07
|
||||
Patch500: 0010-hwdb-Update-database-of-Bluetooth-company-identifier.patch
|
||||
# PATCH-FIX-UPSTREAM added at 2014/11/10
|
||||
Patch501: 0001-login-rerun-vconsole-setup-when-switching-from-vgaco.patch
|
||||
# PATCH-FIX-UPSTREAM added at 2014/11/10
|
||||
Patch502: 0002-shutdown-fix-arguments-to-run-initramfs-shutdown.patch
|
||||
# PATCH-FIX-UPSTREAM added at 2014/11/10
|
||||
Patch503: 0003-utf8-when-looking-at-the-next-unichar-honour-the-siz.patch
|
||||
|
||||
# UDEV PATCHES
|
||||
# ============
|
||||
@ -1883,6 +1889,9 @@ cp %{SOURCE7} m4/
|
||||
%patch498 -p0
|
||||
%patch499 -p0
|
||||
%patch500 -p0
|
||||
%patch501 -p0
|
||||
%patch502 -p0
|
||||
%patch503 -p0
|
||||
|
||||
# udev patches
|
||||
%patch1001 -p1
|
||||
|
Loading…
Reference in New Issue
Block a user