group.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 sysfs_dirent *dir_sd,
  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_sd, (*attr)->name);
  24. }
  25. static int create_files(struct sysfs_dirent *dir_sd,
  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_sd, *attr, SYSFS_KOBJ_ATTR);
  32. if (error)
  33. remove_files(dir_sd, grp);
  34. return error;
  35. }
  36. int sysfs_create_group(struct kobject * kobj,
  37. const struct attribute_group * grp)
  38. {
  39. struct sysfs_dirent *sd;
  40. int error;
  41. BUG_ON(!kobj || !kobj->sd);
  42. if (grp->name) {
  43. error = sysfs_create_subdir(kobj, grp->name, &sd);
  44. if (error)
  45. return error;
  46. } else
  47. sd = kobj->sd;
  48. sysfs_get(sd);
  49. error = create_files(sd, grp);
  50. if (error) {
  51. if (grp->name)
  52. sysfs_remove_subdir(sd);
  53. }
  54. sysfs_put(sd);
  55. return error;
  56. }
  57. void sysfs_remove_group(struct kobject * kobj,
  58. const struct attribute_group * grp)
  59. {
  60. struct sysfs_dirent *dir_sd = kobj->sd;
  61. struct sysfs_dirent *sd;
  62. if (grp->name) {
  63. sd = sysfs_get_dirent(dir_sd, grp->name);
  64. BUG_ON(!sd);
  65. } else
  66. sd = sysfs_get(dir_sd);
  67. remove_files(sd, grp);
  68. if (grp->name)
  69. sysfs_remove_subdir(sd);
  70. sysfs_put(sd);
  71. }
  72. EXPORT_SYMBOL_GPL(sysfs_create_group);
  73. EXPORT_SYMBOL_GPL(sysfs_remove_group);