1*86d7f5d3SJohn Marino /* 2*86d7f5d3SJohn Marino * Copyright (c) 2011 Alex Hornung <alex@alexhornung.com>. 3*86d7f5d3SJohn Marino * All rights reserved. 4*86d7f5d3SJohn Marino * 5*86d7f5d3SJohn Marino * Redistribution and use in source and binary forms, with or without 6*86d7f5d3SJohn Marino * modification, are permitted provided that the following conditions 7*86d7f5d3SJohn Marino * are met: 8*86d7f5d3SJohn Marino * 9*86d7f5d3SJohn Marino * 1. Redistributions of source code must retain the above copyright 10*86d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer. 11*86d7f5d3SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 12*86d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer in 13*86d7f5d3SJohn Marino * the documentation and/or other materials provided with the 14*86d7f5d3SJohn Marino * distribution. 15*86d7f5d3SJohn Marino * 16*86d7f5d3SJohn Marino * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17*86d7f5d3SJohn Marino * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18*86d7f5d3SJohn Marino * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 19*86d7f5d3SJohn Marino * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 20*86d7f5d3SJohn Marino * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 21*86d7f5d3SJohn Marino * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 22*86d7f5d3SJohn Marino * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23*86d7f5d3SJohn Marino * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 24*86d7f5d3SJohn Marino * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25*86d7f5d3SJohn Marino * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 26*86d7f5d3SJohn Marino * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*86d7f5d3SJohn Marino * SUCH DAMAGE. 28*86d7f5d3SJohn Marino */ 29*86d7f5d3SJohn Marino 30*86d7f5d3SJohn Marino /* Make dm_task opaque */ 31*86d7f5d3SJohn Marino struct dm_task; 32*86d7f5d3SJohn Marino 33*86d7f5d3SJohn Marino struct dm_info { 34*86d7f5d3SJohn Marino int exists; 35*86d7f5d3SJohn Marino int suspended; 36*86d7f5d3SJohn Marino int live_table; 37*86d7f5d3SJohn Marino int inactive_table; 38*86d7f5d3SJohn Marino int read_only; 39*86d7f5d3SJohn Marino int32_t open_count; 40*86d7f5d3SJohn Marino int32_t target_count; 41*86d7f5d3SJohn Marino uint32_t event_nr; 42*86d7f5d3SJohn Marino uint32_t major; 43*86d7f5d3SJohn Marino uint32_t minor; 44*86d7f5d3SJohn Marino }; 45*86d7f5d3SJohn Marino 46*86d7f5d3SJohn Marino struct dm_names { 47*86d7f5d3SJohn Marino const char *name; 48*86d7f5d3SJohn Marino uint64_t dev; 49*86d7f5d3SJohn Marino uint32_t next; 50*86d7f5d3SJohn Marino }; 51*86d7f5d3SJohn Marino 52*86d7f5d3SJohn Marino struct dm_deps { 53*86d7f5d3SJohn Marino uint32_t count; 54*86d7f5d3SJohn Marino uint64_t deps[1]; 55*86d7f5d3SJohn Marino }; 56*86d7f5d3SJohn Marino 57*86d7f5d3SJohn Marino struct dm_versions { 58*86d7f5d3SJohn Marino const char *name; 59*86d7f5d3SJohn Marino uint32_t version[3]; 60*86d7f5d3SJohn Marino uint32_t next; 61*86d7f5d3SJohn Marino }; 62*86d7f5d3SJohn Marino 63*86d7f5d3SJohn Marino /* XXX: dm_task_set_geometry */ 64*86d7f5d3SJohn Marino 65*86d7f5d3SJohn Marino enum { 66*86d7f5d3SJohn Marino DM_DEVICE_REMOVE, 67*86d7f5d3SJohn Marino DM_DEVICE_REMOVE_ALL, 68*86d7f5d3SJohn Marino DM_DEVICE_CREATE, 69*86d7f5d3SJohn Marino DM_DEVICE_RELOAD, 70*86d7f5d3SJohn Marino DM_DEVICE_RESUME, 71*86d7f5d3SJohn Marino DM_DEVICE_SUSPEND, 72*86d7f5d3SJohn Marino DM_DEVICE_CLEAR, 73*86d7f5d3SJohn Marino DM_DEVICE_LIST_VERSIONS, 74*86d7f5d3SJohn Marino DM_DEVICE_STATUS, 75*86d7f5d3SJohn Marino DM_DEVICE_TABLE, 76*86d7f5d3SJohn Marino DM_DEVICE_INFO, 77*86d7f5d3SJohn Marino DM_DEVICE_DEPS, 78*86d7f5d3SJohn Marino DM_DEVICE_VERSION, 79*86d7f5d3SJohn Marino DM_DEVICE_TARGET_MSG, 80*86d7f5d3SJohn Marino DM_DEVICE_RENAME, 81*86d7f5d3SJohn Marino DM_DEVICE_LIST 82*86d7f5d3SJohn Marino }; 83*86d7f5d3SJohn Marino 84*86d7f5d3SJohn Marino /* int level, const char *file, int line, const char *fmt, ... */ 85*86d7f5d3SJohn Marino typedef void (*dm_error_func_t)(int, const char *, int, const char *, ...); 86*86d7f5d3SJohn Marino 87*86d7f5d3SJohn Marino struct dm_task *dm_task_create(int task_type); 88*86d7f5d3SJohn Marino void dm_task_destroy(struct dm_task *dmt); 89*86d7f5d3SJohn Marino int dm_task_run(struct dm_task *dmt); 90*86d7f5d3SJohn Marino int dm_task_set_name(struct dm_task *dmt, const char *name); 91*86d7f5d3SJohn Marino const char *dm_task_get_name(struct dm_task *dmt); 92*86d7f5d3SJohn Marino int dm_task_set_newname(struct dm_task *dmt, const char *newname); 93*86d7f5d3SJohn Marino int dm_task_set_major(struct dm_task *dmt, int major); 94*86d7f5d3SJohn Marino int dm_task_set_minor(struct dm_task *dmt, int minor); 95*86d7f5d3SJohn Marino int dm_task_get_minor(struct dm_task *dmt); 96*86d7f5d3SJohn Marino int dm_task_set_uuid(struct dm_task *dmt, const char *uuid); 97*86d7f5d3SJohn Marino const char *dm_task_get_uuid(struct dm_task *dmt); 98*86d7f5d3SJohn Marino int dm_task_add_target(struct dm_task *dmt, uint64_t start, size_t size, 99*86d7f5d3SJohn Marino const char *target, const char *params); 100*86d7f5d3SJohn Marino int dm_task_set_sector(struct dm_task *dmt, uint64_t sector); 101*86d7f5d3SJohn Marino int dm_task_set_message(struct dm_task *dmt, const char *msg); 102*86d7f5d3SJohn Marino int dm_task_set_ro(struct dm_task *dmt); 103*86d7f5d3SJohn Marino int dm_task_no_open_count(struct dm_task *dmt); 104*86d7f5d3SJohn Marino int dm_task_query_inactive_table(struct dm_task *dmt); 105*86d7f5d3SJohn Marino int dm_task_set_read_ahead(struct dm_task *dmt, uint32_t read_ahead); 106*86d7f5d3SJohn Marino int dm_task_get_read_ahead(struct dm_task *dmt, uint32_t *read_ahead); 107*86d7f5d3SJohn Marino int dm_task_secure_data(struct dm_task *dmt); 108*86d7f5d3SJohn Marino int dm_task_get_info(struct dm_task *dmt, struct dm_info *dmi); 109*86d7f5d3SJohn Marino int dm_task_get_driver_version(struct dm_task *dmt, char *ver, size_t ver_sz); 110*86d7f5d3SJohn Marino struct dm_deps *dm_task_get_deps(struct dm_task *dmt); 111*86d7f5d3SJohn Marino struct dm_versions *dm_task_get_versions(struct dm_task *dmt); 112*86d7f5d3SJohn Marino struct dm_names *dm_task_get_names(struct dm_task *dmt); 113*86d7f5d3SJohn Marino int dm_task_update_nodes(void); 114*86d7f5d3SJohn Marino void *dm_get_next_target(struct dm_task *dmt, void *cur, uint64_t *startp, 115*86d7f5d3SJohn Marino uint64_t *lengthp, char **target_type, char **params); 116*86d7f5d3SJohn Marino uint32_t dm_get_major(void); 117*86d7f5d3SJohn Marino int dm_is_dm_major(uint32_t major); 118*86d7f5d3SJohn Marino const char *dm_dir(void); 119*86d7f5d3SJohn Marino void dm_udev_set_sync_support(int sync_udev); 120*86d7f5d3SJohn Marino int dm_task_set_cookie(struct dm_task *dmt, uint32_t *cookie, 121*86d7f5d3SJohn Marino uint16_t udev_flags); 122*86d7f5d3SJohn Marino int dm_udev_wait(uint32_t cookie); 123*86d7f5d3SJohn Marino void dm_lib_release(void); 124*86d7f5d3SJohn Marino int dm_log_init(dm_error_func_t fn); 125*86d7f5d3SJohn Marino int dm_log_init_verbose(int verbose); 126*86d7f5d3SJohn Marino int dm_task_set_uid(struct dm_task *dmt, uid_t uid); 127*86d7f5d3SJohn Marino int dm_task_set_gid(struct dm_task *dmt, gid_t gid); 128*86d7f5d3SJohn Marino int dm_task_set_mode(struct dm_task *dmt, mode_t mode); 129*86d7f5d3SJohn Marino int dm_task_no_flush(struct dm_task *dmt); 130*86d7f5d3SJohn Marino int dm_task_skip_lockfs(struct dm_task *dmt); 131*86d7f5d3SJohn Marino int dm_task_set_geometry(struct dm_task *dmt, const char *cylinders, 132*86d7f5d3SJohn Marino const char *heads, const char *sectors, const char *start); 133*86d7f5d3SJohn Marino 134*86d7f5d3SJohn Marino 135*86d7f5d3SJohn Marino 136*86d7f5d3SJohn Marino 137*86d7f5d3SJohn Marino /*****************************************************************************/ 138*86d7f5d3SJohn Marino /********************** DragonFly-specific extensions ************************/ 139*86d7f5d3SJohn Marino /*****************************************************************************/ 140*86d7f5d3SJohn Marino void *dm_get_next_version(struct dm_task *dmt, void *cur, 141*86d7f5d3SJohn Marino const char **target_type, uint32_t *target_ver); 142*86d7f5d3SJohn Marino void *dm_get_next_dep(struct dm_task *dmt, void *cur, uint64_t *dep); 143*86d7f5d3SJohn Marino void *dm_get_next_name(struct dm_task *dmt, void *cur, const char **name, 144*86d7f5d3SJohn Marino uint64_t *dev); 145*86d7f5d3SJohn Marino 146