* [LTP] [PATCH] syscalls/umount2_{02,03}: Retry umount2() on EBUSY
@ 2016-04-28 16:39 Cyril Hrubis
2016-05-02 8:35 ` [LTP] [PATCH] syscalls/umount2_{02, 03}: " Jan Stancek
0 siblings, 1 reply; 3+ messages in thread
From: Cyril Hrubis @ 2016-04-28 16:39 UTC (permalink / raw)
To: ltp
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [LTP] [PATCH] syscalls/umount2_{02, 03}: Retry umount2() on EBUSY
2016-04-28 16:39 [LTP] [PATCH] syscalls/umount2_{02,03}: Retry umount2() on EBUSY Cyril Hrubis
@ 2016-05-02 8:35 ` Jan Stancek
2016-05-02 9:31 ` Cyril Hrubis
0 siblings, 1 reply; 3+ messages in thread
From: Jan Stancek @ 2016-05-02 8:35 UTC (permalink / raw)
To: ltp
----- Original Message -----
> From: "Cyril Hrubis" <chrubis@suse.cz>
> To: ltp@lists.linux.it
> Sent: Thursday, 28 April, 2016 6:39:54 PM
> Subject: [LTP] [PATCH] syscalls/umount2_{02,03}: Retry umount2() on EBUSY
>
> 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>
Is the culprit here also some background daemons? If so, ACK.
Regards,
Jan
> ---
>
> 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
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* [LTP] [PATCH] syscalls/umount2_{02, 03}: Retry umount2() on EBUSY
2016-05-02 8:35 ` [LTP] [PATCH] syscalls/umount2_{02, 03}: " Jan Stancek
@ 2016-05-02 9:31 ` Cyril Hrubis
0 siblings, 0 replies; 3+ messages in thread
From: Cyril Hrubis @ 2016-05-02 9:31 UTC (permalink / raw)
To: ltp
Hi!
> > 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>
>
> Is the culprit here also some background daemons? If so, ACK.
Yes, still the same offender gnome gvfs-trash. I will updated the patch
changelog to make this clear.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-05-02 9:31 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-28 16:39 [LTP] [PATCH] syscalls/umount2_{02,03}: Retry umount2() on EBUSY Cyril Hrubis
2016-05-02 8:35 ` [LTP] [PATCH] syscalls/umount2_{02, 03}: " Jan Stancek
2016-05-02 9:31 ` Cyril Hrubis
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.