xref: /freebsd/sys/geom/virstor/g_virstor.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1f854db0bSPawel Jakub Dawidek /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
33728855aSPedro F. Giffuni  *
4f854db0bSPawel Jakub Dawidek  * Copyright (c) 2006-2007 Ivan Voras <ivoras@freebsd.org>
5f854db0bSPawel Jakub Dawidek  * All rights reserved.
6f854db0bSPawel Jakub Dawidek  *
7f854db0bSPawel Jakub Dawidek  * Redistribution and use in source and binary forms, with or without
8f854db0bSPawel Jakub Dawidek  * modification, are permitted provided that the following conditions
9f854db0bSPawel Jakub Dawidek  * are met:
10f854db0bSPawel Jakub Dawidek  * 1. Redistributions of source code must retain the above copyright
11f854db0bSPawel Jakub Dawidek  *    notice, this list of conditions and the following disclaimer.
12f854db0bSPawel Jakub Dawidek  * 2. Redistributions in binary form must reproduce the above copyright
13f854db0bSPawel Jakub Dawidek  *    notice, this list of conditions and the following disclaimer in the
14f854db0bSPawel Jakub Dawidek  *    documentation and/or other materials provided with the distribution.
15f854db0bSPawel Jakub Dawidek  *
16f854db0bSPawel Jakub Dawidek  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
17f854db0bSPawel Jakub Dawidek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18f854db0bSPawel Jakub Dawidek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19f854db0bSPawel Jakub Dawidek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
20f854db0bSPawel Jakub Dawidek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21f854db0bSPawel Jakub Dawidek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22f854db0bSPawel Jakub Dawidek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23f854db0bSPawel Jakub Dawidek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24f854db0bSPawel Jakub Dawidek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25f854db0bSPawel Jakub Dawidek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26f854db0bSPawel Jakub Dawidek  * SUCH DAMAGE.
27f854db0bSPawel Jakub Dawidek  */
28f854db0bSPawel Jakub Dawidek 
29f854db0bSPawel Jakub Dawidek #ifndef _G_VIRSTOR_H_
30f854db0bSPawel Jakub Dawidek #define _G_VIRSTOR_H_
31f854db0bSPawel Jakub Dawidek 
32f854db0bSPawel Jakub Dawidek #define	G_VIRSTOR_CLASS_NAME "VIRSTOR"
33f854db0bSPawel Jakub Dawidek 
34f854db0bSPawel Jakub Dawidek #define VIRSTOR_MAP_ALLOCATED 1
35f854db0bSPawel Jakub Dawidek struct virstor_map_entry {
36f854db0bSPawel Jakub Dawidek 	uint16_t	flags;
37f854db0bSPawel Jakub Dawidek 	uint16_t	provider_no;
38f854db0bSPawel Jakub Dawidek 	uint32_t	provider_chunk;
39f854db0bSPawel Jakub Dawidek };
40f854db0bSPawel Jakub Dawidek 
41f854db0bSPawel Jakub Dawidek #define	VIRSTOR_MAP_ENTRY_SIZE (sizeof(struct virstor_map_entry))
42cd853791SKonstantin Belousov #define	VIRSTOR_MAP_BLOCK_ENTRIES (maxphys / VIRSTOR_MAP_ENTRY_SIZE)
43cd853791SKonstantin Belousov /* Struct size is guarded by MPASS in main source */
44f854db0bSPawel Jakub Dawidek 
45f854db0bSPawel Jakub Dawidek #ifdef _KERNEL
46f854db0bSPawel Jakub Dawidek 
47ac03832eSConrad Meyer #define	LOG_MSG(lvl, ...) \
48ac03832eSConrad Meyer     _GEOM_DEBUG("GEOM_VIRSTOR", g_virstor_debug, (lvl), NULL, __VA_ARGS__)
49f854db0bSPawel Jakub Dawidek #define	LOG_MESSAGE LOG_MSG
50f854db0bSPawel Jakub Dawidek 
51ac03832eSConrad Meyer #define	LOG_REQ(lvl, bp, ...) \
52ac03832eSConrad Meyer     _GEOM_DEBUG("GEOM_VIRSTOR", g_virstor_debug, (lvl), (bp), __VA_ARGS__)
53f854db0bSPawel Jakub Dawidek #define	LOG_REQUEST LOG_REQ
54f854db0bSPawel Jakub Dawidek 
55f854db0bSPawel Jakub Dawidek /* "critical" system announcements (e.g. "geom is up") */
56f854db0bSPawel Jakub Dawidek #define	LVL_ANNOUNCE	0
57f854db0bSPawel Jakub Dawidek /* errors */
58f854db0bSPawel Jakub Dawidek #define	LVL_ERROR	1
59f854db0bSPawel Jakub Dawidek /* warnings */
60f854db0bSPawel Jakub Dawidek #define	LVL_WARNING	2
61f854db0bSPawel Jakub Dawidek /* info, noncritical for system operation (user doesn't have to see it */
62f854db0bSPawel Jakub Dawidek #define	LVL_INFO	5
63f854db0bSPawel Jakub Dawidek /* debug info */
64f854db0bSPawel Jakub Dawidek #define	LVL_DEBUG	10
65f854db0bSPawel Jakub Dawidek /* more debug info */
66f854db0bSPawel Jakub Dawidek #define	LVL_DEBUG2	12
67f854db0bSPawel Jakub Dawidek /* superfluous debug info (large volumes of data) */
68f854db0bSPawel Jakub Dawidek #define	LVL_MOREDEBUG	15
69f854db0bSPawel Jakub Dawidek 
70f854db0bSPawel Jakub Dawidek /* Component data */
71f854db0bSPawel Jakub Dawidek struct g_virstor_component {
72f854db0bSPawel Jakub Dawidek 	struct g_consumer	*gcons;
73f854db0bSPawel Jakub Dawidek 	struct g_virstor_softc	*sc;
74f854db0bSPawel Jakub Dawidek 	unsigned int		 index;		/* Component index in array */
75f854db0bSPawel Jakub Dawidek 	unsigned int		 chunk_count;
76f854db0bSPawel Jakub Dawidek 	unsigned int		 chunk_next;
77f854db0bSPawel Jakub Dawidek 	unsigned int		 chunk_reserved;
78f854db0bSPawel Jakub Dawidek 	unsigned int		 flags;
79f854db0bSPawel Jakub Dawidek };
80f854db0bSPawel Jakub Dawidek 
81f854db0bSPawel Jakub Dawidek /* Internal geom instance data */
82f854db0bSPawel Jakub Dawidek struct g_virstor_softc {
83f854db0bSPawel Jakub Dawidek 	struct g_geom		*geom;
84f854db0bSPawel Jakub Dawidek 	struct g_provider	*provider;
85f854db0bSPawel Jakub Dawidek 	struct g_virstor_component *components;
86f854db0bSPawel Jakub Dawidek 	u_int			 n_components;
87f854db0bSPawel Jakub Dawidek 	u_int			 curr_component; /* Component currently used */
88f854db0bSPawel Jakub Dawidek 	uint32_t		 id;		/* Unique ID of this geom */
89f854db0bSPawel Jakub Dawidek 	off_t			 virsize;	/* Total size of virstor */
90f854db0bSPawel Jakub Dawidek 	off_t			 sectorsize;
91f854db0bSPawel Jakub Dawidek 	size_t			 chunk_size;
92f854db0bSPawel Jakub Dawidek 	size_t			 chunk_count;	/* governs map_size */
93f854db0bSPawel Jakub Dawidek 	struct virstor_map_entry *map;
94f854db0bSPawel Jakub Dawidek 	size_t			 map_size;	/* (in bytes) */
95f854db0bSPawel Jakub Dawidek 	size_t			 map_sectors;	/* Size of map in sectors */
96f854db0bSPawel Jakub Dawidek 	size_t			 me_per_sector;	/* # map entries in a sector */
97f854db0bSPawel Jakub Dawidek 	STAILQ_HEAD(, g_virstor_bio_q)	 delayed_bio_q;	/* Queue of delayed BIOs */
98f854db0bSPawel Jakub Dawidek 	struct mtx		 delayed_bio_q_mtx;
99f854db0bSPawel Jakub Dawidek };
100f854db0bSPawel Jakub Dawidek 
101f854db0bSPawel Jakub Dawidek /* "delayed BIOs" Queue element */
102f854db0bSPawel Jakub Dawidek struct g_virstor_bio_q {
103f854db0bSPawel Jakub Dawidek 	struct bio		*bio;
104f854db0bSPawel Jakub Dawidek 	STAILQ_ENTRY(g_virstor_bio_q) linkage;
105f854db0bSPawel Jakub Dawidek };
106f854db0bSPawel Jakub Dawidek 
107f854db0bSPawel Jakub Dawidek #endif	/* _KERNEL */
108f854db0bSPawel Jakub Dawidek 
109f854db0bSPawel Jakub Dawidek #endif	/* !_G_VIRSTOR_H_ */
110