Esempio n. 1
0
node* get(const keyType key, lsm* tree){
  // search the buffer for this item
  nodei* ni = search_buffer(&key, tree);
  if(ni != NULL){
    return ni->node;
  } else{
    // search through the file on disk for this item
    ni = search_disk(&key, tree);
    if(ni != NULL){
      return ni->node;
    }
  }
  // If it does not find the given key, it will return NULL
  return NULL;
}
Esempio n. 2
0
/*
 * register a disk into disk_list
 */
bool_t register_disk(struct disk * disk, enum blkdev_type type)
{
	struct disk_list * list;
	struct partition * part;
	struct blkdev * dev;
	struct disk_block * dblk;
	struct list_head * part_pos;
	s32_t i;

	if(!disk || !disk->name || search_disk(disk->name))
		return FALSE;

	if((disk->sector_size <= 0) || (disk->sector_count <=0))
		return FALSE;

	if((!disk->read_sectors) || (!disk->write_sectors))
		return FALSE;

	if(!partition_parser_probe(disk))
		return FALSE;

	if(list_empty(&(disk->info.entry)))
		return FALSE;

	list = malloc(sizeof(struct disk_list));
	if(!list)
		return FALSE;

	/*
	 * add disk to disk_list
	 */
	list->disk = disk;
	list_add(&list->entry, &disk_list->entry);

	/*
	 * register block device using partition information
	 */
	for(i = 0, part_pos = (&(disk->info.entry))->next; part_pos != &(disk->info.entry); i++, part_pos = part_pos->next)
	{
		part = list_entry(part_pos, struct partition, entry);

		dev = malloc(sizeof(struct blkdev));
		dblk = malloc(sizeof(struct disk_block));
		if(!dev || !dblk)
		{
			/*
			 * please do not free 'list'.
			 */
			free(dev);
			free(dblk);
			unregister_disk(disk);

			return FALSE;
		}

		if(i == 0)
			snprintf((char *)dblk->name, sizeof(dblk->name), (const char *)"%s", disk->name);
		else
			snprintf((char *)dblk->name, sizeof(dblk->name), (const char *)"%sp%ld", disk->name, i);

		part->dev = dev;
		dblk->part = part;
		dblk->offset = part->sector_from;
		dblk->busy = FALSE;
		dblk->disk = disk;

		dev->name	= dblk->name;
		dev->type	= type;
		dev->blksz	= part->sector_size;
		dev->blkcnt	= part->sector_to - part->sector_from + 1;
		dev->open 	= disk_block_open;
		dev->read 	= disk_block_read;
		dev->write	= disk_block_write;
		dev->ioctl 	= disk_block_ioctl;
		dev->close	= disk_block_close;
		dev->driver = dblk;

		if(!register_blkdev(dev))
		{
			/*
			 * please do not free 'list'.
			 */
			free(dev);
			free(dblk);
			unregister_disk(disk);

			return FALSE;
		}
	}

	return TRUE;
}