aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/sysfs/dir.c16
-rw-r--r--fs/sysfs/inode.c1
-rw-r--r--fs/sysfs/mount.c1
-rw-r--r--fs/sysfs/sysfs.h1
4 files changed, 14 insertions, 5 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
index 85a668680f82..17a819151b91 100644
--- a/fs/sysfs/dir.c
+++ b/fs/sysfs/dir.c
@@ -30,6 +30,14 @@ static struct dentry_operations sysfs_dentry_ops = {
30 .d_iput = sysfs_d_iput, 30 .d_iput = sysfs_d_iput,
31}; 31};
32 32
33static unsigned int sysfs_inode_counter;
34ino_t sysfs_get_inum(void)
35{
36 if (unlikely(sysfs_inode_counter < 3))
37 sysfs_inode_counter = 3;
38 return sysfs_inode_counter++;
39}
40
33/* 41/*
34 * Allocates a new sysfs_dirent and links it to the parent sysfs_dirent 42 * Allocates a new sysfs_dirent and links it to the parent sysfs_dirent
35 */ 43 */
@@ -41,6 +49,7 @@ static struct sysfs_dirent * __sysfs_new_dirent(void * element)
41 if (!sd) 49 if (!sd)
42 return NULL; 50 return NULL;
43 51
52 sd->s_ino = sysfs_get_inum();
44 atomic_set(&sd->s_count, 1); 53 atomic_set(&sd->s_count, 1);
45 atomic_set(&sd->s_event, 1); 54 atomic_set(&sd->s_event, 1);
46 INIT_LIST_HEAD(&sd->s_children); 55 INIT_LIST_HEAD(&sd->s_children);
@@ -509,7 +518,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
509 518
510 switch (i) { 519 switch (i) {
511 case 0: 520 case 0:
512 ino = dentry->d_inode->i_ino; 521 ino = parent_sd->s_ino;
513 if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0) 522 if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0)
514 break; 523 break;
515 filp->f_pos++; 524 filp->f_pos++;
@@ -538,10 +547,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
538 547
539 name = sysfs_get_name(next); 548 name = sysfs_get_name(next);
540 len = strlen(name); 549 len = strlen(name);
541 if (next->s_dentry) 550 ino = next->s_ino;
542 ino = next->s_dentry->d_inode->i_ino;
543 else
544 ino = iunique(sysfs_sb, 2);
545 551
546 if (filldir(dirent, name, len, filp->f_pos, ino, 552 if (filldir(dirent, name, len, filp->f_pos, ino,
547 dt_type(next)) < 0) 553 dt_type(next)) < 0)
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c
index bdd30e74de6b..082e2d430e93 100644
--- a/fs/sysfs/inode.c
+++ b/fs/sysfs/inode.c
@@ -141,6 +141,7 @@ struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent * sd)
141 inode->i_mapping->a_ops = &sysfs_aops; 141 inode->i_mapping->a_ops = &sysfs_aops;
142 inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info; 142 inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info;
143 inode->i_op = &sysfs_inode_operations; 143 inode->i_op = &sysfs_inode_operations;
144 inode->i_ino = sd->s_ino;
144 lockdep_set_class(&inode->i_mutex, &sysfs_inode_imutex_key); 145 lockdep_set_class(&inode->i_mutex, &sysfs_inode_imutex_key);
145 146
146 if (sd->s_iattr) { 147 if (sd->s_iattr) {
diff --git a/fs/sysfs/mount.c b/fs/sysfs/mount.c
index 23a48a38e6af..00ab9125d398 100644
--- a/fs/sysfs/mount.c
+++ b/fs/sysfs/mount.c
@@ -33,6 +33,7 @@ static struct sysfs_dirent sysfs_root = {
33 .s_element = NULL, 33 .s_element = NULL,
34 .s_type = SYSFS_ROOT, 34 .s_type = SYSFS_ROOT,
35 .s_iattr = NULL, 35 .s_iattr = NULL,
36 .s_ino = 1,
36}; 37};
37 38
38static void sysfs_clear_inode(struct inode *inode) 39static void sysfs_clear_inode(struct inode *inode)
diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h
index a77c57e5a6d5..1966e1a0a015 100644
--- a/fs/sysfs/sysfs.h
+++ b/fs/sysfs/sysfs.h
@@ -5,6 +5,7 @@ struct sysfs_dirent {
5 void * s_element; 5 void * s_element;
6 int s_type; 6 int s_type;
7 umode_t s_mode; 7 umode_t s_mode;
8 ino_t s_ino;
8 struct dentry * s_dentry; 9 struct dentry * s_dentry;
9 struct iattr * s_iattr; 10 struct iattr * s_iattr;
10 atomic_t s_event; 11 atomic_t s_event;