LCOV - code coverage report
Current view: top level - include/linux - device_cgroup.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc4-xfsa @ Mon Jul 31 20:08:27 PDT 2023 Lines: 17 17 100.0 %
Date: 2023-07-31 20:08:27 Functions: 2 2 100.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 51069266072 : static inline int devcgroup_inode_permission(struct inode *inode, int mask)
      18             : {
      19 51069266072 :         short type, access = 0;
      20             : 
      21 51069266072 :         if (likely(!inode->i_rdev))
      22             :                 return 0;
      23             : 
      24     3930835 :         if (S_ISBLK(inode->i_mode))
      25             :                 type = DEVCG_DEV_BLOCK;
      26     3637693 :         else if (S_ISCHR(inode->i_mode))
      27             :                 type = DEVCG_DEV_CHAR;
      28             :         else
      29             :                 return 0;
      30             : 
      31     3930855 :         if (mask & MAY_WRITE)
      32     3378574 :                 access |= DEVCG_ACC_WRITE;
      33     3930855 :         if (mask & MAY_READ)
      34      727173 :                 access |= DEVCG_ACC_READ;
      35             : 
      36     3930855 :         return devcgroup_check_permission(type, imajor(inode), iminor(inode),
      37             :                                           access);
      38             : }
      39             : 
      40     6676820 : static inline int devcgroup_inode_mknod(int mode, dev_t dev)
      41             : {
      42     6676820 :         short type;
      43             : 
      44     6676820 :         if (!S_ISBLK(mode) && !S_ISCHR(mode))
      45             :                 return 0;
      46             : 
      47     6670023 :         if (S_ISCHR(mode) && dev == WHITEOUT_DEV)
      48             :                 return 0;
      49             : 
      50         430 :         if (S_ISBLK(mode))
      51             :                 type = DEVCG_DEV_BLOCK;
      52             :         else
      53         133 :                 type = DEVCG_DEV_CHAR;
      54             : 
      55         430 :         return devcgroup_check_permission(type, MAJOR(dev), MINOR(dev),
      56             :                                           DEVCG_ACC_MKNOD);
      57             : }
      58             : 
      59             : #else
      60             : static inline int devcgroup_check_permission(short type, u32 major, u32 minor,
      61             :                                short access)
      62             : { return 0; }
      63             : static inline int devcgroup_inode_permission(struct inode *inode, int mask)
      64             : { return 0; }
      65             : static inline int devcgroup_inode_mknod(int mode, dev_t dev)
      66             : { return 0; }
      67             : #endif

Generated by: LCOV version 1.14