diff options
author | David Teigland <teigland@redhat.com> | 2018-11-06 16:03:17 -0600 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2018-11-06 16:41:04 -0600 |
commit | 9799c8da07b77844451c64bcbbce0d9d43ce2552 (patch) | |
tree | 9c6d78454cd880d49760a92d8fcdac0e58177751 | |
parent | 613466aa8f315468d34f45a75c662335abbdab2f (diff) | |
download | lvm2-9799c8da07b77844451c64bcbbce0d9d43ce2552.tar.gz |
devices: reuse bcache fd when getting block size
This avoids an unnecessary open() on the device.
-rw-r--r-- | lib/device/dev-io.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c index 2a4967fc1..2a83a9657 100644 --- a/lib/device/dev-io.c +++ b/lib/device/dev-io.c @@ -149,16 +149,27 @@ static int _io(struct device_area *where, char *buffer, int should_write, dev_io int dev_get_block_size(struct device *dev, unsigned int *physical_block_size, unsigned int *block_size) { const char *name = dev_name(dev); - int needs_open; + int fd = dev->bcache_fd; + int do_close = 0; int r = 1; - needs_open = (!dev->open_count && (dev->phys_block_size == -1 || dev->block_size == -1)); + if ((dev->phys_block_size > 0) && (dev->block_size > 0)) { + *physical_block_size = (unsigned int)dev->phys_block_size; + *block_size = (unsigned int)dev->block_size; + return 1; + } - if (needs_open && !dev_open_readonly(dev)) - return_0; + if (fd <= 0) { + if (!dev->open_count) { + if (!dev_open_readonly(dev)) + return_0; + do_close = 1; + } + fd = dev_fd(dev); + } if (dev->block_size == -1) { - if (ioctl(dev_fd(dev), BLKBSZGET, &dev->block_size) < 0) { + if (ioctl(fd, BLKBSZGET, &dev->block_size) < 0) { log_sys_error("ioctl BLKBSZGET", name); r = 0; goto out; @@ -169,7 +180,7 @@ int dev_get_block_size(struct device *dev, unsigned int *physical_block_size, un #ifdef BLKPBSZGET /* BLKPBSZGET is available in kernel >= 2.6.32 only */ if (dev->phys_block_size == -1) { - if (ioctl(dev_fd(dev), BLKPBSZGET, &dev->phys_block_size) < 0) { + if (ioctl(fd, BLKPBSZGET, &dev->phys_block_size) < 0) { log_sys_error("ioctl BLKPBSZGET", name); r = 0; goto out; @@ -179,7 +190,7 @@ int dev_get_block_size(struct device *dev, unsigned int *physical_block_size, un #elif defined (BLKSSZGET) /* if we can't get physical block size, just use logical block size instead */ if (dev->phys_block_size == -1) { - if (ioctl(dev_fd(dev), BLKSSZGET, &dev->phys_block_size) < 0) { + if (ioctl(fd, BLKSSZGET, &dev->phys_block_size) < 0) { log_sys_error("ioctl BLKSSZGET", name); r = 0; goto out; @@ -197,7 +208,7 @@ int dev_get_block_size(struct device *dev, unsigned int *physical_block_size, un *physical_block_size = (unsigned int) dev->phys_block_size; *block_size = (unsigned int) dev->block_size; out: - if (needs_open && !dev_close_immediate(dev)) + if (do_close && !dev_close_immediate(dev)) stack; return r; |