----- Original Message -----
> From: "Jiri Jaburek" <jjabu...@redhat.com>
> To: "Jan Stancek" <jstan...@redhat.com>
> Cc: "Matus Marhefka" <mmarh...@redhat.com>, ltp-list@lists.sourceforge.net
> Sent: Friday, 12 September, 2014 3:41:25 PM
> Subject: Re: [LTP] [PATCH 1/2 v2] containers: added mountns/mountns03.c
> 
> On 09/12/2014 02:59 PM, Jan Stancek wrote:
> > 
> > 
> > ----- Original Message -----
> >> From: "Jiri Jaburek" <jjabu...@redhat.com>
> >> To: "Matus Marhefka" <mmarh...@redhat.com>
> >> Cc: ltp-list@lists.sourceforge.net, "Jan Stancek" <jstan...@redhat.com>
> >> Sent: Thursday, 11 September, 2014 5:09:46 PM
> >> Subject: Re: [LTP] [PATCH 1/2 v2] containers: added mountns/mountns03.c
> > 
> >>>> +++ b/testcases/kernel/containers/mountns/mountns03.c
> >>>> @@ -0,0 +1,245 @@
> >>>> +/* Copyright (c) 2014 Red Hat, Inc.
> >>>> + *
> >>>> + * This program is free software: you can redistribute it and/or modify
> >>>> + * it under the terms of version 2 the GNU General Public License as
> >>>> + * published by the Free Software Foundation.
> >>>> + *
> >>>> + * 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/>.
> >>>> +
> >>>> ***********************************************************************
> >>>> + * File: mountns03.c
> >>>> + *
> >>>> + * Tests a slave mount: slave mount is like a shared mount except that
> >>>> + * mount and umount events only propagate towards it.
> >>>> + * Description:
> >>>> + * 1. Creates directories "A", "B", "C", "D" and files "A/A", "B/B"
> >>>> + *    "C/C", "D/D"
> >>>> + * 2. Unshares mount namespace and makes it private (so mounts/umounts
> >>>> + *    have no effect on a real system)
> >>>
> >>> Hi,
> >>>
> >>>> + * 3. Bind mounts directory "A" to "A" and "B" to "B"
> >>>
> >>> is the "B" to "B" part necessary in this case? First thing child does is
> >>> it mounts A to B.
> >>>
> >>>> + * 4. Makes both directories ("A" and "B") shared
> >>>
> >>> related to above, is it necessary to make B shared?
> >>
> >> The obvious answer would be "yes", because ...
> > 
> > (atm. replying to this part only)
> > 
> > If you don't make B shared in parent, doesn't a bind operation in child
> > make
> > it shared regardless? You are bind mounting a shared mount to non-shared
> > one.
> 
> No, not really. Consider the following situation:
> 
>     parent  |  child
> ------------+-----------
> A (shared)  | A (shared)
> B (private) | B (shared)
> 
> (that is, you unshare a mount namespace from the parent and do
> MS_SHARED on B in the child)
> 
> The "sharedness" of B isn't propagated to the parent...

I was not implying it is. My point was that after bind in child,
mount "B" receives and forwards event propagations with mount "A" in parent.

> 
> The rule of thumb is that a private mountpoint cannot be affected by
> other (mount) namespaces. In this case, if the child were to spawn its
> own child, it would share B with it, but the original parent would still
> have its own B.
> 
> IOW bind mounting A to B in the child in the situation illustrated above
> would not affect the parent.
> 
> > 
> >    
> > ---------------------------------------------------------------------------
> >    |         BIND MOUNT OPERATION
> >    |         |
> >    
> > |**************************************************************************
> >    |source(A)->| shared       |       private  |       slave    |
> >    |unbindable |
> >    | dest(B)  |               |                |                |
> >    | |
> >    |   |      |               |                |                |           
> >  |
> >    |   v      |               |                |                |
> >    |   |
> >    
> > |**************************************************************************
> >    |  shared  | shared        |     shared     | shared & slave |  invalid
> >    |  |
> >    |          |               |                |                |           
> >  |
> >    |non-shared| shared        |      private   |      slave     |  invalid
> >    ||
> >    
> > ***************************************************************************
> 
> True, the mountpoint in the child is changed from private to shared,
> but such operation doesn't affect the private mountpoint of the parent.

I agree - I don't think we care what happens with "B" in parent, when test
is about "A".

> 
> > I modified the mountns03 testcase, so it doesn't bind and make B shared,
> > consider following strace output:
> > 
> > unshare(CLONE_NEWNS)                    = 0
> > mount("none", "/", "none", MS_REC|MS_PRIVATE, NULL) = 0
> > mount("A", "A", 0x407ab0, MS_BIND, NULL) = 0  --> bind mounts directory "A"
> > to "A"
> > mount("none", "A", "none", MS_SHARED, NULL) = 0  --> make "A" shared
> > access("A/C", F_OK)                     = -1 ENOENT (No such file or
> > directory)  --> there's no C file in "A"
> > clone(child_stack=0x2597030, flags=CLONE_NEWNS|SIGCHLD) = 2396
> > read(3, Process 2396 attached
> >  <unfinished ...>
> > [pid  2396] getpid()                    = 2396
> > [pid  2396] mount("A", "B", 0x407ab0, MS_BIND, NULL) = 0  --> bind shared
> > mount "A" to "B"
> 
> ... making B the same as A, so anything on B done directly on A.
> 
> > [pid  2396] mount("C", "B", 0x407ab0, MS_BIND, NULL) = 0  --> bind mount
> > "C" to "B"
> 
> ... which is essentially bind mount C to A.
> 
> > [pid  2396] write(4, "0", 1 <unfinished ...>
> > [pid  2394] <... read resumed> "0", 1)  = 1
> > [pid  2394] access("A/C", F_OK)         = 0  --> parent can see file "C" in
> > "A"
> 
> Indeed, but only because A was shared by the parent. This means the
> child can affect it in any way (bind mount any number of additional
> mountpoints to it, umount it, etc.). If you bind-mounted B to B and
> made it private, it would retain its B/B file.
> 
> The test works likely due to reasons I mentioned before,
> 
> On 09/11/2014 05:09 PM, Jiri Jaburek wrote:
> > This raises a question
> > - why do you need B at all? Why not do MS_SLAVE on A? In this sense,
> > B (child) is not a slave of B (parent), but a slave of A (parent), with
> > B (parent) being slave of A (parent) due to the shared propagation.
> 
> Meaning that B could be entirely omitted, because it's not used for
> anything in the parent, therefore it doesn't matter whether you
> bind-mount it or not. Meaning, in essence, that you were originally
> correct. :)
> 
> I would like to help Matus with this test case when he gets back to it.

Looking at the discussion this triggered, the more simple we can make it, the 
better :-)

Regards,
Jan

> 
> 
> I'm personally not a namespace kernel developer, so I may be wrong,
> but my testing using multiple shells + mount(8) seems to confirm my
> theories.
> 
> Jiri
> 
> 

------------------------------------------------------------------------------
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to