[LTP] [PATCH] syscalls/umount2_{02,03}: Retry umount2() on EBUSY

Cyril Hrubis chrubis@suse.cz
Thu Apr 28 18:39:54 CEST 2016


This should be last fix for umount2() testcases failing with unexpected
EBUSY.

This patch adds umount2.h header that defined inline umount2_retry()
function that retries umount2() only in case of EBUSY.

The umount2_01 does not need to be fixed since it uses MNT_DETACH that
does lazy umount and hence it does not race with background probing.

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---

 This is last patch needed to fix rare failures (the two obvious ones
 were commited already). After applying this the failures couldn't be
 reproduced, instead there were a few lines as:

 umount2_03    0  TINFO  :  umount('mntpoint', 8) failed with EBUSY, try 0...

 In the log created by running the testcase 100 times in a loop.

 Can somebody ack this so that it can go in before the release?

 testcases/kernel/syscalls/umount2/umount2.h    | 44 ++++++++++++++++++++++++++
 testcases/kernel/syscalls/umount2/umount2_02.c |  4 ++-
 testcases/kernel/syscalls/umount2/umount2_03.c |  4 ++-
 3 files changed, 50 insertions(+), 2 deletions(-)
 create mode 100644 testcases/kernel/syscalls/umount2/umount2.h

diff --git a/testcases/kernel/syscalls/umount2/umount2.h b/testcases/kernel/syscalls/umount2/umount2.h
new file mode 100644
index 0000000..65e4c24
--- /dev/null
+++ b/testcases/kernel/syscalls/umount2/umount2.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2016 Cyril Hrubis <chrubis@suse.cz>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef UMOUNT2_H__
+#define UMOUNT2_H__
+
+static inline int umount2_retry(const char *target, int flags)
+{
+	int i, ret;
+
+	for (i = 0; i < 50; i++) {
+		ret = umount2(target, flags);
+
+		if (ret == 0 || errno != EBUSY)
+			return ret;
+
+		tst_resm(TINFO, "umount('%s', %i) failed with EBUSY, try %2i...",
+			 target, flags, i);
+
+		usleep(100000);
+	}
+
+	tst_resm(TWARN, "Failed to umount('%s', %i) after 50 retries",
+	         target, flags);
+
+	errno = EBUSY;
+	return -1;
+}
+
+#endif	/* UMOUNT2_H__ */
diff --git a/testcases/kernel/syscalls/umount2/umount2_02.c b/testcases/kernel/syscalls/umount2/umount2_02.c
index 33ea21d..7d558fa 100644
--- a/testcases/kernel/syscalls/umount2/umount2_02.c
+++ b/testcases/kernel/syscalls/umount2/umount2_02.c
@@ -33,6 +33,8 @@
 #include "safe_macros.h"
 #include "lapi/mount.h"
 
+#include "umount2.h"
+
 #define DIR_MODE	(S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
 #define MNTPOINT	"mntpoint"
 
@@ -131,7 +133,7 @@ static void test_umount2(int i)
 			tst_brkm(TBROK | TERRNO, cleanup, "access(2) failed");
 	}
 
-	TEST(umount2(MNTPOINT, test_cases[i].flag));
+	TEST(umount2_retry(MNTPOINT, test_cases[i].flag));
 
 	if (test_cases[i].exp_errno != 0)
 		verify_failure(i);
diff --git a/testcases/kernel/syscalls/umount2/umount2_03.c b/testcases/kernel/syscalls/umount2/umount2_03.c
index f2027cc..a8fddf6 100644
--- a/testcases/kernel/syscalls/umount2/umount2_03.c
+++ b/testcases/kernel/syscalls/umount2/umount2_03.c
@@ -28,6 +28,8 @@
 #include "safe_macros.h"
 #include "lapi/mount.h"
 
+#include "umount2.h"
+
 #define DIR_MODE	(S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
 #define MNTPOINT	"mntpoint"
 #define SYMLINK	"symlink"
@@ -110,7 +112,7 @@ static void test_umount2(int i)
 	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
 	mount_flag = 1;
 
-	TEST(umount2(test_cases[i].mntpoint, UMOUNT_NOFOLLOW));
+	TEST(umount2_retry(test_cases[i].mntpoint, UMOUNT_NOFOLLOW));
 
 	if (test_cases[i].exp_errno != 0)
 		verify_failure(i);
-- 
2.7.3


-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list