xfs
[Top] [All Lists]

Re: [PATCH v2 2/2] xfstests: introduce 280 for SEEK_DATA/SEEK_HOLE copy

To: jeff.liu@xxxxxxxxxx
Subject: Re: [PATCH v2 2/2] xfstests: introduce 280 for SEEK_DATA/SEEK_HOLE copy check
From: Mark Tinguely <tinguely@xxxxxxx>
Date: Mon, 06 Feb 2012 16:30:10 -0600
Cc: xfs@xxxxxxxxxxx, Christoph Hellwig <hch@xxxxxxxxxxxxx>
In-reply-to: <4F2FE410.2040508@xxxxxxxxxx>
References: <4F2FE410.2040508@xxxxxxxxxx>
User-agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0
On 02/06/12 08:30, Jeff Liu wrote:
Introduce 280 for SEEK_DATA/SEEK_HOLE copy check.

Signed-off-by: Jie Liu<jeff.liu@xxxxxxxxxx>

---


diff --git a/src/seek_copy_tester.c b/src/seek_copy_tester.c
new file mode 100644
index 0000000..ddf683f
--- /dev/null
+++ b/src/seek_copy_tester.c

+static size_t
+full_write(int fd, const void *buf, size_t count)
+{
+       size_t total = 0;
+       const char *ptr = (const char *) buf;
+
+       while (count>  0) {
+               ssize_t n = write(fd, ptr, count);
+               if (n<  0) {
+                       if (errno == EINTR)
+                               continue;

Wouldn't you want to stop the write loop if interrupted?

+                       error("full_write() failed as %s", strerror(errno));
+                       break;
+               }
+
+               if (n == 0) {
+                       error("full_write() ZERO bytes transferred");

You can tell them how many (total) bytes were written before the error.
Same in full_pwrite()

+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[BUF_SIZE];
+
+       memset(buf, 'A', sizeof(buf));
+
+       total -= start_offset;
+       while (total>  0) {

+       data_len = nr_data_bytes; /* see below */

+               do {
+                       size_t nr_write = MIN(total, BUF_SIZE);

There are 2 dependencies:
 1) The last nr_data_bytes does not exceed total (outer loop)
 2) The remaining data size (data_len) could be less than BUF_SIZE
    (if data_len is not a multiple of BUF_SIZE for example).

+                       if (full_pwrite(fd, buf, nr_write, off) != nr_write) {
+                               error("full_pwrite() failed as %s", 
strerror(errno));
+                               ret = -1;
+                               goto out;
+                       }
+
+                       off += nr_write;
+                       data_len -= nr_write;
+               } while (data_len>  0);

data_len is <= 0 so the inner loop will execute only once if you have more than one chunk of data.
+
+               off += (nr_skip_bytes + nr_data_bytes);
+               total -= off;
+       }
+
+       if (off<  nr_total_bytes) {
+               if (wrote_hole_at_eof) {
+                       ret = ftruncate(fd, nr_total_bytes);
+                       if (ret<  0) {
+                               error("truncate source file to %lld bytes failed as 
%s",
+                                      (long long)nr_total_bytes, 
strerror(errno));
+                       }
+               }
+
+               ret = write_zeros(fd, nr_total_bytes - off);
+               if (ret<  0) {
+                       error("write_zeros to end of file failed as %s",
+                              strerror(errno));
+               }
+       }
+
+out:
+       return ret;
+}

It is shaping up nicely.

--Mark

<Prev in Thread] Current Thread [Next in Thread>