Thread (3 messages) 3 messages, 3 authors, 2016-07-11

Re: [CRIU] Introspecting userns relationships to other namespaces?

From: Andrew Vagin <hidden>
Date: 2016-07-11 21:09:37
Also in: lkml

On Mon, Jul 11, 2016 at 06:06:48AM +0900, James Bottomley wrote:
On Sun, 2016-07-10 at 15:29 -0500, Eric W. Biederman wrote:
quoted
Andrew Vagin [off-list ref] writes:
quoted
On Fri, Jul 08, 2016 at 10:13:08PM -0500, Eric W. Biederman wrote:
quoted
"W. Trevor King" [off-list ref] writes:
quoted
On Thu, Jul 07, 2016 at 08:01:52AM -0700, James Bottomley
wrote:
quoted
In theory, we could get nsfs to show this information as an
option
(just add a show_options entry to the superblock ops), but
the
problem is that although each namespace has a parent user_ns,
there's no way to get it without digging in the namespace
specific
structure.  Probably we should restructure to move it into
ns_common, then we could display it (and enforce all
namespaces
having owning user_ns) but it would be a reasonably large
(but
mechanical) change.
It sounds like everyone is either positive or or neutral on
this
groundwork, even if we haven't decided if/how to expose the
information to userspace.  I'm happy to work up a patch while
the rest
of the discussion continues.  I'm also happy to let someone
else work
up the patch, if anyone else is chomping at the bit ;).
I am dubious on moving all of the user namespace members into
ns_common.

I would happy to be proved wrong but I suspect in the cases where
we
actually use that user namespace the code will become uglier. 
 Making
the ordinary uses uglier to make a rare corner case nicer is the
wrong
trade off.

But feel free to try it is certainly worth doing if it doesn't
make the
code that uses the user namespaces uglier.
If it's interesting for someone, I have this patch in my tree
https://github.com/avagin/linux-task-diag/commit/63b32df68ae8d3a384
2bae42bbcae3468db76d85

I can't say that it makes something uglier.
I have only skimmed things but overall it looks better than I had
feared.
It looks about as messy as I feared, but since someone else has done
all the hard work, I'm happy.
quoted
At the same time I really really don't like losing the parent pointer 
in the user namespace case.  That is seriously obfuscating.
We can do something like this:
@@ -27,11 +27,13 @@ struct user_namespace {
...
-       struct ns_common        ns;
+       union {
+               struct user_namespace   *parent;
+               struct ns_common        ns;
+       };
        unsigned long           flags;
...
@@ -97,6 +97,7 @@ int create_user_ns(struct cred *new)
...
        atomic_set(&ns->count, 1);
        /* Leave the new->user_ns reference with the new user namespace. */
+       BUILD_BUG_ON(&ns->ns.user_ns != &ns->parent);
        ns->parent = parent_ns;
Because it has a slightly different meaning from all other namespaces? 
 If I assume that's what you mean, I think looking at it in a different
way can solve the problem:  The pointer in ns_common is always to the
owning user_ns, so we can label it as such.  Even for a child user_ns,
the owning user_ns is simply the parent.  I think it makes logical
sense to think of all user_ns to namespace relationships as
owning/owned rather than most as owning/owned and some as parent/child.
I think we can rename ns.user_ns to ns.owner or ns.owner_ns.


Thanks,
Andrew
James
quoted
Eric

_______________________________________________
Containers mailing list
Containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help