From 7b114135c8e7265883bd51f5790d292694b768d6 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 8 Mar 2012 13:03:10 -0800 Subject: [PATCH] --- yaml --- r: 288891 b: refs/heads/master c: 54d20f006ceff1f2f1e69d0e54049b6c0765c039 h: refs/heads/master i: 288889: ad36d9e58a57d79e85575de1b3ebb85c8045472c 288887: b46875912973e581d4d44548ef2f5ac4c6a54534 v: v3 --- [refs] | 2 +- trunk/fs/sysfs/dir.c | 6 ++++++ trunk/fs/sysfs/inode.c | 3 +++ trunk/fs/sysfs/sysfs.h | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index c771037bc8e2..25fbd3afbd90 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7b60a18da393ed70db043a777fd9e6d5363077c4 +refs/heads/master: 54d20f006ceff1f2f1e69d0e54049b6c0765c039 diff --git a/trunk/fs/sysfs/dir.c b/trunk/fs/sysfs/dir.c index dd3779cf3a3b..2a7a3f5d1ca6 100644 --- a/trunk/fs/sysfs/dir.c +++ b/trunk/fs/sysfs/dir.c @@ -91,6 +91,9 @@ static int sysfs_link_sibling(struct sysfs_dirent *sd) struct rb_node **node = &sd->s_parent->s_dir.children.rb_node; struct rb_node *parent = NULL; + if (sysfs_type(sd) == SYSFS_DIR) + sd->s_parent->s_dir.subdirs++; + while (*node) { struct sysfs_dirent *pos; int result; @@ -123,6 +126,9 @@ static int sysfs_link_sibling(struct sysfs_dirent *sd) */ static void sysfs_unlink_sibling(struct sysfs_dirent *sd) { + if (sysfs_type(sd) == SYSFS_DIR) + sd->s_parent->s_dir.subdirs--; + rb_erase(&sd->s_rb, &sd->s_parent->s_dir.children); } diff --git a/trunk/fs/sysfs/inode.c b/trunk/fs/sysfs/inode.c index cc7ea5de2fdd..feb2d69396cf 100644 --- a/trunk/fs/sysfs/inode.c +++ b/trunk/fs/sysfs/inode.c @@ -217,6 +217,9 @@ static void sysfs_refresh_inode(struct sysfs_dirent *sd, struct inode *inode) iattrs->ia_secdata, iattrs->ia_secdata_len); } + + if (sysfs_type(sd) == SYSFS_DIR) + set_nlink(inode, sd->s_dir.subdirs + 2); } int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) diff --git a/trunk/fs/sysfs/sysfs.h b/trunk/fs/sysfs/sysfs.h index 6289a00287db..661a9639570b 100644 --- a/trunk/fs/sysfs/sysfs.h +++ b/trunk/fs/sysfs/sysfs.h @@ -19,6 +19,7 @@ struct sysfs_open_dirent; struct sysfs_elem_dir { struct kobject *kobj; + unsigned long subdirs; /* children rbtree starts here and goes through sd->s_rb */ struct rb_root children; };