Print this page
3752 want more verifiable dbuf user eviction
Submitted by:   Justin Gibbs <justing@spectralogic.com>
Submitted by:   Will Andrews <willa@spectralogic.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/sys/zap_impl.h
          +++ new/usr/src/uts/common/fs/zfs/sys/zap_impl.h
↓ open down ↓ 54 lines elided ↑ open up ↑
  55   55  
  56   56  typedef struct mzap_phys {
  57   57          uint64_t mz_block_type; /* ZBT_MICRO */
  58   58          uint64_t mz_salt;
  59   59          uint64_t mz_normflags;
  60   60          uint64_t mz_pad[5];
  61   61          mzap_ent_phys_t mz_chunk[1];
  62   62          /* actually variable size depending on block size */
  63   63  } mzap_phys_t;
  64   64  
       65 +typedef struct mzap_dbuf {
       66 +        uint8_t mzdb_pad[offsetof(dmu_buf_t, db_data)];
       67 +        mzap_phys_t *mzdb_data;
       68 +} mzap_dbuf_t;
       69 +
  65   70  typedef struct mzap_ent {
  66   71          avl_node_t mze_node;
  67   72          int mze_chunkid;
  68   73          uint64_t mze_hash;
  69   74          uint32_t mze_cd; /* copy from mze_phys->mze_cd */
  70   75  } mzap_ent_t;
  71   76  
  72   77  #define MZE_PHYS(zap, mze) \
  73      -        (&(zap)->zap_m.zap_phys->mz_chunk[(mze)->mze_chunkid])
       78 +        (&(zap)->zap_m_phys->mz_chunk[(mze)->mze_chunkid])
  74   79  
  75   80  /*
  76   81   * The (fat) zap is stored in one object. It is an array of
  77   82   * 1<<FZAP_BLOCK_SHIFT byte blocks. The layout looks like one of:
  78   83   *
  79   84   * ptrtbl fits in first block:
  80   85   *      [zap_phys_t zap_ptrtbl_shift < 6] [zap_leaf_t] ...
  81   86   *
  82   87   * ptrtbl too big for first block:
  83   88   *      [zap_phys_t zap_ptrtbl_shift >= 6] [zap_leaf_t] [ptrtbl] ...
↓ open down ↓ 13 lines elided ↑ open up ↑
  97  102   * block size / entry size (2^3) / 2
  98  103   */
  99  104  #define ZAP_EMBEDDED_PTRTBL_SHIFT(zap) (FZAP_BLOCK_SHIFT(zap) - 3 - 1)
 100  105  
 101  106  /*
 102  107   * The embedded pointer table starts half-way through the block.  Since
 103  108   * the pointer table itself is half the block, it starts at (64-bit)
 104  109   * word number (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)).
 105  110   */
 106  111  #define ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) \
 107      -        ((uint64_t *)(zap)->zap_f.zap_phys) \
      112 +        ((uint64_t *)(zap)->zap_f_phys) \
 108  113          [(idx) + (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap))]
 109  114  
 110  115  /*
 111  116   * TAKE NOTE:
 112  117   * If zap_phys_t is modified, zap_byteswap() must be modified.
 113  118   */
 114  119  typedef struct zap_phys {
 115  120          uint64_t zap_block_type;        /* ZBT_HEADER */
 116  121          uint64_t zap_magic;             /* ZAP_MAGIC */
 117  122  
↓ open down ↓ 14 lines elided ↑ open up ↑
 132  137          /*
 133  138           * This structure is followed by padding, and then the embedded
 134  139           * pointer table.  The embedded pointer table takes up second
 135  140           * half of the block.  It is accessed using the
 136  141           * ZAP_EMBEDDED_PTRTBL_ENT() macro.
 137  142           */
 138  143  } zap_phys_t;
 139  144  
 140  145  typedef struct zap_table_phys zap_table_phys_t;
 141  146  
      147 +typedef struct fzap_dbuf {
      148 +        uint8_t fzdb_pad[offsetof(dmu_buf_t, db_data)];
      149 +        zap_phys_t *fzdb_data;
      150 +} fzap_dbuf_t;
      151 +
 142  152  typedef struct zap {
      153 +        dmu_buf_user_t db_evict;
 143  154          objset_t *zap_objset;
 144  155          uint64_t zap_object;
 145      -        struct dmu_buf *zap_dbuf;
      156 +        union {
      157 +                dmu_buf_t *zap_dmu_db;
      158 +                mzap_dbuf_t *mzap_db;
      159 +                fzap_dbuf_t *fzap_db;
      160 +        } zap_db_u;
 146  161          krwlock_t zap_rwlock;
 147  162          boolean_t zap_ismicro;
 148  163          int zap_normflags;
 149  164          uint64_t zap_salt;
 150  165          union {
 151  166                  struct {
 152      -                        zap_phys_t *zap_phys;
 153      -
 154      -                        /*
 155      -                         * zap_num_entries_mtx protects
 156      -                         * zap_num_entries
 157      -                         */
      167 +                        /* protects zap_num_entries */
 158  168                          kmutex_t zap_num_entries_mtx;
 159  169                          int zap_block_shift;
 160  170                  } zap_fat;
 161  171                  struct {
 162      -                        mzap_phys_t *zap_phys;
 163  172                          int16_t zap_num_entries;
 164  173                          int16_t zap_num_chunks;
 165  174                          int16_t zap_alloc_next;
 166  175                          avl_tree_t zap_avl;
 167  176                  } zap_micro;
 168  177          } zap_u;
 169  178  } zap_t;
 170  179  
      180 +/* See sys/dmu.h:dmu_buf_user_t for why we have these. */
      181 +#define zap_dbuf        zap_db_u.zap_dmu_db
      182 +#define zap_f           zap_u.zap_fat
      183 +#define zap_m           zap_u.zap_micro
      184 +#define zap_f_phys      zap_db_u.fzap_db->fzdb_data
      185 +#define zap_m_phys      zap_db_u.mzap_db->mzdb_data
      186 +
 171  187  typedef struct zap_name {
 172  188          zap_t *zn_zap;
 173  189          int zn_key_intlen;
 174  190          const void *zn_key_orig;
 175  191          int zn_key_orig_numints;
 176  192          const void *zn_key_norm;
 177  193          int zn_key_norm_numints;
 178  194          uint64_t zn_hash;
 179  195          matchtype_t zn_matchtype;
 180  196          char zn_normbuf[ZAP_MAXNAMELEN];
 181  197  } zap_name_t;
 182  198  
 183      -#define zap_f   zap_u.zap_fat
 184      -#define zap_m   zap_u.zap_micro
 185      -
 186  199  boolean_t zap_match(zap_name_t *zn, const char *matchname);
 187  200  int zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx,
 188  201      krw_t lti, boolean_t fatreader, boolean_t adding, zap_t **zapp);
 189  202  void zap_unlockdir(zap_t *zap);
 190      -void zap_evict(dmu_buf_t *db, void *vmzap);
      203 +void zap_evict(dmu_buf_user_t *dbu);
 191  204  zap_name_t *zap_name_alloc(zap_t *zap, const char *key, matchtype_t mt);
 192  205  void zap_name_free(zap_name_t *zn);
 193  206  int zap_hashbits(zap_t *zap);
 194  207  uint32_t zap_maxcd(zap_t *zap);
 195  208  uint64_t zap_getflags(zap_t *zap);
 196  209  
 197  210  #define ZAP_HASH_IDX(hash, n) (((n) == 0) ? 0 : ((hash) >> (64 - (n))))
 198  211  
 199  212  void fzap_byteswap(void *buf, size_t size);
 200  213  int fzap_count(zap_t *zap, uint64_t *count);
↓ open down ↓ 28 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX