From: Kay Sievers Date: Tue, 5 Jul 2005 20:40:42 +0000 (+0200) Subject: create udevdb files only if somehting interesting happened X-Git-Tag: 061~8 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=25103c4849d3bdee38d22e08c65cd60cf5d5bcc4 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 --- diff --git a/udev_db.c b/udev_db.c index 264af79d0..6f10b1e58 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 cf28ff37a..b9a4384ee 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';