diff mbox series

[v2] Fix mountns01/02/03/04 final umounts using more peculiar dir names

Message ID 20220620133746.99167-1-cristian.marussi@arm.com
State Superseded
Headers show
Series [v2] Fix mountns01/02/03/04 final umounts using more peculiar dir names | expand

Commit Message

Cristian Marussi June 20, 2022, 1:37 p.m. UTC
Running LTP20220527 release it appears that the recently re-written tests
mountns02/03/04 can now throw a warning on their final umount attempt in
some setup:

<<<test_output>>>
tst_test.c:1526: TINFO: Timeout per run is 0h 00m 30s
mountns04.c:38: TPASS: unbindable mount passed
tst_device.c:395: TWARN: umount('A') failed with EINVAL
mountns.h:36: TWARN: umount(A) failed: EINVAL (22)
tst_device.c:434: TINFO: No device is mounted at B

Moreover, the underlying safe_umount() then upgrades the TWARN emitted
from tst_umount to a TBROK, so causing the test to completely fail:

Summary:
passed   1
failed   0
broken   0
skipped  0
warnings 2
<<<execution_status>>>
initiation_status="ok"
duration=0 termination_type=exited termination_id=4 corefile=no

Even though the final SAFE_UMOUNTs in the test body properly unmount the
test created mountpoints, the final cleanup functions, that finally check
to see if those mountpoints are still mounted, can be fooled into falsely
thinking that test-chosen mountpoints "A" or "B" are still there: this is
due to the fact that the internal helper tst_is_mounted() uses a simple
strstr() on /proc/mounts to check if a directory is still mounted and
clearly the currently test-chosen names are far too much simple, being
one-letter, and they can be easily matched by other unrelated mountpoints
that happen to exist on a specific setup.

Use a more peculiar naming for the test chosen mountpoints and generalize
accordingly all the comments.

Cc: Andrea Cervesato <andrea.cervesato@suse.de>
Cc: Cyril Hrubis <chrubis@suse.cz>
Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
---
v1 --> v2
- using more peculiar naming for mountpoints
- fix comments
- dropped previous SAFE_UMONUT removal

A better, more long term fix should be to fix/harden tst_is_mounted logic,
but looking at mountpoint(1) implementation this is far from trivial to
be done (especially for bind mounts) and it would require a bit of
're-inventing the wheel' to bring all the mountpoint/libmount helpers and
logic inside LTP; on the other side a dirty and ugly solution based on
something like tst_system("mountpoint -q <dir>") would be less portable
since would add the new mountpoint application as an LTP pre-requisite.
(and so just breaking a few CI probably without having a 'mountpoint-less'
failover mechanism)...so I just generalized the chosen names for now...
---
 testcases/kernel/containers/mountns/mountns.h  |  4 ++--
 .../kernel/containers/mountns/mountns01.c      | 18 +++++++++---------
 .../kernel/containers/mountns/mountns02.c      | 18 +++++++++---------
 .../kernel/containers/mountns/mountns03.c      | 18 +++++++++---------
 .../kernel/containers/mountns/mountns04.c      |  8 ++++----
 5 files changed, 33 insertions(+), 33 deletions(-)

Comments

Yang Xu June 21, 2022, 1:43 a.m. UTC | #1
Hi Cristian

Looks good to me,
Reviewed-by: Yang Xu <xuyang2018.jy@fujitsu.com>

Best Regards
Yang Xu

> Running LTP20220527 release it appears that the recently re-written tests
> mountns02/03/04 can now throw a warning on their final umount attempt in
> some setup:
> 
> <<<test_output>>>
> tst_test.c:1526: TINFO: Timeout per run is 0h 00m 30s
> mountns04.c:38: TPASS: unbindable mount passed
> tst_device.c:395: TWARN: umount('A') failed with EINVAL
> mountns.h:36: TWARN: umount(A) failed: EINVAL (22)
> tst_device.c:434: TINFO: No device is mounted at B
> 
> Moreover, the underlying safe_umount() then upgrades the TWARN emitted
> from tst_umount to a TBROK, so causing the test to completely fail:
> 
> Summary:
> passed   1
> failed   0
> broken   0
> skipped  0
> warnings 2
> <<<execution_status>>>
> initiation_status="ok"
> duration=0 termination_type=exited termination_id=4 corefile=no
> 
> Even though the final SAFE_UMOUNTs in the test body properly unmount the
> test created mountpoints, the final cleanup functions, that finally check
> to see if those mountpoints are still mounted, can be fooled into falsely
> thinking that test-chosen mountpoints "A" or "B" are still there: this is
> due to the fact that the internal helper tst_is_mounted() uses a simple
> strstr() on /proc/mounts to check if a directory is still mounted and
> clearly the currently test-chosen names are far too much simple, being
> one-letter, and they can be easily matched by other unrelated mountpoints
> that happen to exist on a specific setup.
> 
> Use a more peculiar naming for the test chosen mountpoints and generalize
> accordingly all the comments.
> 
> Cc: Andrea Cervesato<andrea.cervesato@suse.de>
> Cc: Cyril Hrubis<chrubis@suse.cz>
> Signed-off-by: Cristian Marussi<cristian.marussi@arm.com>
> ---
> v1 -->  v2
> - using more peculiar naming for mountpoints
> - fix comments
> - dropped previous SAFE_UMONUT removal
> 
> A better, more long term fix should be to fix/harden tst_is_mounted logic,
> but looking at mountpoint(1) implementation this is far from trivial to
> be done (especially for bind mounts) and it would require a bit of
> 're-inventing the wheel' to bring all the mountpoint/libmount helpers and
> logic inside LTP; on the other side a dirty and ugly solution based on
> something like tst_system("mountpoint -q<dir>") would be less portable
> since would add the new mountpoint application as an LTP pre-requisite.
> (and so just breaking a few CI probably without having a 'mountpoint-less'
> failover mechanism)...so I just generalized the chosen names for now...
> ---
>   testcases/kernel/containers/mountns/mountns.h  |  4 ++--
>   .../kernel/containers/mountns/mountns01.c      | 18 +++++++++---------
>   .../kernel/containers/mountns/mountns02.c      | 18 +++++++++---------
>   .../kernel/containers/mountns/mountns03.c      | 18 +++++++++---------
>   .../kernel/containers/mountns/mountns04.c      |  8 ++++----
>   5 files changed, 33 insertions(+), 33 deletions(-)
> 
> diff --git a/testcases/kernel/containers/mountns/mountns.h b/testcases/kernel/containers/mountns/mountns.h
> index ad8befa71..347f0783a 100644
> --- a/testcases/kernel/containers/mountns/mountns.h
> +++ b/testcases/kernel/containers/mountns/mountns.h
> @@ -10,8 +10,8 @@
>   #include "tst_test.h"
>   #include "lapi/namespaces_constants.h"
> 
> -#define DIRA "A"
> -#define DIRB "B"
> +#define DIRA "__DIR_A"
> +#define DIRB "__DIR_B"
> 
>   static int dummy_child(void *v)
>   {
> diff --git a/testcases/kernel/containers/mountns/mountns01.c b/testcases/kernel/containers/mountns/mountns01.c
> index 452fe1d10..e99134aba 100644
> --- a/testcases/kernel/containers/mountns/mountns01.c
> +++ b/testcases/kernel/containers/mountns/mountns01.c
> @@ -12,21 +12,21 @@
>    *
>    * [Algorithm]
>    *
> - * - Creates directories "A", "B" and files "A/A", "B/B"
> + * - Creates directories DIR_A, DIR_B and files DIR_A/"A", DIR_B/"B"
>    * - Unshares mount namespace and makes it private (so mounts/umounts have no
>    *   effect on a real system)
> - * - Bind mounts directory "A" to "A"
> - * - Makes directory "A" shared
> + * - Bind mounts directory DIR_A to DIR_A
> + * - Makes directory DIR_A shared
>    * - Clones a new child process with CLONE_NEWNS flag
>    * - There are two test cases (where X is parent namespace and Y child namespace):
>    *  1. First test case
> - *   .. X: bind mounts "B" to "A"
> - *   .. Y: must see "A/B"
> - *   .. X: umounts "A"
> + *   .. X: bind mounts DIR_B to DIR_A
> + *   .. Y: must see DIR_A/"B"
> + *   .. X: umounts DIR_A
>    *  2. Second test case
> - *   .. Y: bind mounts "B" to "A"
> - *   .. X: must see "A/B"
> - *   .. Y: umounts "A"
> + *   .. Y: bind mounts DIR_B to DIR_A
> + *   .. X: must see DIR_A/"B"
> + *   .. Y: umounts DIR_A
>    */
> 
>   #include<sys/wait.h>
> diff --git a/testcases/kernel/containers/mountns/mountns02.c b/testcases/kernel/containers/mountns/mountns02.c
> index cbd435958..258b61217 100644
> --- a/testcases/kernel/containers/mountns/mountns02.c
> +++ b/testcases/kernel/containers/mountns/mountns02.c
> @@ -12,22 +12,22 @@
>    *
>    * [Algorithm]
>    *
> - * - Creates directories "A", "B" and files "A/A", "B/B"
> + * - Creates directories DIR_A, DIR_B and files DIR_A/"A", DIR_B/"B"
>    * - Unshares mount namespace and makes it private (so mounts/umounts have no
>    *   effect on a real system)
> - * - Bind mounts directory "A" to "A"
> - * - Makes directory "A" private
> + * - Bind mounts directory DIR_A to DIR_A
> + * - Makes directory DIR_A private
>    * - Clones a new child process with CLONE_NEWNS flag
>    * - There are two test cases (where X is parent namespace and Y child
>    *   namespace):
>    *  1. First test case
> - *   .. X: bind mounts "B" to "A"
> - *   .. Y: must see "A/A" and must not see "A/B"
> - *   .. X: umounts "A"
> + *   .. X: bind mounts DIR_B to DIR_A
> + *   .. Y: must see DIR_A/"A" and must not see DIR_A/"B"
> + *   .. X: umounts DIR_A
>    *  2. Second test case
> - *   .. Y: bind mounts "B" to "A"
> - *   .. X: must see "A/A" and must not see "A/B"
> - *   .. Y: umounts A
> + *   .. Y: bind mounts DIR_B to DIR_A
> + *   .. X: must see DIR_A/"A" and must not see DIR_A/"B"
> + *   .. Y: umounts DIRA
>    */
> 
>   #include<sys/wait.h>
> diff --git a/testcases/kernel/containers/mountns/mountns03.c b/testcases/kernel/containers/mountns/mountns03.c
> index 5c19a96a9..f37ae7902 100644
> --- a/testcases/kernel/containers/mountns/mountns03.c
> +++ b/testcases/kernel/containers/mountns/mountns03.c
> @@ -12,24 +12,24 @@
>    *
>    * [Algorithm]
>    *
> - * - Creates directories "A", "B" and files "A/A", "B/B"
> + * - Creates directories DIRA, DIRB and files DIRA/"A", DIRB/"B"
>    * - Unshares mount namespace and makes it private (so mounts/umounts have no
>    *   effect on a real system)
> - * - Bind mounts directory "A" to itself
> - * - Makes directory "A" shared
> + * - Bind mounts directory DIRA to itself
> + * - Makes directory DIRA shared
>    * - Clones a new child process with CLONE_NEWNS flag and makes "A" a slave
>    *   mount
>    * - There are two testcases (where X is parent namespace and Y child
>    *   namespace):
>    *  1. First test case
> - *   .. X: bind mounts "B" to "A"
> - *   .. Y: must see the file "A/B"
> - *   .. X: umounts "A"
> + *   .. X: bind mounts DIRB to DIRA
> + *   .. Y: must see the file DIRA/"B"
> + *   .. X: umounts DIRA
>    *  2. Second test case
> - *   .. Y: bind mounts "B" to "A"
> - *   .. X: must see only the "A/A" and must not see "A/B" (as slave mount does
> + *   .. Y: bind mounts DIRB to DIRA
> + *   .. X: must see only the DIRA/"A" and must not see DIRA/"B" (as slave mount does
>    *         not forward propagation)
> - *   .. Y: umounts "A"
> + *   .. Y: umounts DIRA
>    */
> 
>   #include<sys/wait.h>
> diff --git a/testcases/kernel/containers/mountns/mountns04.c b/testcases/kernel/containers/mountns/mountns04.c
> index cc63a03d9..46937ddcd 100644
> --- a/testcases/kernel/containers/mountns/mountns04.c
> +++ b/testcases/kernel/containers/mountns/mountns04.c
> @@ -10,12 +10,12 @@
>    * Tests an unbindable mount: unbindable mount is an unbindable
>    * private mount.
>    *
> - * - Creates directories "A", "B" and files "A/A", "B/B"
> + * - Creates directories DIRA, DIRB and files DIRA/"A", DIRB/"B"
>    * - Unshares mount namespace and makes it private (so mounts/umounts have no
>    *   effect on a real system)
> - * - Bind mounts directory "A" to "A"
> - * - Makes directory "A" unbindable
> - * - Check if bind mount unbindable "A" to "B" fails as expected
> + * - Bind mounts directory DIRA to DIRA
> + * - Makes directory DIRA unbindable
> + * - Check if bind mount unbindable DIRA to DIRB fails as expected
>    */
> 
>   #include<sys/wait.h>
Joerg Vehlow June 21, 2022, 6:51 a.m. UTC | #2
Hi,

Am 6/20/2022 um 3:37 PM schrieb Cristian Marussi:
> Running LTP20220527 release it appears that the recently re-written tests
> mountns02/03/04 can now throw a warning on their final umount attempt in
> some setup:
> 
> <<<test_output>>>
> tst_test.c:1526: TINFO: Timeout per run is 0h 00m 30s
> mountns04.c:38: TPASS: unbindable mount passed
> tst_device.c:395: TWARN: umount('A') failed with EINVAL
> mountns.h:36: TWARN: umount(A) failed: EINVAL (22)
> tst_device.c:434: TINFO: No device is mounted at B
> 
> Moreover, the underlying safe_umount() then upgrades the TWARN emitted
> from tst_umount to a TBROK, so causing the test to completely fail:
> 
> Summary:
> passed   1
> failed   0
> broken   0
> skipped  0
> warnings 2
> <<<execution_status>>>
> initiation_status="ok"
> duration=0 termination_type=exited termination_id=4 corefile=no
> 
> Even though the final SAFE_UMOUNTs in the test body properly unmount the
> test created mountpoints, the final cleanup functions, that finally check
> to see if those mountpoints are still mounted, can be fooled into falsely
> thinking that test-chosen mountpoints "A" or "B" are still there: this is
> due to the fact that the internal helper tst_is_mounted() uses a simple
> strstr() on /proc/mounts to check if a directory is still mounted and
> clearly the currently test-chosen names are far too much simple, being
> one-letter, and they can be easily matched by other unrelated mountpoints
> that happen to exist on a specific setup.
> 
> Use a more peculiar naming for the test chosen mountpoints and generalize
> accordingly all the comments.
> 
> Cc: Andrea Cervesato <andrea.cervesato@suse.de>
> Cc: Cyril Hrubis <chrubis@suse.cz>
> Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
> ---
> v1 --> v2
> - using more peculiar naming for mountpoints
> - fix comments
> - dropped previous SAFE_UMONUT removal
> 
> A better, more long term fix should be to fix/harden tst_is_mounted logic,
> but looking at mountpoint(1) implementation this is far from trivial to
> be done (especially for bind mounts) and it would require a bit of
> 're-inventing the wheel' to bring all the mountpoint/libmount helpers and
> logic inside LTP; on the other side a dirty and ugly solution based on
> something like tst_system("mountpoint -q <dir>") would be less portable
> since would add the new mountpoint application as an LTP pre-requisite.
> (and so just breaking a few CI probably without having a 'mountpoint-less'
> failover mechanism)...so I just generalized the chosen names for now...
> ---
>  testcases/kernel/containers/mountns/mountns.h  |  4 ++--
>  .../kernel/containers/mountns/mountns01.c      | 18 +++++++++---------
>  .../kernel/containers/mountns/mountns02.c      | 18 +++++++++---------
>  .../kernel/containers/mountns/mountns03.c      | 18 +++++++++---------
>  .../kernel/containers/mountns/mountns04.c      |  8 ++++----
>  5 files changed, 33 insertions(+), 33 deletions(-)
> 
> diff --git a/testcases/kernel/containers/mountns/mountns.h b/testcases/kernel/containers/mountns/mountns.h
> index ad8befa71..347f0783a 100644
> --- a/testcases/kernel/containers/mountns/mountns.h
> +++ b/testcases/kernel/containers/mountns/mountns.h
> @@ -10,8 +10,8 @@
>  #include "tst_test.h"
>  #include "lapi/namespaces_constants.h"
>  
> -#define DIRA "A"
> -#define DIRB "B"
> +#define DIRA "__DIR_A"
> +#define DIRB "__DIR_B"
This is the only non-comment change. How does renaming the directories
change anything? Am I missing something?

Joerg
Joerg Vehlow June 21, 2022, 6:55 a.m. UTC | #3
Hi,

Am 6/21/2022 um 8:51 AM schrieb Joerg Vehlow:
>> ---
>>  testcases/kernel/containers/mountns/mountns.h  |  4 ++--
>>  .../kernel/containers/mountns/mountns01.c      | 18 +++++++++---------
>>  .../kernel/containers/mountns/mountns02.c      | 18 +++++++++---------
>>  .../kernel/containers/mountns/mountns03.c      | 18 +++++++++---------
>>  .../kernel/containers/mountns/mountns04.c      |  8 ++++----
>>  5 files changed, 33 insertions(+), 33 deletions(-)
>>
>> diff --git a/testcases/kernel/containers/mountns/mountns.h b/testcases/kernel/containers/mountns/mountns.h
>> index ad8befa71..347f0783a 100644
>> --- a/testcases/kernel/containers/mountns/mountns.h
>> +++ b/testcases/kernel/containers/mountns/mountns.h
>> @@ -10,8 +10,8 @@
>>  #include "tst_test.h"
>>  #include "lapi/namespaces_constants.h"
>>  
>> -#define DIRA "A"
>> -#define DIRB "B"
>> +#define DIRA "__DIR_A"
>> +#define DIRB "__DIR_B"
> This is the only non-comment change. How does renaming the directories
> change anything? Am I missing something?
Nevermind, now after I read the v1-thread, I get it..

Joerg
Cyril Hrubis June 22, 2022, 8:35 a.m. UTC | #4
Hi!
> >> --- a/testcases/kernel/containers/mountns/mountns.h
> >> +++ b/testcases/kernel/containers/mountns/mountns.h
> >> @@ -10,8 +10,8 @@
> >>  #include "tst_test.h"
> >>  #include "lapi/namespaces_constants.h"
> >>  
> >> -#define DIRA "A"
> >> -#define DIRB "B"
> >> +#define DIRA "__DIR_A"
> >> +#define DIRB "__DIR_B"
> > This is the only non-comment change. How does renaming the directories
> > change anything? Am I missing something?
> Nevermind, now after I read the v1-thread, I get it..

We tend to prefix globally visible objects with LTP_ in order to make
them unique enough and that makes them clearly recognizable as being
created by LTP as well. So maybe we should put the LTP string somewhere
in the names too.
Cristian Marussi June 22, 2022, 8:49 a.m. UTC | #5
On Wed, Jun 22, 2022 at 10:35:22AM +0200, Cyril Hrubis wrote:
> Hi!
> > >> --- a/testcases/kernel/containers/mountns/mountns.h
> > >> +++ b/testcases/kernel/containers/mountns/mountns.h
> > >> @@ -10,8 +10,8 @@
> > >>  #include "tst_test.h"
> > >>  #include "lapi/namespaces_constants.h"
> > >>  
> > >> -#define DIRA "A"
> > >> -#define DIRB "B"
> > >> +#define DIRA "__DIR_A"
> > >> +#define DIRB "__DIR_B"
> > > This is the only non-comment change. How does renaming the directories
> > > change anything? Am I missing something?
> > Nevermind, now after I read the v1-thread, I get it..
> 
> We tend to prefix globally visible objects with LTP_ in order to make
> them unique enough and that makes them clearly recognizable as being
> created by LTP as well. So maybe we should put the LTP string somewhere
> in the names too.
> 

Thanks Cyril for the review.
I'll do in v3.

Thanks,
Cristian
diff mbox series

Patch

diff --git a/testcases/kernel/containers/mountns/mountns.h b/testcases/kernel/containers/mountns/mountns.h
index ad8befa71..347f0783a 100644
--- a/testcases/kernel/containers/mountns/mountns.h
+++ b/testcases/kernel/containers/mountns/mountns.h
@@ -10,8 +10,8 @@ 
 #include "tst_test.h"
 #include "lapi/namespaces_constants.h"
 
-#define DIRA "A"
-#define DIRB "B"
+#define DIRA "__DIR_A"
+#define DIRB "__DIR_B"
 
 static int dummy_child(void *v)
 {
diff --git a/testcases/kernel/containers/mountns/mountns01.c b/testcases/kernel/containers/mountns/mountns01.c
index 452fe1d10..e99134aba 100644
--- a/testcases/kernel/containers/mountns/mountns01.c
+++ b/testcases/kernel/containers/mountns/mountns01.c
@@ -12,21 +12,21 @@ 
  *
  * [Algorithm]
  *
- * - Creates directories "A", "B" and files "A/A", "B/B"
+ * - Creates directories DIR_A, DIR_B and files DIR_A/"A", DIR_B/"B"
  * - Unshares mount namespace and makes it private (so mounts/umounts have no
  *   effect on a real system)
- * - Bind mounts directory "A" to "A"
- * - Makes directory "A" shared
+ * - Bind mounts directory DIR_A to DIR_A
+ * - Makes directory DIR_A shared
  * - Clones a new child process with CLONE_NEWNS flag
  * - There are two test cases (where X is parent namespace and Y child namespace):
  *  1. First test case
- *   .. X: bind mounts "B" to "A"
- *   .. Y: must see "A/B"
- *   .. X: umounts "A"
+ *   .. X: bind mounts DIR_B to DIR_A
+ *   .. Y: must see DIR_A/"B"
+ *   .. X: umounts DIR_A
  *  2. Second test case
- *   .. Y: bind mounts "B" to "A"
- *   .. X: must see "A/B"
- *   .. Y: umounts "A"
+ *   .. Y: bind mounts DIR_B to DIR_A
+ *   .. X: must see DIR_A/"B"
+ *   .. Y: umounts DIR_A
  */
 
 #include <sys/wait.h>
diff --git a/testcases/kernel/containers/mountns/mountns02.c b/testcases/kernel/containers/mountns/mountns02.c
index cbd435958..258b61217 100644
--- a/testcases/kernel/containers/mountns/mountns02.c
+++ b/testcases/kernel/containers/mountns/mountns02.c
@@ -12,22 +12,22 @@ 
  *
  * [Algorithm]
  *
- * - Creates directories "A", "B" and files "A/A", "B/B"
+ * - Creates directories DIR_A, DIR_B and files DIR_A/"A", DIR_B/"B"
  * - Unshares mount namespace and makes it private (so mounts/umounts have no
  *   effect on a real system)
- * - Bind mounts directory "A" to "A"
- * - Makes directory "A" private
+ * - Bind mounts directory DIR_A to DIR_A
+ * - Makes directory DIR_A private
  * - Clones a new child process with CLONE_NEWNS flag
  * - There are two test cases (where X is parent namespace and Y child
  *   namespace):
  *  1. First test case
- *   .. X: bind mounts "B" to "A"
- *   .. Y: must see "A/A" and must not see "A/B"
- *   .. X: umounts "A"
+ *   .. X: bind mounts DIR_B to DIR_A
+ *   .. Y: must see DIR_A/"A" and must not see DIR_A/"B"
+ *   .. X: umounts DIR_A
  *  2. Second test case
- *   .. Y: bind mounts "B" to "A"
- *   .. X: must see "A/A" and must not see "A/B"
- *   .. Y: umounts A
+ *   .. Y: bind mounts DIR_B to DIR_A
+ *   .. X: must see DIR_A/"A" and must not see DIR_A/"B"
+ *   .. Y: umounts DIRA
  */
 
 #include <sys/wait.h>
diff --git a/testcases/kernel/containers/mountns/mountns03.c b/testcases/kernel/containers/mountns/mountns03.c
index 5c19a96a9..f37ae7902 100644
--- a/testcases/kernel/containers/mountns/mountns03.c
+++ b/testcases/kernel/containers/mountns/mountns03.c
@@ -12,24 +12,24 @@ 
  *
  * [Algorithm]
  *
- * - Creates directories "A", "B" and files "A/A", "B/B"
+ * - Creates directories DIRA, DIRB and files DIRA/"A", DIRB/"B"
  * - Unshares mount namespace and makes it private (so mounts/umounts have no
  *   effect on a real system)
- * - Bind mounts directory "A" to itself
- * - Makes directory "A" shared
+ * - Bind mounts directory DIRA to itself
+ * - Makes directory DIRA shared
  * - Clones a new child process with CLONE_NEWNS flag and makes "A" a slave
  *   mount
  * - There are two testcases (where X is parent namespace and Y child
  *   namespace):
  *  1. First test case
- *   .. X: bind mounts "B" to "A"
- *   .. Y: must see the file "A/B"
- *   .. X: umounts "A"
+ *   .. X: bind mounts DIRB to DIRA
+ *   .. Y: must see the file DIRA/"B"
+ *   .. X: umounts DIRA
  *  2. Second test case
- *   .. Y: bind mounts "B" to "A"
- *   .. X: must see only the "A/A" and must not see "A/B" (as slave mount does
+ *   .. Y: bind mounts DIRB to DIRA
+ *   .. X: must see only the DIRA/"A" and must not see DIRA/"B" (as slave mount does
  *         not forward propagation)
- *   .. Y: umounts "A"
+ *   .. Y: umounts DIRA
  */
 
 #include <sys/wait.h>
diff --git a/testcases/kernel/containers/mountns/mountns04.c b/testcases/kernel/containers/mountns/mountns04.c
index cc63a03d9..46937ddcd 100644
--- a/testcases/kernel/containers/mountns/mountns04.c
+++ b/testcases/kernel/containers/mountns/mountns04.c
@@ -10,12 +10,12 @@ 
  * Tests an unbindable mount: unbindable mount is an unbindable
  * private mount.
  *
- * - Creates directories "A", "B" and files "A/A", "B/B"
+ * - Creates directories DIRA, DIRB and files DIRA/"A", DIRB/"B"
  * - Unshares mount namespace and makes it private (so mounts/umounts have no
  *   effect on a real system)
- * - Bind mounts directory "A" to "A"
- * - Makes directory "A" unbindable
- * - Check if bind mount unbindable "A" to "B" fails as expected
+ * - Bind mounts directory DIRA to DIRA
+ * - Makes directory DIRA unbindable
+ * - Check if bind mount unbindable DIRA to DIRB fails as expected
  */
 
 #include <sys/wait.h>