Print this page
expandable RAID-Z

@@ -71,53 +71,65 @@
         void    (*smop_claim)(space_map_t *sm, uint64_t start, uint64_t size);
         void    (*smop_free)(space_map_t *sm, uint64_t start, uint64_t size);
 };
 
 /*
- * debug entry
+ * allocation/free entry
  *
- *    1      3         10                     50
- *  ,---+--------+------------+---------------------------------.
- *  | 1 | action |  syncpass  |        txg (lower bits)         |
- *  `---+--------+------------+---------------------------------'
- *   63  62    60 59        50 49                               0
+ *    1               47                   1           15
+ *  ,---+------------------------------+------+-----------------.
+ *  | 0 |   offset (sm_shift units)    | type |       run       |
+ *  `---+------------------------------+------+-----------------'
+ *   63  62                          17   16   15               0
  *
+ * special entry
  *
+ *    1   1      6                        56
+ *  ,---+---+----------+----------------------------------------.
+ *  | 1 | 1 |  action  |           <action specific>            |
+ *  `---+---+----------+----------------------------------------'
+ *   63  62  61      56 55                                      0
  *
- * non-debug entry
+ * debug entry
  *
- *    1               47                   1           15
- *  ,-----------------------------------------------------------.
- *  | 0 |   offset (sm_shift units)    | type |       run       |
- *  `-----------------------------------------------------------'
- *   63  62                          17   16   15               0
+ *    1   1     2         10                     50
+ *  ,---+---+--------+----------+-------------------------------.
+ *  | 1 | 0 | action | syncpass |       txg (lower bits)        |
+ *  `---+---+--------+----------+-------------------------------'
+ *   63  62  61    60 59      50 49                             0
  */
 
 /* All this stuff takes and returns bytes */
 #define SM_RUN_DECODE(x)        (BF64_DECODE(x, 0, 15) + 1)
 #define SM_RUN_ENCODE(x)        BF64_ENCODE((x) - 1, 0, 15)
 #define SM_TYPE_DECODE(x)       BF64_DECODE(x, 15, 1)
 #define SM_TYPE_ENCODE(x)       BF64_ENCODE(x, 15, 1)
 #define SM_OFFSET_DECODE(x)     BF64_DECODE(x, 16, 47)
 #define SM_OFFSET_ENCODE(x)     BF64_ENCODE(x, 16, 47)
-#define SM_DEBUG_DECODE(x)      BF64_DECODE(x, 63, 1)
-#define SM_DEBUG_ENCODE(x)      BF64_ENCODE(x, 63, 1)
 
+#define SM_IS_SPECIAL(x)        (BF64_DECODE(x, 62, 2) == 3)
+#define SM_SPECIAL_ENCODE()     BF64_ENCODE(3, 62, 2)
+#define SM_IS_DEBUG(x)          (BF64_DECODE(x, 62, 2) == 2)
+#define SM_DEBUG_ENCODE()       BF64_ENCODE(2, 62, 2)
+
+#define SM_SPECIAL_ACTION_DECODE(x)     BF64_DECODE(x, 56, 6)
+#define SM_SPECIAL_ACTION_ENCODE(x)     BF64_ENCODE(x, 56, 6)
+
 #define SM_DEBUG_ACTION_DECODE(x)       BF64_DECODE(x, 60, 3)
 #define SM_DEBUG_ACTION_ENCODE(x)       BF64_ENCODE(x, 60, 3)
-
 #define SM_DEBUG_SYNCPASS_DECODE(x)     BF64_DECODE(x, 50, 10)
 #define SM_DEBUG_SYNCPASS_ENCODE(x)     BF64_ENCODE(x, 50, 10)
-
 #define SM_DEBUG_TXG_DECODE(x)          BF64_DECODE(x, 0, 50)
 #define SM_DEBUG_TXG_ENCODE(x)          BF64_ENCODE(x, 0, 50)
 
 #define SM_RUN_MAX                      SM_RUN_DECODE(~0ULL)
 
 #define SM_ALLOC        0x0
 #define SM_FREE         0x1
 
+#define SM_FOLD         0x01
+
 /*
  * The data for a given space map can be kept on blocks of any size.
  * Larger blocks entail fewer i/o operations, but they also cause the
  * DMU to keep more data in-core, and also to waste more i/o bandwidth
  * when only a few blocks have changed since the last transaction group.