Print this page
expandable RAID-Z

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/zfs/sys/space_map.h
          +++ new/usr/src/uts/common/fs/zfs/sys/space_map.h
↓ open down ↓ 65 lines elided ↑ open up ↑
  66   66  
  67   67  struct space_map_ops {
  68   68          void    (*smop_load)(space_map_t *sm);
  69   69          void    (*smop_unload)(space_map_t *sm);
  70   70          uint64_t (*smop_alloc)(space_map_t *sm, uint64_t size);
  71   71          void    (*smop_claim)(space_map_t *sm, uint64_t start, uint64_t size);
  72   72          void    (*smop_free)(space_map_t *sm, uint64_t start, uint64_t size);
  73   73  };
  74   74  
  75   75  /*
  76      - * debug entry
       76 + * allocation/free entry
  77   77   *
  78      - *    1      3         10                     50
  79      - *  ,---+--------+------------+---------------------------------.
  80      - *  | 1 | action |  syncpass  |        txg (lower bits)         |
  81      - *  `---+--------+------------+---------------------------------'
  82      - *   63  62    60 59        50 49                               0
  83      - *
  84      - *
  85      - *
  86      - * non-debug entry
  87      - *
  88   78   *    1               47                   1           15
  89      - *  ,-----------------------------------------------------------.
       79 + *  ,---+------------------------------+------+-----------------.
  90   80   *  | 0 |   offset (sm_shift units)    | type |       run       |
  91      - *  `-----------------------------------------------------------'
       81 + *  `---+------------------------------+------+-----------------'
  92   82   *   63  62                          17   16   15               0
       83 + *
       84 + * special entry
       85 + *
       86 + *    1   1      6                        56
       87 + *  ,---+---+----------+----------------------------------------.
       88 + *  | 1 | 1 |  action  |           <action specific>            |
       89 + *  `---+---+----------+----------------------------------------'
       90 + *   63  62  61      56 55                                      0
       91 + *   
       92 + * debug entry
       93 + *
       94 + *    1   1     2         10                     50
       95 + *  ,---+---+--------+----------+-------------------------------.
       96 + *  | 1 | 0 | action | syncpass |       txg (lower bits)        |
       97 + *  `---+---+--------+----------+-------------------------------'
       98 + *   63  62  61    60 59      50 49                             0
  93   99   */
  94  100  
  95  101  /* All this stuff takes and returns bytes */
  96  102  #define SM_RUN_DECODE(x)        (BF64_DECODE(x, 0, 15) + 1)
  97  103  #define SM_RUN_ENCODE(x)        BF64_ENCODE((x) - 1, 0, 15)
  98  104  #define SM_TYPE_DECODE(x)       BF64_DECODE(x, 15, 1)
  99  105  #define SM_TYPE_ENCODE(x)       BF64_ENCODE(x, 15, 1)
 100  106  #define SM_OFFSET_DECODE(x)     BF64_DECODE(x, 16, 47)
 101  107  #define SM_OFFSET_ENCODE(x)     BF64_ENCODE(x, 16, 47)
 102      -#define SM_DEBUG_DECODE(x)      BF64_DECODE(x, 63, 1)
 103      -#define SM_DEBUG_ENCODE(x)      BF64_ENCODE(x, 63, 1)
 104  108  
      109 +#define SM_IS_SPECIAL(x)        (BF64_DECODE(x, 62, 2) == 3)
      110 +#define SM_SPECIAL_ENCODE()     BF64_ENCODE(3, 62, 2)
      111 +#define SM_IS_DEBUG(x)          (BF64_DECODE(x, 62, 2) == 2)
      112 +#define SM_DEBUG_ENCODE()       BF64_ENCODE(2, 62, 2)
      113 +
      114 +#define SM_SPECIAL_ACTION_DECODE(x)     BF64_DECODE(x, 56, 6)
      115 +#define SM_SPECIAL_ACTION_ENCODE(x)     BF64_ENCODE(x, 56, 6)
      116 +
 105  117  #define SM_DEBUG_ACTION_DECODE(x)       BF64_DECODE(x, 60, 3)
 106  118  #define SM_DEBUG_ACTION_ENCODE(x)       BF64_ENCODE(x, 60, 3)
 107      -
 108  119  #define SM_DEBUG_SYNCPASS_DECODE(x)     BF64_DECODE(x, 50, 10)
 109  120  #define SM_DEBUG_SYNCPASS_ENCODE(x)     BF64_ENCODE(x, 50, 10)
 110      -
 111  121  #define SM_DEBUG_TXG_DECODE(x)          BF64_DECODE(x, 0, 50)
 112  122  #define SM_DEBUG_TXG_ENCODE(x)          BF64_ENCODE(x, 0, 50)
 113  123  
 114  124  #define SM_RUN_MAX                      SM_RUN_DECODE(~0ULL)
 115  125  
 116  126  #define SM_ALLOC        0x0
 117  127  #define SM_FREE         0x1
 118  128  
      129 +#define SM_FOLD         0x01
      130 +
 119  131  /*
 120  132   * The data for a given space map can be kept on blocks of any size.
 121  133   * Larger blocks entail fewer i/o operations, but they also cause the
 122  134   * DMU to keep more data in-core, and also to waste more i/o bandwidth
 123  135   * when only a few blocks have changed since the last transaction group.
 124  136   * This could use a lot more research, but for now, set the freelist
 125  137   * block size to 4k (2^12).
 126  138   */
 127  139  #define SPACE_MAP_BLOCKSHIFT    12
 128  140  
↓ open down ↓ 34 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX