From: <gregkh@suse•de>
To: ebiederm@xmission•com, bcrl@lhnet•ca, cornelia.huck@de•ibm.com,
eric.dumazet@gmail•com, gregkh@suse•de, kay.sievers@vrfy•org,
netdev@vger•kernel.org, serue@us•ibm.com, tj@kernel•org
Subject: patch kobj-add-basic-infrastructure-for-dealing-with-namespaces.patch added to gregkh-2.6 tree
Date: Thu, 29 Apr 2010 13:29:01 -0700 [thread overview]
Message-ID: <12725729413705@kroah.org> (raw)
In-Reply-To: <1269973889-25260-2-git-send-email-ebiederm@xmission.com>
This is a note to let you know that I've just added the patch titled
Subject: kobj: Add basic infrastructure for dealing with namespaces.
to my gregkh-2.6 tree. Its filename is
kobj-add-basic-infrastructure-for-dealing-with-namespaces.patch
This tree can be found at
http://www.kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/patches/
>From ebiederm@xmission•com Thu Apr 29 12:44:32 2010
From: "Eric W. Biederman" <ebiederm@xmission•com>
Date: Tue, 30 Mar 2010 11:31:25 -0700
Subject: kobj: Add basic infrastructure for dealing with namespaces.
To: Greg Kroah-Hartman <gregkh@suse•de>
Cc: Kay Sievers <kay.sievers@vrfy•org>, linux-kernel@vger•kernel.org, Tejun Heo <tj@kernel•org>, Cornelia Huck <cornelia.huck@de•ibm.com>, linux-fsdevel@vger•kernel.org, Eric Dumazet <eric.dumazet@gmail•com>, Benjamin LaHaise <bcrl@lhnet•ca>, Serge Hallyn <serue@us•ibm.com>, <netdev@vger•kernel.org>, "Eric W. Biederman" <ebiederm@xmission•com>
Message-ID: <1269973889-25260-2-git-send-email-ebiederm@xmission•com>
From: Eric W. Biederman <ebiederm@xmission•com>
Move complete knowledge of namespaces into the kobject layer
so we can use that information when reporting kobjects to
userspace.
Signed-off-by: Eric W. Biederman <ebiederm@xmission•com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse•de>
---
drivers/base/class.c | 9 ++++
drivers/base/core.c | 77 +++++++++++++++++++++++++++++------
include/linux/device.h | 3 +
include/linux/kobject.h | 26 ++++++++++++
lib/kobject.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 204 insertions(+), 14 deletions(-)
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -63,6 +63,14 @@ static void class_release(struct kobject
kfree(cp);
}
+static const struct kobj_ns_type_operations *class_child_ns_type(struct kobject *kobj)
+{
+ struct class_private *cp = to_class(kobj);
+ struct class *class = cp->class;
+
+ return class->ns_type;
+}
+
static const struct sysfs_ops class_sysfs_ops = {
.show = class_attr_show,
.store = class_attr_store,
@@ -71,6 +79,7 @@ static const struct sysfs_ops class_sysf
static struct kobj_type class_ktype = {
.sysfs_ops = &class_sysfs_ops,
.release = class_release,
+ .child_ns_type = class_child_ns_type,
};
/* Hotplug events for classes go to the class class_subsys */
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -131,9 +131,21 @@ static void device_release(struct kobjec
kfree(p);
}
+static const void *device_namespace(struct kobject *kobj)
+{
+ struct device *dev = to_dev(kobj);
+ const void *ns = NULL;
+
+ if (dev->class && dev->class->ns_type)
+ ns = dev->class->namespace(dev);
+
+ return ns;
+}
+
static struct kobj_type device_ktype = {
.release = device_release,
.sysfs_ops = &dev_sysfs_ops,
+ .namespace = device_namespace,
};
@@ -595,11 +607,59 @@ static struct kobject *virtual_device_pa
return virtual_dir;
}
-static struct kobject *get_device_parent(struct device *dev,
- struct device *parent)
+struct class_dir {
+ struct kobject kobj;
+ struct class *class;
+};
+
+#define to_class_dir(obj) container_of(obj, struct class_dir, kobj)
+
+static void class_dir_release(struct kobject *kobj)
+{
+ struct class_dir *dir = to_class_dir(kobj);
+ kfree(dir);
+}
+
+static const
+struct kobj_ns_type_operations *class_dir_child_ns_type(struct kobject *kobj)
+{
+ struct class_dir *dir = to_class_dir(kobj);
+ return dir->class->ns_type;
+}
+
+static struct kobj_type class_dir_ktype = {
+ .release = class_dir_release,
+ .sysfs_ops = &kobj_sysfs_ops,
+ .child_ns_type = class_dir_child_ns_type
+};
+
+static struct kobject *
+class_dir_create_and_add(struct class *class, struct kobject *parent_kobj)
{
+ struct class_dir *dir;
int retval;
+ dir = kzalloc(sizeof(*dir), GFP_KERNEL);
+ if (!dir)
+ return NULL;
+
+ dir->class = class;
+ kobject_init(&dir->kobj, &class_dir_ktype);
+
+ dir->kobj.kset = &class->p->class_dirs;
+
+ retval = kobject_add(&dir->kobj, parent_kobj, "%s", class->name);
+ if (retval < 0) {
+ kobject_put(&dir->kobj);
+ return NULL;
+ }
+ return &dir->kobj;
+}
+
+
+static struct kobject *get_device_parent(struct device *dev,
+ struct device *parent)
+{
if (dev->class) {
static DEFINE_MUTEX(gdp_mutex);
struct kobject *kobj = NULL;
@@ -634,18 +694,7 @@ static struct kobject *get_device_parent
}
/* or create a new class-directory at the parent device */
- k = kobject_create();
- if (!k) {
- mutex_unlock(&gdp_mutex);
- return NULL;
- }
- k->kset = &dev->class->p->class_dirs;
- retval = kobject_add(k, parent_kobj, "%s", dev->class->name);
- if (retval < 0) {
- mutex_unlock(&gdp_mutex);
- kobject_put(k);
- return NULL;
- }
+ k = class_dir_create_and_add(dev->class, parent_kobj);
/* do not emit an uevent for this simple "glue" directory */
mutex_unlock(&gdp_mutex);
return k;
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -202,6 +202,9 @@ struct class {
int (*suspend)(struct device *dev, pm_message_t state);
int (*resume)(struct device *dev);
+ const struct kobj_ns_type_operations *ns_type;
+ const void *(*namespace)(struct device *dev);
+
const struct dev_pm_ops *pm;
struct class_private *p;
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -108,6 +108,8 @@ struct kobj_type {
void (*release)(struct kobject *kobj);
const struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
+ const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
+ const void *(*namespace)(struct kobject *kobj);
};
struct kobj_uevent_env {
@@ -134,6 +136,30 @@ struct kobj_attribute {
extern const struct sysfs_ops kobj_sysfs_ops;
+enum kobj_ns_type {
+ KOBJ_NS_TYPE_NONE = 0,
+ KOBJ_NS_TYPES
+};
+
+struct sock;
+struct kobj_ns_type_operations {
+ enum kobj_ns_type type;
+ const void *(*current_ns)(void);
+ const void *(*netlink_ns)(struct sock *sk);
+ const void *(*initial_ns)(void);
+};
+
+int kobj_ns_type_register(const struct kobj_ns_type_operations *ops);
+int kobj_ns_type_registered(enum kobj_ns_type type);
+const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent);
+const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj);
+
+const void *kobj_ns_current(enum kobj_ns_type type);
+const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk);
+const void *kobj_ns_initial(enum kobj_ns_type type);
+void kobj_ns_exit(enum kobj_ns_type type, const void *ns);
+
+
/**
* struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
*
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -850,6 +850,109 @@ struct kset *kset_create_and_add(const c
}
EXPORT_SYMBOL_GPL(kset_create_and_add);
+
+static DEFINE_SPINLOCK(kobj_ns_type_lock);
+static const struct kobj_ns_type_operations *kobj_ns_ops_tbl[KOBJ_NS_TYPES];
+
+int kobj_ns_type_register(const struct kobj_ns_type_operations *ops)
+{
+ enum kobj_ns_type type = ops->type;
+ int error;
+
+ spin_lock(&kobj_ns_type_lock);
+
+ error = -EINVAL;
+ if (type >= KOBJ_NS_TYPES)
+ goto out;
+
+ error = -EINVAL;
+ if (type <= KOBJ_NS_TYPE_NONE)
+ goto out;
+
+ error = -EBUSY;
+ if (kobj_ns_ops_tbl[type])
+ goto out;
+
+ error = 0;
+ kobj_ns_ops_tbl[type] = ops;
+
+out:
+ spin_unlock(&kobj_ns_type_lock);
+ return error;
+}
+
+int kobj_ns_type_registered(enum kobj_ns_type type)
+{
+ int registered = 0;
+
+ spin_lock(&kobj_ns_type_lock);
+ if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES))
+ registered = kobj_ns_ops_tbl[type] != NULL;
+ spin_unlock(&kobj_ns_type_lock);
+
+ return registered;
+}
+
+const struct kobj_ns_type_operations *kobj_child_ns_ops(struct kobject *parent)
+{
+ const struct kobj_ns_type_operations *ops = NULL;
+
+ if (parent && parent->ktype->child_ns_type)
+ ops = parent->ktype->child_ns_type(parent);
+
+ return ops;
+}
+
+const struct kobj_ns_type_operations *kobj_ns_ops(struct kobject *kobj)
+{
+ return kobj_child_ns_ops(kobj->parent);
+}
+
+
+const void *kobj_ns_current(enum kobj_ns_type type)
+{
+ const void *ns = NULL;
+
+ spin_lock(&kobj_ns_type_lock);
+ if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
+ kobj_ns_ops_tbl[type])
+ ns = kobj_ns_ops_tbl[type]->current_ns();
+ spin_unlock(&kobj_ns_type_lock);
+
+ return ns;
+}
+
+const void *kobj_ns_netlink(enum kobj_ns_type type, struct sock *sk)
+{
+ const void *ns = NULL;
+
+ spin_lock(&kobj_ns_type_lock);
+ if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
+ kobj_ns_ops_tbl[type])
+ ns = kobj_ns_ops_tbl[type]->netlink_ns(sk);
+ spin_unlock(&kobj_ns_type_lock);
+
+ return ns;
+}
+
+const void *kobj_ns_initial(enum kobj_ns_type type)
+{
+ const void *ns = NULL;
+
+ spin_lock(&kobj_ns_type_lock);
+ if ((type > KOBJ_NS_TYPE_NONE) && (type < KOBJ_NS_TYPES) &&
+ kobj_ns_ops_tbl[type])
+ ns = kobj_ns_ops_tbl[type]->initial_ns();
+ spin_unlock(&kobj_ns_type_lock);
+
+ return ns;
+}
+
+void kobj_ns_exit(enum kobj_ns_type type, const void *ns)
+{
+}
+
+
EXPORT_SYMBOL(kobject_get);
EXPORT_SYMBOL(kobject_put);
EXPORT_SYMBOL(kobject_del);
next prev parent reply other threads:[~2010-04-30 17:08 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-30 18:30 [PATCH 0/6] tagged sysfs support Eric W. Biederman
2010-03-30 18:31 ` [PATCH 1/6] sysfs: Basic support for multiple super blocks Eric W. Biederman
2010-03-30 19:23 ` Eric Dumazet
2010-03-30 23:50 ` [PATCH 7/6] sysfs: Remove double free sysfs_get_sb Eric W. Biederman
2010-03-31 5:01 ` [PATCH 1/6] sysfs: Basic support for multiple super blocks Serge E. Hallyn
2010-03-31 5:01 ` Serge E. Hallyn
2010-03-31 5:41 ` Tejun Heo
2010-03-31 5:51 ` Eric W. Biederman
2010-03-31 13:47 ` Serge E. Hallyn
2010-03-31 14:02 ` Eric W. Biederman
2010-04-05 7:45 ` Tejun Heo
2010-04-29 20:29 ` patch sysfs-basic-support-for-multiple-super-blocks.patch added to gregkh-2.6 tree gregkh
2010-03-30 18:31 ` [PATCH 2/6] kobj: Add basic infrastructure for dealing with namespaces Eric W. Biederman
2010-04-29 20:29 ` gregkh [this message]
2010-03-30 18:31 ` [PATCH 3/6] sysfs: Implement sysfs tagged directory support Eric W. Biederman
2010-03-31 2:43 ` Serge E. Hallyn
2010-03-31 3:38 ` Eric W. Biederman
2010-03-31 4:02 ` Serge E. Hallyn
2010-03-31 4:23 ` Eric W. Biederman
2010-03-31 4:53 ` Serge E. Hallyn
2010-03-31 6:49 ` Tejun Heo
2010-03-31 7:43 ` Eric W. Biederman
2010-03-31 8:17 ` Tejun Heo
2010-03-31 8:22 ` Tejun Heo
2010-03-31 9:39 ` Eric W. Biederman
2010-04-05 8:17 ` Tejun Heo
2010-04-29 20:29 ` patch sysfs-implement-sysfs-tagged-directory-support.patch added to gregkh-2.6 tree gregkh
2010-04-30 4:18 ` Tejun Heo
2010-04-30 4:45 ` Greg KH
2010-04-30 5:24 ` Eric W. Biederman
2010-04-30 5:37 ` Tejun Heo
2010-04-30 6:12 ` Tejun Heo
2010-04-30 14:29 ` Serge E. Hallyn
2010-04-30 15:22 ` Tejun Heo
2010-04-30 15:43 ` Serge E. Hallyn
2010-04-30 15:58 ` Greg KH
2010-03-30 18:31 ` [PATCH 4/6] sysfs: Add support for tagged directories with untagged members Eric W. Biederman
2010-04-29 20:29 ` patch sysfs-add-support-for-tagged-directories-with-untagged-members.patch added to gregkh-2.6 tree gregkh
2010-03-30 18:31 ` [PATCH 5/6] sysfs: Implement sysfs_delete_link Eric W. Biederman
2010-04-29 20:29 ` patch sysfs-implement-sysfs_delete_link.patch added to gregkh-2.6 tree gregkh
2010-03-30 18:31 ` [PATCH 6/6] driver core: Implement ns directory support for device classes Eric W. Biederman
2010-04-29 20:29 ` patch driver-core-implement-ns-directory-support-for-device-classes.patch added to gregkh-2.6 tree gregkh
2010-03-30 18:53 ` [PATCH 0/6] tagged sysfs support Kay Sievers
2010-03-30 23:04 ` Eric W. Biederman
2010-03-31 5:51 ` Kay Sievers
2010-03-31 6:25 ` Tejun Heo
2010-03-31 6:52 ` Eric W. Biederman
2010-04-03 0:58 ` Ben Hutchings
2010-04-03 8:35 ` Kay Sievers
2010-04-03 16:05 ` Ben Hutchings
2010-04-03 16:35 ` Kay Sievers
2010-03-31 17:21 ` Serge E. Hallyn
2010-03-31 18:09 ` Eric W. Biederman
2010-05-05 0:35 ` [PATCH 0/6] netns support in the kobject layer Eric W. Biederman
2010-05-06 20:04 ` Greg KH
2010-05-16 6:26 ` David Miller
2010-05-17 18:11 ` Greg KH
2010-05-17 20:58 ` Eric W. Biederman
2010-05-17 21:03 ` Greg KH
2010-05-17 22:37 ` Eric W. Biederman
2010-05-17 22:54 ` Greg KH
2010-05-17 23:48 ` David Miller
2010-05-18 4:08 ` Greg KH
2010-05-18 4:21 ` David Miller
2010-05-05 0:36 ` [PATCH 1/6] kobject: Send hotplug events in all network namespaces Eric W. Biederman
2010-05-20 18:10 ` patch kobject-send-hotplug-events-in-all-network-namespaces.patch added to gregkh-2.6 tree gregkh
2010-05-05 0:36 ` [PATCH 2/6] netns: Teach network device kobjects which namespace they are in Eric W. Biederman
2010-05-05 15:17 ` Serge E. Hallyn
2010-05-05 19:56 ` Eric W. Biederman
2010-05-05 22:01 ` Serge E. Hallyn
2010-05-17 4:59 ` [PATCH 7/6] net/sysfs: Fix the bitrot in network device kobject namespace support Eric W. Biederman
2010-05-17 5:07 ` David Miller
2010-05-20 18:10 ` patch netns-teach-network-device-kobjects-which-namespace-they-are-in.patch added to gregkh-2.6 tree gregkh
2010-05-05 0:36 ` [PATCH 3/6] netlink: Implment netlink_broadcast_filtered Eric W. Biederman
2010-05-20 18:10 ` patch netlink-implment-netlink_broadcast_filtered.patch added to gregkh-2.6 tree gregkh
2010-05-05 0:36 ` [PATCH 4/6] kobj: Send hotplug events in the proper namespace Eric W. Biederman
2010-05-20 18:10 ` patch kobj-send-hotplug-events-in-the-proper-namespace.patch added to gregkh-2.6 tree gregkh
2010-05-05 0:36 ` [PATCH 5/6] hotplug: netns aware uevent_helper Eric W. Biederman
2010-05-20 18:10 ` patch hotplug-netns-aware-uevent_helper.patch added to gregkh-2.6 tree gregkh
2010-05-05 0:36 ` [PATCH 6/6] net: Expose all network devices in a namespaces in sysfs Eric W. Biederman
2010-05-20 18:10 ` patch net-expose-all-network-devices-in-a-namespaces-in-sysfs.patch added to gregkh-2.6 tree gregkh
2010-05-20 17:47 ` [PATCH 0/6] tagged sysfs support Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=12725729413705@kroah.org \
--to=gregkh@suse$(echo .)de \
--cc=bcrl@lhnet$(echo .)ca \
--cc=cornelia.huck@de$(echo .)ibm.com \
--cc=ebiederm@xmission$(echo .)com \
--cc=eric.dumazet@gmail$(echo .)com \
--cc=kay.sievers@vrfy$(echo .)org \
--cc=netdev@vger$(echo .)kernel.org \
--cc=serue@us$(echo .)ibm.com \
--cc=tj@kernel$(echo .)org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox