summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--udev_db.c19
-rw-r--r--udev_remove.c21
2 files changed, 25 insertions, 15 deletions
diff --git a/udev_db.c b/udev_db.c
index 264af79d06..6f10b1e58d 100644
--- a/udev_db.c
+++ b/udev_db.c
@@ -68,10 +68,18 @@ int udev_db_add_device(struct udevice *udev)
if (udev->test_run)
return 0;
- get_db_filename(udev->devpath, filename, sizeof(filename));
+ /* don't write anything if udev created only the node with the
+ * kernel name without any interesting data to remember
+ */
+ if (strcmp(udev->name, udev->kernel_name) == 0 &&
+ list_empty(&udev->symlink_list) && list_empty(&udev->env_list) &&
+ !udev->partitions && !udev->ignore_remove) {
+ dbg("nothing interesting to store in udevdb, skip");
+ goto exit;
+ }
+ get_db_filename(udev->devpath, filename, sizeof(filename));
create_path(filename);
-
f = fopen(filename, "w");
if (f == NULL) {
err("unable to create db file '%s'", filename);
@@ -84,12 +92,15 @@ int udev_db_add_device(struct udevice *udev)
list_for_each_entry(name_loop, &udev->symlink_list, node)
fprintf(f, "S:%s\n", name_loop->name);
fprintf(f, "M:%u:%u\n", major(udev->devt), minor(udev->devt));
- fprintf(f, "A:%u\n", udev->partitions);
- fprintf(f, "R:%u\n", udev->ignore_remove);
+ if (udev->partitions)
+ fprintf(f, "A:%u\n", udev->partitions);
+ if (udev->ignore_remove)
+ fprintf(f, "R:%u\n", udev->ignore_remove);
list_for_each_entry(name_loop, &udev->env_list, node)
fprintf(f, "E:%s\n", name_loop->name);
fclose(f);
+exit:
return 0;
}
diff --git a/udev_remove.c b/udev_remove.c
index cf28ff37a9..b9a4384ee0 100644
--- a/udev_remove.c
+++ b/udev_remove.c
@@ -143,18 +143,17 @@ int udev_remove_device(struct udevice *udev)
if (udev->type != DEV_BLOCK && udev->type != DEV_CLASS)
return 0;
- /* remove node only if we can find it in our database */
- if (udev_db_get_device(udev, udev->devpath) != 0) {
- dbg("'%s' not found in database, ignore event", udev->name);
- return -1;
- }
- if (udev->ignore_remove) {
- dbg("remove event for '%s' requested to be ignored by rule", udev->name);
- return 0;
+ if (udev_db_get_device(udev, udev->devpath) == 0) {
+ if (udev->ignore_remove) {
+ dbg("remove event for '%s' requested to be ignored by rule", udev->name);
+ return 0;
+ }
+ dbg("remove name='%s'", udev->name);
+ udev_db_delete_device(udev);
+ } else {
+ dbg("'%s' not found in database, using kernel name '%s'", udev->devpath, udev->kernel_name);
+ strlcpy(udev->name, udev->kernel_name, sizeof(udev->name));
}
- dbg("remove name='%s'", udev->name);
- udev_db_delete_device(udev);
-
/* use full path to the environment */
snprintf(udev->devname, sizeof(udev->devname), "%s/%s", udev_root, udev->name);
udev->devname[sizeof(udev->devname)-1] = '\0';