diff options
| author | David S. Miller <davem@davemloft.net> | 2009-03-27 20:19:16 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-03-27 20:19:16 -0400 |
| commit | a83398570e17af6bb81eb94f4f5dd356bd2828d8 (patch) | |
| tree | 5b5c7c3a56898485479291b7c964a1f3887d469c /fs/sysfs/dir.c | |
| parent | f9384d41c02408dd404aa64d66d0ef38adcf6479 (diff) | |
| parent | 0b4d569de222452bcb55a4a536ade6cf4d8d1e30 (diff) | |
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Diffstat (limited to 'fs/sysfs/dir.c')
| -rw-r--r-- | fs/sysfs/dir.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 82d3b79d0e08..d88d0fac9fa5 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
| @@ -302,7 +302,7 @@ static void sysfs_d_iput(struct dentry * dentry, struct inode * inode) | |||
| 302 | iput(inode); | 302 | iput(inode); |
| 303 | } | 303 | } |
| 304 | 304 | ||
| 305 | static struct dentry_operations sysfs_dentry_ops = { | 305 | static const struct dentry_operations sysfs_dentry_ops = { |
| 306 | .d_iput = sysfs_d_iput, | 306 | .d_iput = sysfs_d_iput, |
| 307 | }; | 307 | }; |
| 308 | 308 | ||
| @@ -434,6 +434,26 @@ int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) | |||
| 434 | } | 434 | } |
| 435 | 435 | ||
| 436 | /** | 436 | /** |
| 437 | * sysfs_pathname - return full path to sysfs dirent | ||
| 438 | * @sd: sysfs_dirent whose path we want | ||
| 439 | * @path: caller allocated buffer | ||
| 440 | * | ||
| 441 | * Gives the name "/" to the sysfs_root entry; any path returned | ||
| 442 | * is relative to wherever sysfs is mounted. | ||
| 443 | * | ||
| 444 | * XXX: does no error checking on @path size | ||
| 445 | */ | ||
| 446 | static char *sysfs_pathname(struct sysfs_dirent *sd, char *path) | ||
| 447 | { | ||
| 448 | if (sd->s_parent) { | ||
| 449 | sysfs_pathname(sd->s_parent, path); | ||
| 450 | strcat(path, "/"); | ||
| 451 | } | ||
| 452 | strcat(path, sd->s_name); | ||
| 453 | return path; | ||
| 454 | } | ||
| 455 | |||
| 456 | /** | ||
| 437 | * sysfs_add_one - add sysfs_dirent to parent | 457 | * sysfs_add_one - add sysfs_dirent to parent |
| 438 | * @acxt: addrm context to use | 458 | * @acxt: addrm context to use |
| 439 | * @sd: sysfs_dirent to be added | 459 | * @sd: sysfs_dirent to be added |
| @@ -458,8 +478,16 @@ int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) | |||
| 458 | int ret; | 478 | int ret; |
| 459 | 479 | ||
| 460 | ret = __sysfs_add_one(acxt, sd); | 480 | ret = __sysfs_add_one(acxt, sd); |
| 461 | WARN(ret == -EEXIST, KERN_WARNING "sysfs: duplicate filename '%s' " | 481 | if (ret == -EEXIST) { |
| 462 | "can not be created\n", sd->s_name); | 482 | char *path = kzalloc(PATH_MAX, GFP_KERNEL); |
| 483 | WARN(1, KERN_WARNING | ||
| 484 | "sysfs: cannot create duplicate filename '%s'\n", | ||
| 485 | (path == NULL) ? sd->s_name : | ||
| 486 | strcat(strcat(sysfs_pathname(acxt->parent_sd, path), "/"), | ||
| 487 | sd->s_name)); | ||
| 488 | kfree(path); | ||
| 489 | } | ||
| 490 | |||
| 463 | return ret; | 491 | return ret; |
| 464 | } | 492 | } |
| 465 | 493 | ||
| @@ -581,6 +609,7 @@ void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt) | |||
| 581 | 609 | ||
| 582 | sysfs_drop_dentry(sd); | 610 | sysfs_drop_dentry(sd); |
| 583 | sysfs_deactivate(sd); | 611 | sysfs_deactivate(sd); |
| 612 | unmap_bin_file(sd); | ||
| 584 | sysfs_put(sd); | 613 | sysfs_put(sd); |
| 585 | } | 614 | } |
| 586 | } | 615 | } |
