[LTP] [PATCH] syscalls/mmap16: close open files in cleanup path

Peter Maydell peter.maydell@linaro.org
Fri Jul 1 16:55:25 CEST 2016


If the mmap16 test fails while the do_test() function
still has its filedescriptor open, the cleanup function's
attempt to unmount will fail with EBUSY, resulting in a
lot of noise in the test log, a leaked mounted filesystem
and unnecessary test failures later in the run.

Make the do_test() file descriptor global so we can
close it in the cleanup function if necessary.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
I noticed this because QEMU linux-user mode happens to fail
this test at the moment, so it exercises the broken failure path.

 testcases/kernel/syscalls/mmap/mmap16.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/testcases/kernel/syscalls/mmap/mmap16.c b/testcases/kernel/syscalls/mmap/mmap16.c
index ca1f47d..5d943a0 100644
--- a/testcases/kernel/syscalls/mmap/mmap16.c
+++ b/testcases/kernel/syscalls/mmap/mmap16.c
@@ -48,6 +48,7 @@ static const char *device;
 static const char *fs_type = "ext4";
 static int mount_flag;
 static int chdir_flag;
+static int parentfd;
 
 static int page_size;
 static int bug_reproduced;
@@ -91,7 +92,7 @@ int main(int ac, char **av)
 
 static void do_test(void)
 {
-	int fd, ret, status;
+	int ret, status;
 	pid_t child;
 	char buf[FS_BLOCKSIZE];
 
@@ -105,12 +106,12 @@ static void do_test(void)
 	case 0:
 		do_child();
 	default:
-		fd = SAFE_OPEN(cleanup, "testfilep", O_RDWR);
+		parentfd = SAFE_OPEN(cleanup, "testfilep", O_RDWR);
 		memset(buf, 'a', FS_BLOCKSIZE);
 
 		TST_SAFE_CHECKPOINT_WAIT(cleanup, 0);
 		while (1) {
-			ret = write(fd, buf, FS_BLOCKSIZE);
+			ret = write(parentfd, buf, FS_BLOCKSIZE);
 			if (ret < 0) {
 				if (errno == ENOSPC) {
 					break;
@@ -120,7 +121,7 @@ static void do_test(void)
 				}
 			}
 		}
-		SAFE_CLOSE(cleanup, fd);
+		SAFE_CLOSE(cleanup, parentfd);
 		TST_SAFE_CHECKPOINT_WAKE(cleanup, 0);
 	}
 
@@ -231,6 +232,8 @@ static void do_child(void)
 
 static void cleanup(void)
 {
+	if (parentfd > 0)
+		close(parentfd);
 	if (chdir_flag && chdir(".."))
 		tst_resm(TWARN | TERRNO, "chdir('..') failed");
 	if (mount_flag && tst_umount(MNTPOINT) < 0)
-- 
1.9.1



More information about the ltp mailing list