1
2
3/* constant dm_target structures for error, zero, linear, stripes etc. */
4struct dm_target {
5          int (*init)(struct dm_table_entry *, int argc, char **argv);
6          int (*destroy)(struct dm_table_entry *);
7          int (*strategy)(struct dm_table_entry *, struct buf *);
8          int (*upcall)(struct dm_table_entry *, struct buf *);
9
10          SLIST_ENTRY(dm_target) next;
11};
12
13
14struct dm_table_entry {
15          struct dm_dev *dm_dev;                  /* backlink */
16          uint64_t start;
17          uint64_t length;
18
19          struct dm_target *target;
20          void *target_config;
21          SLIST_ENTRY(dm_table_entry) next;
22};
23SLIST(dm_table, dm_table_entry);
24
25
26struct dm_pdev {
27          struct vnode *pdev_vnode;
28          int refcnt;
29          SLIST_ENTRY(dm_pdev) next_pdev;
30};
31SLIST(dm_pdevs, pm_pdev);
32
33
34struct dm_dev {
35          char name[DM_NAME_LEN];
36          char uuid[DM_UUID_LEN];
37
38          int minor;
39          uint32_t flags;
40
41          kmutex_t dev_mtx;
42          uint32_t event_nr;
43          uint32_t ref_cnt;
44
45          struct dm_pdev pdevs;
46
47          int cur_active_table;
48          struct dm_table tables[2];
49
50          struct dm_dev_list upcalls;
51          SLIST_NEXT(dm_dev) next_upcall;
52
53          SLIST_NEXT(dm_dev) next_devlist;
54};
55SLIST(dm_dev_list, dm_dev) dm_devs;
56
57
58/* for zero,error : dm_target->target_config == NULL */
59/* for linear : */
60struct target_linear_config {
61          struct dm_pdev *pdev;
62          uint64_t offset;
63};
64
65
66/* for mirror : */
67struct target_mirror_config {
68          struct dm_pdev *orig;
69          struct dm_pdev *copies[MAX_MIRROR_COPIES];
70
71          /* copied blocks bitmaps administration etc*/
72          struct dm_pdev *log_pdev;     /* for administration */
73          uint64_t log_regionsize;      /* blocksize of mirror */
74
75          /* list of parts that still need copied etc.; run length encoded? */
76          ....
77};
78
79
80/* for snapshot : */
81struct target_snapshot_config {
82          struct dm_dev *orig;
83
84          /* modified blocks bitmaps administration etc*/
85          struct dm_pdev *log_pdev;
86          uint64_t log_regionsize;
87          /* list of sector renames to the log device */
88          ...
89};
90
91