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 TAILQ_ENTRY(dm_target) dm_target_next; 11}; 12 13 14struct dm_table_entry { 15 struct dm_dev *dev; /* backlink */ 16 uint64_t start; 17 uint64_t length; 18 19 struct dm_target *target; 20 void *target_config; 21 TAILQ_ENTRY(dm_table_entry) next; 22}; 23TAILQ_HEAD(dm_table, dm_table_entry); 24 25 26struct dm_pdev { 27 struct vnode *pdev_vnode; 28 int refcnt; 29 TAILQ_ENTRY(dm_pdev) next_pdev; 30}; 31TAILQ_HEAD(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 TAILQ_NEXT(dm_dev) next_upcall; 52 53 TAILQ_NEXT(dm_dev) next_devlist; 54}; 55TAILQ_HEAD(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