Initial import of binutils 2.22 on the new vendor branch
[dragonfly.git] / sys / dev / disk / dm / doc / proposal-dm.txt
1
2
3 /* constant dm_target structures for error, zero, linear, stripes etc. */
4 struct 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
14 struct 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 };
23 SLIST(dm_table, dm_table_entry);
24
25
26 struct dm_pdev {
27         struct vnode *pdev_vnode;
28         int refcnt;
29         SLIST_ENTRY(dm_pdev) next_pdev;
30 };
31 SLIST(dm_pdevs, pm_pdev);
32
33
34 struct 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 };
55 SLIST(dm_dev_list, dm_dev) dm_devs;
56
57
58 /* for zero,error : dm_target->target_config == NULL */
59 /* for linear : */
60 struct target_linear_config {
61         struct dm_pdev *pdev;
62         uint64_t offset;
63 };
64
65
66 /* for mirror : */
67 struct 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 : */
81 struct 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