- Fix patch files/patch-hald_hf-storage.c

Revert r351423 and apply it as a patch to the patch.

Reported by:	O. Hartmann <ohartman@zedat.fu-berlin.de>
This commit is contained in:
Bryan Drewery 2014-04-17 05:28:35 +00:00
parent 9c859f6f6e
commit 0b272aed3b
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=351448

View file

@ -1,67 +1,106 @@
Index: patch-hald_hf-storage.c
===================================================================
--- patch-hald_hf-storage.c (revision 351262)
+++ patch-hald_hf-storage.c (working copy)
@@ -1,5 +1,5 @@
---- ./hald/freebsd/hf-storage.c.orig 2009-08-24 14:42:29.000000000 +0200
-+++ ./hald/freebsd/hf-storage.c 2013-06-10 16:22:36.080280935 +0200
+--- hald/freebsd/hf-storage.c.orig 2009-08-24 12:42:29.000000000 +0000
++++ hald/freebsd/hf-storage.c 2014-04-16 19:04:08.004114131 +0000
@@ -30,6 +30,7 @@
#include <limits.h>
#include <inttypes.h>
@@ -8,7 +8,7 @@
#include <sys/param.h>
#include <sys/types.h>
#include <sys/disklabel.h>
-@@ -174,6 +175,10 @@ hf_storage_device_probe_geom (HalDevice
+@@ -174,6 +175,10 @@
if (! geom_obj)
return;
@@ -19,7 +19,7 @@
node = g_node_find(hf_storage_geom_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
GUINT_TO_POINTER(geom_obj->hash));
-@@ -418,10 +423,41 @@ hf_storage_parse_conftxt (const char *co
+@@ -418,10 +423,42 @@
continue;
}
@@ -32,7 +32,8 @@
+ ! strcmp(fields[1], "BSD") ||
+ ! strcmp(fields[1], "PART")) &&
+ (! strncmp(fields[2], "ufsid/", strlen("ufsid/")) ||
-+ ! strncmp(fields[2], "ufs/", strlen("ufs/"))))
++ ! strncmp(fields[2], "ufs/", strlen("ufs/")) ||
++ ! strncmp(fields[2], "diskid/", strlen("diskid/"))))
+ {
+ g_strfreev(fields);
+ continue;
@@ -61,7 +62,7 @@
geom_obj->type = -1; /* We use -1 here to denote a missing type. */
geom_obj->hash = hash;
-@@ -458,6 +494,13 @@ hf_storage_parse_conftxt (const char *co
+@@ -458,6 +495,13 @@
{
g_free(geom_obj->class);
geom_obj->class = g_strdup(fields[12]);
@@ -75,7 +76,7 @@
}
}
}
-@@ -589,11 +632,18 @@ hf_storage_devd_notify (const char *syst
+@@ -589,11 +633,18 @@
char *conftxt;
GSList *new_disks;
@@ -95,7 +96,7 @@
new_disks = hf_storage_parse_conftxt(conftxt);
g_free(conftxt);
-@@ -669,7 +719,7 @@ hf_storage_conftxt_timeout_cb (gpointer
+@@ -669,7 +720,7 @@
if (hf_is_waiting)
return TRUE;
--- ./hald/freebsd/hf-storage.c.orig 2009-08-24 14:42:29.000000000 +0200
+++ ./hald/freebsd/hf-storage.c 2013-06-10 16:22:36.080280935 +0200
@@ -30,6 +30,7 @@
#include <limits.h>
#include <inttypes.h>
#include <string.h>
+#include <unistd.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/disklabel.h>
@@ -174,6 +175,10 @@ hf_storage_device_probe_geom (HalDevice
if (! geom_obj)
return;
+ /* Exclude /dev/diskid/ labels as they are duplicates. */
+ if (strncmp(geom_obj->dev, "diskid/", 7) == 0)
+ return;
+
node = g_node_find(hf_storage_geom_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
GUINT_TO_POINTER(geom_obj->hash));
@@ -418,10 +423,41 @@ hf_storage_parse_conftxt (const char *co
continue;
}
+ /* XXX This is a hack, but we need to ignore dynamic labels like
+ * ufsids which are created and destroyed based on whether or not
+ * the actual device is mounted or not. If we don't then strange
+ * things happen in applications like nautilus.
+ */
+ if ((! strcmp(fields[1], "LABEL") ||
+ ! strcmp(fields[1], "BSD") ||
+ ! strcmp(fields[1], "PART")) &&
+ (! strncmp(fields[2], "ufsid/", strlen("ufsid/")) ||
+ ! strncmp(fields[2], "ufs/", strlen("ufs/"))))
+ {
+ g_strfreev(fields);
+ continue;
+ }
+
geom_obj = g_new0(Geom_Object, 1);
geom_obj->class = g_strdup(fields[1]);
geom_obj->dev = g_strdup(fields[2]);
+ /* Allow for spaces in label names. */
+ if (! strcmp(fields[1], "LABEL"))
+ {
+ int j;
+
+ for (j = 3; g_strv_length(fields) > (j + 2) &&
+ strcmp(fields[j + 2], "i"); j++)
+ {
+ char *tmp;
+
+ tmp = g_strdup_printf("%s %s", geom_obj->dev, fields[j]);
+ g_free(geom_obj->dev);
+ geom_obj->dev = tmp;
+ }
+ }
+
geom_obj->type = -1; /* We use -1 here to denote a missing type. */
geom_obj->hash = hash;
@@ -458,6 +494,13 @@ hf_storage_parse_conftxt (const char *co
{
g_free(geom_obj->class);
geom_obj->class = g_strdup(fields[12]);
+ if (! strcmp(geom_obj->class, "BSD") &&
+ geom_obj->type == FS_UNUSED)
+ {
+ geom_obj->type = FS_BSDFFS;
+ g_free(geom_obj->str_type);
+ geom_obj->str_type = g_strdup("freebsd-ufs");
+ }
}
}
}
@@ -589,11 +632,18 @@ hf_storage_devd_notify (const char *syst
char *conftxt;
GSList *new_disks;
- if (strcmp(system, "DEVFS") || strcmp(subsystem, "CDEV") ||
+ if (! data || strcmp(system, "DEVFS") || strcmp(subsystem, "CDEV") ||
+ ! strncmp(data, "cdev=ufs/", strlen("cdev=ufs/")) ||
+ ! strncmp(data, "cdev=ufsid/", strlen("cdev=ufsid/")) ||
(strcmp(type, "CREATE") && strcmp(type, "DESTROY")))
return FALSE;
+ if (! strcmp(type, "DESTROY"))
+ g_usleep(G_USEC_PER_SEC/2);
+
conftxt = hf_get_string_sysctl(NULL, "kern.geom.conftxt");
+ if (! conftxt)
+ return FALSE;
new_disks = hf_storage_parse_conftxt(conftxt);
g_free(conftxt);
@@ -669,7 +719,7 @@ hf_storage_conftxt_timeout_cb (gpointer
if (hf_is_waiting)
return TRUE;
- hf_storage_devd_notify("DEVFS", "CDEV", "CREATE", NULL);
+ hf_storage_devd_notify("DEVFS", "CDEV", "CREATE", "");
return TRUE;
}