2 # Copyright (c) 2010 Alexander Motin
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
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.
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.
28 #include <sys/param.h>
30 #include <sys/malloc.h>
31 #include <sys/mutex.h>
34 #include <machine/bus.h>
35 #include <sys/systm.h>
36 #include <geom/geom.h>
37 #include <geom/raid/g_raid.h>
39 # The G_RAID metadata class interface.
44 #define G_RAID_MD_TASTE_FAIL -1
45 #define G_RAID_MD_TASTE_EXISTING 0
46 #define G_RAID_MD_TASTE_NEW 1
49 # Default implementations of methods.
52 g_raid_md_create_default(struct g_raid_md_object *md)
55 return (G_RAID_MD_TASTE_FAIL);
59 g_raid_md_ctl_default(struct g_raid_md_object *md,
67 g_raid_md_volume_event_default(struct g_raid_md_object *md,
68 struct g_raid_volume *vol, u_int event)
75 g_raid_md_free_disk_default(struct g_raid_md_object *md,
76 struct g_raid_volume *vol)
83 g_raid_md_free_volume_default(struct g_raid_md_object *md,
84 struct g_raid_volume *vol)
91 # create() - create new node from scratch.
93 struct g_raid_md_object *md;
96 } DEFAULT g_raid_md_create_default;
98 # taste() - taste disk and, if needed, create new node.
100 struct g_raid_md_object *md;
102 struct g_consumer *cp;
106 # ctl() - user-level control commands handling method.
108 struct g_raid_md_object *md;
109 struct gctl_req *req;
110 } DEFAULT g_raid_md_ctl_default;
112 # event() - events handling method.
114 struct g_raid_md_object *md;
115 struct g_raid_disk *disk;
119 # volume_event() - events handling method.
120 METHOD int volume_event {
121 struct g_raid_md_object *md;
122 struct g_raid_volume *vol;
124 } DEFAULT g_raid_md_volume_event_default;
126 # write() - metadata write method.
128 struct g_raid_md_object *md;
129 struct g_raid_volume *vol;
130 struct g_raid_subdisk *sd;
131 struct g_raid_disk *disk;
134 # fail_disk() - mark disk as failed and remove it from use.
135 METHOD int fail_disk {
136 struct g_raid_md_object *md;
137 struct g_raid_subdisk *sd;
138 struct g_raid_disk *disk;
141 # free_disk() - disk destructor.
142 METHOD int free_disk {
143 struct g_raid_md_object *md;
144 struct g_raid_disk *disk;
145 } DEFAULT g_raid_md_free_disk_default;
147 # free_volume() - volume destructor.
148 METHOD int free_volume {
149 struct g_raid_md_object *md;
150 struct g_raid_volume *vol;
151 } DEFAULT g_raid_md_free_volume_default;
153 # free() - destructor.
155 struct g_raid_md_object *md;