summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ata/ata-all.c20
-rw-r--r--sys/dev/ata/ata-all.h14
-rw-r--r--sys/dev/ata/ata-raid.c27
3 files changed, 42 insertions, 19 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index f17c00d..d2ce297 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -75,7 +75,8 @@ static int ata_identify(device_t dev);
MALLOC_DEFINE(M_ATA, "ATA generic", "ATA driver generic layer");
int (*ata_ioctl_func)(struct ata_cmd *iocmd) = NULL;
devclass_t ata_devclass;
-uma_zone_t ata_zone;
+uma_zone_t ata_request_zone;
+uma_zone_t ata_composite_zone;
int ata_wc = 1;
/* local vars */
@@ -837,9 +838,18 @@ MODULE_VERSION(ata, 1);
static void
ata_init(void)
{
- /* init our UMA zone for ATA requests */
- ata_zone = uma_zcreate("ata_request", sizeof(struct ata_request),
- NULL, NULL, NULL, NULL, 0, 0);
+ ata_request_zone = uma_zcreate("ata_request", sizeof(struct ata_request),
+ NULL, NULL, NULL, NULL, 0, 0);
+ ata_composite_zone = uma_zcreate("ata_composite",
+ sizeof(struct ata_composite),
+ NULL, NULL, NULL, NULL, 0, 0);
}
+SYSINIT(ata_register, SI_SUB_DRIVERS, SI_ORDER_SECOND, ata_init, NULL);
-SYSINIT(atadev, SI_SUB_DRIVERS, SI_ORDER_SECOND, ata_init, NULL)
+static void
+ata_uninit(void)
+{
+ uma_zdestroy(ata_composite_zone);
+ uma_zdestroy(ata_request_zone);
+}
+SYSUNINIT(ata_unregister, SI_SUB_DRIVERS, SI_ORDER_SECOND, ata_uninit, NULL);
diff --git a/sys/dev/ata/ata-all.h b/sys/dev/ata/ata-all.h
index c080cb3..12433c2 100644
--- a/sys/dev/ata/ata-all.h
+++ b/sys/dev/ata/ata-all.h
@@ -475,10 +475,16 @@ void ata_generic_hw(struct ata_channel *ch);
int ata_generic_command(struct ata_device *atadev, u_int8_t command, u_int64_t lba, u_int16_t count, u_int16_t feature);
int ata_getparam(device_t parent, struct ata_device *atadev, u_int8_t command);
-/* macros for alloc/free of ata_requests */
-extern uma_zone_t ata_zone;
-#define ata_alloc_request() uma_zalloc(ata_zone, M_NOWAIT | M_ZERO)
-#define ata_free_request(request) uma_zfree(ata_zone, request)
+/* macros for alloc/free of struct ata_request */
+extern uma_zone_t ata_request_zone;
+#define ata_alloc_request() uma_zalloc(ata_request_zone, M_NOWAIT | M_ZERO)
+#define ata_free_request(request) uma_zfree(ata_request_zone, request)
+
+/* macros for alloc/free of struct ata_composite */
+extern uma_zone_t ata_composite_zone;
+#define ata_alloc_composite() uma_zalloc(ata_composite_zone, M_NOWAIT | M_ZERO)
+#define ata_free_composite(composite) uma_zfree(ata_composite_zone, composite)
+
MALLOC_DECLARE(M_ATA);
/* misc newbus defines */
diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c
index 0dcfc29..5418bd9 100644
--- a/sys/dev/ata/ata-raid.c
+++ b/sys/dev/ata/ata-raid.c
@@ -381,8 +381,7 @@ ata_raid_strategy(struct bio *bp)
/* do we have a spare to rebuild on ? */
if (rdp->disks[this].flags & AR_DF_SPARE) {
- if ((composite = malloc(sizeof(struct ata_composite),
- M_AR, M_NOWAIT | M_ZERO))) {
+ if ((composite = ata_alloc_composite())) {
if ((rebuild = ata_alloc_request())) {
rdp->rebuild_lba = blk + chunk;
bcopy(request, rebuild,
@@ -404,12 +403,13 @@ ata_raid_strategy(struct bio *bp)
ata_raid_send_request(rebuild);
}
else {
- free(composite, M_AR);
+ ata_free_composite(composite);
printf("DOH! ata_alloc_request failed!\n");
}
}
- else
- printf("DOH! composite malloc failed!\n");
+ else {
+ printf("DOH! ata_alloc_composite failed!\n");
+ }
}
else if (rdp->disks[this].flags & AR_DF_ONLINE) {
/*
@@ -441,9 +441,8 @@ ata_raid_strategy(struct bio *bp)
struct ata_composite *composite;
int this = drv + rdp->width;
- if ((composite = malloc(sizeof(struct ata_composite),
- M_AR, M_NOWAIT | M_ZERO)) &&
- (mirror = ata_alloc_request())) {
+ if ((composite = ata_alloc_composite())) {
+ if ((mirror = ata_alloc_request())) {
rdp->rebuild_lba = blk + chunk;
bcopy(request, mirror, sizeof(struct ata_request));
mirror->this = this;
@@ -460,6 +459,14 @@ ata_raid_strategy(struct bio *bp)
ata_raid_send_request(mirror);
rdp->disks[this].last_lba = bp->bio_pblkno + chunk;
}
+ else {
+ ata_free_composite(composite);
+ printf("DOH! ata_alloc_request failed!\n");
+ }
+ }
+ else {
+ printf("DOH! ata_alloc_composite failed!\n");
+ }
}
else
drv += rdp->width;
@@ -694,7 +701,7 @@ ata_raid_done(struct ata_request *request)
}
}
mtx_destroy(&composite->lock);
- free(composite, M_AR);
+ ata_free_composite(composite);
}
}
else
@@ -2921,7 +2928,7 @@ ata_raid_init_request(struct ar_softc *rdp, struct bio *bio)
if (!(request = ata_alloc_request())) {
printf("FAILURE - out of memory in ata_raid_init_request\n");
- return 0;
+ return NULL;
}
request->timeout = 5;
request->retries = 2;
OpenPOWER on IntegriCloud