diff options
Diffstat (limited to 'fs/sysfs/dir.c')
-rw-r--r-- | fs/sysfs/dir.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 354675ad0965..620603296c6c 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
@@ -491,9 +491,16 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt, | |||
491 | * | 491 | * |
492 | * LOCKING: | 492 | * LOCKING: |
493 | * Determined by sysfs_addrm_start(). | 493 | * Determined by sysfs_addrm_start(). |
494 | * | ||
495 | * RETURNS: | ||
496 | * 0 on success, -EEXIST if entry with the given name already | ||
497 | * exists. | ||
494 | */ | 498 | */ |
495 | void sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) | 499 | int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) |
496 | { | 500 | { |
501 | if (sysfs_find_dirent(acxt->parent_sd, sd->s_name)) | ||
502 | return -EEXIST; | ||
503 | |||
497 | sd->s_parent = sysfs_get(acxt->parent_sd); | 504 | sd->s_parent = sysfs_get(acxt->parent_sd); |
498 | 505 | ||
499 | if (sysfs_type(sd) == SYSFS_DIR && acxt->parent_inode) | 506 | if (sysfs_type(sd) == SYSFS_DIR && acxt->parent_inode) |
@@ -502,6 +509,8 @@ void sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) | |||
502 | acxt->cnt++; | 509 | acxt->cnt++; |
503 | 510 | ||
504 | sysfs_link_sibling(sd); | 511 | sysfs_link_sibling(sd); |
512 | |||
513 | return 0; | ||
505 | } | 514 | } |
506 | 515 | ||
507 | /** | 516 | /** |
@@ -691,6 +700,7 @@ static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd, | |||
691 | umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO; | 700 | umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO; |
692 | struct sysfs_addrm_cxt acxt; | 701 | struct sysfs_addrm_cxt acxt; |
693 | struct sysfs_dirent *sd; | 702 | struct sysfs_dirent *sd; |
703 | int rc; | ||
694 | 704 | ||
695 | /* allocate */ | 705 | /* allocate */ |
696 | sd = sysfs_new_dirent(name, mode, SYSFS_DIR); | 706 | sd = sysfs_new_dirent(name, mode, SYSFS_DIR); |
@@ -700,17 +710,15 @@ static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd, | |||
700 | 710 | ||
701 | /* link in */ | 711 | /* link in */ |
702 | sysfs_addrm_start(&acxt, parent_sd); | 712 | sysfs_addrm_start(&acxt, parent_sd); |
713 | rc = sysfs_add_one(&acxt, sd); | ||
714 | sysfs_addrm_finish(&acxt); | ||
703 | 715 | ||
704 | if (!sysfs_find_dirent(parent_sd, name)) | 716 | if (rc == 0) |
705 | sysfs_add_one(&acxt, sd); | 717 | *p_sd = sd; |
706 | 718 | else | |
707 | if (!sysfs_addrm_finish(&acxt)) { | ||
708 | sysfs_put(sd); | 719 | sysfs_put(sd); |
709 | return -EEXIST; | ||
710 | } | ||
711 | 720 | ||
712 | *p_sd = sd; | 721 | return rc; |
713 | return 0; | ||
714 | } | 722 | } |
715 | 723 | ||
716 | int sysfs_create_subdir(struct kobject *kobj, const char *name, | 724 | int sysfs_create_subdir(struct kobject *kobj, const char *name, |