summaryrefslogtreecommitdiff
path: root/lib/device/dev-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/device/dev-io.c')
-rw-r--r--lib/device/dev-io.c125
1 files changed, 33 insertions, 92 deletions
diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c
index dd65c3d2e..6c6600672 100644
--- a/lib/device/dev-io.c
+++ b/lib/device/dev-io.c
@@ -58,13 +58,6 @@ static int _dev_get_size_file(struct device *dev, uint64_t *size)
const char *name = dev_name(dev);
struct stat info;
- if (dev->size_seqno == _dev_size_seqno) {
- log_very_verbose("%s: using cached size %" PRIu64 " sectors",
- name, dev->size);
- *size = dev->size;
- return 1;
- }
-
if (stat(name, &info)) {
log_sys_error("stat", name);
return 0;
@@ -73,52 +66,12 @@ static int _dev_get_size_file(struct device *dev, uint64_t *size)
*size = info.st_size;
*size >>= SECTOR_SHIFT; /* Convert to sectors */
dev->size = *size;
- dev->size_seqno = _dev_size_seqno;
log_very_verbose("%s: size is %" PRIu64 " sectors", name, *size);
return 1;
}
-static int _dev_get_size_dev(struct device *dev, uint64_t *size)
-{
- const char *name = dev_name(dev);
- int fd = dev->bcache_fd;
- int do_close = 0;
-
- if (dev->size_seqno == _dev_size_seqno) {
- log_very_verbose("%s: using cached size %" PRIu64 " sectors",
- name, dev->size);
- *size = dev->size;
- return 1;
- }
-
- if (fd <= 0) {
- if (!dev_open_readonly(dev))
- return_0;
- fd = dev_fd(dev);
- do_close = 1;
- }
-
- if (ioctl(fd, BLKGETSIZE64, size) < 0) {
- log_sys_error("ioctl BLKGETSIZE64", name);
- if (do_close && !dev_close_immediate(dev))
- log_sys_error("close", name);
- return 0;
- }
-
- *size >>= BLKSIZE_SHIFT; /* Convert to sectors */
- dev->size = *size;
- dev->size_seqno = _dev_size_seqno;
-
- log_very_verbose("%s: size is %" PRIu64 " sectors", name, *size);
-
- if (do_close && !dev_close_immediate(dev))
- log_sys_error("close", name);
-
- return 1;
-}
-
static int _dev_read_ahead_dev(struct device *dev, uint32_t *read_ahead)
{
long read_ahead_long;
@@ -182,55 +135,24 @@ static int _dev_discard_blocks(struct device *dev, uint64_t offset_bytes, uint64
int dev_get_direct_block_sizes(struct device *dev, unsigned int *physical_block_size,
unsigned int *logical_block_size)
{
- int fd = dev->bcache_fd;
- int do_close = 0;
- unsigned int pbs = 0;
- unsigned int lbs = 0;
-
- if (dev->physical_block_size || dev->logical_block_size) {
- *physical_block_size = dev->physical_block_size;
- *logical_block_size = dev->logical_block_size;
- return 1;
- }
+ int put = !dev->iodev;
+ int ret = 1;
- if (fd <= 0) {
- if (!dev_open_readonly(dev))
- return 0;
- fd = dev_fd(dev);
- do_close = 1;
- }
+ if (!dev->iodev)
+ dev->iodev = io_get_dev(lvm_iom, dev_name(dev), EF_READ_ONLY);
-#ifdef BLKPBSZGET /* not defined before kernel version 2.6.32 (e.g. rhel5) */
- /*
- * BLKPBSZGET from kernel comment for blk_queue_physical_block_size:
- * "the lowest possible sector size that the hardware can operate on
- * without reverting to read-modify-write operations"
- */
- if (ioctl(fd, BLKPBSZGET, &pbs)) {
- stack;
- pbs = 0;
- }
-#endif
-
- /*
- * BLKSSZGET from kernel comment for blk_queue_logical_block_size:
- * "the lowest possible block size that the storage device can address."
- */
- if (ioctl(fd, BLKSSZGET, &lbs)) {
- stack;
- lbs = 0;
- }
-
- dev->physical_block_size = pbs;
- dev->logical_block_size = lbs;
+ if (!dev->iodev)
+ return 1;
- *physical_block_size = pbs;
- *logical_block_size = lbs;
+ if (!io_dev_block_sizes(dev->iodev, physical_block_size, logical_block_size))
+ ret = 0;
- if (do_close && !dev_close_immediate(dev))
- stack;
+ if (put) {
+ io_put_dev(dev->iodev);
+ dev->iodev = NULL;
+ }
- return 1;
+ return ret;
}
/*-----------------------------------------------------------------
@@ -243,13 +165,32 @@ void dev_size_seqno_inc(void)
int dev_get_size(struct device *dev, uint64_t *size)
{
+ int put = !dev->iodev;
+ int ret = 1;
+
if (!dev)
return 0;
if ((dev->flags & DEV_REGULAR))
return _dev_get_size_file(dev, size);
- return _dev_get_size_dev(dev, size);
+ if (!dev->iodev)
+ dev->iodev = io_get_dev(lvm_iom, dev_name(dev), EF_READ_ONLY);
+
+ if (!dev->iodev)
+ return 0;
+
+ if (!io_dev_size(dev->iodev, size))
+ ret = 0;
+ else
+ dev->size = *size;
+
+ if (put) {
+ io_put_dev(dev->iodev);
+ dev->iodev = NULL;
+ }
+
+ return ret;
}
int dev_get_read_ahead(struct device *dev, uint32_t *read_ahead)