From 25921536da17d72dccc9aed736ce5f26ba08b4cb Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 8 Dec 2008 16:59:18 -0700 Subject: [PATCH] imsm: sysfs support routines for determining device connectivity Signed-off-by: Dan Williams --- platform-intel.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ platform-intel.h | 3 +++ 2 files changed, 64 insertions(+) diff --git a/platform-intel.c b/platform-intel.c index 6cd5830..03e4ba7 100644 --- a/platform-intel.c +++ b/platform-intel.c @@ -176,3 +176,64 @@ const struct imsm_orom *find_imsm_orom(void) return &imsm_orom; return NULL; } + +char *devt_to_devpath(dev_t dev) +{ + char device[40]; + + sprintf(device, "/sys/dev/block/%d:%d/device", major(dev), minor(dev)); + return canonicalize_file_name(device); +} + +static char *diskfd_to_devpath(int fd) +{ + /* return the device path for a disk, return NULL on error or fd + * refers to a partition + */ + struct stat st; + + if (fstat(fd, &st) != 0) + return NULL; + if (!S_ISBLK(st.st_mode)) + return NULL; + + return devt_to_devpath(st.st_rdev); +} + +int path_attached_to_hba(const char *disk_path, const char *hba_path) +{ + int rc; + + if (!disk_path || !hba_path) + return 0; + + if (strncmp(disk_path, hba_path, strlen(hba_path)) == 0) + rc = 1; + else + rc = 0; + + return rc; +} + +int devt_attached_to_hba(dev_t dev, const char *hba_path) +{ + char *disk_path = devt_to_devpath(dev); + int rc = path_attached_to_hba(disk_path, hba_path); + + if (disk_path) + free(disk_path); + + return rc; +} + +int disk_attached_to_hba(int fd, const char *hba_path) +{ + char *disk_path = diskfd_to_devpath(fd); + int rc = path_attached_to_hba(disk_path, hba_path); + + if (disk_path) + free(disk_path); + + return rc; +} + diff --git a/platform-intel.h b/platform-intel.h index 9252002..c126482 100644 --- a/platform-intel.h +++ b/platform-intel.h @@ -87,3 +87,6 @@ struct sys_dev *find_driver_devices(const char *bus, const char *driver); __u16 devpath_to_vendor(const char *dev_path); void free_sys_dev(struct sys_dev **list); const struct imsm_orom *find_imsm_orom(void); +int disk_attached_to_hba(int fd, const char *hba_path); +char *devt_to_devpath(dev_t dev); +int path_attached_to_hba(const char *disk_path, const char *hba_path);