1fe27e772SPawel Jakub Dawidek /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 33728855aSPedro F. Giffuni * 432115b10SPawel Jakub Dawidek * Copyright (c) 2004-2009 Pawel Jakub Dawidek <pjd@FreeBSD.org> 5fe27e772SPawel Jakub Dawidek * All rights reserved. 6fe27e772SPawel Jakub Dawidek * 7fe27e772SPawel Jakub Dawidek * Redistribution and use in source and binary forms, with or without 8fe27e772SPawel Jakub Dawidek * modification, are permitted provided that the following conditions 9fe27e772SPawel Jakub Dawidek * are met: 10fe27e772SPawel Jakub Dawidek * 1. Redistributions of source code must retain the above copyright 11fe27e772SPawel Jakub Dawidek * notice, this list of conditions and the following disclaimer. 12fe27e772SPawel Jakub Dawidek * 2. Redistributions in binary form must reproduce the above copyright 13fe27e772SPawel Jakub Dawidek * notice, this list of conditions and the following disclaimer in the 14fe27e772SPawel Jakub Dawidek * documentation and/or other materials provided with the distribution. 15fe27e772SPawel Jakub Dawidek * 16fe27e772SPawel Jakub Dawidek * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 17fe27e772SPawel Jakub Dawidek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18fe27e772SPawel Jakub Dawidek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19fe27e772SPawel Jakub Dawidek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 20fe27e772SPawel Jakub Dawidek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21fe27e772SPawel Jakub Dawidek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22fe27e772SPawel Jakub Dawidek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23fe27e772SPawel Jakub Dawidek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24fe27e772SPawel Jakub Dawidek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25fe27e772SPawel Jakub Dawidek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26fe27e772SPawel Jakub Dawidek * SUCH DAMAGE. 27fe27e772SPawel Jakub Dawidek */ 28fe27e772SPawel Jakub Dawidek 29fe27e772SPawel Jakub Dawidek #ifndef _G_GATE_H_ 30fe27e772SPawel Jakub Dawidek #define _G_GATE_H_ 31fe27e772SPawel Jakub Dawidek 32fe27e772SPawel Jakub Dawidek #include <sys/param.h> 33fe27e772SPawel Jakub Dawidek #include <sys/lock.h> 34fe27e772SPawel Jakub Dawidek #include <sys/mutex.h> 35fe27e772SPawel Jakub Dawidek #include <sys/queue.h> 36fe27e772SPawel Jakub Dawidek 37fe27e772SPawel Jakub Dawidek #include <geom/geom.h> 38fe27e772SPawel Jakub Dawidek 39fe27e772SPawel Jakub Dawidek #define G_GATE_CLASS_NAME "GATE" 40fe27e772SPawel Jakub Dawidek #define G_GATE_PROVIDER_NAME "ggate" 41fe27e772SPawel Jakub Dawidek #define G_GATE_MOD_NAME "ggate" 42fe27e772SPawel Jakub Dawidek #define G_GATE_CTL_NAME "ggctl" 43fe27e772SPawel Jakub Dawidek 44e08ec037SPawel Jakub Dawidek #define G_GATE_VERSION 3 45fe27e772SPawel Jakub Dawidek 46fe27e772SPawel Jakub Dawidek /* 47fe27e772SPawel Jakub Dawidek * Maximum number of request that can be stored in 48fe27e772SPawel Jakub Dawidek * the queue when there are no workers. 49fe27e772SPawel Jakub Dawidek */ 50fe27e772SPawel Jakub Dawidek #define G_GATE_MAX_QUEUE_SIZE 4096 51fe27e772SPawel Jakub Dawidek 52fe27e772SPawel Jakub Dawidek #define G_GATE_FLAG_READONLY 0x0001 53fe27e772SPawel Jakub Dawidek #define G_GATE_FLAG_WRITEONLY 0x0002 54fe27e772SPawel Jakub Dawidek #define G_GATE_FLAG_DESTROY 0x1000 55fe27e772SPawel Jakub Dawidek #define G_GATE_USERFLAGS (G_GATE_FLAG_READONLY | G_GATE_FLAG_WRITEONLY) 56fe27e772SPawel Jakub Dawidek 5732115b10SPawel Jakub Dawidek /* 5832115b10SPawel Jakub Dawidek * Pick unit number automatically in /dev/ggate<unit>. 5932115b10SPawel Jakub Dawidek */ 6032115b10SPawel Jakub Dawidek #define G_GATE_UNIT_AUTO (-1) 6132115b10SPawel Jakub Dawidek /* 6232115b10SPawel Jakub Dawidek * Full provider name is given, so don't use ggate<unit>. 6332115b10SPawel Jakub Dawidek */ 6432115b10SPawel Jakub Dawidek #define G_GATE_NAME_GIVEN (-2) 6532115b10SPawel Jakub Dawidek 66fe27e772SPawel Jakub Dawidek #define G_GATE_CMD_CREATE _IOWR('m', 0, struct g_gate_ctl_create) 67e08ec037SPawel Jakub Dawidek #define G_GATE_CMD_MODIFY _IOWR('m', 1, struct g_gate_ctl_modify) 68e08ec037SPawel Jakub Dawidek #define G_GATE_CMD_DESTROY _IOWR('m', 2, struct g_gate_ctl_destroy) 69e08ec037SPawel Jakub Dawidek #define G_GATE_CMD_CANCEL _IOWR('m', 3, struct g_gate_ctl_cancel) 70e08ec037SPawel Jakub Dawidek #define G_GATE_CMD_START _IOWR('m', 4, struct g_gate_ctl_io) 71e08ec037SPawel Jakub Dawidek #define G_GATE_CMD_DONE _IOWR('m', 5, struct g_gate_ctl_io) 72fe27e772SPawel Jakub Dawidek 73fe27e772SPawel Jakub Dawidek #define G_GATE_INFOSIZE 2048 74fe27e772SPawel Jakub Dawidek 75fe27e772SPawel Jakub Dawidek #ifdef _KERNEL 76fe27e772SPawel Jakub Dawidek /* 77fe27e772SPawel Jakub Dawidek * 'P:' means 'Protected by'. 78fe27e772SPawel Jakub Dawidek */ 79fe27e772SPawel Jakub Dawidek struct g_gate_softc { 80baf63f65SMikolaj Golub char *sc_name; /* P: (read-only) */ 81fe27e772SPawel Jakub Dawidek int sc_unit; /* P: (read-only) */ 827ffb6e0fSPawel Jakub Dawidek int sc_ref; /* P: g_gate_list_mtx */ 83fe27e772SPawel Jakub Dawidek struct g_provider *sc_provider; /* P: (read-only) */ 847ffb6e0fSPawel Jakub Dawidek uint32_t sc_flags; /* P: sc_queue_mtx */ 85fe27e772SPawel Jakub Dawidek 86e35d3a78SPawel Jakub Dawidek struct bio_queue_head sc_inqueue; /* P: sc_queue_mtx */ 87e35d3a78SPawel Jakub Dawidek struct bio_queue_head sc_outqueue; /* P: sc_queue_mtx */ 88e35d3a78SPawel Jakub Dawidek struct mtx sc_queue_mtx; 89e35d3a78SPawel Jakub Dawidek uint32_t sc_queue_count; /* P: sc_queue_mtx */ 900d785336SPawel Jakub Dawidek uint32_t sc_queue_size; /* P: (read-only) */ 91fe27e772SPawel Jakub Dawidek u_int sc_timeout; /* P: (read-only) */ 92351d0fa6SAlexander Motin struct g_consumer *sc_readcons; /* P: sc_read_mtx */ 93351d0fa6SAlexander Motin off_t sc_readoffset; /* P: sc_read_mtx */ 94fe27e772SPawel Jakub Dawidek struct callout sc_callout; /* P: (modified only 95fe27e772SPawel Jakub Dawidek from callout 96fe27e772SPawel Jakub Dawidek thread) */ 97351d0fa6SAlexander Motin uintptr_t sc_seq; /* P: sc_queue_mtx */ 98fe27e772SPawel Jakub Dawidek LIST_ENTRY(g_gate_softc) sc_next; /* P: g_gate_list_mtx */ 99fe27e772SPawel Jakub Dawidek char sc_info[G_GATE_INFOSIZE]; /* P: (read-only) */ 100351d0fa6SAlexander Motin struct mtx sc_read_mtx; 101fe27e772SPawel Jakub Dawidek }; 102fe27e772SPawel Jakub Dawidek 103ac03832eSConrad Meyer #define G_GATE_DEBUG(lvl, ...) \ 104ac03832eSConrad Meyer _GEOM_DEBUG("GEOM_GATE", g_gate_debug, (lvl), NULL, __VA_ARGS__) 105ac03832eSConrad Meyer #define G_GATE_LOGREQ(lvl, bp, ...) \ 106ac03832eSConrad Meyer _GEOM_DEBUG("GEOM_GATE", g_gate_debug, (lvl), (bp), __VA_ARGS__) 107fe27e772SPawel Jakub Dawidek #endif /* !_KERNEL */ 108fe27e772SPawel Jakub Dawidek 109fe27e772SPawel Jakub Dawidek struct g_gate_ctl_create { 110fe27e772SPawel Jakub Dawidek u_int gctl_version; 111fe27e772SPawel Jakub Dawidek off_t gctl_mediasize; 112fe27e772SPawel Jakub Dawidek u_int gctl_sectorsize; 113fe27e772SPawel Jakub Dawidek u_int gctl_flags; 114fe27e772SPawel Jakub Dawidek u_int gctl_maxcount; 115fe27e772SPawel Jakub Dawidek u_int gctl_timeout; 11632115b10SPawel Jakub Dawidek char gctl_name[NAME_MAX]; 117fe27e772SPawel Jakub Dawidek char gctl_info[G_GATE_INFOSIZE]; 118e08ec037SPawel Jakub Dawidek char gctl_readprov[NAME_MAX]; 119e08ec037SPawel Jakub Dawidek off_t gctl_readoffset; 12032115b10SPawel Jakub Dawidek int gctl_unit; /* in/out */ 121fe27e772SPawel Jakub Dawidek }; 122fe27e772SPawel Jakub Dawidek 123e08ec037SPawel Jakub Dawidek #define GG_MODIFY_MEDIASIZE 0x01 124e08ec037SPawel Jakub Dawidek #define GG_MODIFY_INFO 0x02 125e08ec037SPawel Jakub Dawidek #define GG_MODIFY_READPROV 0x04 126e08ec037SPawel Jakub Dawidek #define GG_MODIFY_READOFFSET 0x08 127e08ec037SPawel Jakub Dawidek struct g_gate_ctl_modify { 128e08ec037SPawel Jakub Dawidek u_int gctl_version; 129e08ec037SPawel Jakub Dawidek int gctl_unit; 130e08ec037SPawel Jakub Dawidek uint32_t gctl_modify; 131e08ec037SPawel Jakub Dawidek off_t gctl_mediasize; 132e08ec037SPawel Jakub Dawidek char gctl_info[G_GATE_INFOSIZE]; 133e08ec037SPawel Jakub Dawidek char gctl_readprov[NAME_MAX]; 134e08ec037SPawel Jakub Dawidek off_t gctl_readoffset; 135e08ec037SPawel Jakub Dawidek }; 136e08ec037SPawel Jakub Dawidek 137fe27e772SPawel Jakub Dawidek struct g_gate_ctl_destroy { 138fe27e772SPawel Jakub Dawidek u_int gctl_version; 139fe27e772SPawel Jakub Dawidek int gctl_unit; 140fe27e772SPawel Jakub Dawidek int gctl_force; 14132115b10SPawel Jakub Dawidek char gctl_name[NAME_MAX]; 142fe27e772SPawel Jakub Dawidek }; 143fe27e772SPawel Jakub Dawidek 14484436f14SPawel Jakub Dawidek struct g_gate_ctl_cancel { 14584436f14SPawel Jakub Dawidek u_int gctl_version; 14684436f14SPawel Jakub Dawidek int gctl_unit; 14784436f14SPawel Jakub Dawidek uintptr_t gctl_seq; 14832115b10SPawel Jakub Dawidek char gctl_name[NAME_MAX]; 14984436f14SPawel Jakub Dawidek }; 15084436f14SPawel Jakub Dawidek 151fe27e772SPawel Jakub Dawidek struct g_gate_ctl_io { 152fe27e772SPawel Jakub Dawidek u_int gctl_version; 153fe27e772SPawel Jakub Dawidek int gctl_unit; 1540d785336SPawel Jakub Dawidek uintptr_t gctl_seq; 155fe27e772SPawel Jakub Dawidek u_int gctl_cmd; 156fe27e772SPawel Jakub Dawidek off_t gctl_offset; 157fe27e772SPawel Jakub Dawidek off_t gctl_length; 158fe27e772SPawel Jakub Dawidek void *gctl_data; 159fe27e772SPawel Jakub Dawidek int gctl_error; 160fe27e772SPawel Jakub Dawidek }; 161fe27e772SPawel Jakub Dawidek #endif /* !_G_GATE_H_ */ 162