Print this page
    
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/uts/common/brand/lx/devfs/lxd.h
          +++ new/usr/src/uts/common/brand/lx/devfs/lxd.h
   1    1  /*
   2    2   * This file and its contents are supplied under the terms of the
   3    3   * Common Development and Distribution License ("CDDL"), version 1.0.
   4    4   * You may only use this file in accordance with the terms of version
   5    5   * 1.0 of the CDDL.
   6    6   *
   7    7   * A full copy of the text of the CDDL should have accompanied this
   8    8   * source.  A copy of the CDDL is also available via the Internet at
   9    9   * http://www.illumos.org/license/CDDL.
  10   10   */
  11   11  
  12   12  /*
  13   13   * Copyright 2016 Joyent, Inc.
  14   14   */
  15   15  
  16   16  #ifndef _LXD_H
  17   17  #define _LXD_H
  18   18  
  19   19  #ifdef  __cplusplus
  20   20  extern "C" {
  21   21  #endif
  22   22  
  23   23  /*
  24   24   * lxd.h: declarations, data structures and macros for lxd (lxd devfs).
  25   25   */
  26   26  
  27   27  #include <sys/types.h>
  28   28  #include <sys/param.h>
  29   29  #include <sys/policy.h>
  30   30  #include <sys/dirent.h>
  31   31  #include <sys/errno.h>
  32   32  #include <sys/kmem.h>
  33   33  #include <sys/pathname.h>
  34   34  #include <sys/systm.h>
  35   35  #include <sys/var.h>
  36   36  #include <sys/sysmacros.h>
  37   37  #include <sys/cred.h>
  38   38  #include <sys/priv.h>
  39   39  #include <sys/vnode.h>
  40   40  #include <sys/vfs.h>
  41   41  #include <sys/statvfs.h>
  42   42  #include <sys/cmn_err.h>
  43   43  #include <sys/zone.h>
  44   44  #include <sys/uio.h>
  45   45  #include <sys/utsname.h>
  46   46  #include <sys/atomic.h>
  47   47  #include <vm/anon.h>
  48   48  #include <sys/lx_types.h>
  49   49  
  50   50  #if defined(_KERNEL)
  51   51  
  52   52  #include <sys/lx_brand.h>
  53   53  
  54   54  /*
  55   55   * It's unlikely that we need to create more than 50-60 subdirs/symlinks
  56   56   * as front files so we size the file system hash for 2x that number.
  57   57   * The back devfs typically has ~80 nodes so this is also a comfortable size
  58   58   * for the back hash table.
  59   59   */
  60   60  #define LXD_HASH_SZ     128
  61   61  
  62   62  #define LXD_BACK_HASH(v)        ((((intptr_t)(v)) >> 10) & ((LXD_HASH_SZ) - 1))
  63   63  
  64   64  #define LXD_NM_HASH(ldn, name, hash)                            \
  65   65          {                                                       \
  66   66                  char Xc, *Xcp;                                  \
  67   67                  hash = (uint_t)(uintptr_t)(ldn) >> 8;           \
  68   68                  for (Xcp = (name); (Xc = *Xcp) != 0; Xcp++)     \
  69   69                          hash = (hash << 4) + hash + (uint_t)Xc; \
  70   70                  hash &= (LXD_HASH_SZ - 1);                      \
  71   71          }
  72   72  
  73   73  
  74   74  enum lxd_node_type      { LXDNT_NONE, LXDNT_BACK, LXDNT_FRONT };
  75   75  
  76   76  typedef struct lxd_dev_attr {
  77   77          list_node_t     lxda_link;
  78   78          char            lxda_name[MAXPATHLEN];
  79   79          uid_t           lxda_uid;
  80   80          gid_t           lxda_gid;
  81   81          mode_t          lxda_mode;
  82   82  } lxd_dev_attr_t;
  83   83  
  84   84  /*
  85   85   * lxd per-mount data structure.
  86   86   *
  87   87   * All fields are protected by lxd_contents.
  88   88   * File renames on a specific file system are protected lxdm_renamelck.
  89   89   */
  90   90  typedef struct lxd_mnt {
  91   91          struct vfs      *lxdm_vfsp;     /* filesystem's vfs struct */
  92   92          struct lxd_node *lxdm_rootnode; /* root lxd_node */
  93   93          char            *lxdm_mntpath;  /* name of lxd mount point */
  94   94          dev_t           lxdm_dev;       /* unique dev # of mounted `device' */
  95   95          kmutex_t        lxdm_contents;  /* per-mount lock */
  96   96          kmutex_t        lxdm_renamelck; /* rename lock for this mount */
  97   97          kmutex_t        lxdm_attrlck;   /* per-mount attr. file lock */
  98   98          list_t          lxdm_devattrs;  /* list of device attr. settings */
  99   99          uint_t          lxdm_gen;       /* node ID source for files */
 100  100  
 101  101          /* protects buckets in both "dir ent" and "back" hash tables */
 102  102          kmutex_t        lxdm_hash_mutex[LXD_HASH_SZ];
 103  103  
 104  104          /* per-mount data for "back" vnodes in the fs */
 105  105          uint_t          lxdm_back_refcnt; /* # outstanding "back" vnodes */
 106  106          struct lxd_node *lxdm_back_htable[LXD_HASH_SZ];
 107  107  
 108  108          /*
 109  109           * Per-mount directory data for "front" nodes in the fs.
 110  110           * Each front node has a directory entry but directory entries can live
 111  111           * on either front or back nodes.
 112  112           */
 113  113          uint_t          lxdm_dent_refcnt; /* # outstanding dir ents */
 114  114          struct lxd_dirent *lxdm_dent_htable[LXD_HASH_SZ];
 115  115  } lxd_mnt_t;
 116  116  
 117  117  /*
 118  118   * lxd_node is the file system dependent node for lxd.
 119  119   *
 120  120   * The node is used to represent both front and back files. For front files
 121  121   * the node can represent either a directory or symlink.
 122  122   */
 123  123  typedef struct lxd_node {
 124  124          enum lxd_node_type      lxdn_type;
 125  125  
 126  126          /* Data for "front" nodes */
 127  127          struct lxd_node         *lxdn_prev;     /* lnked lst of lxd nodes */
 128  128          struct lxd_node         *lxdn_next;     /* lnked lst of lxd nodes */
 129  129          struct lxd_node         *lxdn_parent;   /* dir containing this node */
 130  130          krwlock_t               lxdn_rwlock;    /* serialize mods/dir updates */
 131  131          kmutex_t                lxdn_tlock;     /* time, flag, and nlink lock */
 132  132  
 133  133          /* these could be in a union ala tmpfs but not really necessary */
 134  134          uint_t                  lxdn_dirents;   /* number of dirents */
 135  135          struct lxd_dirent       *lxdn_dir;      /* dirent list */
 136  136          char                    *lxdn_symlink;  /* pointer to symlink */
 137  137          struct vattr            lxdn_attr;      /* attributes */
 138  138  
 139  139          /* Hash table link */
 140  140          struct lxd_node         *lxdn_hnxt;     /* link in per-mount entry */
 141  141                                                  /* hash table */
 142  142          vnode_t                 *lxdn_vnode;    /* vnode for this lxd_node */
 143  143  
 144  144          vnode_t                 *lxdn_real_vp;  /* back file - real vnode */
 145  145  } lxd_node_t;
 146  146  
 147  147  /*
 148  148   * Attributes
 149  149   */
 150  150  #define lxdn_mask       lxdn_attr.va_mask
 151  151  #define lxdn_mode       lxdn_attr.va_mode
 152  152  #define lxdn_uid        lxdn_attr.va_uid
 153  153  #define lxdn_gid        lxdn_attr.va_gid
 154  154  #define lxdn_fsid       lxdn_attr.va_fsid
 155  155  #define lxdn_nodeid     lxdn_attr.va_nodeid
 156  156  #define lxdn_nlink      lxdn_attr.va_nlink
 157  157  #define lxdn_size       lxdn_attr.va_size
 158  158  #define lxdn_atime      lxdn_attr.va_atime
 159  159  #define lxdn_mtime      lxdn_attr.va_mtime
 160  160  #define lxdn_ctime      lxdn_attr.va_ctime
 161  161  #define lxdn_rdev       lxdn_attr.va_rdev
 162  162  #define lxdn_blksize    lxdn_attr.va_blksize
 163  163  #define lxdn_nblocks    lxdn_attr.va_nblocks
 164  164  #define lxdn_seq        lxdn_attr.va_seq
 165  165  
 166  166  /*
 167  167   * lx devfs conversion macros
 168  168   */
 169  169  #define VFSTOLXDM(vfsp)         ((lxd_mnt_t *)(vfsp)->vfs_data)
 170  170  #define VTOLXDM(vp)             ((lxd_mnt_t *)(vp)->v_vfsp->vfs_data)
 171  171  #define VTOLDN(vp)              ((lxd_node_t *)(vp)->v_data)
 172  172  #define LDNTOV(ln)              ((ln)->lxdn_vnode)
 173  173  #define ldnode_hold(ln)         VN_HOLD(LDNTOV(ln))
 174  174  #define ldnode_rele(ln)         VN_RELE(LDNTOV(ln))
 175  175  
 176  176  #define REALVP(vp)              (VTOLDN(vp)->lxdn_real_vp)
 177  177  
 178  178  /*
 179  179   * front directories are made up of a linked list of lxd_dirent structures
 180  180   * hanging off directory lxdn_nodes.  File names are not fixed length, but are
 181  181   * null terminated.
 182  182   */
 183  183  typedef struct lxd_dirent {
 184  184          lxd_node_t              *lddir_node;    /* lxd node for this file */
 185  185          struct lxd_dirent       *lddir_next;    /* next directory entry */
 186  186          struct lxd_dirent       *lddir_prev;    /* prev directory entry */
 187  187          uint_t                  lddir_offset;   /* "offset" of dir entry */
 188  188          uint_t                  lddir_hash;     /* a hash of lddir_name */
 189  189          struct lxd_dirent       *lddir_link;    /* linked via hash table */
 190  190          lxd_node_t              *lddir_parent;  /* parent, dir we are in */
 191  191          char                    *lddir_name;    /* null terminated */
 192  192  } lxd_dirent_t;
 193  193  
 194  194  enum de_op      { DE_CREATE, DE_MKDIR, DE_RENAME };     /* direnter ops */
 195  195  enum dr_op      { DR_REMOVE, DR_RMDIR, DR_RENAME };     /* dirremove ops */
 196  196  
 197  197  typedef struct lxd_minor_translator {
 198  198          char    *lxd_mt_path;           /* illumos minor node path */
 199  199          minor_t lxd_mt_minor;           /* illumos minor node number */
 200  200          int     lxd_mt_lx_major;        /* linux major node number */
 201  201          int     lxd_mt_lx_minor;        /* linux minor node number */
 202  202  } lxd_minor_translator_t;
 203  203  
 204  204  enum lxd_xl_tp  { DTT_INVALID, DTT_LIST, DTT_CUSTOM };
 205  205  
 206  206  #define xl_list         lxd_xl_minor.lxd_xl_list
 207  207  #define xl_custom       lxd_xl_minor.lxd_xl_custom
 208  208  
 209  209  typedef struct lxd_devt_translator {
 210  210          char            *lxd_xl_driver; /* driver name */
 211  211          major_t         lxd_xl_major;   /* driver number */
 212  212  
 213  213          enum lxd_xl_tp  lxd_xl_type;    /* dictates how we intrep. xl_minor */
 214  214          union {
 215  215                  uintptr_t               lxd_xl_foo; /* required to compile */
 216  216                  lxd_minor_translator_t  *lxd_xl_list;
 217  217                  void                    (*lxd_xl_custom)(dev_t, dev_t *);
 218  218          } lxd_xl_minor;
 219  219  } lxd_devt_translator_t;
 220  220  
 221  221  extern struct vnodeops *lxd_vnodeops;
 222  222  extern lxd_devt_translator_t lxd_devt_translators[];
 223  223  
 224  224  vnode_t *lxd_make_back_node(vnode_t *, lxd_mnt_t *);
 225  225  void lxd_free_back_node(lxd_node_t *);
 226  226  int lxd_dirdelete(lxd_node_t *, lxd_node_t *, char *, enum dr_op, cred_t *);
 227  227  int lxd_direnter(lxd_mnt_t *, lxd_node_t *, char *, enum de_op, lxd_node_t *,
 228  228          lxd_node_t *, struct vattr *, lxd_node_t **, cred_t *);
 229  229  void lxd_dirinit(lxd_node_t *, lxd_node_t *);
 230  230  int lxd_dirlookup(lxd_node_t *, char *, lxd_node_t **, cred_t *);
 231  231  void lxd_dirtrunc(lxd_node_t *);
 232  232  void lxd_node_init(lxd_mnt_t *, lxd_node_t *, vnode_t *, vattr_t *, cred_t *);
 233  233  int lxd_naccess(void *, int, cred_t *);
 234  234  
 235  235  void lxd_save_attrs(lxd_mnt_t *, vnode_t *);
 236  236  void lxd_apply_db(lxd_mnt_t *);
 237  237  
 238  238  #endif /* KERNEL */
 239  239  
 240  240  #ifdef  __cplusplus
 241  241  }
 242  242  #endif
 243  243  
 244  244  #endif /* _LXD_H */
  
    | 
      ↓ open down ↓ | 
    244 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX