diff options
Diffstat (limited to 'fs/sysfs/inode.c')
-rw-r--r-- | fs/sysfs/inode.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index 26d8503c8997..3eab9c46a71b 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c | |||
@@ -153,10 +153,12 @@ void sysfs_init_inode(struct sysfs_dirent *sd, struct inode *inode) | |||
153 | } | 153 | } |
154 | 154 | ||
155 | /** | 155 | /** |
156 | * sysfs_new_inode - allocate new inode for sysfs_dirent | 156 | * sysfs_get_inode - get inode for sysfs_dirent |
157 | * @sd: sysfs_dirent to allocate inode for | 157 | * @sd: sysfs_dirent to allocate inode for |
158 | * | 158 | * |
159 | * Allocate inode for @sd and initialize basics. | 159 | * Get inode for @sd. If such inode doesn't exist, a new inode |
160 | * is allocated and basics are initialized. New inode is | ||
161 | * returned locked. | ||
160 | * | 162 | * |
161 | * LOCKING: | 163 | * LOCKING: |
162 | * Kernel thread context (may sleep). | 164 | * Kernel thread context (may sleep). |
@@ -164,12 +166,12 @@ void sysfs_init_inode(struct sysfs_dirent *sd, struct inode *inode) | |||
164 | * RETURNS: | 166 | * RETURNS: |
165 | * Pointer to allocated inode on success, NULL on failure. | 167 | * Pointer to allocated inode on success, NULL on failure. |
166 | */ | 168 | */ |
167 | struct inode * sysfs_new_inode(struct sysfs_dirent *sd) | 169 | struct inode * sysfs_get_inode(struct sysfs_dirent *sd) |
168 | { | 170 | { |
169 | struct inode *inode; | 171 | struct inode *inode; |
170 | 172 | ||
171 | inode = new_inode(sysfs_sb); | 173 | inode = iget_locked(sysfs_sb, sd->s_ino); |
172 | if (inode) | 174 | if (inode && (inode->i_state & I_NEW)) |
173 | sysfs_init_inode(sd, inode); | 175 | sysfs_init_inode(sd, inode); |
174 | 176 | ||
175 | return inode; | 177 | return inode; |
@@ -180,7 +182,7 @@ struct inode * sysfs_new_inode(struct sysfs_dirent *sd) | |||
180 | * @dentry: dentry to be instantiated | 182 | * @dentry: dentry to be instantiated |
181 | * @inode: inode associated with @sd | 183 | * @inode: inode associated with @sd |
182 | * | 184 | * |
183 | * Instantiate @dentry with @inode. | 185 | * Unlock @inode if locked and instantiate @dentry with @inode. |
184 | * | 186 | * |
185 | * LOCKING: | 187 | * LOCKING: |
186 | * None. | 188 | * None. |
@@ -189,9 +191,13 @@ void sysfs_instantiate(struct dentry *dentry, struct inode *inode) | |||
189 | { | 191 | { |
190 | BUG_ON(!dentry || dentry->d_inode); | 192 | BUG_ON(!dentry || dentry->d_inode); |
191 | 193 | ||
192 | if (dentry->d_parent && dentry->d_parent->d_inode) { | 194 | if (inode->i_state & I_NEW) { |
193 | struct inode *p_inode = dentry->d_parent->d_inode; | 195 | unlock_new_inode(inode); |
194 | p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME; | 196 | |
197 | if (dentry->d_parent && dentry->d_parent->d_inode) { | ||
198 | struct inode *p_inode = dentry->d_parent->d_inode; | ||
199 | p_inode->i_mtime = p_inode->i_ctime = CURRENT_TIME; | ||
200 | } | ||
195 | } | 201 | } |
196 | 202 | ||
197 | d_instantiate(dentry, inode); | 203 | d_instantiate(dentry, inode); |