summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@suse.de>2005-07-05 22:40:42 +0200
committerKay Sievers <kay.sievers@suse.de>2005-07-05 22:40:42 +0200
commit25103c4849d3bdee38d22e08c65cd60cf5d5bcc4 (patch)
tree3ad58616f2c8a35ad96075536ebd7a39b5988dfd
parent8bd41f36f793f7fc208ef6beb4b2b84e35a5e728 (diff)
create udevdb files only if somehting interesting happened
Device nodes created with the default rule, without any symlink or option are no longer saved to the udevdb. This saves us ~3 MB RAM for pretty much useless files on tmpfs. Note: HAL needs a fix to handle this correctly. It's already available on the list. Signed-off-by: Kay Sievers <kay.sievers@suse.de>
-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';