/* * Evms topology * -- this is fallback for old systems where the toplogy information is not * exported by sysfs * * Copyright (C) 2009 Karel Zak * * This file may be redistributed under the terms of the * GNU Lesser General Public License. * */ #include #include #include #include #include #include #include #include #include #include #include "topology.h" #define EVMS_MAJOR 117 #ifndef _IOT__IOTBASE_u_int32_t #define _IOT__IOTBASE_u_int32_t IOT_SIMPLE(uint32_t) #endif #define _IOT_evms_stripe_info _IOT (_IOTS(uint32_t), 2, 0, 0, 0, 0) #define EVMS_GET_STRIPE_INFO _IOR(EVMS_MAJOR, 0xF0, struct evms_stripe_info) struct evms_stripe_info { uint32_t size; /* stripe unit 512-byte blocks */ uint32_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; return blkid_driver_has_major("evms", major(devno)); } static int probe_evms_tp(blkid_probe pr, const struct blkid_idmag *mag __attribute__((__unused__))) { 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 };