[LTP] [PATCH] mmap21: Check for free space before mapping the file

Victor Cheng-Yen Yang cyyang772@andestech.com
Tue Sep 8 04:31:21 CEST 2026


From: Victor Cheng-Yen Yang <cyyang772@andestech.com>

The test creates a sparse file with lseek() and a one byte write, so
mmap() allocates no blocks. The child then touches every byte and ext4
fills the holes inside ext4_page_mkwrite(). A store instruction has no
error return, so an ENOSPC there becomes VM_FAULT_SIGBUS and the test
reports only

  tst_test.c:536: TBROK: Child (13042) killed by signal SIGBUS

which says nothing about the full filesystem. The information is
available before the mapping and gone after it, so check it in setup
and report TCONF earlier as convention.

Signed-off-by: Victor Cheng-Yen Yang <cyyang772@andestech.com>
---
 testcases/kernel/syscalls/mmap/mmap21.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/testcases/kernel/syscalls/mmap/mmap21.c b/testcases/kernel/syscalls/mmap/mmap21.c
index ea3ae835a..3d6e8bd46 100644
--- a/testcases/kernel/syscalls/mmap/mmap21.c
+++ b/testcases/kernel/syscalls/mmap/mmap21.c
@@ -10,6 +10,7 @@
  * access, and read back the data from the file.
  */
 
+#include <sys/vfs.h>
 #include "tst_test.h"
 
 #define FILE_NAME "testfile"
@@ -71,11 +72,24 @@ exit:
 
 static void setup(void)
 {
+	struct statfs sf;
+	unsigned long long needed, avail;
+
 	if (tst_parse_filesize(str_pages, &pages, 1, LLONG_MAX))
 		tst_brk(TBROK, "Invalid number of pages: %s", str_pages);
 
 	memory_size = pages * getpagesize();
 
+	/* the byte written past the mapping costs a whole block */
+	SAFE_STATFS(".", &sf);
+	needed = memory_size + sf.f_bsize;
+	avail = (unsigned long long)sf.f_bavail * sf.f_bsize;
+
+	if (!tst_fs_has_free(".", needed, TST_BYTES)) {
+		tst_brk(TCONF, "Not enough free space, test needs %llu bytes, %llu available",
+			needed, avail);
+	}
+
 	buff = SAFE_MALLOC(memory_size);
 }
 
-- 
2.55.0



More information about the ltp mailing list