diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c index cd0b1f9e4..5fac6d5ea 100644 --- a/lib/device/dev-io.c +++ b/lib/device/dev-io.c @@ -13,8 +13,7 @@ #include #include #include -#include - +#include // UGH!!! for BLKSSZGET int dev_get_size(struct device *dev, uint64_t *size) { @@ -40,6 +39,29 @@ int dev_get_size(struct device *dev, uint64_t *size) return 1; } +int dev_get_sectsize(struct device *dev, uint32_t *size) +{ + int fd; + int s; + const char *name = dev_name(dev); + + log_very_verbose("Getting size of %s", name); + if ((fd = open(name, O_RDONLY)) < 0) { + log_sys_error("open", name); + return 0; + } + + if (ioctl(fd, BLKSSZGET, &s) < 0) { + log_sys_error("ioctl BLKSSZGET", name); + close(fd); + return 0; + } + + close(fd); + *size = (uint32_t) s; + return 1; +} + int dev_open(struct device *dev, int flags) { const char *name = dev_name(dev); @@ -167,7 +189,7 @@ int dev_zero(struct device *dev, uint64_t offset, int64_t len) int fd = dev->fd; if (fd < 0) { - log_error("Attempt to zero part of an unopened device %s", + log_error("Attempt to zero part of an unopened device %s", name); return 0; } diff --git a/lib/device/device.h b/lib/device/device.h index 4a3338663..1042d8c46 100644 --- a/lib/device/device.h +++ b/lib/device/device.h @@ -26,6 +26,7 @@ struct device { * All io should use these routines. */ int dev_get_size(struct device *dev, uint64_t *size); +int dev_get_sectsize(struct device *dev, uint32_t *size); int dev_open(struct device *dev, int flags); int dev_close(struct device *dev);