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