driver core fixes for .35-git
PATCH 1/1 driver core fixes for .35-git
Here's 3 sysfs bugfixes for your .35-rc git tree. These all fix up regressions that people have reported due to the network namespace changes to sysfs for the .35 release.
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git/
All of these patches have been in the linux-next and mm trees.
The patches will be sent as a follow-on to this message to lkml for people to see.
thanks,
greg k-h
------------
fs/sysfs/symlink.c | 26 ++++++++++++++++++++------ 1 files changed, 20 insertions(+), 6 deletions(-)
---------------
Eric W. Biederman (3):
sysfs: Don't allow the creation of symlinks we can't remove
sysfs: sysfs_delete_link handle symlinks from untagged to tagged directories.
sysfs: allow creating symlinks from untagged to tagged directories
PATCH 1/3 sysfs: Don't allow the creation of symlinks we can't remove
From: Eric W. Biederman <[email protected]>
Recently my tagged sysfs support revealed a flaw in the device core that a few rare drivers are running into such that we don't always put network devices in a class subdirectory named net/.
Since we are not creating the class directory the network devices wind up in a non-tagged directory, but the symlinks to the network devices from /sys/class/net are in a tagged directory. All of which works until we go to remove or rename the symlink. When we remove or rename a symlink we look in the namespace of the target of the symlink. Since the target of the symlink is in a non-tagged sysfs directory we don't have a namespace to look in, and we fail to remove the symlink.
Detect this problem up front and simply don't create symlinks we won't be able to remove later. This prevents symlink leakage and fails in a much clearer and more understandable way.
--- fs/sysfs/symlink.c | 23 ++++++++++++++++++----- 1 files changed, 18 insertions(+), 5 deletions(-)
fs/sysfs/symlink.c +18 -5
@@ -28,6 +28,7 @@ static int sysfs_do_create_link(struct kobject *kobj, struct kobject *target,struct sysfs_dirent *target_sd =NULL ;struct sysfs_dirent *sd =NULL ;struct sysfs_addrm_cxt acxt; +enum kobj_ns_type ns_type;int error;BUG_ON (!name);
@@ -58,16 +59,28 @@ static int sysfs_do_create_link(struct kobject *kobj, struct kobject *target,if (!sd) goto out_put; -if (sysfs_ns_type (parent_sd)) + ns_type =sysfs_ns_type (parent_sd); +if (ns_type) sd->s_ns = target->ktype->namespace (target); sd->s_symlink.target_sd = target_sd; target_sd =NULL ;/* reference is now owned by the symlink */ sysfs_addrm_start (&acxt, parent_sd); -if (warn) - error =sysfs_add_one (&acxt, sd); -else - error =__sysfs_add_one (&acxt, sd); +/* Symlinks must be between directories with the same ns_type */ +if (ns_type ==sysfs_ns_type (sd->s_symlink.target_sd->s_parent)) { +if (warn) + error =sysfs_add_one (&acxt, sd); +else + error =__sysfs_add_one (&acxt, sd); + }else { + error = -EINVAL ; +WARN (1 ,KERN_WARNING +"sysfs: symlink across ns_types %s/%s -> %s/%s\n" , + parent_sd->s_name, + sd->s_name, + sd->s_symlink.target_sd->s_parent->s_name, + sd->s_symlink.target_sd->s_name); + }sysfs_addrm_finish (&acxt);if (error)
Signature · 1 line
1.7.2
PATCH 2/3 sysfs: sysfs_delete_link handle symlinks from untagged to tagged directories.
In reply to Greg KHFrom: Eric W. Biederman <[email protected]>
This happens for network devices when SYSFS_DEPRECATED is enabled.
--- fs/sysfs/symlink.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
fs/sysfs/symlink.c +1 -1
@@ -135,7 +135,7 @@ void sysfs_delete_link(struct kobject *kobj, struct kobject *targ, {const void *ns =NULL ;spin_lock (&sysfs_assoc_lock); -if (targ->sd) +if (targ->sd &&sysfs_ns_type (kobj->sd)) ns = targ->sd->s_ns;spin_unlock (&sysfs_assoc_lock);sysfs_hash_and_remove (kobj->sd, ns, name);
Signature · 1 line
1.7.2
PATCH 3/3 sysfs: allow creating symlinks from untagged to tagged directories
In reply to Greg KHFrom: Eric W. Biederman <[email protected]>
Supporting symlinks from untagged to tagged directories is reasonable, and needed to support CONFIG_SYSFS_DEPRECATED. So don't fail a prior allowing that case to work.
--- fs/sysfs/symlink.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
fs/sysfs/symlink.c +2 -1
@@ -67,7 +67,8 @@ static int sysfs_do_create_link(struct kobject *kobj, struct kobject *target,sysfs_addrm_start (&acxt, parent_sd);/* Symlinks must be between directories with the same ns_type */ -if (ns_type ==sysfs_ns_type (sd->s_symlink.target_sd->s_parent)) { +if (!ns_type || + (ns_type ==sysfs_ns_type (sd->s_symlink.target_sd->s_parent))) {if (warn) error =sysfs_add_one (&acxt, sd);else
Signature · 1 line
1.7.2