Hello, Eric. On 03/31/2010 06:39 PM, Eric W. Biederman wrote: > Let me try a happy median between overwhelming and too little > information by giving you some experts, and a bit of overview. > > (Ugh after have writing this I certainly will agree that we > have some many layers in the device model that they become > obfuscating abstractions). Yeah, exactly, and this patchset is pushing it further with no documentation and indirections to high heavens. As someone who doesn't have much experience with namespaces, I can't make much sense of this patchset and it obfuscates the whole kobject thing more and that's a bad direction to be heading toward. > Looking through my code there are 3 types of callbacks. > - Callbacks to the namespace type of a children. > .child_ns_type Can you please also explain the relationships among kobjects, ns_types and NSes? > - Callbacks to find the namespace of a kobject. > .namespace > - Callbacks on the a namespace type to find the namespace > of a particular context. > .current_ns > .initial_ns (not used in my patchset) > .netlink_ns (not used in my patchset) > > In a world of weird explicitness I expect .child_ns_type and > .namespace could be made to go away by pushing through explicit > ns_type, and namespace parameters everywhere. But that seems > like an awful lot of unnecessary code churn and bloat with > the only real advantage being that we have an abstraction > stored explicit at each layer. * How much churn would it be? I would be willing to trade quite a bit if the following can go away. The sheer amount of indirection there scares me a lot. struct kobj_type { ... const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj); ... }; * Is it necessary to teach kobject layer the concept of namespaces? Wouldn't it be possible to let kobject and sysfs deal with tags and make namespaces use them? > static int kobj_bcast_filter(struct sock *dest_sk, struct sk_buff *skb, void *data) > { > struct kobject *kobj = data; > const struct kobj_ns_type_operations *ops; > > ops = kobj_ns_ops(kobj); > if (ops) { > const void *sock_ns, *ns; > ns = kobj->ktype->namespace(kobj); > sock_ns = ops->netlink_ns(dsk); > return sock_ns != ns; > } > > return 0; > } > > initial_ns is used to figure out what the initial/default > namespace is for a class of namespaces. We only report > with /sbin/hotplug events in the initial network namespace. > At least for now. > > static int kobj_usermode_filter(struct kobject *kobj) > { > const struct kobj_ns_type_operations *ops; > > ops = kobj_ns_ops(kobj); > if (ops) { > const void *init_ns, *ns; > ns = kobj->ktype->namespace(kobj); > init_ns = ops->initial_ns(); > return ns != init_ns; > } > > return 0; > } I can understand you would need two different ways of establishing the accessor depending on the mode of access (file IO or netlink) but can initial_ns ever be dynamic? Can't it just be void *inital_ns instead of a callback? Thanks. -- tejun -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html