On 01/-10/63 13:59, Jeff Liu wrote:
Hello,
This is another SEEK_DATA/SEEK_HOLE tester which is intended to cover multiple
extents checking.
I have ran it against btrfs to ensure the tester works, and ran it against XFS
to ensure the SEEK_DATA/SEEK_HOLE patch works too.
diff --git a/src/seek_copy_tester.c b/src/seek_copy_tester.c
new file mode 100755
index 0000000..4971f34
--- /dev/null
+++ b/src/seek_copy_tester.c
@@ -0,0 +1,674 @@
Do you want to add Author/Copyright and description?
+#include<stdio.h>
+#include<stdlib.h>
+#include<stdint.h>
+#include<stdarg.h>
...
+int
+full_write(int fd, const void *buf, size_t count)
+{
+ int ret = 0;
+ const char *ptr = (const char *) buf;
+
+ while (count> 0) {
+ ssize_t n = write(fd, ptr, count);
+ if (n< 0) {
+ if (errno == EINTR)
+ continue;
+ error("full_write failed as %s", strerror(errno));
+ ret = -1;
+ break;
+ }
+
+ if (n == 0)
+ break;
Callers of this routine expect the count number of bytes to be written.
Write a message if leaving this routine early? An error?
+
+ ptr += n;
+ count -= n;
+ }
+
+ return ret;
+}
...
+int
+create_data_and_holes(int fd, size_t nr_total_bytes, off_t start_offset,
+ uint64_t nr_skip_bytes, uint64_t nr_data_bytes,
+ int wrote_hole_at_eof)
+{
+ int ret = 0;
+ off_t total = nr_total_bytes;
+ off_t data_len = nr_data_bytes;
+ off_t off = start_offset;
+ char buf[4096];
+
+ memset(buf, 'A', sizeof(buf));
+
+ total -= start_offset;
+ while (total> 0) {
+ do {
You can actually write more than total byte on the last data write.
If writing exact total is important, then give do_pwrite() the count:
cnt = MIN(total, sizeof(buf))
+ ssize_t nr_write = do_pwrite(fd, buf, sizeof(buf), off);
+ if (nr_write< 0) {
+ error("do_pwrite() failed as %s",
strerror(errno));
+ ret = -1;
+ goto out;
+ }
+ if (nr_write == 0)
+ break;
+
do_pwrite will return 0 if not an error.
+ off += nr_write;
+ data_len -= nr_write;
These are probably sizeof(buf0 or my cnt not nr_write
+ } while (data_len> 0);
+
+ off += (nr_skip_bytes + nr_data_bytes);
+ total -= off;
...
+
+/*
+ * Copy a data extent from source file to dest file.
+ * @data_off: data offset
+ * @hole_off: hole offset
+ * The length of this extent is (hole_off - data_off).
+ */
+int
+do_extent_copy(int src_fd, int dest_fd, off_t data_off, off_t hole_off)
+{
+ uint64_t len = (uint64_t)(hole_off - data_off);
+ char buf[BUF_SIZE];
+ int ret;
+
+ /* Seek to data_off for data reading */
+ ret = lseek(src_fd, data_off, SEEK_SET);
+ if (ret< 0) {
+ error("seek source file to %llu failed as %s",
+ (uint64_t)data_off, strerror(errno));
+ return ret;
+ }
+
+ /* Seek to data_off for data writing, make holes as well */
+ ret = lseek(dest_fd, data_off, SEEK_SET);
+ if (ret< 0) {
+ error("seek dest file to %llu failed as %s",
+ (uint64_t)data_off, strerror(errno));
+ return ret;
+ }
+
+ while (len> 0) {
+ memset(buf, 0, sizeof(buf));
+ ssize_t n_read = read(src_fd, buf, BUF_SIZE);
+ if (n_read< 0) {
+ if (errno == EINTR)
+ continue;
+
+ error("read source file extent failed as %s",
+ strerror(errno));
+ return n_read;
+ }
+
+ if (n_read == 0)
+ break;
Message? Error?
--Mark Tinguely
|