void remove_driver(partition_map *entry) { partition_map_header *map; Block0 *p; DDMap *m; int i; int j; int f; u32 start; map = entry->the_map; p = map->misc; if (p == NULL) { return; } if (p->sbSig != BLOCK0_SIGNATURE) { return; } if (map->logical_block > p->sbBlkSize) { /* this is not supposed to happen, but let's just ignore it. */ return; } else { /* * compute the factor to convert the block numbers in block0 * into partition map block numbers. */ f = p->sbBlkSize / map->logical_block; } if (p->sbDrvrCount > 0) { m = (DDMap *) p->sbMap; for (i = 0; i < p->sbDrvrCount; i++) { start = get_align_long(&m[i].ddBlock); /* zap the driver if it is wholly contained in the partition */ if (entry->data->dpme_pblock_start <= f*start && f*(start + m[i].ddSize) <= (entry->data->dpme_pblock_start + entry->data->dpme_pblocks)) { // delete this driver // by copying down later ones and zapping the last for (j = i+1; j < p->sbDrvrCount; j++, i++) { put_align_long(get_align_long(&m[j].ddBlock), &m[i].ddBlock); m[i].ddSize = m[j].ddSize; m[i].ddType = m[j].ddType; } put_align_long(0, &m[i].ddBlock); m[i].ddSize = 0; m[i].ddType = 0; p->sbDrvrCount -= 1; return; /* XXX if we continue we will delete other drivers? */ } } } }
void remove_driver(partition_map *entry) { partition_map_header *map; Block0 *p; DDMap *m; int i; int j; int f; u32 start; map = entry->the_map; p = map->misc; if (p == NULL) { return; } if (p->sbSig != BLOCK0_SIGNATURE) { return; } if (map->logical_block > p->sbBlkSize) { return; } else { f = p->sbBlkSize / map->logical_block; } if (p->sbDrvrCount > 0) { m = (DDMap *) p->sbMap; for (i = 0; i < p->sbDrvrCount; i++) { start = get_align_long(&m[i].ddBlock); if (entry->data->dpme_pblock_start <= f*start && f*(start + m[i].ddSize) <= (entry->data->dpme_pblock_start + entry->data->dpme_pblocks)) { // delete this driver // by copying down later ones and zapping the last for (j = i+1; j < p->sbDrvrCount; j++, i++) { put_align_long(get_align_long(&m[j].ddBlock), &m[i].ddBlock); m[i].ddSize = m[j].ddSize; m[i].ddType = m[j].ddType; } put_align_long(0, &m[i].ddBlock); m[i].ddSize = 0; m[i].ddType = 0; p->sbDrvrCount -= 1; return; } } } }