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: releng/10.3/sys/geom/gate/g_gate.h 238119 2012-07-04 20:16:28Z pjd $
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
44238119Spjd#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)
67238119Spjd#define G_GATE_CMD_MODIFY	_IOWR('m', 1, struct g_gate_ctl_modify)
68238119Spjd#define G_GATE_CMD_DESTROY	_IOWR('m', 2, struct g_gate_ctl_destroy)
69238119Spjd#define G_GATE_CMD_CANCEL	_IOWR('m', 3, struct g_gate_ctl_cancel)
70238119Spjd#define G_GATE_CMD_START	_IOWR('m', 4, struct g_gate_ctl_io)
71238119Spjd#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) */
92238119Spjd	struct g_consumer	*sc_readcons;		/* P: XXX */
93238119Spjd	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];
137238119Spjd	char	gctl_readprov[NAME_MAX];
138238119Spjd	off_t	gctl_readoffset;
139204076Spjd	int	gctl_unit;	/* in/out */
140128760Spjd};
141128760Spjd
142238119Spjd#define	GG_MODIFY_MEDIASIZE	0x01
143238119Spjd#define	GG_MODIFY_INFO		0x02
144238119Spjd#define	GG_MODIFY_READPROV	0x04
145238119Spjd#define	GG_MODIFY_READOFFSET	0x08
146238119Spjdstruct g_gate_ctl_modify {
147238119Spjd	u_int		gctl_version;
148238119Spjd	int		gctl_unit;
149238119Spjd	uint32_t	gctl_modify;
150238119Spjd	off_t		gctl_mediasize;
151238119Spjd	char		gctl_info[G_GATE_INFOSIZE];
152238119Spjd	char		gctl_readprov[NAME_MAX];
153238119Spjd	off_t		gctl_readoffset;
154238119Spjd};
155238119Spjd
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