Whamcloud - gitweb
LU-4198 clio: turn on lockless for some kind of IO
[fs/lustre-release.git] / lustre / tests / mirror_io.c
index 5deaeba..ab39f69 100644 (file)
@@ -204,7 +204,7 @@ static void mirror_dump(int argc, char *argv[])
        free(buf);
 }
 
-static size_t add_tids(unsigned int *ids, size_t count, char *arg)
+static size_t add_tids(__u16 *ids, size_t count, char *arg)
 {
        while (*arg) {
                char *end;
@@ -240,7 +240,7 @@ static void mirror_copy(int argc, char *argv[])
        int c;
        int i;
 
-       unsigned int ids[4096] = { 0 };
+       __u16 ids[4096] = { 0 };
        size_t count = 0;
        ssize_t result;
 
@@ -359,6 +359,48 @@ static enum resync_errors resync_parse_error(const char *err)
        return -1;
 }
 
+ssize_t mirror_resync_one(int fd, struct llapi_layout *layout,
+                         uint32_t dst, uint64_t start, uint64_t end)
+{
+       uint64_t mirror_end = 0;
+       ssize_t result = 0;
+       uint64_t count;
+
+       if (end == OBD_OBJECT_EOF)
+               count = OBD_OBJECT_EOF;
+       else
+               count = end - start;
+
+       while (count > 0) {
+               uint32_t src;
+               uint64_t to_copy;
+               ssize_t copied;
+
+               src = llapi_mirror_find(layout, start, end, &mirror_end);
+               if (src == 0)
+                       return -ENOENT;
+
+               if (mirror_end == OBD_OBJECT_EOF)
+                       to_copy = count;
+               else
+                       to_copy = MIN(count, mirror_end - start);
+
+               copied = llapi_mirror_copy(fd, src, dst, start, to_copy);
+               if (copied < 0)
+                       return copied;
+
+               result += copied;
+               if (copied < to_copy) /* end of file */
+                       break;
+
+               if (count != OBD_OBJECT_EOF)
+                       count -= copied;
+               start += copied;
+       }
+
+       return result;
+}
+
 static void mirror_resync(int argc, char *argv[])
 {
        const char *fname;
@@ -464,8 +506,8 @@ static void mirror_resync(int argc, char *argv[])
                }
                printf("\b\n");
 
-               res = llapi_mirror_resync_one(fd, layout, mirror_id,
-                                             comp_array[idx].lrc_start, end);
+               res = mirror_resync_one(fd, layout, mirror_id,
+                                       comp_array[idx].lrc_start, end);
                if (res > 0) {
                        int j;