LCOV - code coverage report
Current view: top level - include/linux - device_cgroup.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 6 6 100.0 %
Date: 2021-04-22 12:43:58 Functions: 0 0 -

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

Generated by: LCOV version 1.14