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

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

?? wbuf.c

?? jffs2源代碼基于2。6內核
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * JFFS2 -- Journalling Flash File System, Version 2. * * Copyright (C) 2001-2003 Red Hat, Inc. * Copyright (C) 2004 Thomas Gleixner <tglx@linutronix.de> * * Created by David Woodhouse <dwmw2@redhat.com> * Modified debugged and enhanced by Thomas Gleixner <tglx@linutronix.de> * * For licensing information, see the file 'LICENCE' in this directory. * * $Id: wbuf.c,v 1.72 2004/09/11 19:22:43 gleixner Exp $ * */#include <linux/kernel.h>#include <linux/slab.h>#include <linux/mtd/mtd.h>#include <linux/crc32.h>#include <linux/mtd/nand.h>#include "nodelist.h"/* For testing write failures */#undef BREAKME#undef BREAKMEHEADER#ifdef BREAKMEstatic unsigned char *brokenbuf;#endif/* max. erase failures before we mark a block bad */#define MAX_ERASE_FAILURES 	2/* two seconds timeout for timed wbuf-flushing */#define WBUF_FLUSH_TIMEOUT	2 * HZstruct jffs2_inodirty {	uint32_t ino;	struct jffs2_inodirty *next;};static struct jffs2_inodirty inodirty_nomem;static int jffs2_wbuf_pending_for_ino(struct jffs2_sb_info *c, uint32_t ino){	struct jffs2_inodirty *this = c->wbuf_inodes;	/* If a malloc failed, consider _everything_ dirty */	if (this == &inodirty_nomem)		return 1;	/* If ino == 0, _any_ non-GC writes mean 'yes' */	if (this && !ino)		return 1;	/* Look to see if the inode in question is pending in the wbuf */	while (this) {		if (this->ino == ino)			return 1;		this = this->next;	}	return 0;}static void jffs2_clear_wbuf_ino_list(struct jffs2_sb_info *c){	struct jffs2_inodirty *this;	this = c->wbuf_inodes;	if (this != &inodirty_nomem) {		while (this) {			struct jffs2_inodirty *next = this->next;			kfree(this);			this = next;		}	}	c->wbuf_inodes = NULL;}static void jffs2_wbuf_dirties_inode(struct jffs2_sb_info *c, uint32_t ino){	struct jffs2_inodirty *new;	/* Mark the superblock dirty so that kupdated will flush... */	OFNI_BS_2SFFJ(c)->s_dirt = 1;	if (jffs2_wbuf_pending_for_ino(c, ino))		return;	new = kmalloc(sizeof(*new), GFP_KERNEL);	if (!new) {		D1(printk(KERN_DEBUG "No memory to allocate inodirty. Fallback to all considered dirty\n"));		jffs2_clear_wbuf_ino_list(c);		c->wbuf_inodes = &inodirty_nomem;		return;	}	new->ino = ino;	new->next = c->wbuf_inodes;	c->wbuf_inodes = new;	return;}static inline void jffs2_refile_wbuf_blocks(struct jffs2_sb_info *c){	struct list_head *this, *next;	static int n;	if (list_empty(&c->erasable_pending_wbuf_list))		return;	list_for_each_safe(this, next, &c->erasable_pending_wbuf_list) {		struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);		D1(printk(KERN_DEBUG "Removing eraseblock at 0x%08x from erasable_pending_wbuf_list...\n", jeb->offset));		list_del(this);		if ((jiffies + (n++)) & 127) {			/* Most of the time, we just erase it immediately. Otherwise we			   spend ages scanning it on mount, etc. */			D1(printk(KERN_DEBUG "...and adding to erase_pending_list\n"));			list_add_tail(&jeb->list, &c->erase_pending_list);			c->nr_erasing_blocks++;			jffs2_erase_pending_trigger(c);		} else {			/* Sometimes, however, we leave it elsewhere so it doesn't get			   immediately reused, and we spread the load a bit. */			D1(printk(KERN_DEBUG "...and adding to erasable_list\n"));			list_add_tail(&jeb->list, &c->erasable_list);		}	}}/* Recover from failure to write wbuf. Recover the nodes up to the * wbuf, not the one which we were starting to try to write. */static void jffs2_wbuf_recover(struct jffs2_sb_info *c){	struct jffs2_eraseblock *jeb, *new_jeb;	struct jffs2_raw_node_ref **first_raw, **raw;	size_t retlen;	int ret;	unsigned char *buf;	uint32_t start, end, ofs, len;	spin_lock(&c->erase_completion_lock);	jeb = &c->blocks[c->wbuf_ofs / c->sector_size];	D1(printk("About to refile bad block at %08x\n", jeb->offset));	D2(jffs2_dump_block_lists(c));	/* File the existing block on the bad_used_list.... */	if (c->nextblock == jeb)		c->nextblock = NULL;	else /* Not sure this should ever happen... need more coffee */		list_del(&jeb->list);	if (jeb->first_node) {		D1(printk("Refiling block at %08x to bad_used_list\n", jeb->offset));		list_add(&jeb->list, &c->bad_used_list);	} else {		BUG();		/* It has to have had some nodes or we couldn't be here */		D1(printk("Refiling block at %08x to erase_pending_list\n", jeb->offset));		list_add(&jeb->list, &c->erase_pending_list);		c->nr_erasing_blocks++;		jffs2_erase_pending_trigger(c);	}	D2(jffs2_dump_block_lists(c));	/* Adjust its size counts accordingly */	c->wasted_size += jeb->free_size;	c->free_size -= jeb->free_size;	jeb->wasted_size += jeb->free_size;	jeb->free_size = 0;	ACCT_SANITY_CHECK(c,jeb);	D1(ACCT_PARANOIA_CHECK(jeb));	/* Find the first node to be recovered, by skipping over every	   node which ends before the wbuf starts, or which is obsolete. */	first_raw = &jeb->first_node;	while (*first_raw && 	       (ref_obsolete(*first_raw) ||		(ref_offset(*first_raw)+ref_totlen(c, jeb, *first_raw)) < c->wbuf_ofs)) {		D1(printk(KERN_DEBUG "Skipping node at 0x%08x(%d)-0x%08x which is either before 0x%08x or obsolete\n",			  ref_offset(*first_raw), ref_flags(*first_raw),			  (ref_offset(*first_raw) + ref_totlen(c, jeb, *first_raw)),			  c->wbuf_ofs));		first_raw = &(*first_raw)->next_phys;	}	if (!*first_raw) {		/* All nodes were obsolete. Nothing to recover. */		D1(printk(KERN_DEBUG "No non-obsolete nodes to be recovered. Just filing block bad\n"));		spin_unlock(&c->erase_completion_lock);		return;	}	start = ref_offset(*first_raw);	end = ref_offset(*first_raw) + ref_totlen(c, jeb, *first_raw);	/* Find the last node to be recovered */	raw = first_raw;	while ((*raw)) {		if (!ref_obsolete(*raw))			end = ref_offset(*raw) + ref_totlen(c, jeb, *raw);		raw = &(*raw)->next_phys;	}	spin_unlock(&c->erase_completion_lock);	D1(printk(KERN_DEBUG "wbuf recover %08x-%08x\n", start, end));	buf = NULL;	if (start < c->wbuf_ofs) {		/* First affected node was already partially written.		 * Attempt to reread the old data into our buffer. */		buf = kmalloc(end - start, GFP_KERNEL);		if (!buf) {			printk(KERN_CRIT "Malloc failure in wbuf recovery. Data loss ensues.\n");			goto read_failed;		}		/* Do the read... */		ret = c->mtd->read_ecc(c->mtd, start, c->wbuf_ofs - start, &retlen, buf, NULL, c->oobinfo);		if (ret == -EBADMSG && retlen == c->wbuf_ofs - start) {			/* ECC recovered */			ret = 0;		}		if (ret || retlen != c->wbuf_ofs - start) {			printk(KERN_CRIT "Old data are already lost in wbuf recovery. Data loss ensues.\n");			kfree(buf);			buf = NULL;		read_failed:			first_raw = &(*first_raw)->next_phys;			/* If this was the only node to be recovered, give up */			if (!(*first_raw))				return;			/* It wasn't. Go on and try to recover nodes complete in the wbuf */			start = ref_offset(*first_raw);		} else {			/* Read succeeded. Copy the remaining data from the wbuf */			memcpy(buf + (c->wbuf_ofs - start), c->wbuf, end - c->wbuf_ofs);		}	}	/* OK... we're to rewrite (end-start) bytes of data from first_raw onwards.	   Either 'buf' contains the data, or we find it in the wbuf */	/* ... and get an allocation of space from a shiny new block instead */	ret = jffs2_reserve_space_gc(c, end-start, &ofs, &len);	if (ret) {		printk(KERN_WARNING "Failed to allocate space for wbuf recovery. Data loss ensues.\n");		if (buf)			kfree(buf);		return;	}	if (end-start >= c->wbuf_pagesize) {		/* Need to do another write immediately. This, btw,		 means that we'll be writing from 'buf' and not from		 the wbuf. Since if we're writing from the wbuf there		 won't be more than a wbuf full of data, now will		 there? :) */		uint32_t towrite = (end-start) - ((end-start)%c->wbuf_pagesize);		D1(printk(KERN_DEBUG "Write 0x%x bytes at 0x%08x in wbuf recover\n",			  towrite, ofs));	  #ifdef BREAKMEHEADER		static int breakme;		if (breakme++ == 20) {			printk(KERN_NOTICE "Faking write error at 0x%08x\n", ofs);			breakme = 0;			c->mtd->write_ecc(c->mtd, ofs, towrite, &retlen,					  brokenbuf, NULL, c->oobinfo);			ret = -EIO;		} else#endif			ret = c->mtd->write_ecc(c->mtd, ofs, towrite, &retlen,						buf, NULL, c->oobinfo);		if (ret || retlen != towrite) {			/* Argh. We tried. Really we did. */			printk(KERN_CRIT "Recovery of wbuf failed due to a second write error\n");			kfree(buf);			if (retlen) {				struct jffs2_raw_node_ref *raw2;				raw2 = jffs2_alloc_raw_node_ref();				if (!raw2)					return;				raw2->flash_offset = ofs | REF_OBSOLETE;				raw2->__totlen = ref_totlen(c, jeb, *first_raw);				raw2->next_phys = NULL;				raw2->next_in_ino = NULL;				jffs2_add_physical_node_ref(c, raw2);			}			return;		}		printk(KERN_NOTICE "Recovery of wbuf succeeded to %08x\n", ofs);		c->wbuf_len = (end - start) - towrite;		c->wbuf_ofs = ofs + towrite;		memcpy(c->wbuf, buf + towrite, c->wbuf_len);		/* Don't muck about with c->wbuf_inodes. False positives are harmless. */		kfree(buf);	} else {		/* OK, now we're left with the dregs in whichever buffer we're using */		if (buf) {			memcpy(c->wbuf, buf, end-start);			kfree(buf);		} else {			memmove(c->wbuf, c->wbuf + (start - c->wbuf_ofs), end - start);		}		c->wbuf_ofs = ofs;		c->wbuf_len = end - start;	}	/* Now sort out the jffs2_raw_node_refs, moving them from the old to the next block */	new_jeb = &c->blocks[ofs / c->sector_size];	spin_lock(&c->erase_completion_lock);	if (new_jeb->first_node) {		/* Odd, but possible with ST flash later maybe */		new_jeb->last_node->next_phys = *first_raw;	} else {		new_jeb->first_node = *first_raw;	}	raw = first_raw;	while (*raw) {		uint32_t rawlen = ref_totlen(c, jeb, *raw);		D1(printk(KERN_DEBUG "Refiling block of %08x at %08x(%d) to %08x\n",			  rawlen, ref_offset(*raw), ref_flags(*raw), ofs));		if (ref_obsolete(*raw)) {			/* Shouldn't really happen much */			new_jeb->dirty_size += rawlen;			new_jeb->free_size -= rawlen;			c->dirty_size += rawlen;		} else {			new_jeb->used_size += rawlen;			new_jeb->free_size -= rawlen;			jeb->dirty_size += rawlen;			jeb->used_size  -= rawlen;			c->dirty_size += rawlen;		}		c->free_size -= rawlen;		(*raw)->flash_offset = ofs | ref_flags(*raw);		ofs += rawlen;		new_jeb->last_node = *raw;		raw = &(*raw)->next_phys;	}	/* Fix up the original jeb now it's on the bad_list */	*first_raw = NULL;	if (first_raw == &jeb->first_node) {		jeb->last_node = NULL;		D1(printk(KERN_DEBUG "Failing block at %08x is now empty. Moving to erase_pending_list\n", jeb->offset));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产成人精品| 亚洲国产另类av| 欧美中文字幕亚洲一区二区va在线 | 中文字幕日本不卡| 日韩欧美一二三区| 欧美一区二区高清| 欧美日韩高清影院| 欧洲一区在线观看| 欧美精品一区二区三区久久久| 欧美一区二区不卡视频| 精品国产一区a| 亚洲一区二区三区四区五区中文 | 亚洲成人自拍网| 国产美女精品人人做人人爽| 91香蕉视频污在线| 欧美成人aa大片| 亚洲一区二区三区精品在线| 蜜桃视频在线观看一区| 在线观看亚洲专区| 久久精品男人天堂av| 日韩电影在线观看一区| 欧洲精品在线观看| 国产日韩欧美亚洲| 国产成人在线视频免费播放| 欧美午夜片在线看| 石原莉奈在线亚洲二区| 欧美一卡在线观看| 国产盗摄一区二区| 亚洲欧美日韩国产手机在线 | 欧美视频你懂的| 国产日韩欧美高清在线| 久久精品国产在热久久| 91精品国产综合久久久久久| 亚洲国产精品视频| 精品国产百合女同互慰| 亚洲国产精品嫩草影院| 欧美色偷偷大香| 日韩精品一区第一页| 91精品国产欧美一区二区| 天天色天天操综合| 日韩欧美不卡在线观看视频| 日韩二区三区在线观看| 欧美精品一区二区三| 成人app下载| 亚洲成a天堂v人片| 国产日本欧美一区二区| 色94色欧美sute亚洲线路一ni | 色偷偷久久一区二区三区| 午夜天堂影视香蕉久久| 精品久久久久久久一区二区蜜臀| 不卡在线视频中文字幕| 欧美日韩国产综合视频在线观看 | 亚洲日本在线a| 日本一区二区三区在线不卡| 日韩免费一区二区三区在线播放| 欧美日韩中字一区| 欧美色网站导航| 日韩精品一区二区在线观看| 欧美另类高清zo欧美| 欧美在线色视频| 91精品国产入口| 欧美精品一区二区三区在线 | 1000精品久久久久久久久| 欧美国产一区视频在线观看| 国产精品久久久久毛片软件| 国产精品午夜免费| 国产精品美女久久久久久| 国产精品美日韩| 亚洲一本大道在线| 久久97超碰国产精品超碰| 国产成人在线电影| 欧美挠脚心视频网站| 欧美日韩国产在线观看| 99国产精品视频免费观看| 国产黄色精品网站| 国产suv精品一区二区三区| 99re热这里只有精品视频| 国产在线视频一区二区| 国内精品不卡在线| 波波电影院一区二区三区| 一本在线高清不卡dvd| 在线亚洲+欧美+日本专区| 欧美亚洲愉拍一区二区| 欧美精品黑人性xxxx| 日韩一级片在线观看| 中文字幕av不卡| 亚洲国产视频直播| 国产一区二区不卡老阿姨| 成人免费毛片app| 欧美日本一区二区在线观看| 久久久亚洲综合| 亚洲啪啪综合av一区二区三区| 亚洲成人免费视| 91首页免费视频| 色噜噜狠狠色综合中国| 亚洲欧美精品午睡沙发| 亚洲3atv精品一区二区三区| hitomi一区二区三区精品| 欧美一级二级三级乱码| 一区二区三区成人| 国产999精品久久久久久绿帽| 日韩美女视频在线| 青娱乐精品视频在线| 7777精品伊人久久久大香线蕉完整版 | 91精品国产色综合久久| 精品国产3级a| 日本一区二区电影| 亚洲欧美电影院| 国产中文一区二区三区| 在线免费观看日本一区| 久久免费视频一区| 天天av天天翘天天综合网色鬼国产 | av中文字幕不卡| 精品久久人人做人人爽| 亚洲国产综合在线| 99久久久久久| 国产偷v国产偷v亚洲高清| 毛片av一区二区| 欧美一区二区黄| 亚洲成av人片观看| 精品视频在线视频| 一区二区三区成人| 在线观看日韩av先锋影音电影院| 欧美精品一区在线观看| 极品美女销魂一区二区三区| 日韩欧美电影一二三| 亚洲国产综合色| 欧美精品久久天天躁| 婷婷综合久久一区二区三区| 欧美麻豆精品久久久久久| 亚洲成a人片综合在线| 欧美日韩激情一区二区三区| 无码av免费一区二区三区试看| 欧美日韩一区二区三区不卡| 天天综合天天综合色| 88在线观看91蜜桃国自产| 日本最新不卡在线| 亚洲精品一区二区三区蜜桃下载| 国产一区二区在线影院| 国产精品久久久久婷婷| 欧美综合在线视频| 免费成人结看片| 国产精品免费aⅴ片在线观看| 日本道精品一区二区三区| 日本在线播放一区二区三区| 日韩精品中文字幕一区二区三区 | 国产三区在线成人av| 91丨porny丨蝌蚪视频| 日韩精品欧美精品| 国产精品乱人伦一区二区| 欧美二区乱c少妇| www.亚洲色图| 国产一区二区精品在线观看| 亚洲视频一二区| 久久一日本道色综合| 91视频xxxx| 成人在线视频首页| 老司机免费视频一区二区三区| 亚洲理论在线观看| 亚洲国产精品ⅴa在线观看| 欧美一卡2卡3卡4卡| 欧美性大战久久| 色屁屁一区二区| 99国产精品99久久久久久| 国产麻豆视频一区| 精品一区二区在线看| 久久福利视频一区二区| 免费的成人av| 老鸭窝一区二区久久精品| 日本不卡一二三| 日韩精品一区第一页| 视频在线观看一区二区三区| 亚洲一区二区精品视频| 一个色综合av| 污片在线观看一区二区| 亚洲v日本v欧美v久久精品| 一卡二卡欧美日韩| 夜色激情一区二区| 午夜久久久影院| 久久99久久久久| 国产麻豆91精品| 99re这里只有精品视频首页| 色综合欧美在线视频区| 欧美三级中文字| 久久久激情视频| 亚洲激情av在线| 极品少妇xxxx精品少妇| 成人动漫在线一区| 欧美二区乱c少妇| 国产视频视频一区| 亚洲国产精品久久久久婷婷884 | 欧美色综合网站| 久久综合久久鬼色中文字| 亚洲精品国产精华液| 免费成人美女在线观看.| 97久久超碰国产精品电影| 欧美日韩精品久久久| 亚洲色图视频网站| 久久不见久久见免费视频1| 色又黄又爽网站www久久|