geom_slice.c (107832) | geom_slice.c (107953) |
---|---|
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 * | 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 107832 2002-12-13 21:31:13Z phk $ | 35 * $FreeBSD: head/sys/geom/geom_slice.c 107953 2002-12-16 22:33:27Z phk $ |
36 */ 37 38 39#include <sys/param.h> 40#include <sys/stdint.h> 41#ifndef _KERNEL 42#include <stdio.h> 43#include <unistd.h> --- 33 unchanged lines hidden (view full) --- 77 M_WAITOK | M_ZERO); 78 gsp->nslice = nslice; 79 return (gsp); 80} 81 82static int 83g_slice_access(struct g_provider *pp, int dr, int dw, int de) 84{ | 36 */ 37 38 39#include <sys/param.h> 40#include <sys/stdint.h> 41#ifndef _KERNEL 42#include <stdio.h> 43#include <unistd.h> --- 33 unchanged lines hidden (view full) --- 77 M_WAITOK | M_ZERO); 78 gsp->nslice = nslice; 79 return (gsp); 80} 81 82static int 83g_slice_access(struct g_provider *pp, int dr, int dw, int de) 84{ |
85 int error, i; | 85 int error; 86 u_int u; |
86 struct g_geom *gp; 87 struct g_consumer *cp; 88 struct g_provider *pp2; 89 struct g_slicer *gsp; 90 struct g_slice *gsl, *gsl2; 91 92 gp = pp->geom; 93 cp = LIST_FIRST(&gp->consumer); 94 KASSERT (cp != NULL, ("g_slice_access but no consumer")); 95 gsp = gp->softc; 96 gsl = &gsp->slices[pp->index]; | 87 struct g_geom *gp; 88 struct g_consumer *cp; 89 struct g_provider *pp2; 90 struct g_slicer *gsp; 91 struct g_slice *gsl, *gsl2; 92 93 gp = pp->geom; 94 cp = LIST_FIRST(&gp->consumer); 95 KASSERT (cp != NULL, ("g_slice_access but no consumer")); 96 gsp = gp->softc; 97 gsl = &gsp->slices[pp->index]; |
97 for (i = 0; i < gsp->nslice; i++) { 98 gsl2 = &gsp->slices[i]; | 98 for (u = 0; u < gsp->nslice; u++) { 99 gsl2 = &gsp->slices[u]; |
99 if (gsl2->length == 0) 100 continue; | 100 if (gsl2->length == 0) 101 continue; |
101 if (i == pp->index) | 102 if (u == pp->index) |
102 continue; 103 if (gsl->offset + gsl->length <= gsl2->offset) 104 continue; 105 if (gsl2->offset + gsl2->length <= gsl->offset) 106 continue; 107 /* overlap */ 108 pp2 = gsl2->provider; 109 if ((pp->acw + dw) > 0 && pp2->ace > 0) --- 14 unchanged lines hidden (view full) --- 124void 125g_slice_finish_hot(struct bio *bp) 126{ 127 struct bio *bp2; 128 struct g_geom *gp; 129 struct g_consumer *cp; 130 struct g_slicer *gsp; 131 struct g_slice *gsl; | 103 continue; 104 if (gsl->offset + gsl->length <= gsl2->offset) 105 continue; 106 if (gsl2->offset + gsl2->length <= gsl->offset) 107 continue; 108 /* overlap */ 109 pp2 = gsl2->provider; 110 if ((pp->acw + dw) > 0 && pp2->ace > 0) --- 14 unchanged lines hidden (view full) --- 125void 126g_slice_finish_hot(struct bio *bp) 127{ 128 struct bio *bp2; 129 struct g_geom *gp; 130 struct g_consumer *cp; 131 struct g_slicer *gsp; 132 struct g_slice *gsl; |
132 int index; | 133 int idx; |
133 134 KASSERT(bp->bio_to != NULL, ("NULL bio_to in g_slice_finish_hot(%p)", bp)); 135 KASSERT(bp->bio_from != NULL, ("NULL bio_from in g_slice_finish_hot(%p)", bp)); 136 gp = bp->bio_to->geom; 137 gsp = gp->softc; 138 cp = LIST_FIRST(&gp->consumer); 139 KASSERT(cp != NULL, ("NULL consumer in g_slice_finish_hot(%p)", bp)); | 134 135 KASSERT(bp->bio_to != NULL, ("NULL bio_to in g_slice_finish_hot(%p)", bp)); 136 KASSERT(bp->bio_from != NULL, ("NULL bio_from in g_slice_finish_hot(%p)", bp)); 137 gp = bp->bio_to->geom; 138 gsp = gp->softc; 139 cp = LIST_FIRST(&gp->consumer); 140 KASSERT(cp != NULL, ("NULL consumer in g_slice_finish_hot(%p)", bp)); |
140 index = bp->bio_to->index; 141 gsl = &gsp->slices[index]; | 141 idx = bp->bio_to->index; 142 gsl = &gsp->slices[idx]; |
142 143 bp2 = g_clone_bio(bp); 144 if (bp2 == NULL) { 145 g_io_deliver(bp, ENOMEM); 146 return; 147 } 148 if (bp2->bio_offset + bp2->bio_length > gsl->length) 149 bp2->bio_length = gsl->length - bp2->bio_offset; --- 7 unchanged lines hidden (view full) --- 157g_slice_start(struct bio *bp) 158{ 159 struct bio *bp2; 160 struct g_provider *pp; 161 struct g_geom *gp; 162 struct g_consumer *cp; 163 struct g_slicer *gsp; 164 struct g_slice *gsl, *gmp; | 143 144 bp2 = g_clone_bio(bp); 145 if (bp2 == NULL) { 146 g_io_deliver(bp, ENOMEM); 147 return; 148 } 149 if (bp2->bio_offset + bp2->bio_length > gsl->length) 150 bp2->bio_length = gsl->length - bp2->bio_offset; --- 7 unchanged lines hidden (view full) --- 158g_slice_start(struct bio *bp) 159{ 160 struct bio *bp2; 161 struct g_provider *pp; 162 struct g_geom *gp; 163 struct g_consumer *cp; 164 struct g_slicer *gsp; 165 struct g_slice *gsl, *gmp; |
165 int index, error; | 166 int idx, error; |
166 u_int m_index; 167 off_t t; 168 169 pp = bp->bio_to; 170 gp = pp->geom; 171 gsp = gp->softc; 172 cp = LIST_FIRST(&gp->consumer); | 167 u_int m_index; 168 off_t t; 169 170 pp = bp->bio_to; 171 gp = pp->geom; 172 gsp = gp->softc; 173 cp = LIST_FIRST(&gp->consumer); |
173 index = pp->index; 174 gsl = &gsp->slices[index]; | 174 idx = pp->index; 175 gsl = &gsp->slices[idx]; |
175 switch(bp->bio_cmd) { 176 case BIO_READ: 177 case BIO_WRITE: 178 case BIO_DELETE: 179 if (bp->bio_offset > gsl->length) { 180 g_io_deliver(bp, EINVAL); /* XXX: EWHAT ? */ 181 return; 182 } --- 45 unchanged lines hidden (view full) --- 228 g_handleattr_off_t(bp, "GEOM::frontstuff", t); 229 return; 230 } 231#ifdef _KERNEL 232 if (!strcmp("GEOM::kerneldump", bp->bio_attribute)) { 233 struct g_kerneldump *gkd; 234 235 gkd = (struct g_kerneldump *)bp->bio_data; | 176 switch(bp->bio_cmd) { 177 case BIO_READ: 178 case BIO_WRITE: 179 case BIO_DELETE: 180 if (bp->bio_offset > gsl->length) { 181 g_io_deliver(bp, EINVAL); /* XXX: EWHAT ? */ 182 return; 183 } --- 45 unchanged lines hidden (view full) --- 229 g_handleattr_off_t(bp, "GEOM::frontstuff", t); 230 return; 231 } 232#ifdef _KERNEL 233 if (!strcmp("GEOM::kerneldump", bp->bio_attribute)) { 234 struct g_kerneldump *gkd; 235 236 gkd = (struct g_kerneldump *)bp->bio_data; |
236 gkd->offset += gsp->slices[index].offset; 237 if (gkd->length > gsp->slices[index].length) 238 gkd->length = gsp->slices[index].length; | 237 gkd->offset += gsp->slices[idx].offset; 238 if (gkd->length > gsp->slices[idx].length) 239 gkd->length = gsp->slices[idx].length; |
239 /* now, pass it on downwards... */ 240 } 241#endif 242 bp2 = g_clone_bio(bp); 243 if (bp2 == NULL) { 244 g_io_deliver(bp, ENOMEM); 245 return; 246 } 247 bp2->bio_done = g_std_done; 248 g_io_request(bp2, cp); 249 break; 250 default: 251 g_io_deliver(bp, EOPNOTSUPP); 252 return; 253 } 254} 255 256void | 240 /* now, pass it on downwards... */ 241 } 242#endif 243 bp2 = g_clone_bio(bp); 244 if (bp2 == NULL) { 245 g_io_deliver(bp, ENOMEM); 246 return; 247 } 248 bp2->bio_done = g_std_done; 249 g_io_request(bp2, cp); 250 break; 251 default: 252 g_io_deliver(bp, EOPNOTSUPP); 253 return; 254 } 255} 256 257void |
257g_slice_dumpconf(struct sbuf *sb, char *indent, struct g_geom *gp, struct g_consumer *cp, struct g_provider *pp) | 258g_slice_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, struct g_consumer *cp, struct g_provider *pp) |
258{ 259 struct g_slicer *gsp; 260 261 gsp = gp->softc; 262 if (indent == NULL) { 263 sbuf_printf(sb, " i %u", pp->index); 264 sbuf_printf(sb, " o %ju", 265 (uintmax_t)gsp->slices[pp->index].offset); --- 12 unchanged lines hidden (view full) --- 278 sbuf_printf(sb, "%s<offset>%ju</offset>\n", indent, 279 (uintmax_t)gsp->slices[pp->index].offset); 280 sbuf_printf(sb, "%s<secoffset>%ju</secoffset>\n", indent, 281 (uintmax_t)gsp->slices[pp->index].offset / 512); 282 } 283} 284 285int | 259{ 260 struct g_slicer *gsp; 261 262 gsp = gp->softc; 263 if (indent == NULL) { 264 sbuf_printf(sb, " i %u", pp->index); 265 sbuf_printf(sb, " o %ju", 266 (uintmax_t)gsp->slices[pp->index].offset); --- 12 unchanged lines hidden (view full) --- 279 sbuf_printf(sb, "%s<offset>%ju</offset>\n", indent, 280 (uintmax_t)gsp->slices[pp->index].offset); 281 sbuf_printf(sb, "%s<secoffset>%ju</secoffset>\n", indent, 282 (uintmax_t)gsp->slices[pp->index].offset / 512); 283 } 284} 285 286int |
286g_slice_config(struct g_geom *gp, u_int index, int how, off_t offset, off_t length, u_int sectorsize, char *fmt, ...) | 287g_slice_config(struct g_geom *gp, u_int idx, int how, off_t offset, off_t length, u_int sectorsize, const char *fmt, ...) |
287{ 288 struct g_provider *pp; 289 struct g_slicer *gsp; 290 struct g_slice *gsl; 291 va_list ap; 292 struct sbuf *sb; 293 int error, acc; 294 295 g_trace(G_T_TOPOLOGY, "g_slice_config(%s, %d, %d)", | 288{ 289 struct g_provider *pp; 290 struct g_slicer *gsp; 291 struct g_slice *gsl; 292 va_list ap; 293 struct sbuf *sb; 294 int error, acc; 295 296 g_trace(G_T_TOPOLOGY, "g_slice_config(%s, %d, %d)", |
296 gp->name, index, how); | 297 gp->name, idx, how); |
297 g_topology_assert(); 298 gsp = gp->softc; 299 error = 0; | 298 g_topology_assert(); 299 gsp = gp->softc; 300 error = 0; |
300 if (index >= gsp->nslice) | 301 if (idx >= gsp->nslice) |
301 return(EINVAL); | 302 return(EINVAL); |
302 gsl = &gsp->slices[index]; | 303 gsl = &gsp->slices[idx]; |
303 pp = gsl->provider; 304 if (pp != NULL) 305 acc = pp->acr + pp->acw + pp->ace; 306 else 307 acc = 0; 308 if (acc != 0 && how != G_SLICE_CONFIG_FORCE) { 309 if (length < gsl->length) 310 return(EBUSY); --- 28 unchanged lines hidden (view full) --- 339 sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND); 340 sbuf_vprintf(sb, fmt, ap); 341 sbuf_finish(sb); 342 pp = g_new_providerf(gp, sbuf_data(sb)); 343 if (bootverbose) 344 printf("GEOM: Configure %s, start %jd length %jd end %jd\n", 345 pp->name, (intmax_t)offset, (intmax_t)length, 346 (intmax_t)(offset + length - 1)); | 304 pp = gsl->provider; 305 if (pp != NULL) 306 acc = pp->acr + pp->acw + pp->ace; 307 else 308 acc = 0; 309 if (acc != 0 && how != G_SLICE_CONFIG_FORCE) { 310 if (length < gsl->length) 311 return(EBUSY); --- 28 unchanged lines hidden (view full) --- 340 sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND); 341 sbuf_vprintf(sb, fmt, ap); 342 sbuf_finish(sb); 343 pp = g_new_providerf(gp, sbuf_data(sb)); 344 if (bootverbose) 345 printf("GEOM: Configure %s, start %jd length %jd end %jd\n", 346 pp->name, (intmax_t)offset, (intmax_t)length, 347 (intmax_t)(offset + length - 1)); |
347 pp->index = index; | 348 pp->index = idx; |
348 pp->mediasize = gsl->length; 349 pp->sectorsize = gsl->sectorsize; 350 gsl->provider = pp; 351 gsp->nprovider++; 352 g_error_provider(pp, 0); 353 sbuf_delete(sb); 354 return(0); 355} 356 357int | 349 pp->mediasize = gsl->length; 350 pp->sectorsize = gsl->sectorsize; 351 gsl->provider = pp; 352 gsp->nprovider++; 353 g_error_provider(pp, 0); 354 sbuf_delete(sb); 355 return(0); 356} 357 358int |
358g_slice_conf_hot(struct g_geom *gp, u_int index, off_t offset, off_t length) | 359g_slice_conf_hot(struct g_geom *gp, u_int idx, off_t offset, off_t length) |
359{ 360 struct g_slicer *gsp; 361 struct g_slice *gsl, *gsl2; 362 363 g_trace(G_T_TOPOLOGY, "g_slice_conf_hot()"); 364 g_topology_assert(); 365 gsp = gp->softc; 366 gsl = gsp->hot; | 360{ 361 struct g_slicer *gsp; 362 struct g_slice *gsl, *gsl2; 363 364 g_trace(G_T_TOPOLOGY, "g_slice_conf_hot()"); 365 g_topology_assert(); 366 gsp = gp->softc; 367 gsl = gsp->hot; |
367 if(index >= gsp->nhot) { 368 gsl2 = g_malloc((index + 1) * sizeof *gsl2, M_WAITOK | M_ZERO); | 368 if(idx >= gsp->nhot) { 369 gsl2 = g_malloc((idx + 1) * sizeof *gsl2, M_WAITOK | M_ZERO); |
369 if (gsp->hot != NULL) 370 bcopy(gsp->hot, gsl2, gsp->nhot * sizeof *gsl2); 371 gsp->hot = gsl2; 372 if (gsp->hot != NULL) 373 g_free(gsl); 374 gsl = gsl2; | 370 if (gsp->hot != NULL) 371 bcopy(gsp->hot, gsl2, gsp->nhot * sizeof *gsl2); 372 gsp->hot = gsl2; 373 if (gsp->hot != NULL) 374 g_free(gsl); 375 gsl = gsl2; |
375 gsp->nhot = index + 1; | 376 gsp->nhot = idx + 1; |
376 } 377 if (bootverbose) 378 printf("GEOM: Add %s hot[%d] start %jd length %jd end %jd\n", | 377 } 378 if (bootverbose) 379 printf("GEOM: Add %s hot[%d] start %jd length %jd end %jd\n", |
379 gp->name, index, (intmax_t)offset, (intmax_t)length, | 380 gp->name, idx, (intmax_t)offset, (intmax_t)length, |
380 (intmax_t)(offset + length - 1)); | 381 (intmax_t)(offset + length - 1)); |
381 gsl[index].offset = offset; 382 gsl[index].length = length; | 382 gsl[idx].offset = offset; 383 gsl[idx].length = length; |
383 return (0); 384} 385 386struct g_provider * | 384 return (0); 385} 386 387struct g_provider * |
387g_slice_addslice(struct g_geom *gp, int index, off_t offset, off_t length, u_int sectorsize, char *fmt, ...) | 388g_slice_addslice(struct g_geom *gp, int idx, off_t offset, off_t length, u_int sectorsize, const char *fmt, ...) |
388{ 389 struct g_provider *pp; 390 struct g_slicer *gsp; 391 va_list ap; 392 struct sbuf *sb; 393 394 g_trace(G_T_TOPOLOGY, "g_slice_addslice()"); 395 g_topology_assert(); 396 gsp = gp->softc; 397 va_start(ap, fmt); 398 sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND); 399 sbuf_vprintf(sb, fmt, ap); 400 sbuf_finish(sb); 401 pp = g_new_providerf(gp, sbuf_data(sb)); 402 | 389{ 390 struct g_provider *pp; 391 struct g_slicer *gsp; 392 va_list ap; 393 struct sbuf *sb; 394 395 g_trace(G_T_TOPOLOGY, "g_slice_addslice()"); 396 g_topology_assert(); 397 gsp = gp->softc; 398 va_start(ap, fmt); 399 sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND); 400 sbuf_vprintf(sb, fmt, ap); 401 sbuf_finish(sb); 402 pp = g_new_providerf(gp, sbuf_data(sb)); 403 |
403 pp->index = index; 404 gsp->slices[index].length = length; 405 gsp->slices[index].offset = offset; 406 gsp->slices[index].provider = pp; 407 gsp->slices[index].sectorsize = sectorsize; 408 pp->mediasize = gsp->slices[index].length; 409 pp->sectorsize = gsp->slices[index].sectorsize; | 404 pp->index = idx; 405 gsp->slices[idx].length = length; 406 gsp->slices[idx].offset = offset; 407 gsp->slices[idx].provider = pp; 408 gsp->slices[idx].sectorsize = sectorsize; 409 pp->mediasize = gsp->slices[idx].length; 410 pp->sectorsize = gsp->slices[idx].sectorsize; |
410 sbuf_delete(sb); 411 if (bootverbose) 412 printf("GEOM: Add %s, start %jd length %jd end %jd\n", 413 pp->name, (intmax_t)offset, (intmax_t)length, 414 (intmax_t)(offset + length - 1)); 415 return(pp); 416} 417 --- 63 unchanged lines hidden --- | 411 sbuf_delete(sb); 412 if (bootverbose) 413 printf("GEOM: Add %s, start %jd length %jd end %jd\n", 414 pp->name, (intmax_t)offset, (intmax_t)length, 415 (intmax_t)(offset + length - 1)); 416 return(pp); 417} 418 --- 63 unchanged lines hidden --- |