freelist
static struct entry *freelist = NULL;
if (freelist != NULL) {
np = freelist;
freelist = np->e_next;
ep->e_next = freelist;
freelist = ep;
struct drive_freelist freelist;
if (ioctl(superdev, VINUM_GETFREELIST, &freeunion.freelist) < 0) {
bigchunk = bigchunk > freeunion.freelist.sectors ? bigchunk : freeunion.freelist.sectors; /* max it */
struct drive_freelist freelist;
if (ioctl(superdev, VINUM_GETFREELIST, &freeunion.freelist) < 0) {
bigchunk = bigchunk > freeunion.freelist.sectors ? bigchunk : freeunion.freelist.sectors; /* max it */
struct drive_freelist freelist;
if (ioctl(superdev, VINUM_GETFREELIST, &freeunion.freelist) < 0) {
bigchunk = bigchunk > freeunion.freelist.sectors ? bigchunk : freeunion.freelist.sectors; /* max it */
struct drive_freelist freelist;
if (ioctl(superdev, VINUM_GETFREELIST, &freeunion.freelist) < 0) {
bigchunk = bigchunk > freeunion.freelist.sectors ? bigchunk : freeunion.freelist.sectors; /* max it */
struct drive_freelist freelist;
if (ioctl(superdev, VINUM_GETFREELIST, &freeunion.freelist) < 0) {
(long long) freeunion.freelist.offset,
(long long) freeunion.freelist.sectors);
struct freelist *grplist;
void freelist_reserve(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT count)
void *freelist_get(struct freelist *list)
void freelist_put(struct freelist * list, void *p)
void freelist_reserve_dma(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT alignment, HPT_UINT count)
void *freelist_get_dma(struct freelist *list, BUS_ADDRESS *busaddr)
void freelist_put_dma(struct freelist *list, void *p, BUS_ADDRESS busaddr)
struct freelist *f;
struct freelist *f;
struct freelist freelist_dev;
struct freelist freelist_plugged_dpc;
PCOMMAND ldm_alloc_cmds_from_list(PVBUS vbus, struct freelist *list, HPT_UINT cnt);
void ldm_free_cmds_to_list(struct freelist *list, PCOMMAND cmd);
PCOMMAND __ldm_alloc_cmd(struct freelist *list);
struct freelist *next;
void freelist_reserve(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT count);
void *freelist_get(struct freelist *);
void freelist_put(struct freelist *, void *p);
void freelist_reserve_dma(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT alignment, HPT_UINT count);
void *freelist_get_dma(struct freelist *, BUS_ADDRESS *busaddr);
void freelist_put_dma(struct freelist *, void *p, BUS_ADDRESS busaddr);
struct freelist *freelist_head;
struct freelist *freelist_dma_head;
struct freelist *grplist;
void freelist_reserve(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT count)
void *freelist_get(struct freelist *list)
void freelist_put(struct freelist * list, void *p)
void freelist_reserve_dma(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT alignment, HPT_UINT count)
void *freelist_get_dma(struct freelist *list, BUS_ADDRESS *busaddr)
void freelist_put_dma(struct freelist *list, void *p, BUS_ADDRESS busaddr)
struct freelist *f;
struct freelist *f;
struct freelist freelist_dev;
struct freelist freelist_plugged_dpc;
PCOMMAND ldm_alloc_cmds_from_list(PVBUS vbus, struct freelist *list, HPT_UINT cnt);
void ldm_free_cmds_to_list(struct freelist *list, PCOMMAND cmd);
PCOMMAND __ldm_alloc_cmd(struct freelist *list);
struct freelist *next;
void freelist_reserve(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT count);
void *freelist_get(struct freelist *);
void freelist_put(struct freelist *, void *p);
void freelist_reserve_dma(struct freelist *list, void *osext, HPT_UINT size, HPT_UINT alignment, HPT_UINT count);
void *freelist_get_dma(struct freelist *, BUS_ADDRESS *busaddr);
void freelist_put_dma(struct freelist *, void *p, BUS_ADDRESS busaddr);
struct freelist *freelist_head;
struct freelist *freelist_dma_head;
if (drive->freelist[fe].sectors >= sd->sectors) { /* more space here */
sd->sectors = drive->freelist[fe].sectors; /* take it */
sd->driveoffset = drive->freelist[fe].offset;
bcopy(&drive->freelist[sfe + 1],
&drive->freelist[sfe],
if (drive->freelist[fe].sectors >= sd->sectors) { /* it'll fit here */
sd->driveoffset = drive->freelist[fe].offset;
if (sd->sectors == drive->freelist[fe].sectors) { /* used up the entire entry */
bcopy(&drive->freelist[fe + 1],
&drive->freelist[fe],
drive->freelist[fe].sectors -= sd->sectors; /* this much less space */
drive->freelist[fe].offset += sd->sectors; /* this much further on */
u_int64_t dend = drive->freelist[fe].offset + drive->freelist[fe].sectors; /* end of entry */
if (drive->freelist[fe].offset > sd->driveoffset) { /* starts after the beginning of sd area */
if (sd->driveoffset == drive->freelist[fe].offset) { /* 1 or 2 */
if (sd->sectors == drive->freelist[fe].sectors) { /* 1: used up the entire entry */
bcopy(&drive->freelist[fe + 1],
&drive->freelist[fe],
drive->freelist[fe].sectors -= sd->sectors; /* this much less space */
drive->freelist[fe].offset += sd->sectors; /* this much further on */
drive->freelist[fe].sectors = sd->driveoffset - drive->freelist[fe].offset;
bcopy(&drive->freelist[fe], /* move the rest down */
&drive->freelist[fe + 1],
drive->freelist[fe + 1].offset = sdend; /* second entry starts after sd */
drive->freelist[fe + 1].sectors = dend - sdend; /* and is this long */
if (drive->freelist)
Free(drive->freelist);
(fe < drive->freelist_entries) && (drive->freelist[fe].offset < offset);
||(drive->freelist[fe].offset > offset))) /* or past the block were looking for */
dend = drive->freelist[fe].offset + drive->freelist[fe].sectors; /* end of the entry */
&&(sdend == drive->freelist[fe + 1].offset)) {
drive->freelist[fe].sectors /* 1a: merge all three blocks */
= drive->freelist[fe + 1].sectors;
bcopy(&drive->freelist[fe + 2], /* move down one */
&drive->freelist[fe + 1],
drive->freelist[fe].sectors += length;
&&(sdend == drive->freelist[fe].offset)) {
drive->freelist[fe].offset = offset; /* it starts where the sd was */
drive->freelist[fe].sectors += length; /* and it's this much bigger */
bcopy(&drive->freelist[fe], /* move the rest up one entry */
&drive->freelist[fe + 1],
drive->freelist[fe].offset = offset; /* this entry represents the sd */
drive->freelist[fe].sectors = length;
drive->freelist = (struct drive_freelist *)
if (drive->freelist == NULL) /* can't malloc, dammit */
drive->freelist[0].offset = DATASTART; /* starts here */
drive->freelist[0].sectors = (drive->label.drive_size >> DEV_BSHIFT) - DATASTART; /* and it's this long */
bcopy(&DRIVE[index].freelist[fe], data,
} *freelist;
struct colist freelist;
TAILQ_INSERT_TAIL(&sc->freelist, c, entry);
TAILQ_INIT(&sc->freelist);
while ((c = TAILQ_FIRST(&sc->freelist)) != NULL) {
TAILQ_REMOVE(&sc->freelist, c, entry);