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