X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fmirror_io.c;h=ab39f6953f3979150f7ed70083144dc2d2277320;hb=6bce536725efd166d2772f13fe954f271f9c53b8;hp=5deaebac43432c15d9b69b68175ce8ab16e3170f;hpb=8f1c7c1e44a4cc8870eb2b2a71da323e265881b4;p=fs%2Flustre-release.git diff --git a/lustre/tests/mirror_io.c b/lustre/tests/mirror_io.c index 5deaeba..ab39f69 100644 --- a/lustre/tests/mirror_io.c +++ b/lustre/tests/mirror_io.c @@ -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;