[PATCH] do not stat autofs mounts(was Re: hall and autofs)
Ian Kent
ikent at redhat.com
Fri May 19 20:19:22 PDT 2006
On Wed, 2006-05-17 at 18:55 -0400, John (J5) Palmieri wrote:
? .blockdev.c.swp
? hal-donot-check-created-by-hal-on-autofs-mounts-2.patch
? hal-donot-check-created-by-hal-on-autofs-mounts-3.patch
? hal-donot-check-created-by-hal-on-autofs-mounts.patch
? hal-donot-stat-autofs-mounts.patch
Index: blockdev.c
===================================================================
RCS file: /cvs/hal/hal/hald/linux2/blockdev.c,v
retrieving revision 1.41
diff -u -r1.41 blockdev.c
--- blockdev.c 9 May 2006 20:13:42 -0000 1.41
+++ blockdev.c 17 May 2006 22:53:13 -0000
@@ -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 ());
@@ -213,6 +214,28 @@
if (strcmp(mnt.mnt_type, "nfs") == 0)
continue;
+ /* If this is an autofs mount (fstype == 'autofs')
+ * store the mount in a list for later use.
+ * On mounts managed by autofs 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 mount points
+ */
+ if (strcmp(mnt.mnt_type, "autofs") == 0) {
+ char *mnt_dir;
+
+ if (mnt.mnt_dir[strlen (mnt.mnt_dir) - 1] != '/')
+ mnt_dir = g_strdup_printf ("%s/", mnt.mnt_dir);
Is this right?
The slash won't appear in /proc/mounts.
Is it needed at all as the fact that it's an autofs filesystem should
exclude other media that's present in the fstab.
+ 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;
@@ -254,6 +277,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"));
@@ -264,8 +288,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];
@@ -292,6 +328,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);
}
More information about the hal
mailing list