]> err.no Git - util-linux/commitdiff
libblkid: add EVMS topology support (for old kernels)
authorKarel Zak <kzak@redhat.com>
Mon, 21 Sep 2009 13:32:09 +0000 (15:32 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 21 Sep 2009 13:32:38 +0000 (15:32 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/blkid/src/topology/Makefile.am
shlibs/blkid/src/topology/evms.c [new file with mode: 0644]
shlibs/blkid/src/topology/topology.c
shlibs/blkid/src/topology/topology.h

index 06927b28769abe507f9035c0b9a4e63edb32d28f..ffaf58dcc6714fa61593fe27c2b21b26e78203d0 100644 (file)
@@ -8,4 +8,5 @@ libblkid_topology_la_SOURCES =  topology.c \
                                topology.h \
                                sysfs.c \
                                md.c \
-                               dm.c
+                               dm.c \
+                               evms.c
diff --git a/shlibs/blkid/src/topology/evms.c b/shlibs/blkid/src/topology/evms.c
new file mode 100644 (file)
index 0000000..9f6c48d
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Evms topology
+ * -- this is fallback for old systems where the toplogy information are not
+ *    exporte dy sysfs
+ *
+ * Copyright (C) 2009 Karel Zak <kzak@redhat.com>
+ *
+ * This file may be redistributed under the terms of the
+ * GNU Lesser General Public License.
+ *
+ */
+#include <errno.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "topology.h"
+
+#define EVMS_MAJOR             117
+#define EVMS_GET_STRIPE_INFO   _IOR(EVMS_MAJOR, 0xF0, struct evms_stripe_info)
+
+struct evms_stripe_info {
+       u_int32_t       size;           /* stripe unit 512-byte blocks */
+       u_int32_t       width;          /* the number of stripe members or RAID data disks */
+} evms_stripe_info;
+
+static int is_evms_device(dev_t devno)
+{
+       if (major(devno) == EVMS_MAJOR)
+               return 1;
+       if (blkid_driver_has_major("evms", major(devno)))
+               return 1;
+       return 0;
+}
+
+static int probe_evms_tp(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       struct evms_stripe_info evms;
+       dev_t devno = blkid_probe_get_devno(pr);
+
+       if (!devno)
+               goto nothing;           /* probably not a block device */
+
+       if (!is_evms_device(devno))
+               goto nothing;
+
+       memset(&evms, 0, sizeof(evms));
+
+       if (ioctl(pr->fd, EVMS_GET_STRIPE_INFO, &evms))
+               goto nothing;
+
+       blkid_topology_set_minimum_io_size(pr, evms.size << 9);
+       blkid_topology_set_optimal_io_size(pr, (evms.size * evms.width) << 9);
+
+       return 0;
+
+nothing:
+       return 1;
+}
+
+const struct blkid_idinfo evms_tp_idinfo =
+{
+       .name           = "evms",
+       .probefunc      = probe_evms_tp,
+       .magics         = BLKID_NONE_MAGIC
+};
+
index d6132a8f3d49c186018fba1879e5a8f8a6c9bf99..ab2ecd0d84dd42f2e1b97db5e62408718fc18a0f 100644 (file)
@@ -61,7 +61,8 @@ static const struct blkid_idinfo *idinfos[] =
 {
        &sysfs_tp_idinfo,
        &md_tp_idinfo,
-       &dm_tp_idinfo
+       &dm_tp_idinfo,
+       &evms_tp_idinfo
 };
 
 
index 8cfcaf9808218756143c62bcc5dbe9701ca7061d..48d3f26f13da29fce7279c90dd7251e9afbd30d3 100644 (file)
@@ -13,6 +13,7 @@ extern int blkid_topology_set_optimal_io_size(blkid_probe pr, unsigned long val)
 extern const struct blkid_idinfo sysfs_tp_idinfo;
 extern const struct blkid_idinfo md_tp_idinfo;
 extern const struct blkid_idinfo dm_tp_idinfo;
+extern const struct blkid_idinfo evms_tp_idinfo;
 
 #endif /* BLKID_TOPOLOGY_H */