实例:vmem_disk驱动-->vmem_disk驱动模块的加载与卸载(2)

支持"制造请求",“请求队列”,

static void setup_device(struct vmem_disk_dev *dev,int which)
{
	memset(dev,0,sizeof(struct vmem_disk_dev));
	dev->size = NSECTORS*HARDSECT_SIZE;
	dev->data = vmalloc(dev->size);
	if(dev->data = NULL)
	{
		printk(KERN_NOTICE"vmalloc failure.\n");
		return;
	}
	spin_lock_init(&dev->lock);
	swicth(request_mode)
	{
		case VMEMD_NOQUEUE:
			dev->queue = blk_alloc_queue(GFP_KERNEL);
			if(dev->queue ==NULL)
			{
				goto out_vfree;
			}
			blk_queue_make_request(dev->queue,vmem_disk_make_rquest);
			break;
		default:
		printk(KERN_NOTICE"Bad request mode %d,using simple\n",request_mode);
		case VMEMD_QUEUE:
		dev->queue = blk_init_queue(vmeme_disk_request,&dev->lock);
		if(dev->queue == NULL)
		{
			goto out_vfree;
		}
		break;
	}
	blk_queue_logical_block_size(dev->queue,HARDSECT_SIZE);
	dev->queue->queuedata = dev;
	dev->gd = alloc_disk(VMEM_DISK_MINORS);
	if(!dev->gd)
	{
		printk(KERNEL_NOTICE"alloc_disk failure\n");
		goto out_vfree;
	}
	dev->gd->major = vmem_disk_major;
	dev->gd->first_minor = which * VMEM_DISK_MINORS;
	dev->gd->fops = &vmem_disk_ops;
	dev->gd->queue = dev->queue;
	dev->gd_private_data = dev;
	snprintf(dev->gd->disk_name,32,"vmem_disk%c,which + "a");
	set_capacuty(dev->gd,NSECTORS*(HARDSECT_SIZE/KERNEL_SECTOR_SIZE));
	add_disk(dev->gd);
	return;
out_vfree:
	if(dev->data)
	{
		vfree(dev->data);
	}
}

static int __init vmem_disk_init(void)
{
	int i;
	vmem_disk_major = register_blkdev(vmem_disk_major,"vmem_disk");//块设备注册函数
	if(vmem_disk_major <= 0)
	{
		printk(KERN_WARNING"vmem_disk:unable to get major number\n");
		return -EBUSY;
	}
	devices = kmalloc(NDEVICES *sizeof(struct vmem_disk_dev),GFP_KERNEL);
	if(!devices)
	{
		goto out_unregister;
	}
	for(i = 0; i< NDEVICES; i++)
	{
		setup_device(devices + i, i);
	}
	return 0;
out_unregister:	
	unregister_blkdev(vmem_disk_major,"sbd");
	return -ENOMEM;
}
module_init(vmem_disk_init);

我们实际上支持两种I/O请求模式,一种是make_rqueust,另一种是request_queuemake_request的版本直接使用vmem_disk_make_request()来处理bio,而request_queue的版本则使用vmem_disk_request来处理请求队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<( ̄︶ ̄)Okay.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值