xref: /freebsd/sys/geom/part/g_part_if.m (revision e17f5b1d)
1#-
2# Copyright (c) 2006-2009 Marcel Moolenaar
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25#
26# $FreeBSD$
27
28#include <sys/param.h>
29#include <sys/lock.h>
30#include <sys/malloc.h>
31#include <sys/mutex.h>
32#include <sys/sbuf.h>
33#include <sys/bus.h>
34#include <machine/bus.h>
35#include <sys/systm.h>
36#include <geom/geom.h>
37#include <geom/part/g_part.h>
38
39# The G_PART scheme interface.
40
41INTERFACE g_part;
42
43# Default implementations of methods.
44CODE {
45	static void
46	default_fullname(struct g_part_table *table,
47	    struct g_part_entry *entry, struct sbuf *sb, const char *pfx)
48	{
49		char buf[32];
50
51		sbuf_printf(sb, "%s%s%s", pfx, g_part_separator,
52		    G_PART_NAME(table, entry, buf, sizeof(buf)));
53	}
54
55	static struct g_provider *
56	default_new_provider(struct g_part_table *table, struct g_geom *gp,
57	    struct g_part_entry *entry, const char *pfx)
58	{
59		struct g_provider *ret;
60		struct sbuf *sb;
61
62		sb = sbuf_new_auto();
63		G_PART_FULLNAME(table, entry, sb, pfx);
64		sbuf_finish(sb);
65		ret = g_new_providerf(gp, "%s", sbuf_data(sb));
66		sbuf_delete(sb);
67		return (ret);
68	}
69
70	static void
71	default_add_alias(struct g_part_table *table, struct g_provider *pp,
72	    struct g_part_entry *entry, const char *pfx)
73	{
74		struct sbuf *sb;
75
76		sb = sbuf_new_auto();
77		G_PART_FULLNAME(table, entry, sb, pfx);
78		sbuf_finish(sb);
79		g_provider_add_alias(pp, "%s", sbuf_data(sb));
80		sbuf_delete(sb);
81	}
82
83	static int
84	default_precheck(struct g_part_table *t __unused,
85	    enum g_part_ctl r __unused, struct g_part_parms *p __unused)
86	{
87		return (0);
88	}
89
90	static int
91	default_resize(struct g_part_table *t __unused,
92	    struct g_part_entry *e __unused, struct g_part_parms *p __unused)
93	{
94		return (ENOSYS);
95	}
96
97	static int
98	default_recover(struct g_part_table *t __unused)
99	{
100		return (ENOSYS);
101	}
102
103	static int
104	default_ioctl(struct g_part_table *table __unused, struct g_provider *pp __unused,
105	    u_long cmd __unused, void *data __unused, int fflag __unused,
106	    struct thread *td __unused)
107	{
108		return (ENOIOCTL);
109	}
110};
111
112# add() - scheme specific processing for the add verb.
113METHOD int add {
114	struct g_part_table *table;
115	struct g_part_entry *entry;
116	struct g_part_parms *gpp;
117};
118
119# add_alias() - Create aliases for the partition's provider with the given
120# alias prefixes.
121METHOD void add_alias {
122	struct g_part_table *table;
123	struct g_provider *pp;
124	struct g_part_entry *entry;
125	const char *pfx;
126} DEFAULT default_add_alias;
127
128# bootcode() - scheme specific processing for the bootcode verb.
129METHOD int bootcode {
130	struct g_part_table *table;
131	struct g_part_parms *gpp;
132};
133
134# create() - scheme specific processing for the create verb.
135METHOD int create {
136	struct g_part_table *table;
137	struct g_part_parms *gpp;
138};
139
140# destroy() - scheme specific processing for the destroy verb.
141METHOD int destroy {
142	struct g_part_table *table;
143	struct g_part_parms *gpp;
144};
145
146# dumpconf()
147METHOD void dumpconf {
148	struct g_part_table *table;
149	struct g_part_entry *entry;
150	struct sbuf *sb;
151	const char *indent;
152};
153
154# dumpto() - return whether the partiton can be used for kernel dumps.
155METHOD int dumpto {
156	struct g_part_table *table;
157	struct g_part_entry *entry;
158};
159
160# fullname() - write the name of the given partition entry to the sbuf.
161METHOD void fullname {
162	struct g_part_table *table;
163	struct g_part_entry *entry;
164	struct sbuf *sb;
165	const char *pfx;
166} DEFAULT default_fullname;
167
168# ioctl() - implement historic ioctls, perhaps.
169METHOD int ioctl {
170	struct g_part_table *table;
171	struct g_provider *pp;
172	u_long cmd;
173	void *data;
174	int fflag;
175	struct thread *td;
176} DEFAULT default_ioctl;
177
178# modify() - scheme specific processing for the modify verb.
179METHOD int modify {
180	struct g_part_table *table;
181	struct g_part_entry *entry;
182	struct g_part_parms *gpp;
183};
184
185# new_provider() - Create the partition's provider(s).
186METHOD struct g_provider * new_provider {
187	struct g_part_table *table;
188	struct g_geom *gp;
189	struct g_part_entry *entry;
190	const char *pfx;
191} DEFAULT default_new_provider;
192
193# resize() - scheme specific processing for the resize verb.
194METHOD int resize {
195	struct g_part_table *table;
196	struct g_part_entry *entry;
197	struct g_part_parms *gpp;
198} DEFAULT default_resize;
199
200# name() - return the name of the given partition entry.
201# Typical names are "p1", "s0" or "c".
202METHOD const char * name {
203	struct g_part_table *table;
204	struct g_part_entry *entry;
205	char *buf;
206	size_t bufsz;
207};
208
209# precheck() - method to allow schemes to check the parameters given
210# to the mentioned ctl request. This only applies to the requests that
211# operate on a GEOM. In other words, it does not apply to the create
212# request.
213# It is allowed (intended actually) to change the parameters according
214# to the schemes needs before they are used. Returning an error will
215# terminate the request immediately.
216METHOD int precheck {
217	struct g_part_table *table;
218	enum g_part_ctl req;
219	struct g_part_parms *gpp;
220} DEFAULT default_precheck;
221
222# probe() - probe the provider attached to the given consumer for the
223# existence of the scheme implemented by the G_PART interface handler.
224METHOD int probe {
225	struct g_part_table *table;
226	struct g_consumer *cp;
227};
228
229# read() - read the on-disk partition table into memory.
230METHOD int read {
231	struct g_part_table *table;
232	struct g_consumer *cp;
233};
234
235# recover() - scheme specific processing for the recover verb.
236METHOD int recover {
237	struct g_part_table *table;
238} DEFAULT default_recover;
239
240# setunset() - set or unset partition entry attributes.
241METHOD int setunset {
242	struct g_part_table *table;
243	struct g_part_entry *entry;
244	const char *attrib;
245	unsigned int set;
246};
247
248# type() - return a string representation of the partition type.
249# Preferably, the alias names.
250METHOD const char * type {
251        struct g_part_table *table;
252        struct g_part_entry *entry;
253        char *buf;
254        size_t bufsz;
255};
256
257# write() - write the in-memory partition table to disk.
258METHOD int write {
259	struct g_part_table *table;
260	struct g_consumer *cp;
261};
262