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

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

?? dcache.c

?? 內核是系統的心臟
?? C
字號:
/*
 *  linux/fs/ext2/dcache.c
 *
 *  Copyright (C) 1992, 1993, 1994  Remy Card (card@masi.ibp.fr)
 *                                  Laboratoire MASI - Institut Blaise Pascal
 *                                  Universite Pierre et Marie Curie (Paris VI)
 *
 */

/*
 * dcache.c contains the code that handles the directory cache used by
 * lookup() and readdir()
 */

#include <asm/segment.h>

#include <linux/fs.h>
#include <linux/ext2_fs.h>
#include <linux/string.h>

#ifndef DONT_USE_DCACHE

#define DCACHE_NAME_LEN	32

struct dir_cache_entry {
	unsigned short dev;
	unsigned long dir;
	unsigned long ino;
	char name[DCACHE_NAME_LEN + 1];
	int len;
	struct dir_cache_entry * queue_prev;
	struct dir_cache_entry * queue_next;
	struct dir_cache_entry * prev;
	struct dir_cache_entry * next;
};

static struct dir_cache_entry * first = NULL;
static struct dir_cache_entry * last = NULL;
static struct dir_cache_entry * first_free = NULL;
static int cache_initialized = 0;
#ifdef EXT2FS_DEBUG_CACHE
static int hits = 0;
static int misses = 0;
#endif

#define CACHE_SIZE 128

static struct dir_cache_entry dcache[CACHE_SIZE];

#define HASH_QUEUES 16

static struct dir_cache_entry * queue_head[HASH_QUEUES];
static struct dir_cache_entry * queue_tail[HASH_QUEUES];

#define hash(dev,dir)	((dev ^ dir) % HASH_QUEUES)

/*
 * Initialize the cache
 */
static void init_cache (void)
{
	int i;

	dcache[0].prev = NULL;
	dcache[0].next = &dcache[1];
	dcache[0].queue_next = dcache[0].queue_prev = NULL;
	for (i = 1; i < CACHE_SIZE - 1; i++) {
		dcache[i].prev = &dcache[i - 1];
		dcache[i].next = &dcache[i + 1];
		dcache[i].queue_next = dcache[i].queue_prev = NULL;
	}
	dcache[i].prev = &dcache[i - 1];
	dcache[i].next = NULL;
	dcache[i].queue_next = dcache[i].queue_prev = NULL;
	first_free = &dcache[0];
	for (i = 0; i < HASH_QUEUES; i++)
		queue_tail[i] = queue_head[i] = NULL;
	cache_initialized = 1;
}

/*
 * Find a name in the cache
 */
static struct dir_cache_entry * find_name (int queue, unsigned short dev,
					   unsigned long dir,
					   const char * name, int len)
{
	struct dir_cache_entry * p;

	for (p = queue_head[queue]; p != NULL && (p->dev != dev ||
	     p->dir != dir || p->len != len ||
	     strncmp (name, p->name, p->len) != 0);
	     p = p->queue_next)
		;
	return p;
}

#ifdef EXT2FS_DEBUG_CACHE
/*
 * List the cache entries for debugging
 */
static void show_cache (const char * func_name)
{
	struct dir_cache_entry * p;

	printk ("%s: cache status\n", func_name);
	for (p = first; p != NULL; p = p->next)
		printk ("dev:%04x, dir=%4lu, name=%s\n",
			p->dev, p->dir, p->name);
}
#endif

/*
 * Add an entry at the beginning of the cache
 */
static void add_to_cache (struct dir_cache_entry * p)
{
	p->prev = NULL;
	p->next = first;
	if (first)
		first->prev = p;
	if (!last)
		last = p;
	first = p;
}

/*
 * Add an entry at the beginning of a queue
 */
static void add_to_queue (int queue, struct dir_cache_entry * p)
{
	p->queue_prev = NULL;
	p->queue_next = queue_head[queue];
	if (queue_head[queue])
		queue_head[queue]->queue_prev = p;
	if (!queue_tail[queue])
		queue_tail[queue] = p;
	queue_head[queue] = p;
}

/*
 * Remove an entry from the cache
 */
static void remove_from_cache (struct dir_cache_entry * p)
{
	if (p->prev)
		p->prev->next = p->next;
	else
		first = p->next;
	if (p->next)
		p->next->prev = p->prev;
	else
		last = p->prev;
	p->prev = NULL;
	p->next = NULL;
}

/*
 * Remove an entry from a queue
 */
static void remove_from_queue (int queue, struct dir_cache_entry * p)
{
	if (p->queue_prev)
		p->queue_prev->queue_next = p->queue_next;
	else
		queue_head[queue] = p->queue_next;
	if (p->queue_next)
		p->queue_next->queue_prev = p->queue_prev;
	else
		queue_tail[queue] = p->queue_prev;
	p->queue_prev = NULL;
	p->queue_next = NULL;
}

/*
 * Invalidate all cache entries on a device (called by put_super() when
 * a file system is unmounted)
 */
void ext2_dcache_invalidate (unsigned short dev)
{
	struct dir_cache_entry * p;
	struct dir_cache_entry * p2;

	if (!cache_initialized)
		init_cache ();
	for (p = first; p != NULL; p = p2) {
		p2 = p->next;
		if (p->dev == dev) {
			remove_from_cache (p);
			remove_from_queue (hash (p->dev, p->dir), p);
			p->next = first_free;
			first_free = p;
		}
	}
#ifdef EXT2FS_DEBUG_CACHE
	show_cache ("dcache_invalidate");
#endif
}

/*
 * Lookup a directory entry in the cache
 */
unsigned long ext2_dcache_lookup (unsigned short dev, unsigned long dir,
				  const char * name, int len)
{
	char our_name[EXT2_NAME_LEN];
	int queue;
	struct dir_cache_entry * p;

	if (!cache_initialized)
		init_cache ();
	if (len > DCACHE_NAME_LEN)
		return 0;
	memcpy (our_name, (char *) name, len);
	our_name[len] = '\0';
#ifdef EXT2FS_DEBUG_CACHE
	printk ("dcache_lookup (%04x, %lu, %s, %d)\n", dev, dir, our_name, len);
#endif
	queue = hash (dev, dir);
	if ((p = find_name (queue, dev, dir, our_name, len))) {
		if (p != first) {
			remove_from_cache (p);
			add_to_cache (p);
		}
		if (p != queue_head[queue]) {
			remove_from_queue (queue, p);
			add_to_queue (queue, p);
		}
#ifdef EXT2FS_DEBUG_CACHE
		hits++;
		printk ("dcache_lookup: %s,hit,inode=%lu,hits=%d,misses=%d\n",
			our_name, p->ino, hits, misses);
		show_cache ("dcache_lookup");
#endif
		return p->ino;
	} else {
#ifdef EXT2FS_DEBUG_CACHE
		misses++;
		printk ("dcache_lookup: %s,miss,hits=%d,misses=%d\n",
			our_name, hits, misses);
		show_cache ("dcache_lookup");
#endif
		return 0;
	}
}

/*
 * Add a directory entry to the cache
 *
 * This function is called by ext2_lookup(), ext2_readdir()
 * and the functions which create directory entries
 */
void ext2_dcache_add (unsigned short dev, unsigned long dir, const char * name,
		      int len, unsigned long ino)
{
	struct dir_cache_entry * p;
	int queue;

	if (!cache_initialized)
		init_cache ();
#ifdef EXT2FS_DEBUG_CACHE
	printk ("dcache_add (%04x, %lu, %s, %d, %lu)\n",
		dev, dir, name, len, ino);
#endif
	if (len > DCACHE_NAME_LEN)
		return;
	queue = hash (dev, dir);
	if ((p = find_name (queue, dev, dir, name, len))) {
		p->dir = dir;
		p->ino = ino;
		if (p != first) {
			remove_from_cache (p);
			add_to_cache (p);
		}
		if (p != queue_head[queue]) {
			remove_from_queue (queue, p);
			add_to_queue (queue, p);
		}
	} else {
		if (first_free) {
			p = first_free;
			first_free = p->next;
		} else {
			if (!last)
				panic ("dcache_add: last == NULL\n");
			else {
				p = last;
				last = p->prev;
				if (last)
					last->next = NULL;
				remove_from_queue (hash (p->dev, p->dir), p);
			}
		}
		p->dev = dev;
		p->dir = dir;
		p->ino = ino;
		strncpy (p->name, name, len);
		p->len = len;
		p->name[len] = '\0';
		add_to_cache (p);
		add_to_queue (queue, p);
	}
#ifdef EXT2FS_DEBUG_CACHE
	show_cache ("dcache_add");
#endif
}

/*
 * Remove a directory from the cache
 *
 * This function is called by the functions which remove directory entries
 */
void ext2_dcache_remove (unsigned short dev, unsigned long dir,
			 const char * name, int len)
{
	struct dir_cache_entry * p;
	int queue;

	if (!cache_initialized)
		init_cache ();
#ifdef EXT2FS_DEBUG_CACHE
	printk ("dcache_remove (%04x, %lu, %s, %d)\n", dev, dir, name, len);
#endif
	if (len > DCACHE_NAME_LEN)
		return;
	queue = hash (dev, dir);
	if ((p = find_name (queue, dev, dir, name, len))) {
		remove_from_cache (p);
		remove_from_queue (queue, p);
		p->next = first_free;
		first_free = p;
	}
#ifdef EXT2FS_DEBUG_CACHE
	show_cache ("dcache_remove");
#endif
}

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美视频一二三区| 欧美日本国产视频| 奇米精品一区二区三区在线观看一| 26uuu色噜噜精品一区二区| 91福利国产成人精品照片| 国产一区二区三区在线观看精品| 亚洲一区二区精品3399| 中文字幕第一区综合| 日韩一区二区精品| 欧美最猛性xxxxx直播| 床上的激情91.| 韩国毛片一区二区三区| 日韩av电影一区| 亚洲国产精品久久久久婷婷884| 国产精品久久久99| 久久久久青草大香线综合精品| 欧美一区二区久久久| 欧洲在线/亚洲| 91视频国产观看| 成人精品视频.| 国产精品自拍网站| 精油按摩中文字幕久久| 丝袜美腿亚洲一区| 亚洲成a人片在线观看中文| 亚洲欧美日韩中文字幕一区二区三区| 国产欧美一区二区精品忘忧草| 在线不卡中文字幕| 欧美亚洲另类激情小说| 99九九99九九九视频精品| 岛国精品一区二区| 国产激情91久久精品导航 | 欧美r级在线观看| 911国产精品| 欧美日韩国产综合一区二区 | 97se亚洲国产综合在线| 国产精品一区二区你懂的| 久久99久久久久| 蜜臀久久99精品久久久久宅男| 日韩二区三区四区| 美女视频一区二区三区| 蜜桃视频第一区免费观看| 日本欧美在线观看| 久久99国产精品久久99| 久久91精品国产91久久小草| 97精品国产97久久久久久久久久久久| 成人一道本在线| 97aⅴ精品视频一二三区| 色婷婷亚洲一区二区三区| 99久久99久久精品免费看蜜桃| 91在线观看免费视频| 一本大道久久a久久精品综合| 色乱码一区二区三区88| 欧美日韩在线免费视频| 欧美丰满嫩嫩电影| 91麻豆精品国产91久久久久| 日韩欧美国产午夜精品| 国产亚洲精品aa| 亚洲天堂a在线| 亚洲一区二区三区四区五区中文| 日韩经典中文字幕一区| 久久精品国产99国产精品| 国产激情视频一区二区三区欧美| 福利一区二区在线观看| 色吧成人激情小说| 欧美一区二区三区在线观看| 精品国产乱码91久久久久久网站| 亚洲精品在线观看网站| 国产精品欧美精品| 亚洲午夜一区二区| 麻豆久久久久久久| 9久草视频在线视频精品| 欧美午夜不卡视频| 精品国产免费久久| 最新不卡av在线| 青草av.久久免费一区| 大白屁股一区二区视频| 欧美午夜一区二区三区免费大片| 欧美成人精品3d动漫h| 国产精品入口麻豆九色| 午夜激情一区二区三区| 国产高清不卡一区二区| 在线观看欧美黄色| 久久伊人蜜桃av一区二区| 亚洲综合在线第一页| 久久99精品国产.久久久久久| www.成人网.com| 日韩一区二区三区精品视频| 国产精品理伦片| 日韩精品一二区| 99精品视频中文字幕| 欧美成人a∨高清免费观看| 亚洲色图第一区| 国产一区二区女| 欧美日本一区二区在线观看| 国产精品欧美极品| 蜜桃久久精品一区二区| 91极品视觉盛宴| 中文字幕高清不卡| 麻豆成人久久精品二区三区红| 色综合久久中文综合久久牛| 久久亚洲欧美国产精品乐播| 亚洲一区二区三区激情| 成人免费看黄yyy456| 欧美大片在线观看| 亚洲一区在线看| 成人av资源在线| 久久久亚洲国产美女国产盗摄 | 大白屁股一区二区视频| 日韩午夜小视频| 亚洲伊人色欲综合网| 99国产精品久| 国产精品美日韩| 国产麻豆精品视频| 欧美成人精品高清在线播放| 天堂在线一区二区| 欧美专区亚洲专区| 亚洲视频免费在线| 成人h精品动漫一区二区三区| 久久亚洲私人国产精品va媚药| 喷水一区二区三区| 777xxx欧美| 日韩国产欧美一区二区三区| 精品欧美一区二区三区精品久久 | 精品裸体舞一区二区三区| 亚洲超丰满肉感bbw| 欧美日韩在线播放| 亚洲一区免费视频| 在线观看精品一区| 亚洲国产日韩综合久久精品| 在线日韩一区二区| 香蕉加勒比综合久久| 欧美精选一区二区| 日韩精品一二三| 538prom精品视频线放| 婷婷开心久久网| 91精品国产一区二区三区| 免费观看91视频大全| 91精品国产日韩91久久久久久| 视频在线观看一区二区三区| 91精品国产综合久久久蜜臀粉嫩| 日本午夜精品视频在线观看 | 亚洲美女偷拍久久| 91久久精品一区二区二区| 一区二区三区在线播放| 欧美在线观看视频一区二区三区 | 久久不见久久见免费视频1| 日韩视频在线一区二区| 黄色日韩网站视频| 国产日韩成人精品| eeuss影院一区二区三区| 亚洲六月丁香色婷婷综合久久| 日本久久精品电影| 日韩激情视频网站| 26uuu国产电影一区二区| 国产成人综合视频| 综合久久一区二区三区| 欧美日韩一区三区四区| 裸体在线国模精品偷拍| 国产午夜亚洲精品不卡| 一本色道久久综合亚洲aⅴ蜜桃| 午夜精品久久久久影视| 久久中文字幕电影| 91在线免费播放| 日韩电影在线一区| 久久免费看少妇高潮| 99re热视频这里只精品| 肉色丝袜一区二区| 国产亚洲精品bt天堂精选| 色综合久久88色综合天天| 天天综合色天天综合色h| 久久久精品2019中文字幕之3| 99v久久综合狠狠综合久久| 日韩和欧美一区二区| 中文字幕巨乱亚洲| 欧美日韩三级在线| 国产福利不卡视频| 亚洲一区二区三区视频在线播放| 日韩免费成人网| 色丁香久综合在线久综合在线观看 | 亚洲精品视频自拍| 欧美一区日本一区韩国一区| 成人亚洲一区二区一| 日日摸夜夜添夜夜添亚洲女人| 国产日韩影视精品| 欧美日韩一区二区三区在线看| 国产精品123区| 视频一区欧美精品| 欧美经典三级视频一区二区三区| 欧美日韩一区不卡| 成人免费毛片a| 精品中文字幕一区二区小辣椒| 亚洲欧美日本韩国| 国产欧美日韩三级| 正在播放一区二区| 色综合久久久久| 国产成人在线视频免费播放| 日韩国产一二三区| 亚洲午夜免费电影| 国产精品蜜臀在线观看| 久久日一线二线三线suv|