Skip to content

Commit

Permalink
sysfs: Add support for tagged directories with untagged members.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Eric W. Biederman authored and Greg Kroah-Hartman committed May 21, 2010
1 parent 3ff195b commit af10ec7
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 9 deletions.
12 changes: 3 additions & 9 deletions fs/sysfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down
2 changes: 2 additions & 0 deletions fs/sysfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit af10ec7

Please sign in to comment.