group.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * fs/sysfs/group.c - Operations for adding/removing multiple files at once.
  3. *
  4. * Copyright (c) 2003 Patrick Mochel
  5. * Copyright (c) 2003 Open Source Development Lab
  6. *
  7. * This file is released undert the GPL v2.
  8. *
  9. */
  10. #include <linux/kobject.h>
  11. #include <linux/module.h>
  12. #include <linux/dcache.h>
  13. #include <linux/namei.h>
  14. #include <linux/err.h>
  15. #include <linux/fs.h>
  16. #include <asm/semaphore.h>
  17. #include "sysfs.h"
  18. static void remove_files(struct dentry * dir,
  19. const struct attribute_group * grp)
  20. {
  21. struct attribute *const* attr;
  22. for (attr = grp->attrs; *attr; attr++)
  23. sysfs_hash_and_remove(dir,(*attr)->name);
  24. }
  25. static int create_files(struct dentry * dir,
  26. const struct attribute_group * grp)
  27. {
  28. struct attribute *const* attr;
  29. int error = 0;
  30. for (attr = grp->attrs; *attr && !error; attr++) {
  31. error = sysfs_add_file(dir, *attr, SYSFS_KOBJ_ATTR);
  32. }
  33. if (error)
  34. remove_files(dir,grp);
  35. return error;
  36. }
  37. int sysfs_create_group(struct kobject * kobj,
  38. const struct attribute_group * grp)
  39. {
  40. struct dentry * dir;
  41. int error;
  42. BUG_ON(!kobj || !kobj->dentry);
  43. if (grp->name) {
  44. error = sysfs_create_subdir(kobj,grp->name,&dir);
  45. if (error)
  46. return error;
  47. } else
  48. dir = kobj->dentry;
  49. dir = dget(dir);
  50. if ((error = create_files(dir,grp))) {
  51. if (grp->name)
  52. sysfs_remove_subdir(dir);
  53. }
  54. dput(dir);
  55. return error;
  56. }
  57. void sysfs_remove_group(struct kobject * kobj,
  58. const struct attribute_group * grp)
  59. {
  60. struct dentry * dir;
  61. if (grp->name) {
  62. dir = lookup_one_len_kern(grp->name, kobj->dentry,
  63. strlen(grp->name));
  64. BUG_ON(IS_ERR(dir));
  65. }
  66. else
  67. dir = dget(kobj->dentry);
  68. remove_files(dir,grp);
  69. if (grp->name)
  70. sysfs_remove_subdir(dir);
  71. /* release the ref. taken in this routine */
  72. dput(dir);
  73. }
  74. EXPORT_SYMBOL_GPL(sysfs_create_group);
  75. EXPORT_SYMBOL_GPL(sysfs_remove_group);