file_setup_area() writes initialized test data into the backing file used for collapse testing, but it ignores the return value from write().
If write() fails or completes only partially, the test continues with incomplete file contents, which can lead to incorrect test results and make failures harder to diagnose. Handle partial writes by retrying until all data is written and abort the test if write() fails. Signed-off-by: Vineet Agarwal <[email protected]> --- tools/testing/selftests/mm/khugepaged.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/mm/khugepaged.c b/tools/testing/selftests/mm/khugepaged.c index 3fe7ef04ac62..c13f06758750 100644 --- a/tools/testing/selftests/mm/khugepaged.c +++ b/tools/testing/selftests/mm/khugepaged.c @@ -369,7 +369,9 @@ static void *file_setup_area(int nr_hpages) int fd; void *p; unsigned long size; - + size_t remaining; + ssize_t ret; + char *buf; unlink(finfo.path); /* Cleanup from previous failed tests */ printf("Creating %s for collapse%s...", finfo.path, finfo.type == VMA_SHMEM ? " (tmpfs)" : ""); @@ -383,7 +385,19 @@ static void *file_setup_area(int nr_hpages) size = nr_hpages * hpage_pmd_size; p = alloc_mapping(nr_hpages); fill_memory(p, 0, size); - write(fd, p, size); + remaining = size; + buf = p; + + while (remaining > 0) { + ret = write(fd, buf, remaining); + if (ret <= 0) { + close(fd); + munmap(p, size); + ksft_exit_fail_msg("write() failed while preparing test file\n"); + } + buf += ret; + remaining -= ret; + } close(fd); munmap(p, size); success("OK"); -- 2.54.0

