|
|
4295f9 |
From 735971d9bffeccc0c17311a29909bdf5d693f806 Mon Sep 17 00:00:00 2001
|
|
|
4295f9 |
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
|
|
4295f9 |
Date: Sun, 12 Sep 2021 16:14:27 +0900
|
|
|
4295f9 |
Subject: [PATCH] udev-node: do not ignore unexpected errors on removing
|
|
|
4295f9 |
symlink in stack directory
|
|
|
4295f9 |
|
|
|
4295f9 |
Only acceptable error here is -ENOENT.
|
|
|
4295f9 |
|
|
|
4295f9 |
(cherry picked from commit 0706cdf4ec92d6bd40391da0e81a30d9bf851663)
|
|
|
4295f9 |
|
|
|
4295f9 |
Related: #1977994
|
|
|
4295f9 |
---
|
|
|
4295f9 |
src/udev/udev-node.c | 23 ++++++++++++++---------
|
|
|
4295f9 |
1 file changed, 14 insertions(+), 9 deletions(-)
|
|
|
4295f9 |
|
|
|
4295f9 |
diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c
|
|
|
4295f9 |
index 61cb9a449b..e1fb387cb9 100644
|
|
|
4295f9 |
--- a/src/udev/udev-node.c
|
|
|
4295f9 |
+++ b/src/udev/udev-node.c
|
|
|
4295f9 |
@@ -334,25 +334,30 @@ static int update_stack_directory(sd_device *dev, const char *dirname, bool add)
|
|
|
4295f9 |
return log_oom_debug();
|
|
|
4295f9 |
|
|
|
4295f9 |
if (!add) {
|
|
|
4295f9 |
- bool unlink_failed = false;
|
|
|
4295f9 |
+ int unlink_error = 0, stat_error = 0;
|
|
|
4295f9 |
|
|
|
4295f9 |
if (stat(dirname, &st) < 0) {
|
|
|
4295f9 |
if (errno == ENOENT)
|
|
|
4295f9 |
return 0; /* The stack directory is already removed. That's OK. */
|
|
|
4295f9 |
- log_device_debug_errno(dev, errno, "Failed to stat %s, ignoring: %m", dirname);
|
|
|
4295f9 |
+ stat_error = -errno;
|
|
|
4295f9 |
}
|
|
|
4295f9 |
|
|
|
4295f9 |
- if (unlink(filename) < 0) {
|
|
|
4295f9 |
- unlink_failed = true;
|
|
|
4295f9 |
- if (errno != ENOENT)
|
|
|
4295f9 |
- log_device_debug_errno(dev, errno, "Failed to remove %s, ignoring: %m", filename);
|
|
|
4295f9 |
- }
|
|
|
4295f9 |
+ if (unlink(filename) < 0)
|
|
|
4295f9 |
+ unlink_error = -errno;
|
|
|
4295f9 |
|
|
|
4295f9 |
if (rmdir(dirname) >= 0 || errno == ENOENT)
|
|
|
4295f9 |
return 0;
|
|
|
4295f9 |
|
|
|
4295f9 |
- if (unlink_failed)
|
|
|
4295f9 |
- return 0; /* If we failed to remove the symlink, there is almost nothing we can do. */
|
|
|
4295f9 |
+ if (unlink_error < 0) {
|
|
|
4295f9 |
+ if (unlink_error == -ENOENT)
|
|
|
4295f9 |
+ return 0;
|
|
|
4295f9 |
+
|
|
|
4295f9 |
+ /* If we failed to remove the symlink, then there is almost nothing we can do. */
|
|
|
4295f9 |
+ return log_device_debug_errno(dev, unlink_error, "Failed to remove %s: %m", filename);
|
|
|
4295f9 |
+ }
|
|
|
4295f9 |
+
|
|
|
4295f9 |
+ if (stat_error < 0)
|
|
|
4295f9 |
+ return log_device_debug_errno(dev, stat_error, "Failed to stat %s: %m", dirname);
|
|
|
4295f9 |
|
|
|
4295f9 |
/* The symlink was removed. Check if the timestamp of directory is changed. */
|
|
|
4295f9 |
r = update_timestamp(dev, dirname, &st);
|