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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? bp.c

?? 塊級的連續(xù)數(shù)據(jù)保護(hù)系統(tǒng)
?? C
?? 第 1 頁 / 共 2 頁
字號:
{
	unsigned int va1=0;
	struct metadata *metadata1=NULL;

	va1 =((((bio->bi_io_vec[0].bv_page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET);
	
	metadata1 = kmalloc(sizeof(struct metadata),GFP_ATOMIC);
	if(metadata1)
		memset(metadata1,0,sizeof(struct metadata));
	else
	{
		printk(KERN_ALERT "metadata1: Memory Allocation Problem\n");
		return -ENOMEM;
	}
	
	memcpy((unsigned int*)metadata1,(unsigned int*)va1,sizeof(struct metadata));
	if(chk_time(metadata1))
		construct_mapping_table(metadata1);
	
	kfree(metadata1);
        mempool_free(bio->bi_io_vec[0].bv_page,pool_page);

	tcount--;
	if(tcount==0)
	{	
		display_mapping_table();
		tasklet_enable(&ts1);
	}
	return 0;		
}

/* cdp_end_bio_io is called when we have finished servicing * a mirrored operation and are ready to return a  * success/failure code to the buffer cache layer.
 */ 
static int cdp_end_bio_io (struct cdp_bio *cdp_bio1)
{
	struct bio *bio = cdp_bio1->master_bio;
	
	bio_endio(bio, bio->bi_size, test_bit(0 , &cdp_bio1->state) ? 0 : -EIO);
	mempool_free(bio->bi_io_vec[0].bv_page,pool_page);
   	if(bio->bi_rw==WRITE)
	   mempool_free(gpage,pool_page);
        mempool_free(cdp_bio1,cdp_bio_pool);
	return 0;
}

static int cdp_end_read_request(struct bio *bio,unsigned int bytes_done,int err)
{
	int uptodate = test_bit(BIO_UPTODATE , &bio->bi_flags);
	struct cdp_bio *cdp_bio1 = (struct cdp_bio1*)(bio->bi_private);
	if(bio->bi_size)
		return 1;

	if(!uptodate)
	printk(KERN_ALERT "Uptodate ! failed\n");
	else
	{
		set_bit(0,&cdp_bio1->state);
		cdp_end_bio_io(cdp_bio1);
	}
	return 0;							
}

static int cdp_end_write_request(struct bio *bio,unsigned int bd,int err)
{
        int uptodate = test_bit(BIO_UPTODATE , &bio->bi_flags);
        struct cdp_bio *cdp_bio1 = (struct cdp_bio1*)(bio->bi_private);
        if(bio->bi_size)
                return 1;

        if(!uptodate)
        printk(KERN_ALERT "Uptodate ! failed\n");
        else
        set_bit(0,&cdp_bio1->state);
        
	if(atomic_dec_and_test(&cdp_bio1->remaining))
	cdp_end_bio_io(cdp_bio1);
        return 0;
}

/* set_time() is called to obtain the current system time * in hrs: mins : sec. This time is used to timestamp the  * data blocks as soon as the I/O request arrives in  * make_request() function.
 */ 
int set_time(void )
{
	sec = CMOS_READ(RTC_SECONDS);
	min = CMOS_READ(RTC_MINUTES);
	hrs = CMOS_READ(RTC_HOURS);
	BCD_TO_BIN(sec);
	BCD_TO_BIN(min);
	BCD_TO_BIN(hrs);
	return 0;
}

/* store_metadata is called to store the metadata on the * CDP Repository. The metadata is stored serially on the * CDP Repository.
 */
struct bio * store_metadata(struct bio *bio1 , unsigned int cdp_rep_sector)
{
	struct metadata *metadata1=NULL; 
	unsigned int va1=0;
       
	metadata1 = kmalloc(sizeof(struct metadata),GFP_ATOMIC);
	if(metadata1)
	memset(metadata1,0,sizeof(struct metadata));
	else
	{
		printk(KERN_ALERT "metadata1: Memory Allocation Problem\n");
		goto out1;
	}
	
	memset(metadata1,0,sizeof(struct metadata));
        metadata1->hrs         = hrs;
        metadata1->min         = min;
        metadata1->sec         = sec;
        metadata1->bisize      = bio1->bi_size;
	metadata1->cdp_sector  = cdp_rep_sector;
	metadata1->host_sector = bio1->bi_sector;
	printk (KERN_ALERT "\nTimestamp                  = %d:%d:%d  ",metadata1->hrs,metadata1->min,metadata1->sec);
	printk (KERN_ALERT "\nHost Disk Sector           = %lu  ",(unsigned long)metadata1->host_sector);
	printk (KERN_ALERT "\nCDP Repository Disk Sector = %lu\n",(unsigned long)metadata1->cdp_sector);
	gpage = mempool_alloc(pool_page,GFP_NOIO);
	if(!gpage)
       	{
		printk(KERN_ALERT "Couldnt fill HighMem\n");
		goto out1;
       	}
	bio1->bi_io_vec[0].bv_page   = gpage;
        bio1->bi_io_vec[0].bv_len    = 512;
	bio1->bi_io_vec[0].bv_offset = 0 ;
	va1 = (unsigned int)kmap(bio1->bi_io_vec[0].bv_page);
	memcpy((unsigned int*)va1,(unsigned int*)metadata1,sizeof(struct metadata));
	kunmap(bio1->bi_io_vec[0].bv_page);
	bio1->bi_sector	= taddr;
	bio1->bi_size   = 512;
	taddr           = taddr + 1;
       	kfree(metadata1);
out1:	
	return bio1;
}

/* make_request() is used to redirect the IO request to * both Host Disk and CDP Repository Disk
 */
static int make_request(request_queue_t *q, struct bio * bio)
{
        struct cdp_bio *cdp_bio1=NULL;
        unsigned int cdp_rep_sector=0; 
        int i=0;
   		/* Here the IO request is timestamped         */
	set_time(); 
	
        cdp_bio1  =  mempool_alloc(cdp_bio_pool,GFP_NOIO);
	if(!cdp_bio1)
       	{
		printk(KERN_ALERT "Couldnt fill HighMem\n");
		return -ENOMEM;
       	}
        cdp_bio1->master_bio   =  bio;
        cdp_bio1->state        =  0;	
	
	// Read operation
        if(bio_data_dir(bio)==READ)
        {
		struct bio *read_bio =  NULL;
	  	printk(KERN_ALERT "Read Request\n");
		read_bio             =  bio_clone(bio,GFP_NOIO);
          	cdp_bio1->bios[0]    =  read_bio;
	  	cdp_bio1->bios[1]    =  NULL;
	  	cdp_bio1->bios[2]    =  NULL;
	  	read_bio->bi_bdev    =  (struct block_device*)dev[0];
	  	read_bio->bi_end_io  =  cdp_end_read_request;
	  	read_bio->bi_rw      =  READ;
	  	read_bio->bi_private =  cdp_bio1;
          	generic_make_request(read_bio);
	  	return 0;
       }
       
       /* Write operation.        * Here the IO request is sent to both Host Disk and         * CDP Repository. The timestamp information is also        * stored on the CDP Repository.        */  
       atomic_set(&cdp_bio1->remaining , 1);
       for(i=0 ; i<3 ;i++)
       {
	  /* i=0 : writing block to Host Disk 
	   * i=1 : writing block to CDP Repository Disk
	   * i=2 : writing metadata/timestamped structure on separate Disk
	   */
	   struct bio *mbio=NULL;
    	   mbio              = bio_clone(bio,GFP_NOIO);
   	   mbio->bi_bdev     = (struct block_device *)dev[i];
	   mbio->bi_end_io   = cdp_end_write_request;
	   mbio->bi_rw       = WRITE;
  	   mbio->bi_private  = cdp_bio1;
           if(i==1)
	   {
	        mbio->bi_sector = maddr;
                cdp_rep_sector  = maddr;      
                maddr = maddr + bio_sectors(mbio);
	   }
	   if(i==2)
	   {
		mbio = store_metadata(mbio,cdp_rep_sector);
	   }	
	   atomic_inc(&cdp_bio1->remaining);
	   cdp_bio1->bios[i] = mbio;
	   generic_make_request(mbio);
       }  
       
       if(atomic_dec_and_test(&cdp_bio1->remaining))
       	   cdp_end_bio_io(cdp_bio1);
 		     
       return 0;
}

/* recovery() is called at time of recovery phase to retrieve * the metadata structures stored on the CDP Repository
 */
static ssize_t recovery(struct file *file,const char __user * buffer, size_t length, loff_t * offset)
{

	int i=0;
	char *msg_ptr=NULL;
	struct page *page=NULL; 
	struct bio  *rbio;
	struct Time msg;
	R_hrs=R_min=R_sec=0;

	msg_ptr=(char *)(&msg);
        for (i = 0; i < length; i++)
    	    get_user(*(msg_ptr+i), buffer + i);
    
	R_hrs=msg.hrs;
	R_min=msg.min;
	R_sec=msg.sec;

	/* disables the given tasklet	 */
	tasklet_disable(&ts1);
	
	/* schedule the tasklet for execution	 */
	tasklet_schedule(&ts1);

	tcount = taddr;
		/* The list heads of the metadata list and bio          * (most recent blocks)list are initialized         */	
	INIT_LIST_HEAD(&mt_home);
	INIT_LIST_HEAD(&mr_bio_home);
	
	for (i=0;i<taddr;i++)
	{
		page = (struct page *)mempool_alloc(pool_page,GFP_NOIO);
	        if(!page)
       		{
			printk(KERN_ALERT "Couldnt fill HighMem\n");
			return -ENOMEM;
       		}
		rbio=NULL;
		rbio=bio_alloc(GFP_NOIO,1); 
	     	rbio->bi_sector = i;
		rbio->bi_bdev   = (struct block_device *)dev[2];
		rbio->bi_io_vec[0].bv_page   = page ;
	     	rbio->bi_io_vec[0].bv_len    = 512 ;
		rbio->bi_io_vec[0].bv_offset = 0 ;
     		rbio->bi_rw	 =  READ ;
		rbio->bi_vcnt    =  1 ;
	     	rbio->bi_idx     =  0 ;
		rbio->bi_size    =  512;
	     	rbio->bi_end_io  =  recovery_end_io;
		rbio->bi_private =  NULL;
		bio_get(rbio);
		generic_make_request(rbio);
		bio_put(rbio);
	}
	return 0;
}

static int blk_open(struct inode *inode, struct file *filp)
{
        struct blk_device *dev = inode->i_bdev->bd_disk->private_data;
        filp->private_data = dev;
        spin_lock(&dev->lock);
        dev->users++;
        spin_unlock(&dev->lock);
        return 0;
}

static int blk_release(struct inode *inode, struct file *filp)
{
        struct blk_device *dev = inode->i_bdev->bd_disk->private_data;
        spin_lock(&dev->lock);
        dev->users--;
        spin_unlock(&dev->lock);
        return 0;
}

int blk_ioctl (struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg)
{
	struct block_device *bdev = inode->i_bdev;
     
	if(cmd==GET_TIME)
	{
        	if(ts_free_flag==1)
        	{
        	       	if (!capable(CAP_SYS_ADMIN))
        	       	{
        	               	printk(KERN_ALERT"\nCapability failure");
        	               	return -EACCES;
        	       	}			/* fsync_bdev is used to flush the buffer cache        	         * contents on the disk. This ensures consistency        	         * at the time of recovery. Only the pending IO        	         * requests in buffer cache which were directed         	         * at the virtual "block_dev" device are sync ed         	         */
        	       	lock_kernel();
        	       	fsync_bdev(bdev);
        	       	invalidate_bdev(bdev, 0);
        	       	unlock_kernel();
        	}
        	ts_free_flag=1;
		recovery(filp,(char *)arg,sizeof(struct Time),0 );
		return 0;	
	}
       	return -ENOTTY;  
}

/* set of device operation */
static struct block_device_operations blk_ops = {
    .owner       = THIS_MODULE,
    .open        = blk_open,
    .release     = blk_release,
    .ioctl       = blk_ioctl
};
/* init_module is called at the time of module insertion */
int init_module( void )
{
	int min_nr=0;
	int megabytes = nr_free_pages() >> (20 - PAGE_SHIFT); 
    
	maddr  = START_METADATA;     
	taddr  = START_METADATA;     
	atomic_set(&free_resources,0); 
	ts_free_flag=0;
	min_nr = megabytes * 2;
	t_count=0;
    
	if (min_nr > 256)
	min_nr = 256;   
    
	/* creates and allocates a guaranteed size,          * preallocated memory pool for bio and page.
         */ 
	pool_page = mempool_create(200,(mempool_alloc_t *)cdp_page_alloc,	(mempool_free_t *)cdp_page_free,NULL); 
	if(!pool_page)
	{
		printk(KERN_ALERT " Mempool creation failed\n");
		goto out4;	
	}
    
	cdp_bio_pool = mempool_create(50,(mempool_alloc_t *)cdp_bio_pool_alloc,(mempool_free_t *)cdp_bio_pool_free,NULL);
	if(!cdp_bio_pool)
	{
		printk(KERN_ALERT " Mempool creation failed\n");
		goto out2;	
	}
    
	/* open_by_devnum function is used to open block device         * by device number         */
	dev[0] = (dev_t)open_by_devnum (MKDEV(HOST_DISK_MAJOR_NUM,HOST_DISK_MINOR_NUM),  FMODE_READ|FMODE_WRITE);
		dev[1] = (dev_t)open_by_devnum (MKDEV(CDP_REPOSITORY_MAJOR_NUM,CDP_REPOSITORY_MINOR_NUM), FMODE_READ|FMODE_WRITE);
		dev[2] = (dev_t)open_by_devnum (MKDEV(CDP_METADATA_MAJOR_NUM,CDP_METADATA_MINOR_NUM), FMODE_READ|FMODE_WRITE);
   
	Device.size = nsectors*hardsect_size;
	spin_lock_init(&Device.lock);
		Queue = blk_alloc_queue(GFP_KERNEL);
	if (Queue == NULL)
	goto out;
		printk(KERN_ALERT "Starting Initialization ....\n ");
	blk_queue_make_request (Queue, make_request);
	blk_queue_hardsect_size(Queue, hardsect_size);
    
	/* register_blkdev function is used to register         * block device "block_dev"	 */
	major_num = register_blkdev(major_num, "block_dev");
	if (major_num <= 0)
	{
		printk(KERN_WARNING "block_dev: unable to get major number\n");
		goto out;
	}
    
	/* alloc_disk function is used to allocate,initialise         * and install gendisk structure         */	Device.gd = alloc_disk(4);
	if (! Device.gd)
	{
	      printk(KERN_ALERT "alloc_disk failure\n");
	      goto out_unregister;
	}
	Device.gd->major        = major_num;
	Device.gd->first_minor  = 0;
	Device.gd->fops         = &blk_ops;
	Device.gd->private_data = &Device;
		strcpy (Device.gd->disk_name, "block_dev0");
	set_capacity(Device.gd,nsectors*(hardsect_size/KERNEL_SECTOR_SIZE));
	Device.gd->queue = Queue;
		add_disk(Device.gd);
	printk(KERN_ALERT "Intialization complete\n");
	return 0;

out_unregister:
	/* unregister_blkdev function is used to unregister         * block device "block_dev"         */  
	unregister_blkdev(major_num, "block_dev");
    
out4:
	mempool_destroy(pool_page);
	goto out;
out2:
	mempool_destroy(cdp_bio_pool);
out:
	return -ENOMEM;
}
/* cleanup_module function is called when the module is removed */
void cleanup_module(void)
{
	/* tasklet_kill() ensures that the tasklet is not         * scheduled to run again 	         */
	tasklet_kill(&ts1);
	tasklet_kill(&ts2);	
    
	/* del_gendisk() cleans up any partitioning information	*/
	del_gendisk(Device.gd);
    
	/* put_disk() releases the reference to the gendisk         * structure so that it can be freed  	 */ 
	put_disk(Device.gd);
        	/* mempool_destroy is used to destroy the memory pools         * allocated previously         */
	mempool_destroy(pool_page);
	mempool_destroy(cdp_bio_pool);
    
	/* unregister_blkdev is used to unregister block device         * virtual "block_dev" device         */
	unregister_blkdev(major_num, "block_dev");
    
	/* blk_cleanup_queue is used to return request queue         * to system , after this driver sees no more requests 
         * from the given queue         */ 
	blk_cleanup_queue(Queue);
	printk(KERN_ALERT "Exit\n");
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品v日韩精品| 国产午夜亚洲精品不卡| 亚洲午夜私人影院| 在线欧美一区二区| 一个色妞综合视频在线观看| 色婷婷精品久久二区二区蜜臀av | 成人一区在线看| 欧美国产成人精品| 91浏览器打开| 日本亚洲欧美天堂免费| 日韩精品一区二区三区swag| 久久精品国产一区二区三区免费看| 欧美成人精品1314www| 国产麻豆日韩欧美久久| 亚洲欧洲日产国产综合网| 日本高清不卡aⅴ免费网站| 污片在线观看一区二区| 久久综合久久久久88| 99在线热播精品免费| 婷婷丁香激情综合| 中文字幕乱码日本亚洲一区二区| 成人教育av在线| 亚洲国产毛片aaaaa无费看| 精品国产伦一区二区三区免费| 国产精品综合二区| 亚洲你懂的在线视频| 欧美一区二区三区播放老司机| 国内欧美视频一区二区| 中文字幕亚洲精品在线观看| 亚洲国产岛国毛片在线| 色婷婷久久综合| 蜜桃久久久久久| 国产精品福利电影一区二区三区四区| 在线区一区二视频| 国产一区二区在线免费观看| 亚洲免费资源在线播放| 精品1区2区在线观看| 日本精品视频一区二区| 国产精品一区久久久久| 一二三四区精品视频| 26uuu国产日韩综合| 91黄色免费看| 成人晚上爱看视频| 蜜臀av在线播放一区二区三区| 中文字幕一区在线观看视频| 91精品国产欧美一区二区| 99国产精品国产精品毛片| 蜜桃传媒麻豆第一区在线观看| 亚洲天堂精品视频| 精品久久久久99| 精品视频在线免费观看| 99精品热视频| 高清不卡一二三区| 免费一区二区视频| 一区二区在线观看免费视频播放| 2014亚洲片线观看视频免费| 欧美精品777| 欧美在线free| www.亚洲精品| 国产精品自拍毛片| 美女网站视频久久| 三级成人在线视频| 亚洲午夜一区二区三区| 一区二区三区中文在线| 亚洲欧洲精品一区二区精品久久久| www久久精品| 欧美变态凌虐bdsm| 日韩一级在线观看| 91麻豆精品国产| 欧美精品久久一区二区三区| 欧洲在线/亚洲| 欧美午夜一区二区| 欧美无砖专区一中文字| 91视频xxxx| 一本大道久久精品懂色aⅴ| 成人激情免费网站| 成人深夜在线观看| jlzzjlzz亚洲女人18| 成人综合婷婷国产精品久久| 国产成人午夜片在线观看高清观看| 黑人巨大精品欧美一区| 蜜臂av日日欢夜夜爽一区| 日韩av电影天堂| 久久se精品一区精品二区| 奇米四色…亚洲| 久久精品国产精品亚洲综合| 久久精品国产精品亚洲综合| 狠狠久久亚洲欧美| 国产精品一区二区你懂的| 国产一区二区看久久| 国产高清不卡一区| 972aa.com艺术欧美| 日本丶国产丶欧美色综合| 欧美三级韩国三级日本一级| 欧美久久久久免费| 精品美女在线播放| 国产日韩欧美一区二区三区乱码 | 蜜臀av在线播放一区二区三区| 视频一区中文字幕| 久久99精品国产| 国产成人激情av| 97精品久久久久中文字幕| 欧美日韩综合不卡| 精品国产乱码久久久久久久久 | 国产成人自拍网| 成人不卡免费av| 欧美亚洲综合网| 精品99一区二区三区| 亚洲天堂2016| 日本欧美肥老太交大片| 国产精品77777| 91国内精品野花午夜精品| 91麻豆精品国产91久久久| 国产日韩精品一区二区三区| 亚洲免费在线播放| 麻豆国产欧美日韩综合精品二区 | 亚洲欧洲精品一区二区精品久久久 | 国产蜜臀av在线一区二区三区| 国产精品视频观看| 偷窥国产亚洲免费视频| 国产精品18久久久久久久久久久久| 色综合网站在线| 日韩美女在线视频| 一区二区三区日韩精品视频| 久久精工是国产品牌吗| 色婷婷国产精品综合在线观看| 欧美一区二区精品| 亚洲乱码国产乱码精品精的特点| 青青草精品视频| 色综合久久久久久久久| 精品国产乱码久久久久久免费| 一区二区三区在线视频播放| 国内精品伊人久久久久av一坑| 欧美亚日韩国产aⅴ精品中极品| 久久精品视频在线看| 亚洲gay无套男同| 99久久精品国产一区二区三区| 欧美电视剧在线看免费| 亚洲一区二区在线视频| av在线不卡观看免费观看| 日韩视频中午一区| 成人一区二区三区视频在线观看 | 午夜精品久久久久久久99水蜜桃 | 欧美亚洲国产一卡| 中文字幕av一区二区三区免费看 | 蜜臀久久99精品久久久久宅男| 国产乱一区二区| 亚洲第一会所有码转帖| 欧美亚日韩国产aⅴ精品中极品| 亚洲一级片在线观看| 欧美高清精品3d| 免费高清不卡av| www久久精品| 不卡视频免费播放| 一区二区免费看| 91精品国产丝袜白色高跟鞋| 麻豆专区一区二区三区四区五区| 欧美xxxxxxxxx| k8久久久一区二区三区| 一区二区三区精品久久久| 欧美在线影院一区二区| 天堂va蜜桃一区二区三区 | 欧美日韩的一区二区| 青青草国产精品亚洲专区无| 久久一区二区视频| 91视频一区二区三区| 日韩激情在线观看| 久久蜜桃av一区二区天堂| 91在线免费看| 日本aⅴ亚洲精品中文乱码| 久久久久99精品一区| 91麻豆免费观看| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产欧美精品区一区二区三区| 91视频国产资源| 精品在线一区二区| 亚洲黄色小说网站| 精品少妇一区二区三区在线视频| eeuss鲁片一区二区三区在线看| 午夜精品久久久| 中文字幕不卡的av| 91精品国产麻豆国产自产在线| 成人午夜看片网址| 日韩精品欧美成人高清一区二区| 久久久蜜桃精品| 欧美猛男gaygay网站| 丁香一区二区三区| 日韩国产欧美三级| 国产精品久99| 欧美大片在线观看一区二区| www.亚洲精品| 麻豆一区二区三区| 亚洲裸体在线观看| 2023国产精品自拍| 欧美日韩的一区二区| 99久久精品免费| 国产精品一区二区在线播放| 亚洲国产美国国产综合一区二区| 欧美高清在线一区| 欧美成人乱码一区二区三区|