device_cgroup.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #include <linux/fs.h>
  3. #define DEVCG_ACC_MKNOD 1
  4. #define DEVCG_ACC_READ 2
  5. #define DEVCG_ACC_WRITE 4
  6. #define DEVCG_ACC_MASK (DEVCG_ACC_MKNOD | DEVCG_ACC_READ | DEVCG_ACC_WRITE)
  7. #define DEVCG_DEV_BLOCK 1
  8. #define DEVCG_DEV_CHAR 2
  9. #define DEVCG_DEV_ALL 4 /* this represents all devices */
  10. #if defined(CONFIG_CGROUP_DEVICE) || defined(CONFIG_CGROUP_BPF)
  11. int devcgroup_check_permission(short type, u32 major, u32 minor,
  12. short access);
  13. static inline int devcgroup_inode_permission(struct inode *inode, int mask)
  14. {
  15. short type, access = 0;
  16. if (likely(!inode->i_rdev))
  17. return 0;
  18. if (S_ISBLK(inode->i_mode))
  19. type = DEVCG_DEV_BLOCK;
  20. else if (S_ISCHR(inode->i_mode))
  21. type = DEVCG_DEV_CHAR;
  22. else
  23. return 0;
  24. if (mask & MAY_WRITE)
  25. access |= DEVCG_ACC_WRITE;
  26. if (mask & MAY_READ)
  27. access |= DEVCG_ACC_READ;
  28. return devcgroup_check_permission(type, imajor(inode), iminor(inode),
  29. access);
  30. }
  31. static inline int devcgroup_inode_mknod(int mode, dev_t dev)
  32. {
  33. short type;
  34. if (!S_ISBLK(mode) && !S_ISCHR(mode))
  35. return 0;
  36. if (S_ISCHR(mode) && dev == WHITEOUT_DEV)
  37. return 0;
  38. if (S_ISBLK(mode))
  39. type = DEVCG_DEV_BLOCK;
  40. else
  41. type = DEVCG_DEV_CHAR;
  42. return devcgroup_check_permission(type, MAJOR(dev), MINOR(dev),
  43. DEVCG_ACC_MKNOD);
  44. }
  45. #else
  46. static inline int devcgroup_check_permission(short type, u32 major, u32 minor,
  47. short access)
  48. { return 0; }
  49. static inline int devcgroup_inode_permission(struct inode *inode, int mask)
  50. { return 0; }
  51. static inline int devcgroup_inode_mknod(int mode, dev_t dev)
  52. { return 0; }
  53. #endif