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


Reply via email to