diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-03-08 16:03:10 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-03-08 16:03:10 -0500 |
commit | 54d20f006ceff1f2f1e69d0e54049b6c0765c039 (patch) | |
tree | e2418ba2f9ee4830d4fc3e16599189b8e1256899 | |
parent | 7b60a18da393ed70db043a777fd9e6d5363077c4 (diff) |
Revert "sysfs: Kill nlink counting."
This reverts commit 524b6c5b39b931311dfe5a2f5abae2f5c9731676.
It has shown to break userspace tools, which is not acceptable.
Reported-by: Jiri Slaby <jslaby@suse.cz>
Cc: Eric W. Biederman <ebiederm@xmission.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | fs/sysfs/dir.c | 6 | ||||
-rw-r--r-- | fs/sysfs/inode.c | 3 | ||||
-rw-r--r-- | fs/sysfs/sysfs.h | 1 |
3 files changed, 10 insertions, 0 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index dd3779cf3a3b..2a7a3f5d1ca6 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
@@ -91,6 +91,9 @@ static int sysfs_link_sibling(struct sysfs_dirent *sd) | |||
91 | struct rb_node **node = &sd->s_parent->s_dir.children.rb_node; | 91 | struct rb_node **node = &sd->s_parent->s_dir.children.rb_node; |
92 | struct rb_node *parent = NULL; | 92 | struct rb_node *parent = NULL; |
93 | 93 | ||
94 | if (sysfs_type(sd) == SYSFS_DIR) | ||
95 | sd->s_parent->s_dir.subdirs++; | ||
96 | |||
94 | while (*node) { | 97 | while (*node) { |
95 | struct sysfs_dirent *pos; | 98 | struct sysfs_dirent *pos; |
96 | int result; | 99 | int result; |
@@ -123,6 +126,9 @@ static int sysfs_link_sibling(struct sysfs_dirent *sd) | |||
123 | */ | 126 | */ |
124 | static void sysfs_unlink_sibling(struct sysfs_dirent *sd) | 127 | static void sysfs_unlink_sibling(struct sysfs_dirent *sd) |
125 | { | 128 | { |
129 | if (sysfs_type(sd) == SYSFS_DIR) | ||
130 | sd->s_parent->s_dir.subdirs--; | ||
131 | |||
126 | rb_erase(&sd->s_rb, &sd->s_parent->s_dir.children); | 132 | rb_erase(&sd->s_rb, &sd->s_parent->s_dir.children); |
127 | } | 133 | } |
128 | 134 | ||
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index cc7ea5de2fdd..feb2d69396cf 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c | |||
@@ -217,6 +217,9 @@ static void sysfs_refresh_inode(struct sysfs_dirent *sd, struct inode *inode) | |||
217 | iattrs->ia_secdata, | 217 | iattrs->ia_secdata, |
218 | iattrs->ia_secdata_len); | 218 | iattrs->ia_secdata_len); |
219 | } | 219 | } |
220 | |||
221 | if (sysfs_type(sd) == SYSFS_DIR) | ||
222 | set_nlink(inode, sd->s_dir.subdirs + 2); | ||
220 | } | 223 | } |
221 | 224 | ||
222 | int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) | 225 | int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) |
diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h index 6289a00287db..661a9639570b 100644 --- a/fs/sysfs/sysfs.h +++ b/fs/sysfs/sysfs.h | |||
@@ -19,6 +19,7 @@ struct sysfs_open_dirent; | |||
19 | struct sysfs_elem_dir { | 19 | struct sysfs_elem_dir { |
20 | struct kobject *kobj; | 20 | struct kobject *kobj; |
21 | 21 | ||
22 | unsigned long subdirs; | ||
22 | /* children rbtree starts here and goes through sd->s_rb */ | 23 | /* children rbtree starts here and goes through sd->s_rb */ |
23 | struct rb_root children; | 24 | struct rb_root children; |
24 | }; | 25 | }; |