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

Jan Stancek jstancek@redhat.com
Mon May 2 10:35:44 CEST 2016





----- 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
> 


More information about the ltp mailing list