kernfs-internal.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. /*
  43. * mount.c
  44. */
  45. struct sysfs_super_info {
  46. /*
  47. * The root associated with this super_block. Each super_block is
  48. * identified by the root and ns it's associated with.
  49. */
  50. struct kernfs_root *root;
  51. /*
  52. * Each sb is associated with one namespace tag, currently the network
  53. * namespace of the task which mounted this sysfs instance. If multiple
  54. * tags become necessary, make the following an array and compare
  55. * sysfs_dirent tag against every entry.
  56. */
  57. const void *ns;
  58. };
  59. #define sysfs_info(SB) ((struct sysfs_super_info *)(SB->s_fs_info))
  60. extern struct kmem_cache *sysfs_dir_cachep;
  61. /*
  62. * inode.c
  63. */
  64. struct inode *sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd);
  65. void sysfs_evict_inode(struct inode *inode);
  66. int sysfs_permission(struct inode *inode, int mask);
  67. int sysfs_setattr(struct dentry *dentry, struct iattr *iattr);
  68. int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
  69. struct kstat *stat);
  70. int sysfs_setxattr(struct dentry *dentry, const char *name, const void *value,
  71. size_t size, int flags);
  72. void sysfs_inode_init(void);
  73. /*
  74. * dir.c
  75. */
  76. extern struct mutex sysfs_mutex;
  77. extern const struct dentry_operations sysfs_dentry_ops;
  78. extern const struct file_operations sysfs_dir_operations;
  79. extern const struct inode_operations sysfs_dir_inode_operations;
  80. struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd);
  81. void sysfs_put_active(struct sysfs_dirent *sd);
  82. void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt);
  83. int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd,
  84. struct sysfs_dirent *parent_sd);
  85. void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt);
  86. struct sysfs_dirent *sysfs_new_dirent(struct kernfs_root *root,
  87. const char *name, umode_t mode, int type);
  88. /*
  89. * file.c
  90. */
  91. extern const struct file_operations kernfs_file_operations;
  92. void sysfs_unmap_bin_file(struct sysfs_dirent *sd);
  93. /*
  94. * symlink.c
  95. */
  96. extern const struct inode_operations sysfs_symlink_inode_operations;
  97. #endif /* __KERNFS_INTERNAL_H */