-__block_mount_partitions(struct hba_device* hd_dev)
-{
- int errno = 0;
- void* buffer = valloc_dma(hd_dev->block_size);
- if (!hd_dev->ops.read_buffer(hd_dev, 1, buffer, hd_dev->block_size)) {
- errno = BLOCK_EREAD;
- goto done;
- }
-
- struct lpt_header* header = (struct lpt_header*)buffer;
- if (header->signature != LPT_SIG) {
- errno = BLOCK_ESIG;
- goto done;
- }
-
- if (header->crc != crc32b(buffer, sizeof(*header))) {
- errno = BLOCK_ECRC;
- goto done;
- }
-
- uint64_t lba = header->pt_start_lba;
- int j = 0;
- int count_per_sector = hd_dev->block_size / sizeof(struct lpt_entry);
- while (lba < header->pt_end_lba) {
- if (!hd_dev->ops.read_buffer(hd_dev, lba, buffer, hd_dev->block_size)) {
- errno = BLOCK_EREAD;
- goto done;
- }
- struct lpt_entry* entry = (struct lpt_entry*)buffer;
- for (int i = 0; i < count_per_sector; i++, j++) {
- struct block_dev* dev = cake_grab(lbd_pile);
- strncpy(dev->name, entry->part_name, PARTITION_NAME_SIZE);
- dev->hd_dev = hd_dev;
- dev->base_lba = entry->base_lba;
- dev->end_lba = entry->end_lba;
- __block_register(dev);
-
- if (j >= header->table_len) {
- goto done;
- }
- }
- }
-
-done:
- vfree_dma(buffer);
- return -errno;
-}
-
-int
-__block_register(struct block_dev* dev)