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

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

?? dcache.c

?? elinux jffs初始版本 具體了解JFFS的文件系統!
?? C
字號:
/* *  linux/fs/dcache.c * *  (C) Copyright 1994 Linus Torvalds *//* * The directory cache is a "two-level" cache, each level doing LRU on * its entries.  Adding new entries puts them at the end of the LRU * queue on the first-level cache, while the second-level cache is * fed by any cache hits. * * The idea is that new additions (from readdir(), for example) will not * flush the cache of entries that have really been used. * * There is a global hash-table over both caches that hashes the entries * based on the directory inode number and device as well as on a * string-hash computed over the name.  */#include <linux/fs.h>#include <linux/string.h>/* * Don't bother caching long names.. They just take up space in the cache, and * for a name cache you just want to cache the "normal" names anyway which tend * to be short. */#define DCACHE_NAME_LEN	15#define DCACHE_SIZE 128struct hash_list {	struct dir_cache_entry * next;	struct dir_cache_entry * prev;};/* * The dir_cache_entry must be in this order: we do ugly things with the pointers */struct dir_cache_entry {	struct hash_list h;	kdev_t dc_dev;	unsigned long dir;	unsigned long version;	unsigned long ino;	unsigned char name_len;	char name[DCACHE_NAME_LEN];	struct dir_cache_entry ** lru_head;	struct dir_cache_entry * next_lru,  * prev_lru;};#define dcache_offset(x) ((unsigned long)&((struct dir_cache_entry*)0)->x)#define dcache_datalen (dcache_offset(lru_head) - dcache_offset(dc_dev))#define COPYDATA(de, newde) \memcpy((void *) &newde->dc_dev, (void *) &de->dc_dev, dcache_datalen)static struct dir_cache_entry level1_cache[DCACHE_SIZE];static struct dir_cache_entry level2_cache[DCACHE_SIZE];/* * The LRU-lists are doubly-linked circular lists, and do not change in size * so these pointers always have something to point to (after _init) */static struct dir_cache_entry * level1_head;static struct dir_cache_entry * level2_head;/* * The hash-queues are also doubly-linked circular lists, but the head is * itself on the doubly-linked list, not just a pointer to the first entry. */#define DCACHE_HASH_QUEUES 32#define hash_fn(dev,dir,namehash) ((HASHDEV(dev) ^ (dir) ^ (namehash)) % DCACHE_HASH_QUEUES)static struct hash_list hash_table[DCACHE_HASH_QUEUES];static inline void remove_lru(struct dir_cache_entry * de){	struct dir_cache_entry * next = de->next_lru;	struct dir_cache_entry * prev = de->prev_lru;	next->prev_lru = prev;	prev->next_lru = next;}static inline void add_lru(struct dir_cache_entry * de, struct dir_cache_entry *head){	struct dir_cache_entry * prev = head->prev_lru;	de->next_lru = head;	de->prev_lru = prev;	prev->next_lru = de;	head->prev_lru = de;}static inline void update_lru(struct dir_cache_entry * de){	if (de == *de->lru_head)		*de->lru_head = de->next_lru;	else {		remove_lru(de);		add_lru(de,*de->lru_head);	}}/* * Stupid name"hash" algorithm. Write something better if you want to, * but I doubt it matters that much */static inline unsigned long namehash(const char * name, int len){	return len +		((const unsigned char *) name)[0]+		((const unsigned char *) name)[len-1];}/* * Hash queue manipulation. Look out for the casts.. */static inline void remove_hash(struct dir_cache_entry * de){	struct dir_cache_entry * next = de->h.next;	if (next) {		struct dir_cache_entry * prev = de->h.prev;		next->h.prev = prev;		prev->h.next = next;		de->h.next = NULL;	}}static inline void add_hash(struct dir_cache_entry * de, struct hash_list * hash){	struct dir_cache_entry * next = hash->next;	de->h.next = next;	de->h.prev = (struct dir_cache_entry *) hash;	next->h.prev = de;	hash->next = de;}/* * Find a directory cache entry given all the necessary info. */static inline struct dir_cache_entry * find_entry(struct inode * dir, const char * name, int len, struct hash_list * hash){	struct dir_cache_entry * de = hash->next;	for (de = hash->next ; de != (struct dir_cache_entry *) hash ; de = de->h.next) {		if (de->dc_dev != dir->i_dev)			continue;		if (de->dir != dir->i_ino)			continue;		if (de->version != dir->i_version)			continue;		if (de->name_len != len)			continue;		if (memcmp(de->name, name, len))			continue;		return de;	}	return NULL;}/* * Move a successfully used entry to level2. If already at level2, * move it to the end of the LRU queue.. */static inline void move_to_level2(struct dir_cache_entry * old_de, struct hash_list * hash){	struct dir_cache_entry * de;	if (old_de->lru_head == &level2_head) {		update_lru(old_de);		return;	}		de = level2_head;	level2_head = de->next_lru;	remove_hash(de);	COPYDATA(old_de, de);	add_hash(de, hash);}int dcache_lookup(struct inode * dir, const char * name, int len, unsigned long * ino){	struct hash_list * hash;	struct dir_cache_entry *de;	if (len > DCACHE_NAME_LEN)		return 0;	hash = hash_table + hash_fn(dir->i_dev, dir->i_ino, namehash(name,len));	de = find_entry(dir, name, len, hash);	if (!de)		return 0;	*ino = de->ino;	move_to_level2(de, hash);	return 1;}void dcache_add(struct inode * dir, const char * name, int len, unsigned long ino){	struct hash_list * hash;	struct dir_cache_entry *de;	if (len > DCACHE_NAME_LEN)		return;	hash = hash_table + hash_fn(dir->i_dev, dir->i_ino, namehash(name,len));	if ((de = find_entry(dir, name, len, hash)) != NULL) {		de->ino = ino;		update_lru(de);		return;	}	de = level1_head;	level1_head = de->next_lru;	remove_hash(de);	de->dc_dev = dir->i_dev;	de->dir = dir->i_ino;	de->version = dir->i_version;	de->ino = ino;	de->name_len = len;	memcpy(de->name, name, len);	add_hash(de, hash);}unsigned long name_cache_init(unsigned long mem_start, unsigned long mem_end){	int i;	struct dir_cache_entry * p;	/*	 * Init level1 LRU lists..	 */	p = level1_cache;	do {		p[1].prev_lru = p;		p[0].next_lru = p+1;		p[0].lru_head = &level1_head;	} while (++p < level1_cache + DCACHE_SIZE-1);	level1_cache[0].prev_lru = p;	p[0].next_lru = &level1_cache[0];	p[0].lru_head = &level1_head;	level1_head = level1_cache;	/*	 * Init level2 LRU lists..	 */	p = level2_cache;	do {		p[1].prev_lru = p;		p[0].next_lru = p+1;		p[0].lru_head = &level2_head;	} while (++p < level2_cache + DCACHE_SIZE-1);	level2_cache[0].prev_lru = p;	p[0].next_lru = &level2_cache[0];	p[0].lru_head = &level2_head;	level2_head = level2_cache;	/*	 * Empty hash queues..	 */	for (i = 0 ; i < DCACHE_HASH_QUEUES ; i++)		hash_table[i].next = hash_table[i].next =			(struct dir_cache_entry *) &hash_table[i];	return mem_start;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产福利91精品一区二区三区| 欧美亚洲一区二区在线| 欧洲精品在线观看| 欧美片网站yy| 国产精品久线观看视频| 视频一区视频二区在线观看| 国产成人在线看| 3d动漫精品啪啪一区二区竹菊| 国产精品色眯眯| 麻豆精品一区二区三区| 欧美日韩中文字幕一区二区| 中文字幕精品综合| 精品一区二区三区在线播放| 欧美日韩亚洲综合一区| 亚洲情趣在线观看| 丰满少妇在线播放bd日韩电影| 精品久久久久久综合日本欧美| 亚洲国产精品久久人人爱| 国产成a人亚洲精品| 亚洲精品在线一区二区| 欧美bbbbb| 日韩一区二区精品在线观看| 成人爱爱电影网址| 69堂成人精品免费视频| 成人免费一区二区三区视频| 国产真实乱对白精彩久久| 欧美色综合网站| 尤物视频一区二区| 91美女片黄在线观看| 亚洲欧美自拍偷拍| 高清av一区二区| 国产欧美一区二区精品久导航 | 亚洲日本欧美天堂| 99精品国产热久久91蜜凸| 精品剧情在线观看| 国产一区二区三区四区五区美女| 欧美一区二区国产| 精品一区二区三区欧美| 精品国产电影一区二区| 国产真实乱对白精彩久久| 久久久久久久久99精品| 国产一区二区精品久久91| 久久久综合网站| 丁香婷婷综合网| 亚洲人被黑人高潮完整版| 色综合久久天天| 亚洲一二三四在线| 91精品欧美福利在线观看| 午夜视频久久久久久| 日韩欧美资源站| 国产福利精品一区二区| 亚洲精品日产精品乱码不卡| 欧美丰满嫩嫩电影| 激情文学综合网| 亚洲视频一区在线| 777久久久精品| 国产成人aaa| 一区二区国产盗摄色噜噜| 6080日韩午夜伦伦午夜伦| 日韩精品资源二区在线| 精品欧美乱码久久久久久1区2区| 老汉av免费一区二区三区| 久久免费视频色| 成人av在线网| 性做久久久久久免费观看欧美| 精品久久人人做人人爱| 99精品国产一区二区三区不卡| 日韩国产精品久久久久久亚洲| 久久久五月婷婷| 色香蕉久久蜜桃| 美国三级日本三级久久99| 亚洲人成网站在线| 久久这里只精品最新地址| 欧美色图12p| 丁香六月久久综合狠狠色| 午夜欧美大尺度福利影院在线看| 久久久久久久久久久久电影| 欧美色图免费看| 成人免费毛片高清视频| 午夜欧美电影在线观看| 亚洲视频在线一区二区| 久久综合中文字幕| 欧美网站一区二区| 97超碰欧美中文字幕| 久久av资源站| 国产91在线|亚洲| 91尤物视频在线观看| 青娱乐精品视频| 亚洲天堂免费在线观看视频| 日韩欧美色综合网站| 欧美亚洲综合色| 97成人超碰视| 国产成人av影院| 激情综合色播激情啊| 五月天激情综合网| 亚洲黄色片在线观看| 亚洲国产高清不卡| 久久―日本道色综合久久| 欧美一级一区二区| 欧美日韩免费一区二区三区| 91在线国内视频| 成人福利视频网站| 成人午夜激情片| 国产高清不卡二三区| 狠狠狠色丁香婷婷综合久久五月| 日韩高清中文字幕一区| 午夜精品福利一区二区蜜股av| 亚洲蜜桃精久久久久久久| 国产成人亚洲综合a∨婷婷| 欧美日韩一本到| 99国产精品一区| 国产盗摄一区二区| 成人小视频在线| 成人精品视频网站| 国产a久久麻豆| 高清国产一区二区| 福利视频网站一区二区三区| 成人一级黄色片| 国产成人精品免费看| 成人免费毛片app| www.欧美.com| 99综合影院在线| 色综合久久88色综合天天6 | 亚洲va欧美va人人爽| 亚洲国产精品久久人人爱蜜臀| 午夜av一区二区三区| 日韩精品福利网| 九一久久久久久| 成人动漫中文字幕| 欧美午夜片在线观看| 欧美一区二区三区视频| 日韩三级精品电影久久久| 久久久久久一二三区| 国产99久久久国产精品| 91黄色小视频| 欧美午夜电影一区| 日韩免费视频一区二区| 久久久久综合网| 18成人在线观看| 日韩精品亚洲专区| 国产精品911| 欧美日韩久久久| 久久久久99精品国产片| 亚洲蜜臀av乱码久久精品蜜桃| 午夜日韩在线观看| 国产高清无密码一区二区三区| 91视频.com| 日韩一区二区精品| 亚洲人成小说网站色在线| 日韩不卡一区二区三区| 成人激情小说乱人伦| 欧美在线播放高清精品| www国产精品av| 亚洲精品视频在线观看网站| 美女性感视频久久| 99精品视频免费在线观看| 91精品国产入口| 自拍偷拍亚洲激情| 久久国产精品露脸对白| 色哟哟精品一区| 亚洲精品一区二区三区精华液| 国产精品三级电影| 美女视频免费一区| 欧美影院午夜播放| 国产亚洲欧洲一区高清在线观看| 亚洲一区二区欧美| 国产成人免费9x9x人网站视频| 欧美日韩一卡二卡三卡| 亚洲丝袜另类动漫二区| 日韩国产在线一| 色成年激情久久综合| 亚洲一区二三区| 狠狠久久亚洲欧美| 91精品国产色综合久久不卡蜜臀| 中文字幕欧美一| 国产成人无遮挡在线视频| 欧美一区二区三区视频在线| 亚洲视频免费在线观看| 国产不卡在线视频| 欧美一个色资源| 亚洲成人精品影院| 91久久国产综合久久| 亚洲国产精品二十页| 国产做a爰片久久毛片| 8v天堂国产在线一区二区| 亚洲一区二区三区国产| 色婷婷亚洲一区二区三区| 国产精品久久久久久久久快鸭 | 欧美视频三区在线播放| 中文字幕在线一区免费| 国产精品一区二区久久精品爱涩 | 欧美性淫爽ww久久久久无| 亚洲免费av高清| 91丨九色丨尤物| 亚洲欧洲av在线| jvid福利写真一区二区三区| 国产日韩视频一区二区三区| 国产精品123| 久久久久9999亚洲精品| 国产福利一区二区|