static void iblock_bio_destructor(struct bio *bio)
{
	struct se_cmd *cmd = bio->bi_private;
	struct iblock_dev *ib_dev = cmd->se_dev->dev_ptr;

	bio_free(bio, ib_dev->ibd_bio_set);
}
예제 #2
0
파일: ext4.c 프로젝트: JansZeng/g-bios
static ssize_t __ext4_read_buff(struct super_block *sb, size_t offset, void *buff, size_t size)
{
	ssize_t ret, start_blk;
	struct bio *bio;

	start_blk = offset / SECT_SIZE;

	bio = bio_alloc();
	if (!bio)
		return -ENOMEM;

	bio->size = (offset % SECT_SIZE + size + SECT_SIZE - 1) & ~(SECT_SIZE - 1);
	bio->data = malloc(bio->size);
	if (!bio->data) {
		ret = -ENOMEM;
		goto L1;
	}

	bio->bdev = sb->s_bdev;
	bio->sect = start_blk;
	submit_bio(READ, bio);

	memcpy(buff, bio->data + offset % SECT_SIZE, size);
	ret = size;

	free(bio->data);
L1:
	bio_free(bio);
	return ret;
}
예제 #3
0
파일: dm-io.c 프로젝트: civato/9005-LL-DEV
static void dm_bio_destructor(struct bio *bio)
{
	unsigned region;
	struct io *io;

	retrieve_io_and_region_from_bio(bio, &io, &region);

	bio_free(bio, io->client->bios);
}
예제 #4
0
파일: ext4.c 프로젝트: JansZeng/g-bios
static int ext4_check_fs_type(const char *bdev_name)
{
	struct ext4_super_block *e4_sb;
	struct bio *bio;
	char buff[EXT4_SUPER_BLK_SIZE];
	struct block_device *bdev;
	uint32_t fc, frc, fi;
	int ret;

	bdev = bdev_get(bdev_name);
	if (NULL == bdev) {
		DPRINT("bdev %s not found!\n", bdev_name);
		return -ENODEV;
	}

	bio = bio_alloc();
	if (!bio)
		return -ENOMEM;

	bio->bdev = bdev;
	bio->sect = 1024 / SECT_SIZE;
	bio->size = sizeof(buff);
	bio->data = buff;
	submit_bio(READ, bio);
	// TODO: check flags here
	bio_free(bio);

	e4_sb = (struct ext4_super_block *)buff;

	if (0xEF53 != e4_sb->s_magic) {
		DPRINT("%s is not \"ext4\" fs!\n", bdev_name);
		return -EINVAL;
	}

	fc = e4_sb->s_feature_compat;
	fi = e4_sb->s_feature_incompat;
	frc = e4_sb->s_feature_ro_compat;


	ret = ck_ext4_feature(fc, frc, fi);

#ifdef CONFIG_DEBUG
	extern void ext_sb_list(struct ext4_super_block * esb);
	if (ret == 0) {
		ext_sb_list(e4_sb);
	}
#endif

	return ret;
}
예제 #5
0
파일: sub.c 프로젝트: airhigh/wdrbd
int DoSplitIo(PVOLUME_EXTENSION VolumeExtension, ULONG io, PIRP upper_pirp, struct splitInfo *splitInfo,
    long split_id, long split_total_id, long split_total_length, struct drbd_device *device, PVOID buffer, LARGE_INTEGER offset, ULONG length)
{
	NTSTATUS				status;
	struct bio				*bio;
	unsigned int			nr_pages;

	nr_pages = (length + PAGE_SIZE - 1) >> PAGE_SHIFT;
	bio = bio_alloc(GFP_NOIO, nr_pages, '75DW');
	if (!bio) 
	{
		return STATUS_INSUFFICIENT_RESOURCES;
	}

	bio->split_id = split_id;
	bio->split_total_id = split_total_id;
	bio->split_total_length = split_total_length;
	bio->splitInfo = splitInfo;
	bio->bio_databuf = buffer;
	bio->pMasterIrp = upper_pirp; 

	bio->bi_sector = offset.QuadPart >> 9; 
	bio->bi_bdev = VolumeExtension->dev;
	bio->bi_rw |= (io == IRP_MJ_WRITE) ? WRITE : READ;
	bio->bi_size = length;
	// save original Master Irp's Stack Flags
	bio->MasterIrpStackFlags = ((PIO_STACK_LOCATION)IoGetCurrentIrpStackLocation(upper_pirp))->Flags;
	
	status = drbd_make_request(device->rq_queue, bio); // drbd local I/O entry point 
	if (STATUS_SUCCESS != status)
	{
		bio_free(bio);
		status = STATUS_INSUFFICIENT_RESOURCES;
	}

	return status;
}
예제 #6
0
/*
 * default destructor for a bio allocated with bio_alloc_bioset()
 */
static void bio_fs_destructor(struct bio *bio)
{
	bio_free(bio, fs_bio_set);
}
예제 #7
0
파일: dm.c 프로젝트: 3sOx/asuswrt-merlin
static void dm_bio_destructor(struct bio *bio)
{
	struct bio_set *bs = bio->bi_private;

	bio_free(bio, bs);
}
예제 #8
0
static void _clone_destructor(struct bio *const bio)
{
	struct iostash_bio *const io = bio->bi_private;
	struct hdd_info *const hdd = io->hdd;
	bio_free(bio, hdd->bs);
}
예제 #9
0
파일: dm.c 프로젝트: ena30/snake-os
static void dm_bio_destructor(struct bio *bio)
{
	bio_free(bio, dm_set);
}
예제 #10
0
파일: ext4.c 프로젝트: JansZeng/g-bios
static int ext4_fill_super(struct super_block *sb)
{
	int ret;
	int group_count;
	unsigned int bpg; // blocks per groups
	char buff[KB(1)];
	struct ext4_sb_info *e4_sbi;
	struct ext4_super_block *e4_sb;
	struct ext4_group_desc *gdt;
	struct bio *bio;
	size_t off;

	bio = bio_alloc();
	if (!bio)
		return -ENOMEM;

	bio->bdev = sb->s_bdev;
	bio->sect = 1024 / SECT_SIZE;
	bio->size = sizeof(buff);
	bio->data = buff;
	submit_bio(READ, bio);
	// TODO: check flags here
	bio_free(bio);

	if (ext4_check_fstype(buff, sizeof(struct ext4_super_block)) == false) {
		GEN_DBG("Invalid EXT4 magic number!\n"); // ((struct ext4_super_block *)buff)->s_magic);
		ret = -EINVAL;
		goto L1;
	}

	e4_sbi = zalloc(sizeof(*e4_sbi));
	if (!e4_sbi) {
		ret = -ENOMEM;
		goto L1;
	}

#if 1 // fixme
	e4_sb = &e4_sbi->e4_sb;
	memcpy(e4_sb, buff, sizeof(*e4_sb));
#endif

	sb->s_fs_info = e4_sbi;
	sb->s_blocksize = 1024 << e4_sb->s_log_block_size;

	bpg = e4_sb->s_blocks_per_group;
	group_count = (e4_sb->s_blocks_count_lo + bpg - 1) / bpg;
	DPRINT("super block information:\n"
		"label = \"%s\", inode size = %d, block size = %d\n",
		e4_sb->s_volume_name[0] ? e4_sb->s_volume_name : "<N/A>",
		e4_sb->s_inode_size, sb->s_blocksize);

	gdt = malloc(group_count * sizeof(struct ext4_group_desc));
	if (NULL == gdt) {
		ret = -ENOMEM;
		goto L2;
	}
	e4_sbi->gdt = gdt;
	off = (e4_sb->s_first_data_block + 1) * sb->s_blocksize;

	__ext4_read_buff(sb, off, gdt, group_count * sizeof(struct ext4_group_desc));

	DPRINT("group descrition:\n"
		"block groups = %d, free blocks = %d, free inodes = %d\n",
		group_count, gdt->bg_free_blocks_count_lo, gdt->bg_free_inodes_count_lo);

	return 0;

L2:
	free(e4_sbi);
L1:
	return ret;
}