From 662e0238f062b838361bca91d465813da710acd4 Mon Sep 17 00:00:00 2001 From: Dave Wysochanski Date: Thu, 19 Apr 2007 02:10:42 +0000 Subject: [PATCH] Add dev_read_circular, read 2 regions on same device. --- WHATS_NEW | 1 + lib/config/config.c | 12 ++---------- lib/device/dev-io.c | 29 +++++++++++++++++++++++++++++ lib/device/device.h | 2 ++ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 9abfa4790..cc6d9b74e 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.25 - ================================= + Add dev_read_circular. Add pvck command stub. Update lists of attribute characters in man pages. Change cling alloc policy attribute character from 'C' to l'. diff --git a/lib/config/config.c b/lib/config/config.c index 159e74106..6c7128a41 100644 --- a/lib/config/config.c +++ b/lib/config/config.c @@ -210,18 +210,10 @@ int read_config_fd(struct config_tree *cft, struct device *dev, stack; return 0; } - if (!dev_read(dev, (uint64_t) offset, size, buf)) { - log_error("Read from %s failed", dev_name(dev)); + if (!dev_read_circular(dev, (uint64_t) offset, size, + (uint64_t) offset2, size2, buf)) { goto out; } - if (size2) { - if (!dev_read(dev, (uint64_t) offset2, size2, - buf + size)) { - log_error("Circular read from %s failed", - dev_name(dev)); - goto out; - } - } p->fb = buf; } diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c index 8e8582e04..0e50e5110 100644 --- a/lib/device/dev-io.c +++ b/lib/device/dev-io.c @@ -564,6 +564,35 @@ int dev_read(struct device *dev, uint64_t offset, size_t len, void *buffer) return _aligned_io(&where, buffer, 0); } +/* + * Read from 'dev' into 'buf', possibly in 2 distinct regions, denoted + * by (offset,len) and (offset2,len2). Thus, the total size of + * 'buf' should be len+len2. + */ +int dev_read_circular(struct device *dev, uint64_t offset, size_t len, + uint64_t offset2, size_t len2, void *buf) +{ + if (!dev_read(dev, offset, len, buf)) { + log_error("Read from %s failed", dev_name(dev)); + return 0; + } + + /* + * The second region is optional, and allows for + * a circular buffer on the device. + */ + if (!len2) + return 1; + + if (!dev_read(dev, offset2, len2, buf + len)) { + log_error("Circular read from %s failed", + dev_name(dev)); + return 0; + } + + return 1; +} + /* FIXME If O_DIRECT can't extend file, dev_extend first; dev_truncate after. * But fails if concurrent processes writing */ diff --git a/lib/device/device.h b/lib/device/device.h index 4dc08e64d..19a9e1764 100644 --- a/lib/device/device.h +++ b/lib/device/device.h @@ -78,6 +78,8 @@ int dev_fd(struct device *dev); const char *dev_name(const struct device *dev); int dev_read(struct device *dev, uint64_t offset, size_t len, void *buffer); +int dev_read_circular(struct device *dev, uint64_t offset, size_t len, + uint64_t offset2, size_t len2, void *buf); int dev_write(struct device *dev, uint64_t offset, size_t len, void *buffer); int dev_append(struct device *dev, size_t len, void *buffer); int dev_set(struct device *dev, uint64_t offset, size_t len, int value); -- 2.43.5