summaryrefslogtreecommitdiff
blob: 9d4e6f53431c04e35c3502bd41ef8718620b1c0e (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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
diff -Naur hal-0.5.7-orig/hald/linux2/blockdev.c hal-0.5.7/hald/linux2/blockdev.c
--- hal-0.5.7-orig/hald/linux2/blockdev.c	2006-02-24 07:29:06 +0300
+++ hal-0.5.7/hald/linux2/blockdev.c	2006-06-02 23:45:51 +0400
@@ -185,6 +185,7 @@
 	dev_t devt = makedev(0, 0);
 	GSList *volumes = NULL;
 	GSList *volume;
+        GSList *autofs_mounts = NULL;
 
 	/* open /proc/mounts */
 	g_snprintf (buf, sizeof (buf), "%s/mounts", get_hal_proc_path ());
@@ -205,6 +206,43 @@
 	while ((mnte = getmntent_r (f, &mnt, buf, sizeof(buf))) != NULL) {
 		struct stat statbuf;
 
+		/* If this is a nfs mount or autofs 
+		 * (fstype == 'nfs' || fstype == 'autofs') 
+		 * ignore the mount. Reason:
+		 *  1. we don't list nfs devices in HAL
+  		 *  2. more problematic: stat on mountpoints with 
+		 *     'stale nfs handle' never come
+  		 *     back and block complete HAL and all applications 
+		 *     using HAL fail.
+		 *  3. autofs and HAL butt heads causing drives to never
+		 *     be unmounted
+  		 */
+		if (strcmp(mnt.mnt_type, "nfs") == 0)
+			continue;
+
+		/* If this is an autofs mount (fstype == 'autofs' or fstype == 'subfs') 
+		 * store the mount in a list for later use. 
+		 * On mounts managed by autofs or subfs accessing files below the mount
+		 * point cause the mount point to be remounted after an 
+		 * unmount.  We keep the list so we do not check for
+		 * the .created-by-hal file on mounts under autofs or subfs mount points
+		 */
+		if (strcmp(mnt.mnt_type, "autofs") == 0 ||
+		    strcmp(mnt.mnt_type, "subfs") == 0) {
+			char *mnt_dir;
+
+			if (mnt.mnt_dir[strlen (mnt.mnt_dir) - 1] != '/')
+				mnt_dir = g_strdup_printf ("%s/", mnt.mnt_dir);
+			else
+				mnt_dir = g_strdup (mnt.mnt_dir);
+
+			autofs_mounts = g_slist_append (autofs_mounts,
+							mnt_dir);
+
+
+			continue;
+		}
+
 		/* check the underlying device of the mount point */
 		if (stat (mnt.mnt_dir, &statbuf) != 0)
 			continue;
@@ -242,6 +280,7 @@
 		HalDevice *dev;
 		char *mount_point;
 		char *mount_point_hal_file;
+		GSList *autofs_node;
 
 		dev = HAL_DEVICE (volume->data);
 		mount_point = g_strdup (hal_device_property_get_string (dev, "volume.mount_point"));
@@ -251,8 +290,20 @@
 		device_property_atomic_update_end ();
 		HAL_INFO (("set %s to unmounted", hal_device_get_udi (dev)));
 
+		/* check to see if mount point falls under autofs */
+		autofs_node = autofs_mounts;
+		while (autofs_node != NULL) {
+			char *am = (char *)autofs_node->data;
+
+			if (strncmp (am, mount_point, strlen (am)) == 0);
+				break;
+
+			autofs_node = autofs_node->next;
+		}
+
 		mount_point_hal_file = g_strdup_printf ("%s/.created-by-hal", mount_point);
-		if (g_file_test (mount_point_hal_file, G_FILE_TEST_EXISTS)) {
+		if (!autofs_node && 
+		     g_file_test (mount_point_hal_file, G_FILE_TEST_EXISTS)) {
 			char *cleanup_stdin;
 			char *extra_env[2];
 
@@ -279,6 +330,8 @@
 		g_free (mount_point);
 	}
 	g_slist_free (volumes);
+	g_slist_foreach (autofs_mounts, (GFunc) g_free, NULL);
+	g_slist_free (autofs_mounts);
 exit:
 	endmntent (f);
 }