!20 修复systemd读取quota_nld生成的PID文件概率性失败的问题

From: @handsome_brother 
Reviewed-by: @liuzhiqiang26 
Signed-off-by: @liuzhiqiang26
This commit is contained in:
openeuler-ci-bot 2022-12-06 09:05:58 +00:00 committed by Gitee
commit 35f9c43662
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
3 changed files with 153 additions and 107 deletions

View File

@ -0,0 +1,34 @@
From 25f16b1de313ce0d411f754572f94f051bfbe3c8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
Date: Tue, 16 Mar 2021 17:28:15 +0100
Subject: [PATCH] quota_nld: Initialize sa_mask when registering PID file
removal
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
term_action.sa_mask is an automatic variable and and thus unitialized.
This patch empties the signal mask.
Signed-off-by: Petr Písař <ppisar@redhat.com>
Signed-off-by: Jan Kara <jack@suse.cz>
---
quota_nld.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/quota_nld.c b/quota_nld.c
index 72d99a9..09c4775 100644
--- a/quota_nld.c
+++ b/quota_nld.c
@@ -466,7 +466,7 @@ static void use_pid_file(void)
term_action.sa_handler = remove_pid;
term_action.sa_flags = 0;
- if (sigaction(SIGTERM, &term_action, NULL))
+ if (sigemptyset(&term_action.sa_mask) || sigaction(SIGTERM, &term_action, NULL))
errstr(_("Could not register PID file removal on SIGTERM.\n"));
if (store_pid())
errstr(_("Could not store my PID %jd.\n"), (intmax_t )getpid());
--
1.8.3.1

View File

@ -1,6 +1,6 @@
From 09b60c7787dfd31c17bfc2c2560bc561b141c207 Mon Sep 17 00:00:00 2001
From: lihaoxiang <lihaoxiang9@huawei.com>
Date: Thu, 1 Dec 2022 09:32:09 +0800
From 06b93e5c1caf5d36d51132cb85c11a96cbdae023 Mon Sep 17 00:00:00 2001
From: "lihaoxiang (F)" <lihaoxiang9@huawei.com>
Date: Thu, 1 Dec 2022 12:10:49 +0800
Subject: [PATCH] quota-nld: fix open PID file failed when systemd read it
Running quota_nld by systemd might cause the problem that systemd
@ -14,13 +14,16 @@ In this situation, we move the procedure of creating PID file into the
parent process to ensure the PID file must existed when quota_nld exit.
After that, the above problem would never occur again.
[JK: Fixed up SIGTERM handling and format strings]
Signed-off-by: lihaoxiang <lihaoxiang9@huawei.com>
Signed-off-by: Jan Kara <jack@suse.cz>
---
quota_nld.c | 43 +++++++++++++++++++++++++++++++++----------
1 file changed, 33 insertions(+), 10 deletions(-)
quota_nld.c | 44 ++++++++++++++++++++++++++++++++++----------
1 file changed, 34 insertions(+), 10 deletions(-)
diff --git a/quota_nld.c b/quota_nld.c
index 72d99a9..ae90bd0 100644
index 09c4775..82e60c2 100644
--- a/quota_nld.c
+++ b/quota_nld.c
@@ -413,7 +413,7 @@ static char *build_pid_file_name(void)
@ -37,7 +40,7 @@ index 72d99a9..ae90bd0 100644
return -1;
}
- if (fprintf(pid_file, "%jd\n", (intmax_t)getpid()) < 0) {
+ if (fprintf(pid_file, "%jd\n", pid) < 0) {
+ if (fprintf(pid_file, "%d\n", (int)pid) < 0) {
errstr(_("Could not write daemon's PID into '%s'.\n"),
pid_name);
fclose(pid_file);
@ -46,49 +49,50 @@ index 72d99a9..ae90bd0 100644
/* Store daemon's PID into file and register its removal on SIGTERM */
-static void use_pid_file(void)
+static void use_pid_file(pid_t pid)
+static void setup_sigterm_handler(void)
{
struct sigaction term_action;
@@ -468,8 +468,35 @@ static void use_pid_file(void)
@@ -468,8 +468,36 @@ static void use_pid_file(void)
term_action.sa_flags = 0;
if (sigaction(SIGTERM, &term_action, NULL))
if (sigemptyset(&term_action.sa_mask) || sigaction(SIGTERM, &term_action, NULL))
errstr(_("Could not register PID file removal on SIGTERM.\n"));
- if (store_pid())
- errstr(_("Could not store my PID %jd.\n"), (intmax_t )getpid());
+ if (store_pid(pid))
+ errstr(_("Could not store my PID %jd.\n"), pid);
+}
+
+static void fork_daemon()
+static void fork_daemon(void)
+{
+ pid_t pid = fork();
+ if (pid < 0) {
+ errstr(_("Failed to daemonize: fork error with %s\n"), strerror(errno));
+ errstr(_("Failed to daemonize: fork: %s\n"), strerror(errno));
+ exit(1);
+ } else if (pid != 0) {
+ use_pid_file(pid);
+ if (store_pid(pid)) {
+ errstr(_("Could not store my PID %d.\n"), (int)pid);
+ kill(pid, SIGKILL);
+ }
+ exit(0);
+ }
+
+ if (setsid() == -1) {
+ errstr(_("Failed to daemonize: setsid error with %s\n"), strerror(errno));
+ setup_sigterm_handler();
+ if (setsid() < 0) {
+ errstr(_("Failed to daemonize: setsid: %s\n"), strerror(errno));
+ exit(1);
+ }
+ if (chdir("/"))
+ if (chdir("/") < 0)
+ errstr(_("Failed to chdir in daemonize\n"));
+ int fd = open("/dev/null", O_RDWR, 0);
+ if (fd >= 0) {
+ (void)dup2(fd, STDIN_FILENO);
+ (void)dup2(fd, STDOUT_FILENO);
+ (void)dup2(fd, STDERR_FILENO);
+
+ (void)close(fd);
+ dup2(fd, STDIN_FILENO);
+ dup2(fd, STDOUT_FILENO);
+ dup2(fd, STDERR_FILENO);
+ close(fd);
+ }
}
int main(int argc, char **argv)
@@ -485,11 +512,7 @@ int main(int argc, char **argv)
@@ -485,11 +513,7 @@ int main(int argc, char **argv)
dhandle = init_dbus();
if (!(flags & FL_NODAEMON)) {
use_syslog();
@ -102,4 +106,5 @@ index 72d99a9..ae90bd0 100644
run(nsock);
return 0;
--
2.37.0.windows.1
1.8.3.1

View File

@ -1,7 +1,7 @@
Name: quota
Version: 4.06
Epoch: 1
Release: 6
Release: 7
Summary: Linux Diskquota system as part of the Linux kernel
License: BSD and GPLv2 and GPLv2+ and LGPLv2+
URL: http://sourceforge.net/projects/linuxquota/
@ -16,7 +16,8 @@ Patch0: 0000-Limit-number-of-comparison-characters-to-4.patch
Patch1: 0001-Limit-maximum-of-RPC-port.patch
Patch2: 0002-quotaio_xfs-Warn-when-large-kernel-timestamps-cannot.patch
Patch3: 0003-quota-Add-sw64-architecture.patch
Patch4: 0004-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch
Patch4: 0004-quota_nld-Initialize-sa_mask-when-registering-PID-fi.patch
Patch5: 0005-quota-nld-fix-open-PID-file-failed-when-systemd-read.patch
BuildRequires: autoconf, automake, coreutils, rpcgen, systemd, gcc
BuildRequires: e2fsprogs-devel, gettext-devel, openldap-devel
@ -125,6 +126,12 @@ make check
%{_mandir}/man*/*
%changelog
* Tue Dec 6 2022 lihaoxiang <lihaoxiang9@huawei.com> - 1:4.06-7
- Type:bugfix
- ID:NA
- SUG:NA
- DESC:rebase upstream patch about fix systemd read PID file failed
* Thu Dec 1 2022 lihaoxiang <lihaoxiang9@huawei.com> - 1:4.06-6
- Type:bugfix
- ID:NA