1/*- 2 * Copyright (c) 2002 Poul-Henning Kamp 3 * Copyright (c) 2002 Networks Associates Technology, Inc. 4 * All rights reserved. 5 * 6 * This software was developed for the FreeBSD Project by Poul-Henning Kamp 7 * and NAI Labs, the Security Research Division of Network Associates, Inc. 8 * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the --- 18 unchanged lines hidden (view full) --- 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * |
35 * $FreeBSD: head/sys/geom/geom_slice.c 93776 2002-04-04 09:54:13Z phk $ |
36 */ 37 38 39#include <sys/param.h> 40#ifndef _KERNEL 41#include <stdio.h> 42#include <unistd.h> 43#include <stdlib.h> --- 11 unchanged lines hidden (view full) --- 55#include <sys/mutex.h> 56#endif 57#include <sys/errno.h> 58#include <sys/sbuf.h> 59#include <geom/geom.h> 60#include <geom/geom_slice.h> 61#include <machine/stdarg.h> 62 |
63static g_orphan_t g_slice_orphan; 64static g_access_t g_slice_access; 65static g_start_t g_slice_start; 66 |
67struct g_slicer * 68g_slice_init(unsigned nslice, unsigned scsize) 69{ 70 struct g_slicer *gsp; 71 72 gsp = g_malloc(sizeof *gsp, M_WAITOK | M_ZERO); 73 gsp->softc = g_malloc(scsize, M_WAITOK | M_ZERO); 74 gsp->slices = g_malloc(nslice * sizeof(struct g_slice), M_WAITOK | M_ZERO); 75 gsp->nslice = nslice; 76 return (gsp); 77} 78 |
79static int |
80g_slice_access(struct g_provider *pp, int dr, int dw, int de) 81{ 82 int error, i; 83 struct g_geom *gp; 84 struct g_consumer *cp; 85 struct g_provider *pp2; 86 struct g_slicer *gsp; 87 struct g_slice *gsl, *gsl2; --- 25 unchanged lines hidden (view full) --- 113 de++; 114 /* ... and let go of it on last close */ 115 if ((cp->acr + dr) == 0 && (cp->acw + dw) == 0 && (cp->ace + de) == 1) 116 de--; 117 error = g_access_rel(cp, dr, dw, de); 118 return (error); 119} 120 |
121static void |
122g_slice_start(struct bio *bp) 123{ 124 struct bio *bp2; 125 struct g_provider *pp; 126 struct g_geom *gp; 127 struct g_consumer *cp; 128 struct g_slicer *gsp; 129 struct g_slice *gsl; --- 95 unchanged lines hidden (view full) --- 225 void **vp; 226 int error; 227 228 g_topology_assert(); 229 vp = (void **)extrap; 230 gp = g_new_geomf(mp, "%s", pp->name); 231 gsp = g_slice_init(slices, extra); 232 gsp->start = start; |
233 gp->access = g_slice_access; 234 gp->orphan = g_slice_orphan; |
235 gp->softc = gsp; 236 gp->start = g_slice_start; 237 gp->spoiled = g_std_spoiled; 238 gp->dumpconf = g_slice_dumpconf; 239 cp = g_new_consumer(gp); 240 g_attach(cp, pp); 241 error = g_access_rel(cp, 1, 0, 0); 242 if (error) { --- 4 unchanged lines hidden (view full) --- 247 g_destroy_geom(gp); 248 return (NULL); 249 } 250 *vp = gsp->softc; 251 *cpp = cp; 252 return (gp); 253} 254 |
255static void |
256g_slice_orphan(struct g_consumer *cp) 257{ 258 struct g_geom *gp; 259 struct g_provider *pp; 260 int error; 261 262 g_trace(G_T_TOPOLOGY, "g_slice_orphan(%p/%s)", cp, cp->provider->name); 263 g_topology_assert(); --- 12 unchanged lines hidden --- |