LCOV - code coverage report
Current view: top level - include/linux - posix_acl.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 6 18 33.3 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 3 161 1.9 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :   File: linux/posix_acl.h
       3                 :            : 
       4                 :            :   (C) 2002 Andreas Gruenbacher, <a.gruenbacher@computer.org>
       5                 :            : */
       6                 :            : 
       7                 :            : 
       8                 :            : #ifndef __LINUX_POSIX_ACL_H
       9                 :            : #define __LINUX_POSIX_ACL_H
      10                 :            : 
      11                 :            : #include <linux/bug.h>
      12                 :            : #include <linux/slab.h>
      13                 :            : #include <linux/rcupdate.h>
      14                 :            : 
      15                 :            : #define ACL_UNDEFINED_ID        (-1)
      16                 :            : 
      17                 :            : /* a_type field in acl_user_posix_entry_t */
      18                 :            : #define ACL_TYPE_ACCESS         (0x8000)
      19                 :            : #define ACL_TYPE_DEFAULT        (0x4000)
      20                 :            : 
      21                 :            : /* e_tag entry in struct posix_acl_entry */
      22                 :            : #define ACL_USER_OBJ            (0x01)
      23                 :            : #define ACL_USER                (0x02)
      24                 :            : #define ACL_GROUP_OBJ           (0x04)
      25                 :            : #define ACL_GROUP               (0x08)
      26                 :            : #define ACL_MASK                (0x10)
      27                 :            : #define ACL_OTHER               (0x20)
      28                 :            : 
      29                 :            : /* permissions in the e_perm field */
      30                 :            : #define ACL_READ                (0x04)
      31                 :            : #define ACL_WRITE               (0x02)
      32                 :            : #define ACL_EXECUTE             (0x01)
      33                 :            : //#define ACL_ADD               (0x08)
      34                 :            : //#define ACL_DELETE            (0x10)
      35                 :            : 
      36                 :            : struct posix_acl_entry {
      37                 :            :         short                   e_tag;
      38                 :            :         unsigned short          e_perm;
      39                 :            :         union {
      40                 :            :                 kuid_t          e_uid;
      41                 :            :                 kgid_t          e_gid;
      42                 :            : #ifndef CONFIG_UIDGID_STRICT_TYPE_CHECKS
      43                 :            :                 unsigned int    e_id;
      44                 :            : #endif
      45                 :            :         };
      46                 :            : };
      47                 :            : 
      48                 :            : struct posix_acl {
      49                 :            :         union {
      50                 :            :                 atomic_t                a_refcount;
      51                 :            :                 struct rcu_head         a_rcu;
      52                 :            :         };
      53                 :            :         unsigned int            a_count;
      54                 :            :         struct posix_acl_entry  a_entries[0];
      55                 :            : };
      56                 :            : 
      57                 :            : #define FOREACH_ACL_ENTRY(pa, acl, pe) \
      58                 :            :         for(pa=(acl)->a_entries, pe=pa+(acl)->a_count; pa<pe; pa++)
      59                 :            : 
      60                 :            : 
      61                 :            : /*
      62                 :            :  * Duplicate an ACL handle.
      63                 :            :  */
      64                 :            : static inline struct posix_acl *
      65                 :            : posix_acl_dup(struct posix_acl *acl)
      66                 :            : {
      67   [ #  #  #  # ]:          0 :         if (acl)
           [ #  #  #  #  
             #  #  #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  #  
             #  #  #  # ]
           [ #  #  #  # ]
      68                 :          0 :                 atomic_inc(&acl->a_refcount);
      69                 :            :         return acl;
      70                 :            : }
      71                 :            : 
      72                 :            : /*
      73                 :            :  * Free an ACL handle.
      74                 :            :  */
      75                 :            : static inline void
      76                 :            : posix_acl_release(struct posix_acl *acl)
      77                 :            : {
      78   [ #  #  #  # ]:        379 :         if (acl && atomic_dec_and_test(&acl->a_refcount))
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ -  +  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  #  
             #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  #  
             #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  #  
             #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  #  
             #  #  #  # ]
           [ #  #  #  # ]
      79                 :          0 :                 kfree_rcu(acl, a_rcu);
      80                 :            : }
      81                 :            : 
      82                 :            : 
      83                 :            : /* posix_acl.c */
      84                 :            : 
      85                 :            : extern void posix_acl_init(struct posix_acl *, int);
      86                 :            : extern struct posix_acl *posix_acl_alloc(int, gfp_t);
      87                 :            : extern int posix_acl_valid(const struct posix_acl *);
      88                 :            : extern int posix_acl_permission(struct inode *, const struct posix_acl *, int);
      89                 :            : extern struct posix_acl *posix_acl_from_mode(umode_t, gfp_t);
      90                 :            : extern int posix_acl_equiv_mode(const struct posix_acl *, umode_t *);
      91                 :            : extern int posix_acl_create(struct posix_acl **, gfp_t, umode_t *);
      92                 :            : extern int posix_acl_chmod(struct posix_acl **, gfp_t, umode_t);
      93                 :            : 
      94                 :            : extern struct posix_acl *get_posix_acl(struct inode *, int);
      95                 :            : extern int set_posix_acl(struct inode *, int, struct posix_acl *);
      96                 :            : 
      97                 :            : #ifdef CONFIG_FS_POSIX_ACL
      98                 :            : static inline struct posix_acl **acl_by_type(struct inode *inode, int type)
      99                 :            : {
     100      [ #  #  # ]:          0 :         switch (type) {
              [ #  #  # ]
              [ #  #  # ]
     101                 :            :         case ACL_TYPE_ACCESS:
     102                 :          0 :                 return &inode->i_acl;
     103                 :            :         case ACL_TYPE_DEFAULT:
     104                 :          0 :                 return &inode->i_default_acl;
     105                 :            :         default:
     106                 :          0 :                 BUG();
     107                 :            :         }
     108                 :            : }
     109                 :            : 
     110                 :            : static inline struct posix_acl *get_cached_acl(struct inode *inode, int type)
     111                 :            : {
     112                 :            :         struct posix_acl **p = acl_by_type(inode, type);
     113                 :        733 :         struct posix_acl *acl = ACCESS_ONCE(*p);
     114 [ -  + ][ -  + ]:        733 :         if (acl) {
         [ #  # ][ #  # ]
     115                 :            :                 spin_lock(&inode->i_lock);
     116                 :          0 :                 acl = *p;
     117   [ #  #  #  #  :          0 :                 if (acl != ACL_NOT_CACHED)
             #  #  #  # ]
     118                 :            :                         acl = posix_acl_dup(acl);
     119                 :            :                 spin_unlock(&inode->i_lock);
     120                 :            :         }
     121                 :            :         return acl;
     122                 :            : }
     123                 :            : 
     124                 :            : static inline struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type)
     125                 :            : {
     126                 :    1520928 :         return rcu_dereference(*acl_by_type(inode, type));
     127                 :            : }
     128                 :            : 
     129                 :            : static inline void set_cached_acl(struct inode *inode,
     130                 :            :                                   int type,
     131                 :            :                                   struct posix_acl *acl)
     132                 :            : {
     133                 :            :         struct posix_acl **p = acl_by_type(inode, type);
     134                 :            :         struct posix_acl *old;
     135                 :            :         spin_lock(&inode->i_lock);
     136                 :          0 :         old = *p;
     137                 :          0 :         rcu_assign_pointer(*p, posix_acl_dup(acl));
     138                 :            :         spin_unlock(&inode->i_lock);
     139   [ #  #  #  #  :          0 :         if (old != ACL_NOT_CACHED)
             #  #  #  # ]
     140                 :            :                 posix_acl_release(old);
     141                 :            : }
     142                 :            : 
     143                 :            : static inline void forget_cached_acl(struct inode *inode, int type)
     144                 :            : {
     145                 :            :         struct posix_acl **p = acl_by_type(inode, type);
     146                 :            :         struct posix_acl *old;
     147                 :            :         spin_lock(&inode->i_lock);
     148                 :            :         old = *p;
     149                 :            :         *p = ACL_NOT_CACHED;
     150                 :            :         spin_unlock(&inode->i_lock);
     151                 :            :         if (old != ACL_NOT_CACHED)
     152                 :            :                 posix_acl_release(old);
     153                 :            : }
     154                 :            : 
     155                 :            : static inline void forget_all_cached_acls(struct inode *inode)
     156                 :            : {
     157                 :            :         struct posix_acl *old_access, *old_default;
     158                 :            :         spin_lock(&inode->i_lock);
     159                 :            :         old_access = inode->i_acl;
     160                 :            :         old_default = inode->i_default_acl;
     161                 :            :         inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED;
     162                 :            :         spin_unlock(&inode->i_lock);
     163                 :            :         if (old_access != ACL_NOT_CACHED)
     164                 :            :                 posix_acl_release(old_access);
     165                 :            :         if (old_default != ACL_NOT_CACHED)
     166                 :            :                 posix_acl_release(old_default);
     167                 :            : }
     168                 :            : #endif
     169                 :            : 
     170                 :            : static inline void cache_no_acl(struct inode *inode)
     171                 :            : {
     172                 :            : #ifdef CONFIG_FS_POSIX_ACL
     173                 :     877266 :         inode->i_acl = NULL;
     174                 :     877266 :         inode->i_default_acl = NULL;
     175                 :            : #endif
     176                 :            : }
     177                 :            : 
     178                 :            : #endif  /* __LINUX_POSIX_ACL_H */

Generated by: LCOV version 1.9