[sheepdog] [PATCH v2 1/2] util: add find_zero_blocks()
MORITA Kazutaka
morita.kazutaka at gmail.com
Fri Jul 19 07:22:43 CEST 2013
From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
This adds a helper function which does the similar thing as
trim_zero_blocks() but doesn't update the given buffer.
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
include/util.h | 1 +
lib/util.c | 24 +++++++++++++++++++-----
2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/include/util.h b/include/util.h
index b2c5395..583fa9e 100644
--- a/include/util.h
+++ b/include/util.h
@@ -95,6 +95,7 @@ void reraise_crash_signal(int signo, int status);
pid_t gettid(void);
bool is_xattr_enabled(const char *path);
+void find_zero_blocks(const void *buf, uint64_t *poffset, uint32_t *plen);
void trim_zero_blocks(void *buf, uint64_t *offset, uint32_t *len);
void untrim_zero_blocks(void *buf, uint64_t offset, uint32_t len,
uint32_t requested_len);
diff --git a/lib/util.c b/lib/util.c
index 69bedfb..5fe0bfa 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -355,7 +355,7 @@ int rmdir_r(char *dir_path)
}
/*
- * Trim zero blocks from the beginning and end of buffer
+ * Find zero blocks from the beginning and end of buffer
*
* The caller passes the offset of 'buf' with 'poffset' so that this funciton
* can align the return values to BLOCK_SIZE. 'plen' points the length of the
@@ -365,10 +365,10 @@ int rmdir_r(char *dir_path)
* buffer, this function also decreases the length on condition that '*plen' is
* block-aligned.
*/
-void trim_zero_blocks(void *buf, uint64_t *poffset, uint32_t *plen)
+void find_zero_blocks(const void *buf, uint64_t *poffset, uint32_t *plen)
{
const uint8_t zero[BLOCK_SIZE] = {0};
- uint8_t *p = buf;
+ const uint8_t *p = buf;
uint64_t start = *poffset;
uint64_t offset = 0;
uint32_t len = *plen;
@@ -385,8 +385,6 @@ void trim_zero_blocks(void *buf, uint64_t *poffset, uint32_t *plen)
offset += size;
len -= size;
}
- if (offset > 0)
- memmove(buf, p + offset, len);
/* trim zero sectors from the end of buffer */
while (len >= BLOCK_SIZE) {
@@ -405,6 +403,22 @@ void trim_zero_blocks(void *buf, uint64_t *poffset, uint32_t *plen)
}
/*
+ * Trim zero blocks from the beginning and end of buffer
+ *
+ * This function is similar to find_zero_blocks(), but this updates 'buf' so
+ * that the zero block are removed from the beginning of buffer.
+ */
+void trim_zero_blocks(void *buf, uint64_t *poffset, uint32_t *plen)
+{
+ uint8_t *p = buf;
+ uint64_t orig_offset = *poffset;
+
+ find_zero_blocks(buf, poffset, plen);
+ if (orig_offset < *poffset)
+ memmove(p, p + *poffset - orig_offset, *plen);
+}
+
+/*
* Untrim zero blocks to the beginning and end of buffer
*
* 'offset' is the offset of 'buf' in the original buffer, 'len' is the length
--
1.7.9.5
More information about the sheepdog
mailing list