1128760Spjd/*- 2204076Spjd * Copyright (c) 2004-2009 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3128760Spjd * All rights reserved. 4128760Spjd * 5128760Spjd * Redistribution and use in source and binary forms, with or without 6128760Spjd * modification, are permitted provided that the following conditions 7128760Spjd * are met: 8128760Spjd * 1. Redistributions of source code must retain the above copyright 9128760Spjd * notice, this list of conditions and the following disclaimer. 10128760Spjd * 2. Redistributions in binary form must reproduce the above copyright 11128760Spjd * notice, this list of conditions and the following disclaimer in the 12128760Spjd * documentation and/or other materials provided with the distribution. 13155174Spjd * 14128760Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15128760Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16128760Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17128760Spjd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18128760Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19128760Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20128760Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21128760Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22128760Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23128760Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24128760Spjd * SUCH DAMAGE. 25128760Spjd * 26128760Spjd * $FreeBSD$ 27128760Spjd */ 28128760Spjd 29128760Spjd#ifndef _G_GATE_H_ 30128760Spjd#define _G_GATE_H_ 31128760Spjd 32128760Spjd#include <sys/param.h> 33128760Spjd#include <sys/lock.h> 34128760Spjd#include <sys/mutex.h> 35128760Spjd#include <sys/queue.h> 36128760Spjd 37128760Spjd#include <geom/geom.h> 38128760Spjd 39128760Spjd#define G_GATE_CLASS_NAME "GATE" 40128760Spjd#define G_GATE_PROVIDER_NAME "ggate" 41128760Spjd#define G_GATE_MOD_NAME "ggate" 42128760Spjd#define G_GATE_CTL_NAME "ggctl" 43128760Spjd 44240265Strociny#define G_GATE_VERSION 3 45128760Spjd 46128760Spjd/* 47128760Spjd * Maximum number of request that can be stored in 48128760Spjd * the queue when there are no workers. 49128760Spjd */ 50128760Spjd#define G_GATE_MAX_QUEUE_SIZE 4096 51128760Spjd 52128760Spjd#define G_GATE_FLAG_READONLY 0x0001 53128760Spjd#define G_GATE_FLAG_WRITEONLY 0x0002 54128760Spjd#define G_GATE_FLAG_DESTROY 0x1000 55128760Spjd#define G_GATE_USERFLAGS (G_GATE_FLAG_READONLY | G_GATE_FLAG_WRITEONLY) 56128760Spjd 57204076Spjd/* 58204076Spjd * Pick unit number automatically in /dev/ggate<unit>. 59204076Spjd */ 60204076Spjd#define G_GATE_UNIT_AUTO (-1) 61204076Spjd/* 62204076Spjd * Full provider name is given, so don't use ggate<unit>. 63204076Spjd */ 64204076Spjd#define G_GATE_NAME_GIVEN (-2) 65204076Spjd 66128760Spjd#define G_GATE_CMD_CREATE _IOWR('m', 0, struct g_gate_ctl_create) 67240265Strociny#define G_GATE_CMD_MODIFY _IOWR('m', 1, struct g_gate_ctl_modify) 68240265Strociny#define G_GATE_CMD_DESTROY _IOWR('m', 2, struct g_gate_ctl_destroy) 69240265Strociny#define G_GATE_CMD_CANCEL _IOWR('m', 3, struct g_gate_ctl_cancel) 70240265Strociny#define G_GATE_CMD_START _IOWR('m', 4, struct g_gate_ctl_io) 71240265Strociny#define G_GATE_CMD_DONE _IOWR('m', 5, struct g_gate_ctl_io) 72128760Spjd 73128760Spjd#define G_GATE_INFOSIZE 2048 74128760Spjd 75128760Spjd#ifdef _KERNEL 76128760Spjd/* 77128760Spjd * 'P:' means 'Protected by'. 78128760Spjd */ 79128760Spjdstruct g_gate_softc { 80220062Strociny char *sc_name; /* P: (read-only) */ 81128760Spjd int sc_unit; /* P: (read-only) */ 82162056Spjd int sc_ref; /* P: g_gate_list_mtx */ 83128760Spjd struct g_provider *sc_provider; /* P: (read-only) */ 84162056Spjd uint32_t sc_flags; /* P: sc_queue_mtx */ 85128760Spjd 86141561Spjd struct bio_queue_head sc_inqueue; /* P: sc_queue_mtx */ 87141561Spjd struct bio_queue_head sc_outqueue; /* P: sc_queue_mtx */ 88141561Spjd struct mtx sc_queue_mtx; 89141561Spjd uint32_t sc_queue_count; /* P: sc_queue_mtx */ 90128835Spjd uint32_t sc_queue_size; /* P: (read-only) */ 91128760Spjd u_int sc_timeout; /* P: (read-only) */ 92240265Strociny struct g_consumer *sc_readcons; /* P: XXX */ 93240265Strociny off_t sc_readoffset; /* P: XXX */ 94128760Spjd struct callout sc_callout; /* P: (modified only 95128760Spjd from callout 96128760Spjd thread) */ 97128835Spjd uintptr_t sc_seq; /* P: (modified only 98128760Spjd from g_down 99128760Spjd thread) */ 100128760Spjd LIST_ENTRY(g_gate_softc) sc_next; /* P: g_gate_list_mtx */ 101128760Spjd char sc_info[G_GATE_INFOSIZE]; /* P: (read-only) */ 102128760Spjd}; 103128760Spjd 104128760Spjd#define G_GATE_DEBUG(lvl, ...) do { \ 105128760Spjd if (g_gate_debug >= (lvl)) { \ 106128760Spjd printf("GEOM_GATE"); \ 107128760Spjd if (g_gate_debug > 0) \ 108128760Spjd printf("[%u]", lvl); \ 109128760Spjd printf(": "); \ 110128760Spjd printf(__VA_ARGS__); \ 111128760Spjd printf("\n"); \ 112128760Spjd } \ 113128760Spjd} while (0) 114128760Spjd#define G_GATE_LOGREQ(lvl, bp, ...) do { \ 115128760Spjd if (g_gate_debug >= (lvl)) { \ 116128760Spjd printf("GEOM_GATE"); \ 117128760Spjd if (g_gate_debug > 0) \ 118128760Spjd printf("[%u]", lvl); \ 119128760Spjd printf(": "); \ 120128760Spjd printf(__VA_ARGS__); \ 121128760Spjd printf(" "); \ 122128760Spjd g_print_bio(bp); \ 123128760Spjd printf("\n"); \ 124128760Spjd } \ 125128760Spjd} while (0) 126128760Spjd#endif /* !_KERNEL */ 127128760Spjd 128128760Spjdstruct g_gate_ctl_create { 129128760Spjd u_int gctl_version; 130128760Spjd off_t gctl_mediasize; 131128760Spjd u_int gctl_sectorsize; 132128760Spjd u_int gctl_flags; 133128760Spjd u_int gctl_maxcount; 134128760Spjd u_int gctl_timeout; 135204076Spjd char gctl_name[NAME_MAX]; 136128760Spjd char gctl_info[G_GATE_INFOSIZE]; 137240265Strociny char gctl_readprov[NAME_MAX]; 138240265Strociny off_t gctl_readoffset; 139204076Spjd int gctl_unit; /* in/out */ 140128760Spjd}; 141128760Spjd 142240265Strociny#define GG_MODIFY_MEDIASIZE 0x01 143240265Strociny#define GG_MODIFY_INFO 0x02 144240265Strociny#define GG_MODIFY_READPROV 0x04 145240265Strociny#define GG_MODIFY_READOFFSET 0x08 146240265Strocinystruct g_gate_ctl_modify { 147240265Strociny u_int gctl_version; 148240265Strociny int gctl_unit; 149240265Strociny uint32_t gctl_modify; 150240265Strociny off_t gctl_mediasize; 151240265Strociny char gctl_info[G_GATE_INFOSIZE]; 152240265Strociny char gctl_readprov[NAME_MAX]; 153240265Strociny off_t gctl_readoffset; 154240265Strociny}; 155240265Strociny 156128760Spjdstruct g_gate_ctl_destroy { 157128760Spjd u_int gctl_version; 158128760Spjd int gctl_unit; 159128760Spjd int gctl_force; 160204076Spjd char gctl_name[NAME_MAX]; 161128760Spjd}; 162128760Spjd 163147843Spjdstruct g_gate_ctl_cancel { 164147843Spjd u_int gctl_version; 165147843Spjd int gctl_unit; 166147843Spjd uintptr_t gctl_seq; 167204076Spjd char gctl_name[NAME_MAX]; 168147843Spjd}; 169147843Spjd 170128760Spjdstruct g_gate_ctl_io { 171128835Spjd u_int gctl_version; 172128835Spjd int gctl_unit; 173128835Spjd uintptr_t gctl_seq; 174128835Spjd u_int gctl_cmd; 175128835Spjd off_t gctl_offset; 176128835Spjd off_t gctl_length; 177128835Spjd void *gctl_data; 178128835Spjd int gctl_error; 179128760Spjd}; 180128760Spjd#endif /* !_G_GATE_H_ */ 181