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 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs