aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/sysfs/dir.c26
-rw-r--r--fs/sysfs/file.c12
-rw-r--r--fs/sysfs/symlink.c9
-rw-r--r--fs/sysfs/sysfs.h2
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 */
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,
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);
62extern void sysfs_put_active_two(struct sysfs_dirent *sd); 62extern void sysfs_put_active_two(struct sysfs_dirent *sd);
63extern void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt, 63extern void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
64 struct sysfs_dirent *parent_sd); 64 struct sysfs_dirent *parent_sd);
65extern void sysfs_add_one(struct sysfs_addrm_cxt *acxt, 65extern int sysfs_add_one(struct sysfs_addrm_cxt *acxt,
66 struct sysfs_dirent *sd); 66 struct sysfs_dirent *sd);
67extern void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, 67extern void sysfs_remove_one(struct sysfs_addrm_cxt *acxt,
68 struct sysfs_dirent *sd); 68 struct sysfs_dirent *sd);