g_uncompress.c (283900) | g_uncompress.c (266220) |
---|---|
1/*- 2 * Copyright (c) 2010-2012 Aleksandr Rybalko 3 * Copyright (c) 2004 Max Khon 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 20 unchanged lines hidden (view full) --- 29 * GEOM UNCOMPRESS module - simple decompression module for use with read-only 30 * copressed images maked by mkuzip(8) or mkulzma(8) utilities. 31 * 32 * To enable module in kernel config, put this line: 33 * device geom_uncompress 34 */ 35 36#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2010-2012 Aleksandr Rybalko 3 * Copyright (c) 2004 Max Khon 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 20 unchanged lines hidden (view full) --- 29 * GEOM UNCOMPRESS module - simple decompression module for use with read-only 30 * copressed images maked by mkuzip(8) or mkulzma(8) utilities. 31 * 32 * To enable module in kernel config, put this line: 33 * device geom_uncompress 34 */ 35 36#include <sys/cdefs.h> |
37__FBSDID("$FreeBSD: stable/10/sys/geom/uncompress/g_uncompress.c 283900 2015-06-02 02:05:32Z ae $"); | 37__FBSDID("$FreeBSD: stable/10/sys/geom/uncompress/g_uncompress.c 266220 2014-05-16 14:28:55Z loos $"); |
38 39#include <sys/param.h> 40#include <sys/bio.h> 41#include <sys/endian.h> 42#include <sys/errno.h> 43#include <sys/kernel.h> 44#include <sys/lock.h> 45#include <sys/mutex.h> --- 413 unchanged lines hidden (view full) --- 459static struct g_geom * 460g_uncompress_taste(struct g_class *mp, struct g_provider *pp, int flags) 461{ 462 struct cloop_header *header; 463 struct g_uncompress_softc *sc; 464 struct g_provider *pp2; 465 struct g_consumer *cp; 466 struct g_geom *gp; | 38 39#include <sys/param.h> 40#include <sys/bio.h> 41#include <sys/endian.h> 42#include <sys/errno.h> 43#include <sys/kernel.h> 44#include <sys/lock.h> 45#include <sys/mutex.h> --- 413 unchanged lines hidden (view full) --- 459static struct g_geom * 460g_uncompress_taste(struct g_class *mp, struct g_provider *pp, int flags) 461{ 462 struct cloop_header *header; 463 struct g_uncompress_softc *sc; 464 struct g_provider *pp2; 465 struct g_consumer *cp; 466 struct g_geom *gp; |
467 uint64_t *offsets; 468 uint32_t i, r, total, total_offsets, type; | 467 uint32_t i, total_offsets, type; |
469 uint8_t *buf; 470 int error; 471 472 g_trace(G_T_TOPOLOGY, "%s(%s,%s)", __func__, mp->name, pp->name); 473 g_topology_assert(); 474 475 /* Skip providers that are already open for writing. */ 476 if (pp->acw > 0) --- 18 unchanged lines hidden (view full) --- 495 g_topology_unlock(); 496 497 /* 498 * Read cloop header, look for CLOOP magic, perform 499 * other validity checks. 500 */ 501 DPRINTF(("%s: media sectorsize %u, mediasize %jd\n", 502 gp->name, pp->sectorsize, (intmax_t)pp->mediasize)); | 468 uint8_t *buf; 469 int error; 470 471 g_trace(G_T_TOPOLOGY, "%s(%s,%s)", __func__, mp->name, pp->name); 472 g_topology_assert(); 473 474 /* Skip providers that are already open for writing. */ 475 if (pp->acw > 0) --- 18 unchanged lines hidden (view full) --- 494 g_topology_unlock(); 495 496 /* 497 * Read cloop header, look for CLOOP magic, perform 498 * other validity checks. 499 */ 500 DPRINTF(("%s: media sectorsize %u, mediasize %jd\n", 501 gp->name, pp->sectorsize, (intmax_t)pp->mediasize)); |
503 total = roundup(sizeof(struct cloop_header), pp->sectorsize); 504 buf = g_read_data(cp, 0, total, NULL); | 502 i = roundup(sizeof(struct cloop_header), pp->sectorsize); 503 buf = g_read_data(cp, 0, i, NULL); |
505 if (buf == NULL) 506 goto err; 507 header = (struct cloop_header *) buf; 508 if (strncmp(header->magic, CLOOP_MAGIC_START, 509 sizeof(CLOOP_MAGIC_START) - 1) != 0) { 510 DPRINTF(("%s: no CLOOP magic\n", gp->name)); 511 goto err; 512 } --- 40 unchanged lines hidden (view full) --- 553 } 554 total_offsets = sc->nblocks + 1; 555 if (sizeof(struct cloop_header) + 556 total_offsets * sizeof(uint64_t) > pp->mediasize) { 557 printf("%s: media too small for %u blocks\n", 558 gp->name, sc->nblocks); 559 goto err; 560 } | 504 if (buf == NULL) 505 goto err; 506 header = (struct cloop_header *) buf; 507 if (strncmp(header->magic, CLOOP_MAGIC_START, 508 sizeof(CLOOP_MAGIC_START) - 1) != 0) { 509 DPRINTF(("%s: no CLOOP magic\n", gp->name)); 510 goto err; 511 } --- 40 unchanged lines hidden (view full) --- 552 } 553 total_offsets = sc->nblocks + 1; 554 if (sizeof(struct cloop_header) + 555 total_offsets * sizeof(uint64_t) > pp->mediasize) { 556 printf("%s: media too small for %u blocks\n", 557 gp->name, sc->nblocks); 558 goto err; 559 } |
561 g_free(buf); | 560 free(buf, M_GEOM); |
562 | 561 |
563 sc->offsets = malloc(total_offsets * sizeof(uint64_t), 564 M_GEOM_UNCOMPRESS, M_WAITOK | M_ZERO); 565 total = roundup((sizeof(struct cloop_header) + | 562 i = roundup((sizeof(struct cloop_header) + |
566 total_offsets * sizeof(uint64_t)), pp->sectorsize); | 563 total_offsets * sizeof(uint64_t)), pp->sectorsize); |
567#define RSZ ((total - r) > MAXPHYS ? MAXPHYS: (total - r)) 568 for (r = 0, i = 0; r < total; r += MAXPHYS) { 569 buf = g_read_data(cp, r, RSZ, &error); 570 if (buf == NULL) { 571 free(sc->offsets, M_GEOM_UNCOMPRESS); 572 goto err; 573 } 574 offsets = (uint64_t *)buf; 575 if (r == 0) 576 offsets += 577 sizeof(struct cloop_header) / sizeof(uint64_t); 578 for (; i < total_offsets && offsets < (uint64_t *)(buf + RSZ); 579 i++, offsets++) 580 sc->offsets[i] = be64toh(*offsets); 581 g_free(buf); | 564 buf = g_read_data(cp, 0, i, NULL); 565 if (buf == NULL) 566 goto err; 567 sc->offsets = malloc(total_offsets * sizeof(uint64_t), 568 M_GEOM_UNCOMPRESS, M_WAITOK); 569 for (i = 0; i <= total_offsets; i++) { 570 sc->offsets[i] = be64toh(((uint64_t *) 571 (buf+sizeof(struct cloop_header)))[i]); |
582 } | 572 } |
583#undef RSZ 584 buf = NULL; | 573 free(buf, M_GEOM); |
585 DPRINTF(("%s: done reading offsets\n", gp->name)); 586 mtx_init(&sc->last_mtx, "geom_uncompress cache", NULL, MTX_DEF); 587 sc->last_blk = -1; 588 sc->last_buf = malloc(sc->blksz, M_GEOM_UNCOMPRESS, M_WAITOK); 589 sc->req_total = 0; 590 sc->req_cached = 0; 591 592 switch (sc->type) { --- 31 unchanged lines hidden (view full) --- 624 pp2->stripeoffset, pp2->stripesize, pp2->flags)); 625 printf("%s: %u x %u blocks\n", gp->name, sc->nblocks, sc->blksz); 626 return (gp); 627 628err: 629 g_topology_lock(); 630 g_access(cp, -1, 0, 0); 631 if (buf != NULL) | 574 DPRINTF(("%s: done reading offsets\n", gp->name)); 575 mtx_init(&sc->last_mtx, "geom_uncompress cache", NULL, MTX_DEF); 576 sc->last_blk = -1; 577 sc->last_buf = malloc(sc->blksz, M_GEOM_UNCOMPRESS, M_WAITOK); 578 sc->req_total = 0; 579 sc->req_cached = 0; 580 581 switch (sc->type) { --- 31 unchanged lines hidden (view full) --- 613 pp2->stripeoffset, pp2->stripesize, pp2->flags)); 614 printf("%s: %u x %u blocks\n", gp->name, sc->nblocks, sc->blksz); 615 return (gp); 616 617err: 618 g_topology_lock(); 619 g_access(cp, -1, 0, 0); 620 if (buf != NULL) |
632 g_free(buf); | 621 free(buf, M_GEOM); |
633 if (gp->softc != NULL) { 634 g_uncompress_softc_free(gp->softc, NULL); 635 gp->softc = NULL; 636 } 637 g_detach(cp); 638 g_destroy_consumer(cp); 639 g_destroy_geom(gp); 640 --- 44 unchanged lines hidden --- | 622 if (gp->softc != NULL) { 623 g_uncompress_softc_free(gp->softc, NULL); 624 gp->softc = NULL; 625 } 626 g_detach(cp); 627 g_destroy_consumer(cp); 628 g_destroy_geom(gp); 629 --- 44 unchanged lines hidden --- |