| 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 |
|
| 11 | struct dm_target;
|
| 12 | struct dm_table;
|
| 13 | struct dm_dev;
|
| 14 |
|
| 15 | typedef enum { STATUSTYPE_INFO, STATUSTYPE_TABLE } status_type_t;
|
| 16 |
|
| 17 | union 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 |
|
| 26 | typedef 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 |
|
| 33 | typedef 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 |
|
| 41 | typedef 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 |
|
| 51 | typedef int (*dm_endio_fn) (struct dm_target *ti,
|
| 52 | struct bio *bio, int error,
|
| 53 | union map_info *map_context);
|
| 54 |
|
| 55 | typedef void (*dm_presuspend_fn) (struct dm_target *ti);
|
| 56 | typedef void (*dm_postsuspend_fn) (struct dm_target *ti);
|
| 57 | typedef void (*dm_resume_fn) (struct dm_target *ti);
|
| 58 |
|
| 59 | typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type,
|
| 60 | char *result, unsigned int maxlen);
|
| 61 |
|
| 62 | typedef int (*dm_message_fn) (struct dm_target *ti, unsigned argc, char **argv);
|
| 63 |
|
| 64 | void 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 |
|
| 71 | int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
|
| 72 | sector_t len, int mode, struct dm_dev **result);
|
| 73 | void dm_put_device(struct dm_target *ti, struct dm_dev *d);
|
| 74 |
|
| 75 | |
| 76 | * Information about a target type
|
| 77 |
|
| 78 | struct 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 |
|
| 93 | struct 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 |
|
| 102 | struct dm_target {
|
| 103 | struct dm_table *table;
|
| 104 | struct target_type *type;
|
| 105 |
|
| 106 |
|
| 107 | sector_t begin;
|
| 108 | sector_t len;
|
| 109 |
|
| 110 |
|
| 111 |
|
| 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 |
|
| 121 | void *private;
|
| 122 |
|
| 123 |
|
| 124 | char *error;
|
| 125 | };
|
| 126 |
|
| 127 | int dm_register_target(struct target_type *t);
|
| 128 | int dm_unregister_target(struct target_type *t);
|
| 129 |
|
| 130 | #endif
|