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