diff options
-rw-r--r-- | fs/sysfs/dir.c | 16 | ||||
-rw-r--r-- | fs/sysfs/inode.c | 1 | ||||
-rw-r--r-- | fs/sysfs/mount.c | 1 | ||||
-rw-r--r-- | fs/sysfs/sysfs.h | 1 |
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 | ||
33 | static unsigned int sysfs_inode_counter; | ||
34 | ino_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 | ||
38 | static void sysfs_clear_inode(struct inode *inode) | 39 | static 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; |