From: ebiederm@xmission.com (Eric W. Biederman)
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.cz>, Greg KH <greg@kroah.com>,
Alan Cox <alan@lxorguk.ukuu.org.uk>,
LKML <linux-kernel@vger.kernel.org>,
Al Viro <viro@zeniv.linux.org.uk>,
Linus Torvalds <torvalds@linux-foundation.org>,
Maciej Rutecki <maciej.rutecki@gmail.com>
Subject: [PATCH] sysfs: Optionally count subdirectories to support buggy applications
Date: Wed, 01 Feb 2012 14:21:59 -0800 [thread overview]
Message-ID: <m1ehueyz20.fsf_-_@fess.ebiederm.org> (raw)
In-Reply-To: <m1wr87ywex.fsf@fess.ebiederm.org> (Eric W. Biederman's message of "Tue, 31 Jan 2012 21:06:46 -0800")
lm_sensors and possibly other applications get confused if all sysfs
directories return nlink == 1. The lm_sensors code that got confused
was just wrong and a fixed version of lm_sensors should be released
shortly.
There may be other applications that have problems with sysfs return
nlink == 1 for directories. To allow people to continue to use old
versions of userspace with new kernels add to sysfs a compile time
option to maintain mostly precise directory counts for those people who
don't mind the cost.
I have moved where we keep nlink in sysfs_dirent as compared to previous
versions of subdirectory counting to a location that packs better.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
---
fs/sysfs/Kconfig | 15 +++++++++++++++
fs/sysfs/dir.c | 8 ++++++++
fs/sysfs/inode.c | 2 ++
fs/sysfs/sysfs.h | 38 ++++++++++++++++++++++++++++++++++++++
4 files changed, 63 insertions(+), 0 deletions(-)
diff --git a/fs/sysfs/Kconfig b/fs/sysfs/Kconfig
index 8c41fea..9b403e9 100644
--- a/fs/sysfs/Kconfig
+++ b/fs/sysfs/Kconfig
@@ -21,3 +21,18 @@ config SYSFS
example, "root=03:01" for /dev/hda1.
Designers of embedded systems may wish to say N here to conserve space.
+
+config SYSFS_COUNT_LINKS
+ bool "sysfs count subdirectoires to support buggy applications"
+ default n
+ help
+
+ Increase the memory and cpu untilization of sysfs by maintaining
+ by maintaining a count of how hard links from subdirectories a
+ directory has. This allows sysfs to report the directory nlink
+ as the number of subdirectories plus two. With out this enabled
+ sysfs will report the nlink of all directories as 1, which is
+ the standard way of indicating that the number of subdirectoires
+ is not tracked.
+
+ Unless you know you need this say N here.
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
index dd3779c..f30df7c 100644
--- a/fs/sysfs/dir.c
+++ b/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)
+ sysfs_inc_nlink(sd->s_parent);
+
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)
+ sysfs_dec_nlink(sd->s_parent);
+
rb_erase(&sd->s_rb, &sd->s_parent->s_dir.children);
}
@@ -367,6 +373,8 @@ struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type)
sd->s_mode = mode;
sd->s_flags = type;
+ sysfs_init_nlink(sd);
+
return sd;
err_out2:
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c
index 4291fd1..782c66a 100644
--- a/fs/sysfs/inode.c
+++ b/fs/sysfs/inode.c
@@ -216,6 +216,8 @@ static void sysfs_refresh_inode(struct sysfs_dirent *sd, struct inode *inode)
iattrs->ia_secdata,
iattrs->ia_secdata_len);
}
+
+ set_nlink(inode, sysfs_read_nlink(sd));
}
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 6289a00..4603506 100644
--- a/fs/sysfs/sysfs.h
+++ b/fs/sysfs/sysfs.h
@@ -69,6 +69,9 @@ struct sysfs_dirent {
const void *s_ns; /* namespace tag */
unsigned int s_hash; /* ns + name hash */
+#ifdef CONFIG_SYSFS_COUNT_LINKS
+ unsigned int s_nlink;
+#endif
union {
struct sysfs_elem_dir s_dir;
struct sysfs_elem_symlink s_symlink;
@@ -127,6 +130,41 @@ do { \
#define sysfs_dirent_init_lockdep(sd) do {} while(0)
#endif
+#ifdef CONFIG_SYSFS_COUNT_LINKS
+static inline void sysfs_init_nlink(struct sysfs_dirent *sd)
+{
+ if (sysfs_type(sd) == SYSFS_DIR)
+ sd->s_nlink = 2;
+ else
+ sd->s_nlink = 1;
+}
+static inline void sysfs_inc_nlink(struct sysfs_dirent *sd)
+{
+ sd->s_nlink++;
+}
+static inline void sysfs_dec_nlink(struct sysfs_dirent *sd)
+{
+ sd->s_nlink++;
+}
+static inline unsigned int sysfs_read_nlink(struct sysfs_dirent *sd)
+{
+ return sd->s_nlink;
+}
+#else
+static inline void sysfs_init_nlink(struct sysfs_dirent *sd)
+{
+}
+static inline void sysfs_inc_nlink(struct sysfs_dirent *sd)
+{
+}
+static inline void sysfs_dec_nlink(struct sysfs_dirent *sd)
+{
+}
+static inline unsigned int sysfs_read_nlink(struct sysfs_dirent *sd)
+{
+ return 1;
+}
+#endif
/*
* Context structure to be used while adding/removing nodes.
*/
--
1.7.2.5
next prev parent reply other threads:[~2012-02-01 22:19 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-30 21:56 sysfs regression: wrong link counts Jiri Slaby
2012-01-30 22:06 ` Greg KH
2012-01-30 22:10 ` Alan Cox
2012-01-30 22:27 ` Greg KH
2012-01-30 22:43 ` Al Viro
2012-01-30 22:56 ` Al Viro
2012-01-31 1:27 ` Eric W. Biederman
2012-01-31 10:48 ` Jiri Slaby
2012-01-31 12:44 ` Eric W. Biederman
2012-01-31 16:45 ` Linus Torvalds
2012-01-31 19:18 ` Al Viro
2012-02-01 5:06 ` Eric W. Biederman
2012-02-01 22:21 ` Eric W. Biederman [this message]
2012-02-01 22:24 ` [PATCH] sysfs: Optionally count subdirectories to support buggy applications Greg Kroah-Hartman
2012-02-01 22:44 ` Eric W. Biederman
2012-02-01 22:49 ` Greg Kroah-Hartman
2012-02-01 22:31 ` Dave Jones
2012-02-01 22:35 ` Jiri Slaby
2012-02-01 23:15 ` Linus Torvalds
2012-02-01 23:18 ` Linus Torvalds
2012-02-02 1:22 ` Al Viro
2012-02-02 21:24 ` [RFC] killing boilerplate checks in ->link/->mkdir/->rename Al Viro
2012-02-02 23:46 ` Linus Torvalds
2012-02-03 1:16 ` Al Viro
2012-02-03 1:45 ` Al Viro
2012-02-03 2:00 ` Linus Torvalds
2012-02-03 14:57 ` Chris Mason
2012-02-03 17:08 ` Al Viro
2012-02-03 19:34 ` Artem Bityutskiy
2012-02-06 8:50 ` Artem Bityutskiy
2012-02-06 13:56 ` Al Viro
2012-02-06 17:05 ` Artem Bityutskiy
2012-02-06 17:11 ` Al Viro
2012-02-07 7:21 ` Artem Bityutskiy
2012-02-06 22:49 ` Dave Chinner
2012-02-03 8:25 ` Andreas Dilger
2012-02-03 17:03 ` Al Viro
2012-02-04 7:42 ` Andreas Dilger
2012-03-05 13:30 ` [PATCH] sysfs: Optionally count subdirectories to support buggy applications Jiri Slaby
2012-03-05 16:09 ` Greg Kroah-Hartman
2012-03-05 16:47 ` Linus Torvalds
2012-03-08 21:05 ` Greg Kroah-Hartman
2012-03-08 22:18 ` Eric W. Biederman
2012-03-08 23:40 ` Linus Torvalds
2012-03-08 21:28 ` Eric W. Biederman
2012-03-08 21:34 ` [PATCH 1/3] sysfs: Compact sysfs_dirent s_flags into a byte Eric W. Biederman
2012-03-08 21:36 ` [PATCH 2/3] sysfs: Maintain usable nlink directory counts Eric W. Biederman
2012-03-08 21:37 ` [PATCH 3/3] sysfs: Remove SYSFS_FLAG_REMOVED and use sd->s_nlink == 0 instead Eric W. Biederman
2012-03-09 3:40 ` Linus Torvalds
2012-03-08 22:28 ` [PATCH 1/3] sysfs: Compact sysfs_dirent s_flags into a byte Greg Kroah-Hartman
2012-03-09 2:49 ` Eric W. Biederman
2012-01-31 3:45 ` sysfs regression: wrong link counts Eric W. Biederman
2012-01-31 11:54 ` Alan Cox
2012-01-30 22:52 ` Kay Sievers
2012-01-31 10:41 ` network regression: cannot rename netdev twice Jiri Slaby
2012-01-31 10:52 ` Kay Sievers
2012-01-31 11:00 ` Jiri Slaby
2012-01-31 11:13 ` Kay Sievers
2012-01-31 11:17 ` Jiri Slaby
2012-01-31 11:58 ` Kay Sievers
2012-01-31 14:18 ` Eric W. Biederman
2012-01-31 14:40 ` [PATCH] sysfs: Update the name hash when renaming sysfs entries Eric W. Biederman
2012-01-31 14:41 ` Jiri Slaby
2012-01-31 14:55 ` Greg KH
2012-02-04 2:14 ` network regression: cannot rename netdev twice Henrique de Moraes Holschuh
2012-02-06 20:03 ` Kay Sievers
2012-02-08 2:00 ` Henrique de Moraes Holschuh
2012-02-08 3:50 ` Kay Sievers
2012-02-08 6:42 ` Valdis.Kletnieks
2012-02-08 10:57 ` Kay Sievers
2012-02-08 20:06 ` Valdis.Kletnieks
2012-02-08 20:27 ` Stephen Hemminger
2012-02-08 23:48 ` Kay Sievers
2012-01-31 1:32 ` sysfs regression: wrong link counts Eric W. Biederman
2012-02-01 18:29 ` Maciej Rutecki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m1ehueyz20.fsf_-_@fess.ebiederm.org \
--to=ebiederm@xmission.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=greg@kroah.com \
--cc=gregkh@linuxfoundation.org \
--cc=jslaby@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=maciej.rutecki@gmail.com \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).