亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? block-io.c

?? Ubuntu公司提供免費的iSCSI Target
?? C
字號:
/* * Target device block I/O. * * Based on file I/O driver from FUJITA Tomonori * (C) 2004 - 2005 FUJITA Tomonori <tomof@acm.org> * (C) 2006 Andre Brinkmann <brinkman at hni dot upb dot de> * (C) 2007 Ross Walker <rswwalker at hotmail dot com> * (C) 2007 Ming Zhang <blackmagic02881 at gmail dot com> * This code is licenced under the GPL. */#include <linux/parser.h>#include <linux/blkdev.h>#include <linux/buffer_head.h>#include "iscsi.h"#include "iscsi_dbg.h"#include "iotype.h"struct blockio_data {	char *path;	struct block_device *bdev;};struct tio_work {	atomic_t error;	atomic_t bios_remaining;	struct completion tio_complete;};static void blockio_bio_endio(struct bio *bio, int error){	struct tio_work *tio_work = bio->bi_private;	error = test_bit(BIO_UPTODATE, &bio->bi_flags) ? error : -EIO;	if (error)		atomic_set(&tio_work->error, error);	/* If last bio signal completion */	if (atomic_dec_and_test(&tio_work->bios_remaining))		complete(&tio_work->tio_complete);	bio_put(bio);}/* * Blockio_make_request(): The function translates an iscsi-request into * a number of requests to the corresponding block device. */static intblockio_make_request(struct iet_volume *volume, struct tio *tio, int rw){	struct blockio_data *bio_data = volume->private;	struct request_queue *bdev_q = bdev_get_queue(bio_data->bdev);	struct tio_work *tio_work;	struct bio *tio_bio = NULL, *bio = NULL, *biotail = NULL;	u32 offset = tio->offset;	u32 size = tio->size;	u32 tio_index = 0;	int max_pages = 1;	int err = 0;	loff_t ppos = ((loff_t) tio->idx << PAGE_SHIFT) + offset;	/* Calculate max_pages for bio_alloc (memory saver) */	if (bdev_q)		max_pages = bio_get_nr_vecs(bio_data->bdev);	tio_work = kzalloc(sizeof (*tio_work), GFP_KERNEL);	if (!tio_work)		return -ENOMEM;	atomic_set(&tio_work->error, 0);	atomic_set(&tio_work->bios_remaining, 0);	init_completion(&tio_work->tio_complete);	/* Main processing loop, allocate and fill all bios */	while (tio_index < tio->pg_cnt) {		bio = bio_alloc(GFP_KERNEL, min(max_pages, BIO_MAX_PAGES));		if (!bio) {			err = -ENOMEM;			goto out;		}		bio->bi_sector = ppos >> volume->blk_shift;		bio->bi_bdev = bio_data->bdev;		bio->bi_end_io = blockio_bio_endio;		bio->bi_private = tio_work;		if (tio_bio)			biotail = biotail->bi_next = bio;		else			tio_bio = biotail = bio;		atomic_inc(&tio_work->bios_remaining);		/* Loop for filling bio */		while (tio_index < tio->pg_cnt) {			unsigned int bytes = PAGE_SIZE - offset;			if (bytes > size)				bytes = size;			if (!bio_add_page(bio, tio->pvec[tio_index], bytes, offset))				break;			size -= bytes;			ppos += bytes;			offset = 0;			tio_index++;		}	}	/* Walk the list, submitting bios 1 by 1 */	while (tio_bio) {		bio = tio_bio;		tio_bio = tio_bio->bi_next;		bio->bi_next = NULL;		submit_bio(rw, bio);	}	if (bdev_q && bdev_q->unplug_fn)		bdev_q->unplug_fn(bdev_q);	wait_for_completion(&tio_work->tio_complete);	err = atomic_read(&tio_work->error);	kfree(tio_work);	return err;out:	while (tio_bio) {		bio = tio_bio;		tio_bio = tio_bio->bi_next;		bio_put(bio);	}	kfree(tio_work);	return err;}static intblockio_open_path(struct iet_volume *volume, const char *path){	struct blockio_data *bio_data = volume->private;	struct block_device *bdev;	int flags = LUReadonly(volume) ? MS_RDONLY : 0;	int err = 0;	bio_data->path = kstrdup(path, GFP_KERNEL);	if (!bio_data->path)		return -ENOMEM;	bdev = open_bdev_excl(path, flags, THIS_MODULE);	if (IS_ERR(bdev)) {		err = PTR_ERR(bdev);		eprintk("Can't open device %s, error %d\n", path, err);		bio_data->bdev = NULL;	} else {		bio_data->bdev = bdev;		fsync_bdev(bio_data->bdev);	}	return err;}static intset_scsiid(struct iet_volume *volume, const char *id){	size_t len;	if ((len = strlen(id)) > SCSI_ID_LEN - VENDOR_ID_LEN) {		eprintk("SCSI ID too long, %zd provided, %u max\n", len,			SCSI_ID_LEN - VENDOR_ID_LEN);		return -EINVAL;	}	memcpy(volume->scsi_id + VENDOR_ID_LEN, id, len);	return 0;}static voidgen_scsiid(struct iet_volume *volume, struct inode *inode){	int i;	u32 *p;	strlcpy(volume->scsi_id, VENDOR_ID, VENDOR_ID_LEN);	for (i = VENDOR_ID_LEN; i < SCSI_ID_LEN; i++)		if (volume->scsi_id[i])			return;	/* If a scsi id doesn't exist generate a 16 byte one:	 * Bytes   1-4: target type	 * Bytes   5-8: target id	 * Bytes  9-12: inode number	 * Bytes 13-16: device type	 */	p = (u32 *) (volume->scsi_id + VENDOR_ID_LEN);	*(p + 0) = volume->target->trgt_param.target_type;	*(p + 1) = volume->target->tid;	*(p + 2) = volume->lun;	*(p + 3) = (unsigned int) inode->i_sb->s_dev;}static intset_scsisn(struct iet_volume *volume, const char *sn){	size_t len;	if ((len = strlen(sn)) > SCSI_SN_LEN) {		eprintk("SCSI SN too long, %zd provided, %u max\n", len,			SCSI_SN_LEN);		return -EINVAL;	}	memcpy(volume->scsi_sn, sn, len);	return 0;}/* Create an enumeration of our accepted actions */enum{	Opt_scsiid, Opt_scsisn, Opt_path, Opt_ignore, Opt_err,};/* Create a match table using our action enums and their matching options */static match_table_t tokens = {	{Opt_scsiid, "ScsiId=%s"},	{Opt_scsisn, "ScsiSN=%s"},	{Opt_path, "Path=%s"},	{Opt_ignore, "Type=%s"},	{Opt_ignore, "IOMode=%s"},	{Opt_err, NULL},};static intparse_blockio_params (struct iet_volume *volume, char *params){	int err = 0;	char *p, *q;	/* Loop through parameters separated by commas, look up our	 * parameter in match table, return enumeration and arguments	 * select case based on the returned enum and run the action */	while ((p = strsep(&params, ",")) != NULL) {		substring_t args[MAX_OPT_ARGS];		int token;		if (!*p)			continue;		token = match_token(p, tokens, args);		switch (token) {		case Opt_scsiid:			if (!(q = match_strdup(&args[0]))) {				err = -ENOMEM;				goto out;			}			err = set_scsiid(volume, q);			kfree(q);			if (err < 0)				goto out;			break;		case Opt_scsisn:			if (!(q = match_strdup(&args[0]))) {				err = -ENOMEM;				goto out;			}			err = set_scsisn(volume, q);			kfree(q);			if (err < 0)				goto out;			break;		case Opt_path:			if (!(q = match_strdup(&args[0]))) {				err = -ENOMEM;				goto out;			}			err = blockio_open_path(volume, q);			kfree(q);			if (err < 0)				goto out;			break;		case Opt_ignore:			break;		default:			eprintk("Bad option %s for Lun %u on Target %s \n",				p, volume->lun, volume->target->name);			return -EINVAL;		}	}  out:	return err;}static voidblockio_detach(struct iet_volume *volume){	struct blockio_data *bio_data = volume->private;	if (bio_data->bdev)		close_bdev_excl(bio_data->bdev);	kfree(bio_data->path);	kfree(volume->private);}static intblockio_attach (struct iet_volume *volume, char *args){	struct blockio_data *bio_data;	int err = 0;	if (volume->private) {		eprintk("Lun %u already attached on Target %s \n",			volume->lun, volume->target->name);		return -EBUSY;	}	bio_data = kzalloc(sizeof (*bio_data), GFP_KERNEL);	if (!bio_data)		return -ENOMEM;	volume->private = bio_data;	if ((err = parse_blockio_params(volume, args)) < 0) {		eprintk("Error attaching Lun %u to Target %s \n",			volume->lun, volume->target->name);		goto out;	}	/* Assign a vendor id, generate scsi id if none exists */	gen_scsiid(volume, bio_data->bdev->bd_inode);	volume->blk_shift = SECTOR_SIZE_BITS;	volume->blk_cnt = bio_data->bdev->bd_inode->i_size >> volume->blk_shift;  out:	if (err < 0)		blockio_detach(volume);	return err;}static voidblockio_show(struct iet_volume *volume, struct seq_file *seq){	struct blockio_data *bio_data = volume->private;	/* Used to display blockio volume info in /proc/net/iet/volumes */	seq_printf(seq, " path:%s\n", bio_data->path);}struct iotype blockio = {	.name = "blockio",	.attach = blockio_attach,	.make_request = blockio_make_request,	.detach = blockio_detach,	.show = blockio_show,};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩av中文在线观看| 日韩一级大片在线| 日韩三级av在线播放| 国产精品久久久久久久久免费相片| 亚洲一区av在线| 国产成都精品91一区二区三| 欧美精品久久一区| 国产精品女主播在线观看| 免费成人av资源网| 欧美午夜视频网站| 亚洲视频在线观看三级| 国产成人精品影院| 精品国产3级a| 无码av中文一区二区三区桃花岛| 91在线观看地址| 国产精品国产三级国产普通话蜜臀 | 欧美日韩精品免费| 国产精品二三区| 成a人片国产精品| 国产精品麻豆一区二区| 国产精品综合网| 久久蜜桃香蕉精品一区二区三区| 蜜桃久久久久久| 日韩一区二区三区免费观看| 香蕉久久一区二区不卡无毒影院| 91蜜桃在线免费视频| 国产丝袜欧美中文另类| 国产美女精品在线| 精品国产制服丝袜高跟| 久久电影网站中文字幕| 日韩精品一区二区三区三区免费 | 国产日韩v精品一区二区| 蜜桃一区二区三区四区| 91精品国产欧美一区二区成人| 一个色妞综合视频在线观看| 欧美午夜精品免费| 亚洲国产精品自拍| 欧美精品色综合| 蜜臀久久99精品久久久久久9| 日韩视频一区二区三区在线播放| 七七婷婷婷婷精品国产| 日韩欧美色综合| 激情五月播播久久久精品| 精品国产髙清在线看国产毛片| 美女视频第一区二区三区免费观看网站 | 日韩欧美美女一区二区三区| 六月婷婷色综合| 欧美哺乳videos| 国产99久久久国产精品潘金| 国产精品久久久久9999吃药| 91色婷婷久久久久合中文| 洋洋av久久久久久久一区| 欧美精品在线观看一区二区| 老司机免费视频一区二区| 久久久久久夜精品精品免费| 成人av片在线观看| 亚洲成a人片在线不卡一二三区| 91精品黄色片免费大全| 国产不卡免费视频| 依依成人综合视频| 91精品国产乱码| 成人手机在线视频| 亚洲香肠在线观看| 久久久www成人免费无遮挡大片| 成人av网站免费| 日日夜夜精品免费视频| 国产亚洲欧美激情| 欧美日韩成人综合天天影院| 国产东北露脸精品视频| 亚洲午夜免费视频| 久久日一线二线三线suv| aaa国产一区| 人妖欧美一区二区| 成人欧美一区二区三区| 91精品久久久久久久99蜜桃| 9i看片成人免费高清| 久久国产精品区| 亚洲狠狠丁香婷婷综合久久久| 欧美电影免费观看高清完整版| 91麻豆国产精品久久| 精品一区二区免费| 亚洲一区av在线| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美mv日韩mv亚洲| 日本丰满少妇一区二区三区| 狠狠色丁香婷婷综合久久片| 色诱亚洲精品久久久久久| 97久久精品人人爽人人爽蜜臀 | 一区二区三区加勒比av| 欧美本精品男人aⅴ天堂| 欧美在线不卡视频| 菠萝蜜视频在线观看一区| 久久99久久精品欧美| 亚洲无线码一区二区三区| 中文字幕av一区二区三区免费看 | 奇米亚洲午夜久久精品| 亚洲午夜久久久久久久久电影网| 中文字幕高清不卡| 日韩免费高清视频| 91精品国产综合久久香蕉的特点| 91丨九色丨尤物| 成人午夜电影久久影院| 狠狠狠色丁香婷婷综合激情 | 亚洲精品国产第一综合99久久 | 国产99久久精品| 久久成人精品无人区| 亚洲成人av中文| 亚洲激情网站免费观看| 日韩理论在线观看| 亚洲人一二三区| 亚洲精品日韩专区silk| 中文字幕一区免费在线观看| 中文字幕精品三区| 中文字幕欧美日本乱码一线二线| 久久久久久久精| 久久久精品国产免费观看同学| 亚洲精品一区二区三区在线观看| 日韩一区二区视频在线观看| 欧美日韩精品系列| 欧美一级电影网站| 日韩欧美色综合网站| 欧美成人a∨高清免费观看| 欧美电影免费观看完整版| 精品国产免费视频| 国产亚洲欧美日韩在线一区| 欧美激情一二三区| 中文字幕一区二区三区四区不卡 | 亚洲高清免费视频| 亚洲成人手机在线| 人人爽香蕉精品| 国产一区二区影院| av激情亚洲男人天堂| 欧美主播一区二区三区| 欧美一级欧美三级| 久久久久综合网| 1000精品久久久久久久久| 亚洲影院久久精品| 日韩精彩视频在线观看| 国产乱子伦视频一区二区三区| 成人网在线免费视频| 色av成人天堂桃色av| 91精品欧美久久久久久动漫| 久久久99精品久久| 一区二区三区欧美日韩| 日本欧美一区二区| 岛国一区二区三区| 欧美日韩精品三区| 国产亚洲视频系列| 亚洲成人av免费| 国产福利一区二区三区视频在线| 99久久国产综合精品麻豆| 欧美精品电影在线播放| 国产性色一区二区| 亚洲国产中文字幕在线视频综合| 韩国三级电影一区二区| 日本福利一区二区| 国产无一区二区| 日韩av中文字幕一区二区三区| 大白屁股一区二区视频| 欧美一级高清片| 中文字幕一区视频| 国产一区二区三区四区五区美女| 91久久精品网| 欧美经典一区二区| 美腿丝袜在线亚洲一区| 日本韩国一区二区三区视频| 精品国产精品一区二区夜夜嗨| 亚洲自拍另类综合| eeuss国产一区二区三区| 精品免费一区二区三区| 亚洲国产成人91porn| 国产福利电影一区二区三区| 91精品国产欧美日韩| 亚洲综合在线电影| 成人sese在线| 久久免费视频一区| 美女视频网站黄色亚洲| 欧美精品日韩一区| 亚洲成人久久影院| 99视频一区二区三区| 久久久www成人免费毛片麻豆 | 欧美一区二区三区四区视频| 亚洲理论在线观看| 不卡的av网站| 久久精品亚洲精品国产欧美| 蜜桃在线一区二区三区| 欧美久久一二区| 亚洲成人你懂的| 欧美在线一区二区| 亚洲精品欧美在线| 97超碰欧美中文字幕| 国产精品每日更新在线播放网址| 国产美女久久久久| 久久精品视频网| 国产成人精品免费在线| 国产欧美精品一区aⅴ影院| 国产91富婆露脸刺激对白| 久久精品无码一区二区三区| 国产电影精品久久禁18| 国产视频一区不卡|