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 /fs/sysfs | |
| 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>
Diffstat (limited to 'fs/sysfs')
| -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 354675ad096..620603296c6 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 ea0e494d7d5..33bb3406dc4 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 c129f307936..a6b13f12b0e 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 32b8b64e5cf..bb3f0c999b1 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); |
