diff options
Diffstat (limited to 'fs/sysfs/dir.c')
-rw-r--r-- | fs/sysfs/dir.c | 16 |
1 files changed, 11 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) |