Print this page
expandable RAID-Z


  56         avl_node_t      ss_node;        /* AVL node */
  57         uint64_t        ss_start;       /* starting offset of this segment */
  58         uint64_t        ss_end;         /* ending offset (non-inclusive) */
  59 } space_seg_t;
  60 
  61 typedef struct space_map_obj {
  62         uint64_t        smo_object;     /* on-disk space map object */
  63         uint64_t        smo_objsize;    /* size of the object */
  64         uint64_t        smo_alloc;      /* space allocated from the map */
  65 } space_map_obj_t;
  66 
  67 struct space_map_ops {
  68         void    (*smop_load)(space_map_t *sm);
  69         void    (*smop_unload)(space_map_t *sm);
  70         uint64_t (*smop_alloc)(space_map_t *sm, uint64_t size);
  71         void    (*smop_claim)(space_map_t *sm, uint64_t start, uint64_t size);
  72         void    (*smop_free)(space_map_t *sm, uint64_t start, uint64_t size);
  73 };
  74 
  75 /*
  76  * debug entry
  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  *    1               47                   1           15
  89  *  ,-----------------------------------------------------------.
  90  *  | 0 |   offset (sm_shift units)    | type |       run       |
  91  *  `-----------------------------------------------------------'
  92  *   63  62                          17   16   15               0
  93  */
  94 
  95 /* All this stuff takes and returns bytes */
  96 #define SM_RUN_DECODE(x)        (BF64_DECODE(x, 0, 15) + 1)
  97 #define SM_RUN_ENCODE(x)        BF64_ENCODE((x) - 1, 0, 15)
  98 #define SM_TYPE_DECODE(x)       BF64_DECODE(x, 15, 1)
  99 #define SM_TYPE_ENCODE(x)       BF64_ENCODE(x, 15, 1)
 100 #define SM_OFFSET_DECODE(x)     BF64_DECODE(x, 16, 47)
 101 #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 








 105 #define SM_DEBUG_ACTION_DECODE(x)       BF64_DECODE(x, 60, 3)
 106 #define SM_DEBUG_ACTION_ENCODE(x)       BF64_ENCODE(x, 60, 3)
 107 
 108 #define SM_DEBUG_SYNCPASS_DECODE(x)     BF64_DECODE(x, 50, 10)
 109 #define SM_DEBUG_SYNCPASS_ENCODE(x)     BF64_ENCODE(x, 50, 10)
 110 
 111 #define SM_DEBUG_TXG_DECODE(x)          BF64_DECODE(x, 0, 50)
 112 #define SM_DEBUG_TXG_ENCODE(x)          BF64_ENCODE(x, 0, 50)
 113 
 114 #define SM_RUN_MAX                      SM_RUN_DECODE(~0ULL)
 115 
 116 #define SM_ALLOC        0x0
 117 #define SM_FREE         0x1
 118 


 119 /*
 120  * The data for a given space map can be kept on blocks of any size.
 121  * Larger blocks entail fewer i/o operations, but they also cause the
 122  * DMU to keep more data in-core, and also to waste more i/o bandwidth
 123  * when only a few blocks have changed since the last transaction group.
 124  * This could use a lot more research, but for now, set the freelist
 125  * block size to 4k (2^12).
 126  */
 127 #define SPACE_MAP_BLOCKSHIFT    12
 128 
 129 typedef void space_map_func_t(space_map_t *sm, uint64_t start, uint64_t size);
 130 
 131 extern void space_map_create(space_map_t *sm, uint64_t start, uint64_t size,
 132     uint8_t shift, kmutex_t *lp);
 133 extern void space_map_destroy(space_map_t *sm);
 134 extern void space_map_add(space_map_t *sm, uint64_t start, uint64_t size);
 135 extern void space_map_remove(space_map_t *sm, uint64_t start, uint64_t size);
 136 extern int space_map_contains(space_map_t *sm, uint64_t start, uint64_t size);
 137 extern void space_map_vacate(space_map_t *sm,
 138     space_map_func_t *func, space_map_t *mdest);




  56         avl_node_t      ss_node;        /* AVL node */
  57         uint64_t        ss_start;       /* starting offset of this segment */
  58         uint64_t        ss_end;         /* ending offset (non-inclusive) */
  59 } space_seg_t;
  60 
  61 typedef struct space_map_obj {
  62         uint64_t        smo_object;     /* on-disk space map object */
  63         uint64_t        smo_objsize;    /* size of the object */
  64         uint64_t        smo_alloc;      /* space allocated from the map */
  65 } space_map_obj_t;
  66 
  67 struct space_map_ops {
  68         void    (*smop_load)(space_map_t *sm);
  69         void    (*smop_unload)(space_map_t *sm);
  70         uint64_t (*smop_alloc)(space_map_t *sm, uint64_t size);
  71         void    (*smop_claim)(space_map_t *sm, uint64_t start, uint64_t size);
  72         void    (*smop_free)(space_map_t *sm, uint64_t start, uint64_t size);
  73 };
  74 
  75 /*
  76  * allocation/free entry
  77  *
  78  *    1               47                   1           15
  79  *  ,---+------------------------------+------+-----------------.
  80  *  | 0 |   offset (sm_shift units)    | type |       run       |
  81  *  `---+------------------------------+------+-----------------'
  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
  99  */
 100 
 101 /* All this stuff takes and returns bytes */
 102 #define SM_RUN_DECODE(x)        (BF64_DECODE(x, 0, 15) + 1)
 103 #define SM_RUN_ENCODE(x)        BF64_ENCODE((x) - 1, 0, 15)
 104 #define SM_TYPE_DECODE(x)       BF64_DECODE(x, 15, 1)
 105 #define SM_TYPE_ENCODE(x)       BF64_ENCODE(x, 15, 1)
 106 #define SM_OFFSET_DECODE(x)     BF64_DECODE(x, 16, 47)
 107 #define SM_OFFSET_ENCODE(x)     BF64_ENCODE(x, 16, 47)


 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 
 117 #define SM_DEBUG_ACTION_DECODE(x)       BF64_DECODE(x, 60, 3)
 118 #define SM_DEBUG_ACTION_ENCODE(x)       BF64_ENCODE(x, 60, 3)

 119 #define SM_DEBUG_SYNCPASS_DECODE(x)     BF64_DECODE(x, 50, 10)
 120 #define SM_DEBUG_SYNCPASS_ENCODE(x)     BF64_ENCODE(x, 50, 10)

 121 #define SM_DEBUG_TXG_DECODE(x)          BF64_DECODE(x, 0, 50)
 122 #define SM_DEBUG_TXG_ENCODE(x)          BF64_ENCODE(x, 0, 50)
 123 
 124 #define SM_RUN_MAX                      SM_RUN_DECODE(~0ULL)
 125 
 126 #define SM_ALLOC        0x0
 127 #define SM_FREE         0x1
 128 
 129 #define SM_FOLD         0x01
 130 
 131 /*
 132  * The data for a given space map can be kept on blocks of any size.
 133  * Larger blocks entail fewer i/o operations, but they also cause the
 134  * DMU to keep more data in-core, and also to waste more i/o bandwidth
 135  * when only a few blocks have changed since the last transaction group.
 136  * This could use a lot more research, but for now, set the freelist
 137  * block size to 4k (2^12).
 138  */
 139 #define SPACE_MAP_BLOCKSHIFT    12
 140 
 141 typedef void space_map_func_t(space_map_t *sm, uint64_t start, uint64_t size);
 142 
 143 extern void space_map_create(space_map_t *sm, uint64_t start, uint64_t size,
 144     uint8_t shift, kmutex_t *lp);
 145 extern void space_map_destroy(space_map_t *sm);
 146 extern void space_map_add(space_map_t *sm, uint64_t start, uint64_t size);
 147 extern void space_map_remove(space_map_t *sm, uint64_t start, uint64_t size);
 148 extern int space_map_contains(space_map_t *sm, uint64_t start, uint64_t size);
 149 extern void space_map_vacate(space_map_t *sm,
 150     space_map_func_t *func, space_map_t *mdest);