sysfs: Add support for tagged directories with untagged members.
authorEric W. Biederman <ebiederm@maxwell.aristanetworks.com>
Tue, 30 Mar 2010 18:31:27 +0000 (11:31 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 21 May 2010 16:37:31 +0000 (09:37 -0700)
I had hopped to avoid this but the bonding driver adds a file
to /sys/class/net/  and the easiest way to handle that file is
to make it untagged and to register it only once.

So relax the rules on tagged directories, and make bonding work.

Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fs/sysfs/dir.c
fs/sysfs/inode.c

index b2b83067ccc89405696a432638710f913e55e5f9..a63eb4ba7867069e580e3964de49b5cbb50b0011 100644 (file)
@@ -383,12 +383,6 @@ int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
        if (sysfs_find_dirent(acxt->parent_sd, sd->s_ns, sd->s_name))
                return -EEXIST;
 
-       if (sysfs_ns_type(acxt->parent_sd) && !sd->s_ns) {
-               WARN(1, KERN_WARNING "sysfs: ns required in '%s' for '%s'\n",
-                       acxt->parent_sd->s_name, sd->s_name);
-               return -EINVAL;
-       }
-
        sd->s_parent = sysfs_get(acxt->parent_sd);
 
        sysfs_link_sibling(sd);
@@ -545,7 +539,7 @@ struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd,
        struct sysfs_dirent *sd;
 
        for (sd = parent_sd->s_dir.children; sd; sd = sd->s_sibling) {
-               if (sd->s_ns != ns)
+               if (ns && sd->s_ns && (sd->s_ns != ns))
                        continue;
                if (!strcmp(sd->s_name, name))
                        return sd;
@@ -879,7 +873,7 @@ static struct sysfs_dirent *sysfs_dir_pos(const void *ns,
                while (pos && (ino > pos->s_ino))
                        pos = pos->s_sibling;
        }
-       while (pos && pos->s_ns != ns)
+       while (pos && pos->s_ns && pos->s_ns != ns)
                pos = pos->s_sibling;
        return pos;
 }
@@ -890,7 +884,7 @@ static struct sysfs_dirent *sysfs_dir_next_pos(const void *ns,
        pos = sysfs_dir_pos(ns, parent_sd, ino, pos);
        if (pos)
                pos = pos->s_sibling;
-       while (pos && pos->s_ns != ns)
+       while (pos && pos->s_ns && pos->s_ns != ns)
                pos = pos->s_sibling;
        return pos;
 }
index cf2bad1462ea2d03dad0630f1f175ff93c85f374..bbd77e95cf7f7d6babe801fcac345d7cfcd7599f 100644 (file)
@@ -335,6 +335,8 @@ int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const void *ns, const cha
        sysfs_addrm_start(&acxt, dir_sd);
 
        sd = sysfs_find_dirent(dir_sd, ns, name);
+       if (sd && (sd->s_ns != ns))
+               sd = NULL;
        if (sd)
                sysfs_remove_one(&acxt, sd);