kernfs-internal.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * fs/kernfs/kernfs-internal.h - kernfs internal header file
  3. *
  4. * Copyright (c) 2001-3 Patrick Mochel
  5. * Copyright (c) 2007 SUSE Linux Products GmbH
  6. * Copyright (c) 2007, 2013 Tejun Heo <teheo@suse.de>
  7. *
  8. * This file is released under the GPLv2.
  9. */
  10. #ifndef __KERNFS_INTERNAL_H
  11. #define __KERNFS_INTERNAL_H
  12. #include <linux/lockdep.h>
  13. #include <linux/fs.h>
  14. #include <linux/mutex.h>
  15. #include <linux/kernfs.h>
  16. struct sysfs_inode_attrs {
  17. struct iattr ia_iattr;
  18. void *ia_secdata;
  19. u32 ia_secdata_len;
  20. };
  21. #define SD_DEACTIVATED_BIAS INT_MIN
  22. /* SYSFS_TYPE_MASK and types are defined in include/linux/kernfs.h */
  23. /**
  24. * kernfs_root - find out the kernfs_root a sysfs_dirent belongs to
  25. * @sd: sysfs_dirent of interest
  26. *
  27. * Return the kernfs_root @sd belongs to.
  28. */
  29. static inline struct kernfs_root *kernfs_root(struct sysfs_dirent *sd)
  30. {
  31. /* if parent exists, it's always a dir; otherwise, @sd is a dir */
  32. if (sd->s_parent)
  33. sd = sd->s_parent;
  34. return sd->s_dir.root;
  35. }
  36. /*
  37. * Context structure to be used while adding/removing nodes.
  38. */
  39. struct sysfs_addrm_cxt {
  40. struct sysfs_dirent *removed;
  41. };
  42. #include "../sysfs/sysfs.h"
  43. /*
  44. * mount.c
  45. */
  46. struct sysfs_super_info {
  47. /*
  48. * The root associated with this super_block. Each super_block is
  49. * identified by the root and ns it's associated with.
  50. */
  51. struct kernfs_root *root;
  52. /*
  53. * Each sb is associated with one namespace tag, currently the network
  54. * namespace of the task which mounted this sysfs instance. If multiple
  55. * tags become necessary, make the following an array and compare
  56. * sysfs_dirent tag against every entry.
  57. */
  58. const void *ns;
  59. };
  60. #define sysfs_info(SB) ((struct sysfs_super_info *)(SB->s_fs_info))
  61. extern struct kmem_cache *sysfs_dir_cachep;
  62. /*
  63. * inode.c
  64. */
  65. struct inode *sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd);
  66. void sysfs_evict_inode(struct inode *inode);
  67. int sysfs_permission(struct inode *inode, int mask);
  68. int sysfs_setattr(struct dentry *dentry, struct iattr *iattr);
  69. int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
  70. struct kstat *stat);
  71. int sysfs_setxattr(struct dentry *dentry, const char *name, const void *value,
  72. size_t size, int flags);
  73. void sysfs_inode_init(void);
  74. /*
  75. * dir.c
  76. */
  77. extern struct mutex sysfs_mutex;
  78. extern const struct dentry_operations sysfs_dentry_ops;
  79. extern const struct file_operations sysfs_dir_operations;
  80. extern const struct inode_operations sysfs_dir_inode_operations;
  81. struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd);
  82. void sysfs_put_active(struct sysfs_dirent *sd);
  83. void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt);
  84. int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd,
  85. struct sysfs_dirent *parent_sd);
  86. void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt);
  87. struct sysfs_dirent *sysfs_new_dirent(struct kernfs_root *root,
  88. const char *name, umode_t mode, int type);
  89. /*
  90. * file.c
  91. */
  92. extern const struct file_operations kernfs_file_operations;
  93. void sysfs_unmap_bin_file(struct sysfs_dirent *sd);
  94. /*
  95. * symlink.c
  96. */
  97. extern const struct inode_operations sysfs_symlink_inode_operations;
  98. #endif /* __KERNFS_INTERNAL_H */