Skip to content

Commit

Permalink
sysfs: make sysfs_add_one() automatically check for duplicate entry
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tejun Heo authored and Greg Kroah-Hartman committed Oct 12, 2007
1 parent 41fc1c2 commit 23dc279
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 23 deletions.
26 changes: 17 additions & 9 deletions fs/sysfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -491,9 +491,16 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
*
* LOCKING:
* Determined by sysfs_addrm_start().
*
* RETURNS:
* 0 on success, -EEXIST if entry with the given name already
* exists.
*/
void sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
{
if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
return -EEXIST;

sd->s_parent = sysfs_get(acxt->parent_sd);

if (sysfs_type(sd) == SYSFS_DIR && acxt->parent_inode)
Expand All @@ -502,6 +509,8 @@ void sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
acxt->cnt++;

sysfs_link_sibling(sd);

return 0;
}

/**
Expand Down Expand Up @@ -691,6 +700,7 @@ static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd,
umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;
struct sysfs_addrm_cxt acxt;
struct sysfs_dirent *sd;
int rc;

/* allocate */
sd = sysfs_new_dirent(name, mode, SYSFS_DIR);
Expand All @@ -700,17 +710,15 @@ static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd,

/* link in */
sysfs_addrm_start(&acxt, parent_sd);
rc = sysfs_add_one(&acxt, sd);
sysfs_addrm_finish(&acxt);

if (!sysfs_find_dirent(parent_sd, name))
sysfs_add_one(&acxt, sd);

if (!sysfs_addrm_finish(&acxt)) {
if (rc == 0)
*p_sd = sd;
else
sysfs_put(sd);
return -EEXIST;
}

*p_sd = sd;
return 0;
return rc;
}

int sysfs_create_subdir(struct kobject *kobj, const char *name,
Expand Down
12 changes: 5 additions & 7 deletions fs/sysfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,23 +397,21 @@ int sysfs_add_file(struct sysfs_dirent *dir_sd, const struct attribute *attr,
umode_t mode = (attr->mode & S_IALLUGO) | S_IFREG;
struct sysfs_addrm_cxt acxt;
struct sysfs_dirent *sd;
int rc;

sd = sysfs_new_dirent(attr->name, mode, type);
if (!sd)
return -ENOMEM;
sd->s_elem.attr.attr = (void *)attr;

sysfs_addrm_start(&acxt, dir_sd);
rc = sysfs_add_one(&acxt, sd);
sysfs_addrm_finish(&acxt);

if (!sysfs_find_dirent(dir_sd, attr->name))
sysfs_add_one(&acxt, sd);

if (!sysfs_addrm_finish(&acxt)) {
if (rc)
sysfs_put(sd);
return -EEXIST;
}

return 0;
return rc;
}


Expand Down
9 changes: 3 additions & 6 deletions fs/sysfs/symlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,14 +91,11 @@ int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char
target_sd = NULL; /* reference is now owned by the symlink */

sysfs_addrm_start(&acxt, parent_sd);
error = sysfs_add_one(&acxt, sd);
sysfs_addrm_finish(&acxt);

if (!sysfs_find_dirent(parent_sd, name))
sysfs_add_one(&acxt, sd);

if (!sysfs_addrm_finish(&acxt)) {
error = -EEXIST;
if (error)
goto out_put;
}

return 0;

Expand Down
2 changes: 1 addition & 1 deletion fs/sysfs/sysfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ extern struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd);
extern void sysfs_put_active_two(struct sysfs_dirent *sd);
extern void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
struct sysfs_dirent *parent_sd);
extern void sysfs_add_one(struct sysfs_addrm_cxt *acxt,
extern int sysfs_add_one(struct sysfs_addrm_cxt *acxt,
struct sysfs_dirent *sd);
extern void sysfs_remove_one(struct sysfs_addrm_cxt *acxt,
struct sysfs_dirent *sd);
Expand Down

0 comments on commit 23dc279

Please sign in to comment.