From 366f59003a54891bc5bfcac5ae0b52d26f45ccaf Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Mon, 11 Jun 2007 14:02:45 +0900 Subject: [PATCH] --- yaml --- r: 57599 b: refs/heads/master c: dc351252b33f8fede396d6173dba117bcb933607 h: refs/heads/master i: 57597: 0eac01f44aa54d7df79e0ab6c79017c8e11a493d 57595: 816f57f9fb3f9e776bde5f798551704180bbf010 57591: ed5f4a6ea35f775eda142872960a9553e6f575c2 57583: dccd25aa0c41af49a0a0d4b8772150561efe6fab 57567: b2795480bc8734259a1bfaee6a66add37128713b 57535: b17c0d0898eb898b763b7a482ecfad67d37820ee 57471: e52d192fd95f1602bf5b6b5d72b516f65a15f6a4 57343: f802f7a104b9d0892ea2759fee445440f015ed2e v: v3 --- [refs] | 2 +- trunk/fs/sysfs/dir.c | 16 +++++++++++----- trunk/fs/sysfs/inode.c | 1 + trunk/fs/sysfs/mount.c | 1 + trunk/fs/sysfs/sysfs.h | 1 + 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index c403da9c70bc..33dca9a2715e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 99f9f3d49cbc7d944476f6fde53a77ec789ab2aa +refs/heads/master: dc351252b33f8fede396d6173dba117bcb933607 diff --git a/trunk/fs/sysfs/dir.c b/trunk/fs/sysfs/dir.c index 85a668680f82..17a819151b91 100644 --- a/trunk/fs/sysfs/dir.c +++ b/trunk/fs/sysfs/dir.c @@ -30,6 +30,14 @@ static struct dentry_operations sysfs_dentry_ops = { .d_iput = sysfs_d_iput, }; +static unsigned int sysfs_inode_counter; +ino_t sysfs_get_inum(void) +{ + if (unlikely(sysfs_inode_counter < 3)) + sysfs_inode_counter = 3; + return sysfs_inode_counter++; +} + /* * Allocates a new sysfs_dirent and links it to the parent sysfs_dirent */ @@ -41,6 +49,7 @@ static struct sysfs_dirent * __sysfs_new_dirent(void * element) if (!sd) return NULL; + sd->s_ino = sysfs_get_inum(); atomic_set(&sd->s_count, 1); atomic_set(&sd->s_event, 1); INIT_LIST_HEAD(&sd->s_children); @@ -509,7 +518,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) switch (i) { case 0: - ino = dentry->d_inode->i_ino; + ino = parent_sd->s_ino; if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0) break; filp->f_pos++; @@ -538,10 +547,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) name = sysfs_get_name(next); len = strlen(name); - if (next->s_dentry) - ino = next->s_dentry->d_inode->i_ino; - else - ino = iunique(sysfs_sb, 2); + ino = next->s_ino; if (filldir(dirent, name, len, filp->f_pos, ino, dt_type(next)) < 0) diff --git a/trunk/fs/sysfs/inode.c b/trunk/fs/sysfs/inode.c index bdd30e74de6b..082e2d430e93 100644 --- a/trunk/fs/sysfs/inode.c +++ b/trunk/fs/sysfs/inode.c @@ -141,6 +141,7 @@ struct inode * sysfs_new_inode(mode_t mode, struct sysfs_dirent * sd) inode->i_mapping->a_ops = &sysfs_aops; inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info; inode->i_op = &sysfs_inode_operations; + inode->i_ino = sd->s_ino; lockdep_set_class(&inode->i_mutex, &sysfs_inode_imutex_key); if (sd->s_iattr) { diff --git a/trunk/fs/sysfs/mount.c b/trunk/fs/sysfs/mount.c index 23a48a38e6af..00ab9125d398 100644 --- a/trunk/fs/sysfs/mount.c +++ b/trunk/fs/sysfs/mount.c @@ -33,6 +33,7 @@ static struct sysfs_dirent sysfs_root = { .s_element = NULL, .s_type = SYSFS_ROOT, .s_iattr = NULL, + .s_ino = 1, }; static void sysfs_clear_inode(struct inode *inode) diff --git a/trunk/fs/sysfs/sysfs.h b/trunk/fs/sysfs/sysfs.h index a77c57e5a6d5..1966e1a0a015 100644 --- a/trunk/fs/sysfs/sysfs.h +++ b/trunk/fs/sysfs/sysfs.h @@ -5,6 +5,7 @@ struct sysfs_dirent { void * s_element; int s_type; umode_t s_mode; + ino_t s_ino; struct dentry * s_dentry; struct iattr * s_iattr; atomic_t s_event;