[LTP] [PATCH 1/3] clone08: convert to new LTP API

Alexey Kodanev alexey.kodanev@oracle.com
Thu Jun 8 11:36:37 CEST 2017


Hi,
On 06/07/2017 06:46 PM, Cyril Hrubis wrote:
> Hi!
>>  static long clone_child(const struct test_case *t, int use_tst)
>> @@ -121,16 +97,16 @@ static long clone_child(const struct test_case *t, int use_tst)
>>  		child_stack, &ptid, NULL, &ctid));
>>  
>>  	if (TEST_RETURN == -1 && TTERRNO == ENOSYS)
>> -		tst_brkm(TCONF, cleanup, "clone does not support 7 args");
>> +		tst_brk(TCONF, "clone does not support 7 args");
>>  
>>  	if (TEST_RETURN == -1) {
>>  		if (use_tst) {
>> -			tst_brkm(TBROK | TTERRNO, cleanup, "%s clone() failed",
>> +			tst_brk(TBROK | TTERRNO, "%s clone() failed",
>>  				 t->name);
>>  		} else {
>>  			printf("%s clone() failed, errno: %d",
>>  			       t->name, TEST_ERRNO);
>> -			exit(1);
>> +			_exit(1);
>>  		}
>>  	}
> Do we still need the use_tst flag here? Calling tst_* functions in child
> works fine with the new library.

Great, this simplifies things.

>
>>  	return TEST_RETURN;
>> @@ -140,8 +116,8 @@ static int wait4child(pid_t child)
>>  {
>>  	int status;
>>  
>> -	if (waitpid(child, &status, 0) == -1)
>> -		tst_resm(TBROK|TERRNO, "waitpid");
>> +	SAFE_WAITPID(child, &status, 0);
>> +
>>  	if (WIFEXITED(status))
>>  		return WEXITSTATUS(status);
>>  	else
>> @@ -150,77 +126,55 @@ static int wait4child(pid_t child)
>>  
>>  static void test_clone_parent(int t)
>>  {
>> -	int status;
>>  	pid_t child;
>>  
>> -	fflush(stdout);
>> -	child = FORK_OR_VFORK();
>> -	switch (child) {
>> -	case 0:
>> +	child = SAFE_FORK();
>> +	if (!child) {
>>  		parent_ppid = getppid();
>>  		clone_child(&test_cases[t], 0);
>> -		exit(0);
>> -	case -1:
>> -		tst_brkm(TBROK | TERRNO, NULL, "test_clone_parent fork");
>> -	default:
>> -		status = wait4child(child);
>> -		if (status == 0) {
>> -			/* wait for CLONE_PARENT child */
>> -			status = wait4child(-1);
>> -			if (status == 0) {
>> -				tst_resm(TPASS, "test %s", test_cases[t].name);
>> -			} else {
>> -				tst_resm(TFAIL, "test %s, status: %d",
>> -					 test_cases[t].name, status);
>> -			}
>> -		} else {
>> -			tst_resm(TFAIL, "test %s, status: %d",
>> -				 test_cases[t].name, status);
>> -		}
>> -	};
>> +		_exit(0);
>> +	}
>> +	tst_reap_children();
>> +	tst_res(TPASS, "clone and forked child has the same parent");
> Hmm, so supposedly we produce TBROK in the tst_reap_childer() if the
> child_clone_parent() has failed, right?
>
> The test failures are accounted for in the structure stored in the
> shared memory. Only exit statuses that are propagated correctly are
> these that should exit the test immediately which are TBROK and TCONF.
>
> So if a test child fails it should call the tst_res(TFAIL, ...) function
> and then exit with 0. Or exit with non-zero value while the parent waits
> for it and calls the tst_res() function accordingly. At least this is
> how the code in tst_test.c is structured now.
>
> Moreover even if the code in tst_test was able to cope with tests
> exitting with TFAIL this would still produce TPASS message even if the
> child reported a failure.

Agree, I'll move tst_res() to a child function and make it exit with 0.

Thanks,
Alexey


More information about the ltp mailing list