aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sysfs/dir.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-08-02 08:38:03 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2007-10-12 17:51:04 -0400
commit23dc279950a056c33a14d09cf759f5173d41abd9 (patch)
tree852f8cc24c24988717dbae8f98da999ff27755fa /fs/sysfs/dir.c
parent41fc1c27452e041a18e5141b8203ee0ea72bc483 (diff)
sysfs: make sysfs_add_one() automatically check for duplicate entry
Make sysfs_add_one() check for duplicate entry and return -EEXIST if such entry exists. This simplifies node addition code a bit. This patch doesn't introduce any noticeable behavior change. Signed-off-by: Tejun Heo <htejun@gmail.com> Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs/sysfs/dir.c')
-rw-r--r--fs/sysfs/dir.c26
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 */
495void sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) 499int 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
716int sysfs_create_subdir(struct kobject *kobj, const char *name, 724int sysfs_create_subdir(struct kobject *kobj, const char *name,