1#- 2# Copyright (c) 2010 Alexander Motin 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/raid/g_raid.h> 38 39# The G_RAID transformation class interface. 40 41INTERFACE g_raid_tr; 42 43# Default implementations of methods. 44CODE { 45 static int 46 g_raid_tr_locked_default(struct g_raid_tr_object *tr, void *argp) 47 { 48 49 return (0); 50 } 51}; 52 53HEADER { 54#define G_RAID_TR_TASTE_FAIL -1 55#define G_RAID_TR_TASTE_SUCCEED 0 56}; 57 58# taste() - volume taste method. 59METHOD int taste { 60 struct g_raid_tr_object *tr; 61 struct g_raid_volume *volume; 62}; 63 64# event() - events handling method. 65METHOD int event { 66 struct g_raid_tr_object *tr; 67 struct g_raid_subdisk *sd; 68 u_int event; 69}; 70 71# start() - begin operation. 72METHOD int start { 73 struct g_raid_tr_object *tr; 74}; 75 76# stop() - stop operation. 77METHOD int stop { 78 struct g_raid_tr_object *tr; 79}; 80 81# iorequest() - manage forward transformation and generates requests to disks. 82METHOD void iostart { 83 struct g_raid_tr_object *tr; 84 struct bio *bp; 85}; 86 87# iodone() - manages backward transformation and reports completion status. 88METHOD void iodone { 89 struct g_raid_tr_object *tr; 90 struct g_raid_subdisk *sd; 91 struct bio *bp; 92}; 93 94# kerneldump() - optimized for rebustness (simplified) kernel dumping routine. 95METHOD int kerneldump { 96 struct g_raid_tr_object *tr; 97 void *virtual; 98 off_t offset; 99 size_t length; 100} DEFAULT g_raid_tr_kerneldump_common; 101 102# locked() - callback method for lock(). 103METHOD int locked { 104 struct g_raid_tr_object *tr; 105 void *argp; 106} DEFAULT g_raid_tr_locked_default; 107 108# free() - destructor. 109METHOD int free { 110 struct g_raid_tr_object *tr; 111}; 112 113# idle() - callback when the volume is idle for a while and the TR wants 114# to schedule some work for that idle period. 115METHOD int idle { 116 struct g_raid_tr_object *tr; 117}; 118