diff options
author | Tejun Heo <htejun@gmail.com> | 2007-08-02 08:38:03 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-10-12 17:51:04 -0400 |
commit | 23dc279950a056c33a14d09cf759f5173d41abd9 (patch) | |
tree | 852f8cc24c24988717dbae8f98da999ff27755fa | |
parent | 41fc1c27452e041a18e5141b8203ee0ea72bc483 (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>
-rw-r--r-- | fs/sysfs/dir.c | 26 | ||||
-rw-r--r-- | fs/sysfs/file.c | 12 | ||||
-rw-r--r-- | fs/sysfs/symlink.c | 9 | ||||
-rw-r--r-- | fs/sysfs/sysfs.h | 2 |
4 files changed, 26 insertions, 23 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, |
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index ea0e494d7d58..33bb3406dc49 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c | |||
@@ -397,6 +397,7 @@ int sysfs_add_file(struct sysfs_dirent *dir_sd, const struct attribute *attr, | |||
397 | umode_t mode = (attr->mode & S_IALLUGO) | S_IFREG; | 397 | umode_t mode = (attr->mode & S_IALLUGO) | S_IFREG; |
398 | struct sysfs_addrm_cxt acxt; | 398 | struct sysfs_addrm_cxt acxt; |
399 | struct sysfs_dirent *sd; | 399 | struct sysfs_dirent *sd; |
400 | int rc; | ||
400 | 401 | ||
401 | sd = sysfs_new_dirent(attr->name, mode, type); | 402 | sd = sysfs_new_dirent(attr->name, mode, type); |
402 | if (!sd) | 403 | if (!sd) |
@@ -404,16 +405,13 @@ int sysfs_add_file(struct sysfs_dirent *dir_sd, const struct attribute *attr, | |||
404 | sd->s_elem.attr.attr = (void *)attr; | 405 | sd->s_elem.attr.attr = (void *)attr; |
405 | 406 | ||
406 | sysfs_addrm_start(&acxt, dir_sd); | 407 | sysfs_addrm_start(&acxt, dir_sd); |
408 | rc = sysfs_add_one(&acxt, sd); | ||
409 | sysfs_addrm_finish(&acxt); | ||
407 | 410 | ||
408 | if (!sysfs_find_dirent(dir_sd, attr->name)) | 411 | if (rc) |
409 | sysfs_add_one(&acxt, sd); | ||
410 | |||
411 | if (!sysfs_addrm_finish(&acxt)) { | ||
412 | sysfs_put(sd); | 412 | sysfs_put(sd); |
413 | return -EEXIST; | ||
414 | } | ||
415 | 413 | ||
416 | return 0; | 414 | return rc; |
417 | } | 415 | } |
418 | 416 | ||
419 | 417 | ||
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c index c129f307936a..a6b13f12b0e7 100644 --- a/fs/sysfs/symlink.c +++ b/fs/sysfs/symlink.c | |||
@@ -91,14 +91,11 @@ int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char | |||
91 | target_sd = NULL; /* reference is now owned by the symlink */ | 91 | target_sd = NULL; /* reference is now owned by the symlink */ |
92 | 92 | ||
93 | sysfs_addrm_start(&acxt, parent_sd); | 93 | sysfs_addrm_start(&acxt, parent_sd); |
94 | error = sysfs_add_one(&acxt, sd); | ||
95 | sysfs_addrm_finish(&acxt); | ||
94 | 96 | ||
95 | if (!sysfs_find_dirent(parent_sd, name)) | 97 | if (error) |
96 | sysfs_add_one(&acxt, sd); | ||
97 | |||
98 | if (!sysfs_addrm_finish(&acxt)) { | ||
99 | error = -EEXIST; | ||
100 | goto out_put; | 98 | goto out_put; |
101 | } | ||
102 | 99 | ||
103 | return 0; | 100 | return 0; |
104 | 101 | ||
diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h index 32b8b64e5cf1..bb3f0c999b15 100644 --- a/fs/sysfs/sysfs.h +++ b/fs/sysfs/sysfs.h | |||
@@ -62,7 +62,7 @@ extern struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd); | |||
62 | extern void sysfs_put_active_two(struct sysfs_dirent *sd); | 62 | extern void sysfs_put_active_two(struct sysfs_dirent *sd); |
63 | extern void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt, | 63 | extern void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt, |
64 | struct sysfs_dirent *parent_sd); | 64 | struct sysfs_dirent *parent_sd); |
65 | extern void sysfs_add_one(struct sysfs_addrm_cxt *acxt, | 65 | extern int sysfs_add_one(struct sysfs_addrm_cxt *acxt, |
66 | struct sysfs_dirent *sd); | 66 | struct sysfs_dirent *sd); |
67 | extern void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, | 67 | extern void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, |
68 | struct sysfs_dirent *sd); | 68 | struct sysfs_dirent *sd); |