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