1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * Copyright (C) 2001 Sistina Software (UK) Limited. 3*1da177e4SLinus Torvalds * Copyright (C) 2004 Red Hat, Inc. All rights reserved. 4*1da177e4SLinus Torvalds * 5*1da177e4SLinus Torvalds * This file is released under the LGPL. 6*1da177e4SLinus Torvalds */ 7*1da177e4SLinus Torvalds 8*1da177e4SLinus Torvalds #ifndef _LINUX_DEVICE_MAPPER_H 9*1da177e4SLinus Torvalds #define _LINUX_DEVICE_MAPPER_H 10*1da177e4SLinus Torvalds 11*1da177e4SLinus Torvalds struct dm_target; 12*1da177e4SLinus Torvalds struct dm_table; 13*1da177e4SLinus Torvalds struct dm_dev; 14*1da177e4SLinus Torvalds 15*1da177e4SLinus Torvalds typedef enum { STATUSTYPE_INFO, STATUSTYPE_TABLE } status_type_t; 16*1da177e4SLinus Torvalds 17*1da177e4SLinus Torvalds union map_info { 18*1da177e4SLinus Torvalds void *ptr; 19*1da177e4SLinus Torvalds unsigned long long ll; 20*1da177e4SLinus Torvalds }; 21*1da177e4SLinus Torvalds 22*1da177e4SLinus Torvalds /* 23*1da177e4SLinus Torvalds * In the constructor the target parameter will already have the 24*1da177e4SLinus Torvalds * table, type, begin and len fields filled in. 25*1da177e4SLinus Torvalds */ 26*1da177e4SLinus Torvalds typedef int (*dm_ctr_fn) (struct dm_target *target, 27*1da177e4SLinus Torvalds unsigned int argc, char **argv); 28*1da177e4SLinus Torvalds 29*1da177e4SLinus Torvalds /* 30*1da177e4SLinus Torvalds * The destructor doesn't need to free the dm_target, just 31*1da177e4SLinus Torvalds * anything hidden ti->private. 32*1da177e4SLinus Torvalds */ 33*1da177e4SLinus Torvalds typedef void (*dm_dtr_fn) (struct dm_target *ti); 34*1da177e4SLinus Torvalds 35*1da177e4SLinus Torvalds /* 36*1da177e4SLinus Torvalds * The map function must return: 37*1da177e4SLinus Torvalds * < 0: error 38*1da177e4SLinus Torvalds * = 0: The target will handle the io by resubmitting it later 39*1da177e4SLinus Torvalds * > 0: simple remap complete 40*1da177e4SLinus Torvalds */ 41*1da177e4SLinus Torvalds typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio, 42*1da177e4SLinus Torvalds union map_info *map_context); 43*1da177e4SLinus Torvalds 44*1da177e4SLinus Torvalds /* 45*1da177e4SLinus Torvalds * Returns: 46*1da177e4SLinus Torvalds * < 0 : error (currently ignored) 47*1da177e4SLinus Torvalds * 0 : ended successfully 48*1da177e4SLinus Torvalds * 1 : for some reason the io has still not completed (eg, 49*1da177e4SLinus Torvalds * multipath target might want to requeue a failed io). 50*1da177e4SLinus Torvalds */ 51*1da177e4SLinus Torvalds typedef int (*dm_endio_fn) (struct dm_target *ti, 52*1da177e4SLinus Torvalds struct bio *bio, int error, 53*1da177e4SLinus Torvalds union map_info *map_context); 54*1da177e4SLinus Torvalds 55*1da177e4SLinus Torvalds typedef void (*dm_presuspend_fn) (struct dm_target *ti); 56*1da177e4SLinus Torvalds typedef void (*dm_postsuspend_fn) (struct dm_target *ti); 57*1da177e4SLinus Torvalds typedef void (*dm_resume_fn) (struct dm_target *ti); 58*1da177e4SLinus Torvalds 59*1da177e4SLinus Torvalds typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type, 60*1da177e4SLinus Torvalds char *result, unsigned int maxlen); 61*1da177e4SLinus Torvalds 62*1da177e4SLinus Torvalds typedef int (*dm_message_fn) (struct dm_target *ti, unsigned argc, char **argv); 63*1da177e4SLinus Torvalds 64*1da177e4SLinus Torvalds void dm_error(const char *message); 65*1da177e4SLinus Torvalds 66*1da177e4SLinus Torvalds /* 67*1da177e4SLinus Torvalds * Constructors should call these functions to ensure destination devices 68*1da177e4SLinus Torvalds * are opened/closed correctly. 69*1da177e4SLinus Torvalds * FIXME: too many arguments. 70*1da177e4SLinus Torvalds */ 71*1da177e4SLinus Torvalds int dm_get_device(struct dm_target *ti, const char *path, sector_t start, 72*1da177e4SLinus Torvalds sector_t len, int mode, struct dm_dev **result); 73*1da177e4SLinus Torvalds void dm_put_device(struct dm_target *ti, struct dm_dev *d); 74*1da177e4SLinus Torvalds 75*1da177e4SLinus Torvalds /* 76*1da177e4SLinus Torvalds * Information about a target type 77*1da177e4SLinus Torvalds */ 78*1da177e4SLinus Torvalds struct target_type { 79*1da177e4SLinus Torvalds const char *name; 80*1da177e4SLinus Torvalds struct module *module; 81*1da177e4SLinus Torvalds unsigned version[3]; 82*1da177e4SLinus Torvalds dm_ctr_fn ctr; 83*1da177e4SLinus Torvalds dm_dtr_fn dtr; 84*1da177e4SLinus Torvalds dm_map_fn map; 85*1da177e4SLinus Torvalds dm_endio_fn end_io; 86*1da177e4SLinus Torvalds dm_presuspend_fn presuspend; 87*1da177e4SLinus Torvalds dm_postsuspend_fn postsuspend; 88*1da177e4SLinus Torvalds dm_resume_fn resume; 89*1da177e4SLinus Torvalds dm_status_fn status; 90*1da177e4SLinus Torvalds dm_message_fn message; 91*1da177e4SLinus Torvalds }; 92*1da177e4SLinus Torvalds 93*1da177e4SLinus Torvalds struct io_restrictions { 94*1da177e4SLinus Torvalds unsigned short max_sectors; 95*1da177e4SLinus Torvalds unsigned short max_phys_segments; 96*1da177e4SLinus Torvalds unsigned short max_hw_segments; 97*1da177e4SLinus Torvalds unsigned short hardsect_size; 98*1da177e4SLinus Torvalds unsigned int max_segment_size; 99*1da177e4SLinus Torvalds unsigned long seg_boundary_mask; 100*1da177e4SLinus Torvalds }; 101*1da177e4SLinus Torvalds 102*1da177e4SLinus Torvalds struct dm_target { 103*1da177e4SLinus Torvalds struct dm_table *table; 104*1da177e4SLinus Torvalds struct target_type *type; 105*1da177e4SLinus Torvalds 106*1da177e4SLinus Torvalds /* target limits */ 107*1da177e4SLinus Torvalds sector_t begin; 108*1da177e4SLinus Torvalds sector_t len; 109*1da177e4SLinus Torvalds 110*1da177e4SLinus Torvalds /* FIXME: turn this into a mask, and merge with io_restrictions */ 111*1da177e4SLinus Torvalds /* Always a power of 2 */ 112*1da177e4SLinus Torvalds sector_t split_io; 113*1da177e4SLinus Torvalds 114*1da177e4SLinus Torvalds /* 115*1da177e4SLinus Torvalds * These are automatically filled in by 116*1da177e4SLinus Torvalds * dm_table_get_device. 117*1da177e4SLinus Torvalds */ 118*1da177e4SLinus Torvalds struct io_restrictions limits; 119*1da177e4SLinus Torvalds 120*1da177e4SLinus Torvalds /* target specific data */ 121*1da177e4SLinus Torvalds void *private; 122*1da177e4SLinus Torvalds 123*1da177e4SLinus Torvalds /* Used to provide an error string from the ctr */ 124*1da177e4SLinus Torvalds char *error; 125*1da177e4SLinus Torvalds }; 126*1da177e4SLinus Torvalds 127*1da177e4SLinus Torvalds int dm_register_target(struct target_type *t); 128*1da177e4SLinus Torvalds int dm_unregister_target(struct target_type *t); 129*1da177e4SLinus Torvalds 130*1da177e4SLinus Torvalds #endif /* _LINUX_DEVICE_MAPPER_H */ 131