group.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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/err.h>
  14. #include "sysfs.h"
  15. static void remove_files(struct dentry * dir,
  16. const struct attribute_group * grp)
  17. {
  18. struct attribute *const* attr;
  19. for (attr = grp->attrs; *attr; attr++)
  20. sysfs_hash_and_remove(dir,(*attr)->name);
  21. }
  22. static int create_files(struct dentry * dir,
  23. const struct attribute_group * grp)
  24. {
  25. struct attribute *const* attr;
  26. int error = 0;
  27. for (attr = grp->attrs; *attr && !error; attr++) {
  28. error = sysfs_add_file(dir, *attr, SYSFS_KOBJ_ATTR);
  29. }
  30. if (error)
  31. remove_files(dir,grp);
  32. return error;
  33. }
  34. int sysfs_create_group(struct kobject * kobj,
  35. const struct attribute_group * grp)
  36. {
  37. struct dentry * dir;
  38. int error;
  39. BUG_ON(!kobj || !kobj->dentry);
  40. if (grp->name) {
  41. error = sysfs_create_subdir(kobj,grp->name,&dir);
  42. if (error)
  43. return error;
  44. } else
  45. dir = kobj->dentry;
  46. dir = dget(dir);
  47. if ((error = create_files(dir,grp))) {
  48. if (grp->name)
  49. sysfs_remove_subdir(dir);
  50. }
  51. dput(dir);
  52. return error;
  53. }
  54. void sysfs_remove_group(struct kobject * kobj,
  55. const struct attribute_group * grp)
  56. {
  57. struct dentry * dir;
  58. if (grp->name)
  59. dir = sysfs_get_dentry(kobj->dentry,grp->name);
  60. else
  61. dir = dget(kobj->dentry);
  62. remove_files(dir,grp);
  63. if (grp->name)
  64. sysfs_remove_subdir(dir);
  65. /* release the ref. taken in this routine */
  66. dput(dir);
  67. }
  68. EXPORT_SYMBOL_GPL(sysfs_create_group);
  69. EXPORT_SYMBOL_GPL(sysfs_remove_group);