summaryrefslogtreecommitdiff
path: root/source/l/hal/patches/ignore_dupe_add_events.diff
blob: 0056d8f9642ddef491990cabb3ab689d1dc32baa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Author: Danny Kukawka <danny.kukawka@web.de>
Date:   Wed Mar 18 17:30:53 2009 +0100

    ignore ADD events if there is already a device with same sysfs_path

    Ignore ADD events if there is already a device with the same
    syfs_path available in the GDL or TDL. This should prevent
    problems getting duplicated devices from calling 'udevadm trigger'
    (fd.o#18861) or from some other rare cases (see:
    http://lists.freedesktop.org/archives/hal/2009-February/012954.html).

    TODO: Check if it make sense to call a refresh for the already
          existing device instead of ignoring the event completely.

diff -Nur hal-0.5.11.orig/hald/linux/device.c hal-0.5.11/hald/linux/device.c
--- hal-0.5.11.orig/hald/linux/device.c	2008-05-07 18:23:42.000000000 -0500
+++ hal-0.5.11/hald/linux/device.c	2009-07-16 16:21:36.619979288 -0500
@@ -4423,11 +4423,22 @@
 		handler = dev_handlers[i];
 		if (strcmp (handler->subsystem, subsystem) == 0) {
 			HalDevice *d;
+			HalDevice *check;
 
 			if (strcmp (subsystem, "scsi") == 0)
 				if (missing_scsi_host (sysfs_path, (HotplugEvent *)end_token, HOTPLUG_ACTION_ADD))
 					goto out;
 
+			/* check if there is already a device with this sysfs_path in the system */
+			if ((check = hal_device_store_match_key_value_string (hald_get_gdl (), "linux.sysfs_path", sysfs_path)) != NULL ||
+			    (check = hal_device_store_match_key_value_string (hald_get_tdl (), "linux.sysfs_path", sysfs_path)) != NULL) {
+				HAL_WARNING(("Have already a device with sysfs_path='%s' and udi='%s'. Ignore new add event for now.", 
+					     sysfs_path, hal_device_get_udi(check)));
+				/* maybe we should do a refresh on the found device ??? */
+				hotplug_event_end (end_token);
+				goto out; 
+			}
+
 			/* attempt to add the device */
 			d = handler->add (sysfs_path, device_file, parent_dev, parent_path);
 			if (d == NULL) {