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

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

?? freelists.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 *  linux/fs/ext/freelists.c
 *
 *  Copyright (C) 1992  Remy Card (card@masi.ibp.fr)
 *
 */

/* freelists.c contains the code that handles the inode and block free lists */


/*

   The free blocks are managed by a linked list. The super block contains the
   number of the first free block. This block contains 254 numbers of other
   free blocks and the number of the next block in the list.

   When an ext fs is mounted, the number of the first free block is stored
   in s->u.ext_sb.s_firstfreeblocknumber and the block header is stored in
   s->u.ext_sb.s_firstfreeblock. u.ext_sb.s_freeblockscount contains the count
   of free blocks.

   The free inodes are also managed by a linked list in a similar way. The
   super block contains the number of the first free inode. This inode contains
   14 numbers of other free inodes and the number of the next inode in the list.
   
   The number of the first free inode is stored in
   s->u.ext_sb.s_firstfreeinodenumber and the header of the block containing
   the inode is stored in s->u.ext_sb.s_firstfreeinodeblock.
   u.ext_sb.s_freeinodescount contains the count of free inodes.

*/

#include <linux/sched.h>
#include <linux/ext_fs.h>
#include <linux/stat.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/locks.h>

#define clear_block(addr) \
__asm__("cld\n\t" \
        "rep\n\t" \
        "stosl" \
        : \
        :"a" (0),"c" (BLOCK_SIZE/4),"D" ((long) (addr)):"cx","di")

void ext_free_block(struct super_block * sb, int block)
{
	struct buffer_head * bh;
	struct ext_free_block * efb;

	if (!sb) {
		printk("trying to free block on non-existent device\n");
		return;
	}
	lock_super (sb);
	if (block < sb->u.ext_sb.s_firstdatazone ||
	    block >= sb->u.ext_sb.s_nzones) {
		printk("trying to free block not in datazone\n");
		return;
	}
	bh = get_hash_table(sb->s_dev, block, sb->s_blocksize);
	if (bh)
		bh->b_dirt=0;
	brelse(bh);
	if (sb->u.ext_sb.s_firstfreeblock)
		efb = (struct ext_free_block *) sb->u.ext_sb.s_firstfreeblock->b_data;
	if (!sb->u.ext_sb.s_firstfreeblock || efb->count == 254) {
#ifdef EXTFS_DEBUG
printk("ext_free_block: block full, skipping to %d\n", block);
#endif
		if (sb->u.ext_sb.s_firstfreeblock)
			brelse (sb->u.ext_sb.s_firstfreeblock);
		if (!(sb->u.ext_sb.s_firstfreeblock = bread (sb->s_dev,
			block, sb->s_blocksize)))
			panic ("ext_free_block: unable to read block to free\n");
		efb = (struct ext_free_block *) sb->u.ext_sb.s_firstfreeblock->b_data;
		efb->next = sb->u.ext_sb.s_firstfreeblocknumber;
		efb->count = 0;
		sb->u.ext_sb.s_firstfreeblocknumber = block;
	} else {
		efb->free[efb->count++] = block;
	}
	sb->u.ext_sb.s_freeblockscount ++;
	sb->s_dirt = 1;
	sb->u.ext_sb.s_firstfreeblock->b_dirt = 1;
	unlock_super (sb);
	return;
}

int ext_new_block(struct super_block * sb)
{
	struct buffer_head * bh;
	struct ext_free_block * efb;
	int j;

	if (!sb) {
		printk("trying to get new block from non-existent device\n");
		return 0;
	}
	if (!sb->u.ext_sb.s_firstfreeblock)
		return 0;
	lock_super (sb);
	efb = (struct ext_free_block *) sb->u.ext_sb.s_firstfreeblock->b_data;
	if (efb->count) {
		j = efb->free[--efb->count];
		sb->u.ext_sb.s_firstfreeblock->b_dirt = 1;
	} else {
#ifdef EXTFS_DEBUG
printk("ext_new_block: block empty, skipping to %d\n", efb->next);
#endif
		j = sb->u.ext_sb.s_firstfreeblocknumber;
		sb->u.ext_sb.s_firstfreeblocknumber = efb->next;
		brelse (sb->u.ext_sb.s_firstfreeblock);
		if (!sb->u.ext_sb.s_firstfreeblocknumber) {
			sb->u.ext_sb.s_firstfreeblock = NULL;
		} else {
			if (!(sb->u.ext_sb.s_firstfreeblock = bread (sb->s_dev,
				sb->u.ext_sb.s_firstfreeblocknumber,
				sb->s_blocksize)))
				panic ("ext_new_block: unable to read next free block\n");
		}
	}
	if (j < sb->u.ext_sb.s_firstdatazone || j > sb->u.ext_sb.s_nzones) {
		printk ("ext_new_block: blk = %d\n", j);
		printk("allocating block not in data zone\n");
		return 0;
	}
	sb->u.ext_sb.s_freeblockscount --;
	sb->s_dirt = 1;

	if (!(bh=getblk(sb->s_dev, j, sb->s_blocksize))) {
		printk("new_block: cannot get block");
		return 0;
	}
	clear_block(bh->b_data);
	bh->b_uptodate = 1;
	bh->b_dirt = 1;
	brelse(bh);
#ifdef EXTFS_DEBUG
printk("ext_new_block: allocating block %d\n", j);
#endif
	unlock_super (sb);
	return j;
}

unsigned long ext_count_free_blocks(struct super_block *sb)
{
#ifdef EXTFS_DEBUG
	struct buffer_head * bh;
	struct ext_free_block * efb;
	unsigned long count, block;

	lock_super (sb);
	if (!sb->u.ext_sb.s_firstfreeblock)
		count = 0;
	else {
		efb = (struct ext_free_block *) sb->u.ext_sb.s_firstfreeblock->b_data;
		count = efb->count + 1;
		block = efb->next;
		while (block) {
			if (!(bh = bread (sb->s_dev, block, sb->s_blocksize))) {
				printk ("ext_count_free: error while reading free blocks list\n");
				block = 0;
			} else {
				efb = (struct ext_free_block *) bh->b_data;
				count += efb->count + 1;
				block = efb->next;
				brelse (bh);
			}
		}
	}
printk("ext_count_free_blocks: stored = %d, computed = %d\n",
	sb->u.ext_sb.s_freeblockscount, count);
	unlock_super (sb);
	return count;
#else
	return sb->u.ext_sb.s_freeblockscount;
#endif
}

void ext_free_inode(struct inode * inode)
{
	struct buffer_head * bh;
	struct ext_free_inode * efi;
	struct super_block * sb;
	unsigned long block;
	unsigned long ino;
	dev_t dev;

	if (!inode)
		return;
	if (!inode->i_dev) {
		printk("free_inode: inode has no device\n");
		return;
	}
	if (inode->i_count != 1) {
		printk("free_inode: inode has count=%d\n",inode->i_count);
		return;
	}
	if (inode->i_nlink) {
		printk("free_inode: inode has nlink=%d\n",inode->i_nlink);
		return;
	}
	if (!inode->i_sb) {
		printk("free_inode: inode on non-existent device\n");
		return;
	}
	sb = inode->i_sb;
	ino = inode->i_ino;
	dev = inode->i_dev;
	clear_inode(inode);
	lock_super (sb);
	if (ino < 1 || ino > sb->u.ext_sb.s_ninodes) {
		printk("free_inode: inode 0 or non-existent inode\n");
		unlock_super (sb);
		return;
	}
	if (sb->u.ext_sb.s_firstfreeinodeblock)
		efi = ((struct ext_free_inode *) sb->u.ext_sb.s_firstfreeinodeblock->b_data) +
			(sb->u.ext_sb.s_firstfreeinodenumber-1)%EXT_INODES_PER_BLOCK;
	if (!sb->u.ext_sb.s_firstfreeinodeblock || efi->count == 14) {
#ifdef EXTFS_DEBUG
printk("ext_free_inode: inode full, skipping to %d\n", ino);
#endif
		if (sb->u.ext_sb.s_firstfreeinodeblock)
			brelse (sb->u.ext_sb.s_firstfreeinodeblock);
		block = 2 + (ino - 1) / EXT_INODES_PER_BLOCK;
		if (!(bh = bread(dev, block, sb->s_blocksize)))
			panic("ext_free_inode: unable to read inode block\n");
		efi = ((struct ext_free_inode *) bh->b_data) +
			(ino - 1) % EXT_INODES_PER_BLOCK;
		efi->next = sb->u.ext_sb.s_firstfreeinodenumber;
		efi->count = 0;
		sb->u.ext_sb.s_firstfreeinodenumber = ino;
		sb->u.ext_sb.s_firstfreeinodeblock = bh;
	} else {
		efi->free[efi->count++] = ino;
	}
	sb->u.ext_sb.s_freeinodescount ++;
	sb->s_dirt = 1;
	sb->u.ext_sb.s_firstfreeinodeblock->b_dirt = 1;
	unlock_super (sb);
}

struct inode * ext_new_inode(const struct inode * dir)
{
	struct super_block * sb;
	struct inode * inode;
	struct ext_free_inode * efi;
	unsigned long block;
	int j;

	if (!dir || !(inode=get_empty_inode()))
		return NULL;
	sb = dir->i_sb;
	inode->i_sb = sb;
	inode->i_flags = sb->s_flags;
	if (!sb->u.ext_sb.s_firstfreeinodeblock)
		return 0;
	lock_super (sb);
	efi = ((struct ext_free_inode *) sb->u.ext_sb.s_firstfreeinodeblock->b_data) +
		(sb->u.ext_sb.s_firstfreeinodenumber-1)%EXT_INODES_PER_BLOCK;
	if (efi->count) {
		j = efi->free[--efi->count];
		sb->u.ext_sb.s_firstfreeinodeblock->b_dirt = 1;
	} else {
#ifdef EXTFS_DEBUG
printk("ext_free_inode: inode empty, skipping to %d\n", efi->next);
#endif
		j = sb->u.ext_sb.s_firstfreeinodenumber;
		if (efi->next > sb->u.ext_sb.s_ninodes) {
			printk ("efi->next = %d\n", efi->next);
			panic ("ext_new_inode: bad inode number in free list\n");
		}
		sb->u.ext_sb.s_firstfreeinodenumber = efi->next;
		block = 2 + (((unsigned long) efi->next) - 1) / EXT_INODES_PER_BLOCK;
		brelse (sb->u.ext_sb.s_firstfreeinodeblock);
		if (!sb->u.ext_sb.s_firstfreeinodenumber) {
			sb->u.ext_sb.s_firstfreeinodeblock = NULL;
		} else {
			if (!(sb->u.ext_sb.s_firstfreeinodeblock =
			    bread(sb->s_dev, block, sb->s_blocksize)))
				panic ("ext_new_inode: unable to read next free inode block\n");
		}
	}
	sb->u.ext_sb.s_freeinodescount --;
	sb->s_dirt = 1;
	inode->i_count = 1;
	inode->i_nlink = 1;
	inode->i_dev = sb->s_dev;
	inode->i_uid = current->euid;
	inode->i_gid = (dir->i_mode & S_ISGID) ? dir->i_gid : current->egid;
	inode->i_dirt = 1;
	inode->i_ino = j;
	inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
	inode->i_op = NULL;
	inode->i_blocks = inode->i_blksize = 0;
	insert_inode_hash(inode);
#ifdef EXTFS_DEBUG
printk("ext_new_inode : allocating inode %d\n", inode->i_ino);
#endif
	unlock_super (sb);
	return inode;
}

unsigned long ext_count_free_inodes(struct super_block *sb)
{
#ifdef EXTFS_DEBUG
	struct buffer_head * bh;
	struct ext_free_inode * efi;
	unsigned long count, block, ino;

	lock_super (sb);
	if (!sb->u.ext_sb.s_firstfreeinodeblock)
		count = 0;
	else {
		efi = ((struct ext_free_inode *) sb->u.ext_sb.s_firstfreeinodeblock->b_data) +
			((sb->u.ext_sb.s_firstfreeinodenumber-1)%EXT_INODES_PER_BLOCK);
		count = efi->count + 1;
		ino = efi->next;
		while (ino) {
			if (ino < 1 || ino > sb->u.ext_sb.s_ninodes) {
				printk ("u.ext_sb.s_firstfreeinodenumber = %d, ino = %d\n", 
					(int) sb->u.ext_sb.s_firstfreeinodenumber,ino);
				panic ("ext_count_fre_inodes: bad inode number in free list\n");
			}
			block = 2 + ((ino - 1) / EXT_INODES_PER_BLOCK);
			if (!(bh = bread (sb->s_dev, block, sb->s_blocksize))) {
				printk ("ext_count_free_inodes: error while reading free inodes list\n");
				block = 0;
			} else {
				efi = ((struct ext_free_inode *) bh->b_data) +
					((ino - 1) % EXT_INODES_PER_BLOCK);
				count += efi->count + 1;
				ino = efi->next;
				brelse (bh);
			}
		}
	}
printk("ext_count_free_inodes: stored = %d, computed = %d\n",
	sb->u.ext_sb.s_freeinodescount, count);
	unlock_super (sb);
	return count;
#else
	return sb->u.ext_sb.s_freeinodescount;
#endif
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
盗摄精品av一区二区三区| 麻豆国产欧美一区二区三区| 国产精品一区免费视频| 日韩精品一区二区三区中文精品| 午夜精品久久久| 91精品国产91热久久久做人人 | 久久精品男人天堂av| 久久精品国产网站| 久久久www免费人成精品| 国产精品一区二区三区四区| 欧美激情在线观看视频免费| 91美女片黄在线观看| 亚洲线精品一区二区三区八戒| 91精品婷婷国产综合久久| 麻豆国产欧美一区二区三区| 中文字幕不卡三区| 一本久久精品一区二区| 视频一区视频二区中文字幕| 精品国产免费久久| 成人国产一区二区三区精品| 一区二区三区不卡视频| 欧美成人精品1314www| 国产99久久精品| 一个色综合av| 久久综合网色—综合色88| 91精品欧美福利在线观看| 久久成人免费网| 中文字幕在线不卡一区| 欧美精品乱人伦久久久久久| 国产一区二区电影| 亚洲综合区在线| 精品噜噜噜噜久久久久久久久试看 | www.成人在线| 天天影视涩香欲综合网| 国产精品免费久久久久| 欧美日韩精品一区二区三区蜜桃| 国产又粗又猛又爽又黄91精品| 一区二区三区91| 久久久蜜桃精品| 欧美日韩国产高清一区二区三区| 高清国产一区二区| 日本在线观看不卡视频| 亚洲欧洲日韩综合一区二区| 日韩视频不卡中文| 在线日韩一区二区| 成人中文字幕电影| 男女激情视频一区| 亚洲国产中文字幕在线视频综合| 欧美激情艳妇裸体舞| 午夜伊人狠狠久久| 国产精品视频免费| 精品日韩成人av| 欧美精品乱码久久久久久| 91一区二区在线观看| 国产大陆亚洲精品国产| 麻豆国产精品777777在线| 亚洲综合色网站| 亚洲免费在线看| 国产精品麻豆一区二区| 久久精品免费在线观看| 精品99一区二区| 在线播放亚洲一区| 欧美日韩一区精品| 欧美系列日韩一区| 91在线无精精品入口| 国产成人自拍网| 久久99精品久久久| 蜜臀精品一区二区三区在线观看 | 欧美男女性生活在线直播观看| 成人18视频在线播放| 韩国一区二区三区| 精品在线一区二区三区| 美女脱光内衣内裤视频久久网站 | 婷婷夜色潮精品综合在线| 亚洲激情校园春色| 一区二区三区四区中文字幕| 日韩一区中文字幕| 中文字幕中文字幕中文字幕亚洲无线| 国产日韩综合av| 国产欧美日本一区二区三区| 亚洲国产精品精华液ab| 亚洲国产成人一区二区三区| 国产精品三级视频| 日韩理论电影院| 亚洲精品国产精华液| 亚洲国产精品一区二区久久恐怖片| 亚洲精品国产视频| 天天色天天操综合| 日韩激情视频网站| 国产综合色在线| 成人av资源网站| 欧美综合视频在线观看| 欧美三电影在线| 欧美一区二区视频在线观看 | 蜜臀久久99精品久久久画质超高清 | 一区二区三区小说| 天堂久久一区二区三区| 激情综合网激情| 国产成人精品综合在线观看| jizzjizzjizz欧美| 欧美性生活一区| 91麻豆精品91久久久久同性| 精品国产自在久精品国产| 国产欧美精品一区| 亚洲女与黑人做爰| 免费成人小视频| 成人国产电影网| 欧美日韩国产综合视频在线观看| 日韩欧美一级特黄在线播放| 国产欧美综合在线| 五月婷婷综合网| 欧美一级一级性生活免费录像| 亚洲精品一区二区三区精华液| 国产精品美女久久久久aⅴ| 亚欧色一区w666天堂| 韩国午夜理伦三级不卡影院| 99久久99久久免费精品蜜臀| 欧美日韩精品一区二区三区| 2023国产精品视频| 亚洲综合在线第一页| 久久国产夜色精品鲁鲁99| 成人精品在线视频观看| 欧美精选一区二区| 欧美高清在线精品一区| 午夜a成v人精品| 成人国产视频在线观看| 宅男在线国产精品| 国产精品成人免费精品自在线观看| 日本少妇一区二区| 色综合天天综合色综合av | 日本中文在线一区| 97久久人人超碰| www国产精品av| 亚洲第一狼人社区| 91老师片黄在线观看| 久久久一区二区| 舔着乳尖日韩一区| 91久久奴性调教| 欧美国产日产图区| 看电视剧不卡顿的网站| 色又黄又爽网站www久久| 久久久久久电影| 青青草97国产精品免费观看无弹窗版 | 91精品福利在线一区二区三区| 国产精品电影一区二区三区| 另类欧美日韩国产在线| 欧美日韩在线播放一区| 亚洲伦理在线免费看| 粉嫩av一区二区三区粉嫩| 精品国产伦一区二区三区免费| 三级影片在线观看欧美日韩一区二区| 99国产精品久久久久久久久久| 久久久99精品免费观看不卡| 奇米色777欧美一区二区| 欧美日韩一级片在线观看| 亚洲最新视频在线观看| 色婷婷亚洲精品| 中文字幕亚洲在| 99热国产精品| 国产精品视频线看| eeuss国产一区二区三区| 中文字幕一区二区三区四区不卡| 国产精品乡下勾搭老头1| 精品国产乱码久久久久久老虎| 日av在线不卡| 欧美一级久久久| 蜜桃视频在线观看一区二区| 91精品国产色综合久久不卡蜜臀| 亚洲国产欧美日韩另类综合| 欧美系列亚洲系列| 天堂蜜桃91精品| 日韩三级在线观看| 激情伊人五月天久久综合| 日韩欧美你懂的| 国模一区二区三区白浆| 欧美精品一区二区蜜臀亚洲| 国产中文字幕精品| 欧美国产亚洲另类动漫| 91丨九色丨尤物| 一区二区久久久久| 精品视频1区2区| 日本成人在线看| 精品人在线二区三区| 成人一区二区三区中文字幕| 国产精品国产自产拍高清av| 色诱亚洲精品久久久久久| 五月综合激情网| 精品日产卡一卡二卡麻豆| 成人av在线一区二区| 亚洲综合在线观看视频| 欧美日韩精品欧美日韩精品一 | 欧美伦理视频网站| 日韩av午夜在线观看| 久久综合五月天婷婷伊人| 波多野结衣在线一区| 夜夜操天天操亚洲| 欧美xxxxxxxx| 99精品视频中文字幕| 午夜精品aaa| 久久久久久电影|