diff options
Diffstat (limited to 'fs/sysfs/dir.c')
-rw-r--r-- | fs/sysfs/dir.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index aedaeba82ae5..3a05a596e3b4 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
@@ -370,17 +370,17 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt, | |||
370 | memset(acxt, 0, sizeof(*acxt)); | 370 | memset(acxt, 0, sizeof(*acxt)); |
371 | acxt->parent_sd = parent_sd; | 371 | acxt->parent_sd = parent_sd; |
372 | 372 | ||
373 | /* Lookup parent inode. inode initialization and I_NEW | 373 | /* Lookup parent inode. inode initialization is protected by |
374 | * clearing are protected by sysfs_mutex. By grabbing it and | 374 | * sysfs_mutex, so inode existence can be determined by |
375 | * looking up with _nowait variant, inode state can be | 375 | * looking up inode while holding sysfs_mutex. |
376 | * determined reliably. | ||
377 | */ | 376 | */ |
378 | mutex_lock(&sysfs_mutex); | 377 | mutex_lock(&sysfs_mutex); |
379 | 378 | ||
380 | inode = ilookup5_nowait(sysfs_sb, parent_sd->s_ino, sysfs_ilookup_test, | 379 | inode = ilookup5(sysfs_sb, parent_sd->s_ino, sysfs_ilookup_test, |
381 | parent_sd); | 380 | parent_sd); |
381 | if (inode) { | ||
382 | WARN_ON(inode->i_state & I_NEW); | ||
382 | 383 | ||
383 | if (inode && !(inode->i_state & I_NEW)) { | ||
384 | /* parent inode available */ | 384 | /* parent inode available */ |
385 | acxt->parent_inode = inode; | 385 | acxt->parent_inode = inode; |
386 | 386 | ||
@@ -393,8 +393,7 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt, | |||
393 | mutex_lock(&inode->i_mutex); | 393 | mutex_lock(&inode->i_mutex); |
394 | mutex_lock(&sysfs_mutex); | 394 | mutex_lock(&sysfs_mutex); |
395 | } | 395 | } |
396 | } else | 396 | } |
397 | iput(inode); | ||
398 | } | 397 | } |
399 | 398 | ||
400 | /** | 399 | /** |
@@ -636,6 +635,7 @@ struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, | |||
636 | 635 | ||
637 | return sd; | 636 | return sd; |
638 | } | 637 | } |
638 | EXPORT_SYMBOL_GPL(sysfs_get_dirent); | ||
639 | 639 | ||
640 | static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd, | 640 | static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd, |
641 | const char *name, struct sysfs_dirent **p_sd) | 641 | const char *name, struct sysfs_dirent **p_sd) |
@@ -829,16 +829,12 @@ int sysfs_rename_dir(struct kobject * kobj, const char *new_name) | |||
829 | if (!new_dentry) | 829 | if (!new_dentry) |
830 | goto out_unlock; | 830 | goto out_unlock; |
831 | 831 | ||
832 | /* rename kobject and sysfs_dirent */ | 832 | /* rename sysfs_dirent */ |
833 | error = -ENOMEM; | 833 | error = -ENOMEM; |
834 | new_name = dup_name = kstrdup(new_name, GFP_KERNEL); | 834 | new_name = dup_name = kstrdup(new_name, GFP_KERNEL); |
835 | if (!new_name) | 835 | if (!new_name) |
836 | goto out_unlock; | 836 | goto out_unlock; |
837 | 837 | ||
838 | error = kobject_set_name(kobj, "%s", new_name); | ||
839 | if (error) | ||
840 | goto out_unlock; | ||
841 | |||
842 | dup_name = sd->s_name; | 838 | dup_name = sd->s_name; |
843 | sd->s_name = new_name; | 839 | sd->s_name = new_name; |
844 | 840 | ||