summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2015-03-03 15:37:17 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2015-03-06 13:17:39 +0100
commit6f68f4364b537cf52a27b5e53bb7f10de5a938fe (patch)
tree8df9fd563df4382425091252b304bb1e7605e64f /lib
parentb48ff3b94e7cd771bbaf42f38b546054d02bc0f2 (diff)
downloadlvm2-6f68f4364b537cf52a27b5e53bb7f10de5a938fe.tar.gz
devices: avoid extra open() syscall
If the device is already opened by lvm's device cache, avoid extra syscall opening devices for obtaining its size.
Diffstat (limited to 'lib')
-rw-r--r--lib/device/dev-io.c17
-rw-r--r--lib/device/device.h2
-rw-r--r--lib/report/report.c2
3 files changed, 9 insertions, 12 deletions
diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c
index 122b616fb..d712f3154 100644
--- a/lib/device/dev-io.c
+++ b/lib/device/dev-io.c
@@ -289,25 +289,22 @@ static int _dev_get_size_file(const struct device *dev, uint64_t *size)
return 1;
}
-static int _dev_get_size_dev(const struct device *dev, uint64_t *size)
+static int _dev_get_size_dev(struct device *dev, uint64_t *size)
{
- int fd;
const char *name = dev_name(dev);
- if ((fd = open(name, O_RDONLY)) < 0) {
- log_sys_error("open", name);
- return 0;
- }
+ if (!dev_open_readonly(dev))
+ return_0;
- if (ioctl(fd, BLKGETSIZE64, size) < 0) {
+ if (ioctl(dev_fd(dev), BLKGETSIZE64, size) < 0) {
log_sys_error("ioctl BLKGETSIZE64", name);
- if (close(fd))
+ if (!dev_close(dev))
log_sys_error("close", name);
return 0;
}
*size >>= BLKSIZE_SHIFT; /* Convert to sectors */
- if (close(fd))
+ if (!dev_close(dev))
log_sys_error("close", name);
log_very_verbose("%s: size is %" PRIu64 " sectors", name, *size);
@@ -377,7 +374,7 @@ static int _dev_discard_blocks(struct device *dev, uint64_t offset_bytes, uint64
* Public functions
*---------------------------------------------------------------*/
-int dev_get_size(const struct device *dev, uint64_t *size)
+int dev_get_size(struct device *dev, uint64_t *size)
{
if (!dev)
return 0;
diff --git a/lib/device/device.h b/lib/device/device.h
index 0d38f96b7..dcc37137f 100644
--- a/lib/device/device.h
+++ b/lib/device/device.h
@@ -94,7 +94,7 @@ int dev_ext_release(struct device *dev);
* All io should use these routines.
*/
int dev_get_block_size(struct device *dev, unsigned int *phys_block_size, unsigned int *block_size);
-int dev_get_size(const struct device *dev, uint64_t *size);
+int dev_get_size(struct device *dev, uint64_t *size);
int dev_get_read_ahead(struct device *dev, uint32_t *read_ahead);
int dev_discard_blocks(struct device *dev, uint64_t offset_bytes, uint64_t size_bytes);
diff --git a/lib/report/report.c b/lib/report/report.c
index 4ef2b04ec..86b0a5407 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -965,7 +965,7 @@ static int _devsize_disp(struct dm_report *rh, struct dm_pool *mem,
struct dm_report_field *field,
const void *data, void *private)
{
- const struct device *dev = *(const struct device * const *) data;
+ struct device *dev = *(struct device * const *) data;
uint64_t size;
if (!dev || !dev->dev || !dev_get_size(dev, &size))