]> sourceware.org Git - lvm2.git/commitdiff
Add dev_read_circular, read 2 regions on same device.
authorDave Wysochanski <dwysocha@redhat.com>
Thu, 19 Apr 2007 02:10:42 +0000 (02:10 +0000)
committerDave Wysochanski <dwysocha@redhat.com>
Thu, 19 Apr 2007 02:10:42 +0000 (02:10 +0000)
WHATS_NEW
lib/config/config.c
lib/device/dev-io.c
lib/device/device.h

index 9abfa479033ce7d185b2a7622ac1ef4a2eb547d4..cc6d9b74e9e46f1c057fef03b3b2aaa96624f97a 100644 (file)
--- 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'.
index 159e74106a718bd3568462e8e5e1486d2e88428f..6c7128a4190ebdc874fd5a759aa0e6da5be657c9 100644 (file)
@@ -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;
        }
 
index 8e8582e04a44138bed5623a6947080d8f52c0634..0e50e511068261ddbb741f9b3295c492b8007d43 100644 (file)
@@ -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
  */
index 4dc08e64de4864deef53304a76bc8f138b0f3718..19a9e176443515b35a9ca118b9bdea70766257c3 100644 (file)
@@ -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);
This page took 0.036375 seconds and 5 git commands to generate.