aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sysfs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/sysfs/inode.c')
-rw-r--r--fs/sysfs/inode.c24
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 */
167struct inode * sysfs_new_inode(struct sysfs_dirent *sd) 169struct 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);