aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-core/runit/runit/0002-support-etc-runit-nosync-file-to-make-sync-on-shutdow.diff
blob: 91f9e947e197b41acd57f128e1f17f193d2fa53f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
From aed8774b9aa813cbb3e8b732f6f7ae132f86c82b Mon Sep 17 00:00:00 2001
From: Andras Korn <korn-debbugs@elan.rulez.org>
Date: Thu, 6 Dec 2012 16:57:06 +0100
Subject: [PATCH] support /etc/runit/nosync file to make sync on
 shutdown/reboot optional

https://bugs.debian.org/695281
---
 runit-2.1.2/doc/runit.8.html |  2 ++
 runit-2.1.2/man/runit.8      |  5 +++++
 runit-2.1.2/src/runit.c      | 15 ++++++++++-----
 runit-2.1.2/src/runit.h      |  1 +
 4 files changed, 18 insertions(+), 5 deletions(-)

--- a/runit-2.1.2/doc/runit.8.html
+++ b/runit-2.1.2/doc/runit.8.html
@@ -34,6 +34,8 @@ stage 2 if it is running, and runs <i>/e
 and possibly halt or reboot the system are done here. If stage 3 returns,
 <b>runit</b> checks if the file <i>/etc/runit/reboot</i> exists and has the execute by
 owner permission set. If so, the system is rebooted, it&rsquo;s halted otherwise.
+If <i>/etc/runit/nosync</i> exists, <b>runit</b> doesn&rsquo;t invoke
+sync(). This is useful in vservers.
 
 <h2><a name='sect6'>Ctrl-alt-del</a></h2>
 If <b>runit</b> receives the ctrl-alt-del keyboard request and the file
--- a/runit-2.1.2/man/runit.8
+++ b/runit-2.1.2/man/runit.8
@@ -48,6 +48,11 @@ checks if the file
 .I /etc/runit/reboot
 exists and has the execute by owner permission set.
 If so, the system is rebooted, it's halted otherwise.
+If
+.I /etc/runit/nosync
+exists,
+.B runit
+doesn't invoke sync(). This is useful in vservers.
 .SH CTRL-ALT-DEL
 If
 .B runit
--- a/runit-2.1.2/src/runit.c
+++ b/runit-2.1.2/src/runit.c
@@ -41,6 +41,11 @@ void sig_int_handler (void) {
 }
 void sig_child_handler (void) { write(selfpipe[1], "", 1); }
 
+void sync_if_needed() {
+  struct stat s;
+  if (stat(NOSYNC, &s) == -1) sync();
+}
+
 int main (int argc, const char * const *argv, char * const *envp) {
   const char * prog[2];
   int pid, pid2;
@@ -305,28 +310,28 @@ int main (int argc, const char * const *
   case -1:
   if ((stat(REBOOT, &s) != -1) && (s.st_mode & S_IXUSR)) {
     strerr_warn2(INFO, "system reboot.", 0);
-    sync();
+    sync_if_needed();
     reboot_system(RB_AUTOBOOT);
   }
   else {
 #ifdef RB_POWER_OFF
     strerr_warn2(INFO, "power off...", 0);
-    sync();
+    sync_if_needed();
     reboot_system(RB_POWER_OFF);
     sleep(2);
 #endif
 #ifdef RB_HALT_SYSTEM
     strerr_warn2(INFO, "system halt.", 0);
-    sync();
+    sync_if_needed();
     reboot_system(RB_HALT_SYSTEM);
 #else
 #ifdef RB_HALT
     strerr_warn2(INFO, "system halt.", 0);
-    sync();
+    sync_if_needed();
     reboot_system(RB_HALT);
 #else
     strerr_warn2(INFO, "system reboot.", 0);
-    sync();
+    sync_if_needed();
     reboot_system(RB_AUTOBOOT);
 #endif
 #endif
--- a/runit-2.1.2/src/runit.h
+++ b/runit-2.1.2/src/runit.h
@@ -1,4 +1,5 @@
 #define RUNIT "/sbin/runit"
 #define STOPIT "/etc/runit/stopit"
 #define REBOOT "/etc/runit/reboot"
+#define NOSYNC "/run/runit.nosync"
 #define CTRLALTDEL "/etc/runit/ctrlaltdel"