11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Copyright (C) 2001 Sistina Software (UK) Limited. 31da177e4SLinus Torvalds * Copyright (C) 2004 Red Hat, Inc. All rights reserved. 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * This file is released under the LGPL. 61da177e4SLinus Torvalds */ 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds #ifndef _LINUX_DEVICE_MAPPER_H 91da177e4SLinus Torvalds #define _LINUX_DEVICE_MAPPER_H 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds struct dm_target; 121da177e4SLinus Torvalds struct dm_table; 131da177e4SLinus Torvalds struct dm_dev; 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds typedef enum { STATUSTYPE_INFO, STATUSTYPE_TABLE } status_type_t; 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds union map_info { 181da177e4SLinus Torvalds void *ptr; 191da177e4SLinus Torvalds unsigned long long ll; 201da177e4SLinus Torvalds }; 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds /* 231da177e4SLinus Torvalds * In the constructor the target parameter will already have the 241da177e4SLinus Torvalds * table, type, begin and len fields filled in. 251da177e4SLinus Torvalds */ 261da177e4SLinus Torvalds typedef int (*dm_ctr_fn) (struct dm_target *target, 271da177e4SLinus Torvalds unsigned int argc, char **argv); 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds /* 301da177e4SLinus Torvalds * The destructor doesn't need to free the dm_target, just 311da177e4SLinus Torvalds * anything hidden ti->private. 321da177e4SLinus Torvalds */ 331da177e4SLinus Torvalds typedef void (*dm_dtr_fn) (struct dm_target *ti); 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds /* 361da177e4SLinus Torvalds * The map function must return: 371da177e4SLinus Torvalds * < 0: error 381da177e4SLinus Torvalds * = 0: The target will handle the io by resubmitting it later 391da177e4SLinus Torvalds * > 0: simple remap complete 401da177e4SLinus Torvalds */ 411da177e4SLinus Torvalds typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio, 421da177e4SLinus Torvalds union map_info *map_context); 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds /* 451da177e4SLinus Torvalds * Returns: 461da177e4SLinus Torvalds * < 0 : error (currently ignored) 471da177e4SLinus Torvalds * 0 : ended successfully 481da177e4SLinus Torvalds * 1 : for some reason the io has still not completed (eg, 491da177e4SLinus Torvalds * multipath target might want to requeue a failed io). 501da177e4SLinus Torvalds */ 511da177e4SLinus Torvalds typedef int (*dm_endio_fn) (struct dm_target *ti, 521da177e4SLinus Torvalds struct bio *bio, int error, 531da177e4SLinus Torvalds union map_info *map_context); 541da177e4SLinus Torvalds 551da177e4SLinus Torvalds typedef void (*dm_presuspend_fn) (struct dm_target *ti); 561da177e4SLinus Torvalds typedef void (*dm_postsuspend_fn) (struct dm_target *ti); 571da177e4SLinus Torvalds typedef void (*dm_resume_fn) (struct dm_target *ti); 581da177e4SLinus Torvalds 591da177e4SLinus Torvalds typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type, 601da177e4SLinus Torvalds char *result, unsigned int maxlen); 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds typedef int (*dm_message_fn) (struct dm_target *ti, unsigned argc, char **argv); 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds void dm_error(const char *message); 651da177e4SLinus Torvalds 661da177e4SLinus Torvalds /* 671da177e4SLinus Torvalds * Constructors should call these functions to ensure destination devices 681da177e4SLinus Torvalds * are opened/closed correctly. 691da177e4SLinus Torvalds * FIXME: too many arguments. 701da177e4SLinus Torvalds */ 711da177e4SLinus Torvalds int dm_get_device(struct dm_target *ti, const char *path, sector_t start, 721da177e4SLinus Torvalds sector_t len, int mode, struct dm_dev **result); 731da177e4SLinus Torvalds void dm_put_device(struct dm_target *ti, struct dm_dev *d); 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds /* 761da177e4SLinus Torvalds * Information about a target type 771da177e4SLinus Torvalds */ 781da177e4SLinus Torvalds struct target_type { 791da177e4SLinus Torvalds const char *name; 801da177e4SLinus Torvalds struct module *module; 811da177e4SLinus Torvalds unsigned version[3]; 821da177e4SLinus Torvalds dm_ctr_fn ctr; 831da177e4SLinus Torvalds dm_dtr_fn dtr; 841da177e4SLinus Torvalds dm_map_fn map; 851da177e4SLinus Torvalds dm_endio_fn end_io; 861da177e4SLinus Torvalds dm_presuspend_fn presuspend; 871da177e4SLinus Torvalds dm_postsuspend_fn postsuspend; 881da177e4SLinus Torvalds dm_resume_fn resume; 891da177e4SLinus Torvalds dm_status_fn status; 901da177e4SLinus Torvalds dm_message_fn message; 911da177e4SLinus Torvalds }; 921da177e4SLinus Torvalds 931da177e4SLinus Torvalds struct io_restrictions { 94*3ee247ebSAlasdair G Kergon unsigned int max_sectors; 951da177e4SLinus Torvalds unsigned short max_phys_segments; 961da177e4SLinus Torvalds unsigned short max_hw_segments; 971da177e4SLinus Torvalds unsigned short hardsect_size; 981da177e4SLinus Torvalds unsigned int max_segment_size; 991da177e4SLinus Torvalds unsigned long seg_boundary_mask; 1001da177e4SLinus Torvalds }; 1011da177e4SLinus Torvalds 1021da177e4SLinus Torvalds struct dm_target { 1031da177e4SLinus Torvalds struct dm_table *table; 1041da177e4SLinus Torvalds struct target_type *type; 1051da177e4SLinus Torvalds 1061da177e4SLinus Torvalds /* target limits */ 1071da177e4SLinus Torvalds sector_t begin; 1081da177e4SLinus Torvalds sector_t len; 1091da177e4SLinus Torvalds 1101da177e4SLinus Torvalds /* FIXME: turn this into a mask, and merge with io_restrictions */ 1111da177e4SLinus Torvalds /* Always a power of 2 */ 1121da177e4SLinus Torvalds sector_t split_io; 1131da177e4SLinus Torvalds 1141da177e4SLinus Torvalds /* 1151da177e4SLinus Torvalds * These are automatically filled in by 1161da177e4SLinus Torvalds * dm_table_get_device. 1171da177e4SLinus Torvalds */ 1181da177e4SLinus Torvalds struct io_restrictions limits; 1191da177e4SLinus Torvalds 1201da177e4SLinus Torvalds /* target specific data */ 1211da177e4SLinus Torvalds void *private; 1221da177e4SLinus Torvalds 1231da177e4SLinus Torvalds /* Used to provide an error string from the ctr */ 1241da177e4SLinus Torvalds char *error; 1251da177e4SLinus Torvalds }; 1261da177e4SLinus Torvalds 1271da177e4SLinus Torvalds int dm_register_target(struct target_type *t); 1281da177e4SLinus Torvalds int dm_unregister_target(struct target_type *t); 1291da177e4SLinus Torvalds 1301da177e4SLinus Torvalds #endif /* _LINUX_DEVICE_MAPPER_H */ 131