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

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

?? truncate.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號(hào):
/*
 *  linux/fs/ext2/truncate.c
 *
 *  Copyright (C) 1992, 1993, 1994  Remy Card (card@masi.ibp.fr)
 *                                  Laboratoire MASI - Institut Blaise Pascal
 *                                  Universite Pierre et Marie Curie (Paris VI)
 *
 *  from
 *
 *  linux/fs/minix/truncate.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 */

/*
 * Real random numbers for secure rm added 94/02/18
 * Idea from Pierre del Perugia <delperug@gla.ecoledoc.ibp.fr>
 */

#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/ext2_fs.h>
#include <linux/fcntl.h>
#include <linux/sched.h>
#include <linux/stat.h>
#include <linux/locks.h>

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

static int ext2_secrm_seed = 152;	/* Random generator base */

#define RANDOM_INT (ext2_secrm_seed = ext2_secrm_seed * 69069l +1)

/*
 * Truncate has the most races in the whole filesystem: coding it is
 * a pain in the a**. Especially as I don't do any locking...
 *
 * The code may look a bit weird, but that's just because I've tried to
 * handle things like file-size changes in a somewhat graceful manner.
 * Anyway, truncating a file at the same time somebody else writes to it
 * is likely to result in pretty weird behaviour...
 *
 * The new code handles normal truncates (size = 0) as well as the more
 * general case (size = XXX). I hope.
 */

static int trunc_direct (struct inode * inode)
{
	int i, tmp;
	unsigned long * p;
	struct buffer_head * bh;
	unsigned long block_to_free = 0;
	unsigned long free_count = 0;
	int retry = 0;
	int blocks = inode->i_sb->s_blocksize / 512;
#define DIRECT_BLOCK ((inode->i_size + inode->i_sb->s_blocksize - 1) / \
			inode->i_sb->s_blocksize)
	int direct_block = DIRECT_BLOCK;

repeat:
	for (i = direct_block ; i < EXT2_NDIR_BLOCKS ; i++) {
		p = inode->u.ext2_i.i_data + i;
		tmp = *p;
		if (!tmp)
			continue;
		if (inode->u.ext2_i.i_flags & EXT2_SECRM_FL)
			bh = getblk (inode->i_dev, tmp,
				     inode->i_sb->s_blocksize);
		else
			bh = get_hash_table (inode->i_dev, tmp,
					     inode->i_sb->s_blocksize);
		if (i < direct_block) {
			brelse (bh);
			goto repeat;
		}
		if ((bh && bh->b_count != 1) || tmp != *p) {
			retry = 1;
			brelse (bh);
			continue;
		}
		*p = 0;
		inode->i_blocks -= blocks;
		inode->i_dirt = 1;
		if (inode->u.ext2_i.i_flags & EXT2_SECRM_FL) {
			clear_block (bh->b_data, inode->i_sb->s_blocksize,
				     RANDOM_INT);
			bh->b_dirt = 1;
		}
		brelse (bh);
		if (free_count == 0) {
			block_to_free = tmp;
			free_count++;
		} else if (free_count > 0 && block_to_free == tmp - free_count)
			free_count++;
		else {
			ext2_free_blocks (inode->i_sb, block_to_free, free_count);
			block_to_free = tmp;
			free_count = 1;
		}
/*		ext2_free_blocks (inode->i_sb, tmp, 1); */
	}
	if (free_count > 0)
		ext2_free_blocks (inode->i_sb, block_to_free, free_count);
	return retry;
}

static int trunc_indirect (struct inode * inode, int offset, unsigned long * p)
{
	int i, tmp;
	struct buffer_head * bh;
	struct buffer_head * ind_bh;
	unsigned long * ind;
	unsigned long block_to_free = 0;
	unsigned long free_count = 0;
	int retry = 0;
	int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
	int blocks = inode->i_sb->s_blocksize / 512;
#define INDIRECT_BLOCK ((int)DIRECT_BLOCK - offset)
	int indirect_block = INDIRECT_BLOCK;

	tmp = *p;
	if (!tmp)
		return 0;
	ind_bh = bread (inode->i_dev, tmp, inode->i_sb->s_blocksize);
	if (tmp != *p) {
		brelse (ind_bh);
		return 1;
	}
	if (!ind_bh) {
		*p = 0;
		return 0;
	}
repeat:
	for (i = indirect_block ; i < addr_per_block ; i++) {
		if (i < 0)
			i = 0;
		if (i < indirect_block)
			goto repeat;
		ind = i + (unsigned long *) ind_bh->b_data;
		tmp = *ind;
		if (!tmp)
			continue;
		if (inode->u.ext2_i.i_flags & EXT2_SECRM_FL)
			bh = getblk (inode->i_dev, tmp,
				     inode->i_sb->s_blocksize);
		else
			bh = get_hash_table (inode->i_dev, tmp,
					     inode->i_sb->s_blocksize);
		if (i < indirect_block) {
			brelse (bh);
			goto repeat;
		}
		if ((bh && bh->b_count != 1) || tmp != *ind) {
			retry = 1;
			brelse (bh);
			continue;
		}
		*ind = 0;
		ind_bh->b_dirt = 1;
		if (inode->u.ext2_i.i_flags & EXT2_SECRM_FL) {
			clear_block (bh->b_data, inode->i_sb->s_blocksize,
				     RANDOM_INT);
			bh->b_dirt = 1;
		}
		brelse (bh);
		if (free_count == 0) {
			block_to_free = tmp;
			free_count++;
		} else if (free_count > 0 && block_to_free == tmp - free_count)
			free_count++;
		else {
			ext2_free_blocks (inode->i_sb, block_to_free, free_count);
			block_to_free = tmp;
			free_count = 1;
		}
/*		ext2_free_blocks (inode->i_sb, tmp, 1); */
		inode->i_blocks -= blocks;
		inode->i_dirt = 1;
	}
	if (free_count > 0)
		ext2_free_blocks (inode->i_sb, block_to_free, free_count);
	ind = (unsigned long *) ind_bh->b_data;
	for (i = 0; i < addr_per_block; i++)
		if (*(ind++))
			break;
	if (i >= addr_per_block)
		if (ind_bh->b_count != 1)
			retry = 1;
		else {
			tmp = *p;
			*p = 0;
			inode->i_blocks -= blocks;
			inode->i_dirt = 1;
			ext2_free_blocks (inode->i_sb, tmp, 1);
		}
	if (IS_SYNC(inode) && ind_bh->b_dirt) {
		ll_rw_block (WRITE, 1, &ind_bh);
		wait_on_buffer (ind_bh);
	}
	brelse (ind_bh);
	return retry;
}

static int trunc_dindirect (struct inode * inode, int offset,
			    unsigned long * p)
{
	int i, tmp;
	struct buffer_head * dind_bh;
	unsigned long * dind;
	int retry = 0;
	int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
	int blocks = inode->i_sb->s_blocksize / 512;
#define DINDIRECT_BLOCK (((int)DIRECT_BLOCK - offset) / addr_per_block)
	int dindirect_block = DINDIRECT_BLOCK;

	tmp = *p;
	if (!tmp)
		return 0;
	dind_bh = bread (inode->i_dev, tmp, inode->i_sb->s_blocksize);
	if (tmp != *p) {
		brelse (dind_bh);
		return 1;
	}
	if (!dind_bh) {
		*p = 0;
		return 0;
	}
repeat:
	for (i = dindirect_block ; i < addr_per_block ; i++) {
		if (i < 0)
			i = 0;
		if (i < dindirect_block)
			goto repeat;
		dind = i + (unsigned long *) dind_bh->b_data;
		tmp = *dind;
		if (!tmp)
			continue;
		retry |= trunc_indirect (inode, offset + (i * addr_per_block),
					  dind);
		dind_bh->b_dirt = 1;
	}
	dind = (unsigned long *) dind_bh->b_data;
	for (i = 0; i < addr_per_block; i++)
		if (*(dind++))
			break;
	if (i >= addr_per_block)
		if (dind_bh->b_count != 1)
			retry = 1;
		else {
			tmp = *p;
			*p = 0;
			inode->i_blocks -= blocks;
			inode->i_dirt = 1;
			ext2_free_blocks (inode->i_sb, tmp, 1);
		}
	if (IS_SYNC(inode) && dind_bh->b_dirt) {
		ll_rw_block (WRITE, 1, &dind_bh);
		wait_on_buffer (dind_bh);
	}
	brelse (dind_bh);
	return retry;
}

static int trunc_tindirect (struct inode * inode)
{
	int i, tmp;
	struct buffer_head * tind_bh;
	unsigned long * tind, * p;
	int retry = 0;
	int addr_per_block = EXT2_ADDR_PER_BLOCK(inode->i_sb);
	int blocks = inode->i_sb->s_blocksize / 512;
#define TINDIRECT_BLOCK (((int)DIRECT_BLOCK - (addr_per_block * addr_per_block + \
			  addr_per_block + EXT2_NDIR_BLOCKS)) / \
			  (addr_per_block * addr_per_block))
	int tindirect_block = TINDIRECT_BLOCK;

	p = inode->u.ext2_i.i_data + EXT2_TIND_BLOCK;
	if (!(tmp = *p))
		return 0;
	tind_bh = bread (inode->i_dev, tmp, inode->i_sb->s_blocksize);
	if (tmp != *p) {
		brelse (tind_bh);
		return 1;
	}
	if (!tind_bh) {
		*p = 0;
		return 0;
	}
repeat:
	for (i = tindirect_block ; i < addr_per_block ; i++) {
		if (i < 0)
			i = 0;
		if (i < tindirect_block)
			goto repeat;
		tind = i + (unsigned long *) tind_bh->b_data;
		retry |= trunc_dindirect(inode, EXT2_NDIR_BLOCKS +
			addr_per_block + (i + 1) * addr_per_block * addr_per_block,
			tind);
		tind_bh->b_dirt = 1;
	}
	tind = (unsigned long *) tind_bh->b_data;
	for (i = 0; i < addr_per_block; i++)
		if (*(tind++))
			break;
	if (i >= addr_per_block)
		if (tind_bh->b_count != 1)
			retry = 1;
		else {
			tmp = *p;
			*p = 0;
			inode->i_blocks -= blocks;
			inode->i_dirt = 1;
			ext2_free_blocks (inode->i_sb, tmp, 1);
		}
	if (IS_SYNC(inode) && tind_bh->b_dirt) {
		ll_rw_block (WRITE, 1, &tind_bh);
		wait_on_buffer (tind_bh);
	}
	brelse (tind_bh);
	return retry;
}
		
void ext2_truncate (struct inode * inode)
{
	int retry;

	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
	    S_ISLNK(inode->i_mode)))
		return;
	ext2_discard_prealloc(inode);
	while (1) {
		retry = trunc_direct(inode);
		retry |= trunc_indirect (inode, EXT2_IND_BLOCK,
			(unsigned long *) &inode->u.ext2_i.i_data[EXT2_IND_BLOCK]);
		retry |= trunc_dindirect (inode, EXT2_IND_BLOCK +
			EXT2_ADDR_PER_BLOCK(inode->i_sb),
			(unsigned long *) &inode->u.ext2_i.i_data[EXT2_DIND_BLOCK]);
		retry |= trunc_tindirect (inode);
		if (!retry)
			break;
		if (IS_SYNC(inode) && inode->i_dirt)
			ext2_sync_inode (inode);
		current->counter = 0;
		schedule ();
	}
	inode->i_mtime = inode->i_ctime = CURRENT_TIME;
	inode->i_dirt = 1;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜激情在线| 亚洲精品国产精品乱码不99| 欧美tk丨vk视频| 欧美一区二视频| 日韩欧美二区三区| 精品人在线二区三区| 欧美一区二区三区在线电影| 日韩美女在线视频| 久久看人人爽人人| 亚洲国产精品v| 亚洲色图在线播放| 夜夜精品视频一区二区| 婷婷国产在线综合| 久久成人羞羞网站| 国产精品一区二区免费不卡| 成人黄页在线观看| 色综合久久综合网| 欧美日韩精品是欧美日韩精品| 国产精品不卡在线| 亚洲欧美日韩国产综合在线| 亚洲午夜久久久久久久久电影院| 日韩经典一区二区| 国产高清精品网站| 色哟哟一区二区在线观看 | 日韩欧美一二三四区| 精品99一区二区三区| 国产精品福利在线播放| 亚洲最新视频在线观看| 日本欧美一区二区| 国产成人综合自拍| 91黄色免费观看| 欧美一区二区三区性视频| 国产偷v国产偷v亚洲高清| 亚洲精选免费视频| 美国十次综合导航| 99久久伊人精品| 91精品国产综合久久蜜臀| 久久免费看少妇高潮| 中文字幕在线不卡| 日本在线不卡一区| 波多野结衣在线一区| 欧美日韩一区二区在线观看视频| 精品国产91乱码一区二区三区| 日韩码欧中文字| 美国十次综合导航| 色婷婷av久久久久久久| 精品国产乱码久久久久久久久| 中文字幕日韩av资源站| 日日摸夜夜添夜夜添国产精品| 国产91丝袜在线播放| 欧美午夜精品一区二区三区| 国产丝袜欧美中文另类| 亚洲国产sm捆绑调教视频| 国产米奇在线777精品观看| 日本高清免费不卡视频| 精品国产乱码久久久久久牛牛| 亚洲宅男天堂在线观看无病毒| 国产精品一线二线三线| 欧美二区在线观看| 亚洲视频 欧洲视频| 国产一区二区三区日韩| 欧美午夜免费电影| 国产精品青草综合久久久久99| 五月天欧美精品| 97久久精品人人做人人爽| 欧美电影免费观看完整版| 亚洲精品久久久蜜桃| 福利一区福利二区| 日韩欧美另类在线| 亚洲超碰97人人做人人爱| 91丨porny丨在线| 国产拍欧美日韩视频二区| 久久99精品国产.久久久久久| 欧美怡红院视频| 成人黄动漫网站免费app| 日韩精品一区在线| 午夜激情综合网| 欧美亚男人的天堂| 亚洲天堂中文字幕| 成人av免费网站| 欧美激情在线一区二区| 久久99精品国产麻豆婷婷洗澡| 欧美日韩另类国产亚洲欧美一级| 亚洲视频电影在线| 99久久婷婷国产综合精品| 国产日韩精品一区二区三区在线| 麻豆国产一区二区| 欧美一区二区三区在线| 五月天一区二区| 欧美日韩不卡一区二区| 亚洲电影视频在线| 欧美三级中文字| 性欧美疯狂xxxxbbbb| 欧美日韩亚洲综合在线| 亚洲成人午夜电影| 欧美日韩美少妇| 丝袜美腿亚洲一区二区图片| 欧美日韩国产系列| 亚洲国产成人91porn| 欧美日韩国产欧美日美国产精品| 亚洲午夜av在线| 欧美日韩一区小说| 日韩影视精彩在线| 91精品国产高清一区二区三区蜜臀 | 欧美一区二区三区视频在线观看| 亚洲国产欧美在线| 欧美老女人第四色| 欧美96一区二区免费视频| 日韩欧美自拍偷拍| 激情久久五月天| 国产喂奶挤奶一区二区三区| 国产91精品一区二区| 国产精品国产三级国产a| av中文一区二区三区| 亚洲综合男人的天堂| 欧美日韩免费观看一区三区| 日韩高清一级片| 欧美mv和日韩mv国产网站| 国产精品99久久久久久宅男| 久久精品一区二区三区不卡牛牛| 国产成人av影院| 亚洲另类在线一区| 91精品一区二区三区久久久久久| 麻豆国产精品一区二区三区| 国产亚洲va综合人人澡精品| 91麻豆免费观看| 亚洲成人精品影院| 欧美成人综合网站| 成人精品鲁一区一区二区| 一区二区三区免费在线观看| 91精品国产综合久久小美女| 国产一区二区福利视频| 亚洲人成网站在线| 91精品国产手机| 国产精品456露脸| 成人精品视频网站| 一区二区三区四区在线免费观看| 欧美肥大bbwbbw高潮| 国产jizzjizz一区二区| 亚洲自拍偷拍欧美| 2023国产精品自拍| 日本精品免费观看高清观看| 美女视频网站黄色亚洲| 国产精品三级在线观看| 精品视频123区在线观看| 精品一区二区精品| 亚洲人成电影网站色mp4| 69p69国产精品| 99精品欧美一区二区三区小说| 偷偷要91色婷婷| 国产精品久久久久久久久晋中 | 日韩欧美资源站| 成人短视频下载| 美女网站一区二区| 亚洲欧美一区二区三区极速播放| 欧美不卡一区二区三区| 91精彩视频在线| 国产精品夜夜爽| 视频一区二区三区中文字幕| 欧美激情综合网| 日韩视频免费观看高清完整版在线观看 | 91精品在线观看入口| 99精品视频在线播放观看| 另类综合日韩欧美亚洲| 亚洲综合色噜噜狠狠| 国产人久久人人人人爽| 日韩一区二区在线看片| 日本高清无吗v一区| 床上的激情91.| 激情都市一区二区| 日韩电影一区二区三区| 亚洲色大成网站www久久九九| 欧美一区二区三区色| 色综合天天性综合| 国产99久久久国产精品潘金 | 高潮精品一区videoshd| 久久国产成人午夜av影院| 亚洲成av人片在线观看无码| 亚洲色图制服丝袜| 欧美国产视频在线| 久久亚区不卡日本| 日韩欧美国产综合在线一区二区三区 | 91精品国产黑色紧身裤美女| 色欧美片视频在线观看在线视频| 丁香天五香天堂综合| 精品一区二区三区在线视频| 婷婷国产v国产偷v亚洲高清| 亚洲伊人色欲综合网| 亚洲欧美视频在线观看| 成人毛片老司机大片| 韩国午夜理伦三级不卡影院| 热久久国产精品| 日本视频在线一区| 日韩高清国产一区在线| 三级成人在线视频| 日韩黄色一级片| 日韩电影在线免费观看| 五月婷婷久久综合| 日韩黄色片在线观看| 青娱乐精品在线视频|