ata (raid) patches
Michael Butler
imb at protected-networks.net
Tue Nov 29 04:01:21 GMT 2005
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
I wrote:
| For those game enough to try the results of my handiwork ;-), enclosed
| is a patch against the files in /usr/src/sys/dev/ata for RELENG_6 (and
| possibly others) with the following objectives:
|
| 1) the ata-raid driver currently leaks ata_composite and ata_request
| structures into "neverland" in a mirrored configuration. This can be
| observed using "sysctl -a | grep ^ata_" and noting the increasing
| "in-use" count as time goes on. Eventually, this causes the kernel to
| run out of memory. This is fixed by tracking the request counts on each
| composite request.
~ [ .. ]
| As usual, this patch comes with no warranty ... it works for me. "If it
| breaks your system, you own all the pieces".
|
| I recommend you back up your system before testing,
This is just the composite/request leak patch on it's own,
Michael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (MingW32)
iD8DBQFDi9J3iJykeV6HPMURAvENAJ4v9p/HjHLQ+iJ+EH23+z9ZiTbXyACeOhNA
ux0UiWyGNNKu4rrPl12GP+4=
=NC/r
-----END PGP SIGNATURE-----
-------------- next part --------------
*** /usr/src/sys/dev/ata/ata-all.h.orig Sun Nov 27 14:17:57 2005
--- /usr/src/sys/dev/ata/ata-all.h Sun Nov 27 14:22:05 2005
***************
*** 331,336 ****
--- 331,337 ----
u_int32_t wr_depend; /* write depends on subdisks */
u_int32_t wr_done; /* done write subdisks */
struct ata_request *request[32]; /* size must match maps above */
+ long count; /* count required of this composite */
caddr_t data_1;
caddr_t data_2;
};
*** ata-raid.c.orig Mon Nov 28 18:02:01 2005
--- ata-raid.c Mon Nov 28 22:52:53 2005
***************
*** 410,415 ****
--- 410,416 ----
mtx_init(&composite->lock,
"ATA PseudoRAID rebuild lock",
NULL, MTX_DEF);
+ composite->count = request->bytecount;
composite->rd_needed |= (1 << drv);
composite->wr_depend |= (1 << drv);
composite->wr_needed |= (1 << this);
***************
*** 468,473 ****
--- 469,475 ----
mtx_init(&composite->lock,
"ATA PseudoRAID mirror lock",
NULL, MTX_DEF);
+ composite->count = request->bytecount;
composite->wr_needed |= (1 << drv);
composite->wr_needed |= (1 << this);
composite->request[drv] = request;
***************
*** 607,613 ****
/* good data, update how far we've gotten */
else {
bp->bio_resid -= request->donecount;
! if (bp->bio_resid == 0) {
if (composite->wr_done & (1 << mirror))
finished = 1;
}
--- 609,616 ----
/* good data, update how far we've gotten */
else {
bp->bio_resid -= request->donecount;
! composite->count -= request->donecount;
! if (composite->count == 0) {
if (composite->wr_done & (1 << mirror))
finished = 1;
}
***************
*** 621,627 ****
printf("DOH! rebuild failed\n"); /* XXX SOS */
rdp->rebuild_lba = blk;
}
! if (bp->bio_resid == 0)
finished = 1;
}
}
--- 624,630 ----
printf("DOH! rebuild failed\n"); /* XXX SOS */
rdp->rebuild_lba = blk;
}
! if (composite->count == 0)
finished = 1;
}
}
***************
*** 658,667 ****
}
bp->bio_resid -=
composite->request[mirror]->donecount;
}
! else
bp->bio_resid -= request->donecount;
! if (bp->bio_resid == 0)
finished = 1;
}
mtx_unlock(&composite->lock);
--- 661,674 ----
}
bp->bio_resid -=
composite->request[mirror]->donecount;
+ composite->count -=
+ composite->request[mirror]->donecount;
}
! else {
bp->bio_resid -= request->donecount;
! composite->count -= request->donecount;
! }
! if (composite->count == 0)
finished = 1;
}
mtx_unlock(&composite->lock);
***************
*** 723,729 ****
rdp->status &= ~AR_S_REBUILDING;
ata_raid_config_changed(rdp, 1);
}
! biodone(bp);
}
if (composite) {
--- 730,738 ----
rdp->status &= ~AR_S_REBUILDING;
ata_raid_config_changed(rdp, 1);
}
! /* cover the case of a series of composites which are only partly complete */
! if (bp->bio_resid == 0)
! biodone(bp);
}
if (composite) {
More information about the freebsd-stable
mailing list