udev: ignore error caused by device disconnection
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 12 Nov 2019 05:58:25 +0000 (14:58 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 12 Nov 2019 05:58:53 +0000 (14:58 +0900)
During an add or change event, the device may be disconnected.

Fixes #13976.

src/udev/udev-node.c

index 2d72570..a34b8d6 100644 (file)
@@ -296,8 +296,11 @@ static int node_permissions_apply(sd_device *dev, bool apply_mac,
         else
                 mode |= S_IFCHR;
 
-        if (lstat(devnode, &stats) < 0)
+        if (lstat(devnode, &stats) < 0) {
+                if (errno == ENOENT)
+                        return 0; /* this is necessarily racey, so ignore missing the device */
                 return log_device_debug_errno(dev, errno, "cannot stat() node %s: %m", devnode);
+        }
 
         if ((mode != MODE_INVALID && (stats.st_mode & S_IFMT) != (mode & S_IFMT)) || stats.st_rdev != devnum)
                 return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EEXIST),
@@ -322,11 +325,13 @@ static int node_permissions_apply(sd_device *dev, bool apply_mac,
 
                         r = chmod_and_chown(devnode, mode, uid, gid);
                         if (r < 0)
-                                log_device_warning_errno(dev, r, "Failed to set owner/mode of %s to uid=" UID_FMT ", gid=" GID_FMT ", mode=%#o: %m",
-                                                         devnode,
-                                                         uid_is_valid(uid) ? uid : stats.st_uid,
-                                                         gid_is_valid(gid) ? gid : stats.st_gid,
-                                                         mode != MODE_INVALID ? mode & 0777 : stats.st_mode & 0777);
+                                log_device_full(dev, r == -ENOENT ? LOG_DEBUG : LOG_ERR, r,
+                                                "Failed to set owner/mode of %s to uid=" UID_FMT
+                                                ", gid=" GID_FMT ", mode=%#o: %m",
+                                                devnode,
+                                                uid_is_valid(uid) ? uid : stats.st_uid,
+                                                gid_is_valid(gid) ? gid : stats.st_gid,
+                                                mode != MODE_INVALID ? mode & 0777 : stats.st_mode & 0777);
                 } else
                         log_device_debug(dev, "Preserve permissions of %s, uid=" UID_FMT ", gid=" GID_FMT ", mode=%#o",
                                          devnode,
@@ -343,7 +348,8 @@ static int node_permissions_apply(sd_device *dev, bool apply_mac,
 
                                 q = mac_selinux_apply(devnode, label);
                                 if (q < 0)
-                                        log_device_error_errno(dev, q, "SECLABEL: failed to set SELinux label '%s': %m", label);
+                                        log_device_full(dev, q == -ENOENT ? LOG_DEBUG : LOG_ERR, q,
+                                                        "SECLABEL: failed to set SELinux label '%s': %m", label);
                                 else
                                         log_device_debug(dev, "SECLABEL: set SELinux label '%s'", label);
 
@@ -352,7 +358,8 @@ static int node_permissions_apply(sd_device *dev, bool apply_mac,
 
                                 q = mac_smack_apply(devnode, SMACK_ATTR_ACCESS, label);
                                 if (q < 0)
-                                        log_device_error_errno(dev, q, "SECLABEL: failed to set SMACK label '%s': %m", label);
+                                        log_device_full(dev, q == -ENOENT ? LOG_DEBUG : LOG_ERR, q,
+                                                        "SECLABEL: failed to set SMACK label '%s': %m", label);
                                 else
                                         log_device_debug(dev, "SECLABEL: set SMACK label '%s'", label);