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

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

?? truncate.c

?? 內(nèi)核是系統(tǒng)的心臟
?? C
字號:
/*
 *  linux/fs/ext/truncate.c
 *
 *  Copyright (C) 1992  Remy Card (card@masi.ibp.fr)
 *
 *  from
 *
 *  linux/fs/minix/truncate.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 */

#include <linux/sched.h>
#include <linux/ext_fs.h>
#include <linux/stat.h>
#include <linux/fcntl.h>
#include <linux/errno.h>

/*
 * 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;
	int retry = 0;
#define DIRECT_BLOCK ((inode->i_size + 1023) >> 10)

repeat:
	for (i = DIRECT_BLOCK ; i < 9 ; i++) {
		p = inode->u.ext_i.i_data+i;
		if (!(tmp = *p))
			continue;
		bh = getblk(inode->i_dev,tmp,BLOCK_SIZE);
		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_dirt = 1;
		brelse(bh);
		ext_free_block(inode->i_sb,tmp);
	}
	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;
	int retry = 0;
#define INDIRECT_BLOCK (DIRECT_BLOCK-offset)

	tmp = *p;
	if (!tmp)
		return 0;
	ind_bh = bread(inode->i_dev, tmp, BLOCK_SIZE);
	if (tmp != *p) {
		brelse(ind_bh);
		return 1;
	}
	if (!ind_bh) {
		*p = 0;
		return 0;
	}
repeat:
	for (i = INDIRECT_BLOCK ; i < 256 ; 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;
		bh = getblk(inode->i_dev,tmp,BLOCK_SIZE);
		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;
		brelse(bh);
		ext_free_block(inode->i_sb,tmp);
	}
	ind = (unsigned long *) ind_bh->b_data;
	for (i = 0; i < 256; i++)
		if (*(ind++))
			break;
	if (i >= 256)
		if (ind_bh->b_count != 1)
			retry = 1;
		else {
			tmp = *p;
			*p = 0;
			inode->i_dirt = 1;
			ext_free_block(inode->i_sb,tmp);
		}
	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;
#define DINDIRECT_BLOCK ((DIRECT_BLOCK-offset)>>8)

	tmp = *p;
	if (!tmp)
		return 0;
	dind_bh = bread(inode->i_dev, tmp, BLOCK_SIZE);
	if (tmp != *p) {
		brelse(dind_bh);
		return 1;
	}
	if (!dind_bh) {
		*p = 0;
		return 0;
	}
repeat:
	for (i = DINDIRECT_BLOCK ; i < 256 ; 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<<8),dind);
		dind_bh->b_dirt = 1;
	}
	dind = (unsigned long *) dind_bh->b_data;
	for (i = 0; i < 256; i++)
		if (*(dind++))
			break;
	if (i >= 256)
		if (dind_bh->b_count != 1)
			retry = 1;
		else {
			tmp = *p;
			*p = 0;
			inode->i_dirt = 1;
			ext_free_block(inode->i_sb,tmp);
		}
	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;
#define TINDIRECT_BLOCK ((DIRECT_BLOCK-(256*256+256+9))>>16)

	p = inode->u.ext_i.i_data+11;
	if (!(tmp = *p))
		return 0;
	tind_bh = bread(inode->i_dev, tmp, BLOCK_SIZE);
	if (tmp != *p) {
		brelse(tind_bh);
		return 1;
	}
	if (!tind_bh) {
		*p = 0;
		return 0;
	}
repeat:
	for (i = TINDIRECT_BLOCK ; i < 256 ; i ++) {
		if (i < 0)
			i = 0;
		if (i < TINDIRECT_BLOCK)
			goto repeat;
		tind = i+(unsigned long *) tind_bh->b_data;
		retry |= trunc_dindirect(inode,9+256+256*256+(i<<16),tind);
		tind_bh->b_dirt = 1;
	}
	tind = (unsigned long *) tind_bh->b_data;
	for (i = 0; i < 256; i++)
		if (*(tind++))
			break;
	if (i >= 256)
		if (tind_bh->b_count != 1)
			retry = 1;
		else {
			tmp = *p;
			*p = 0;
			inode->i_dirt = 1;
			ext_free_block(inode->i_sb,tmp);
		}
	brelse(tind_bh);
	return retry;
}

void ext_truncate(struct inode * inode)
{
	int retry;

	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
	     S_ISLNK(inode->i_mode)))
		return;
	while (1) {
		retry = trunc_direct(inode);
		retry |= trunc_indirect(inode,9,inode->u.ext_i.i_data+9);
		retry |= trunc_dindirect(inode,9+256,inode->u.ext_i.i_data+10);
		retry |= trunc_tindirect(inode);
		if (!retry)
			break;
		current->counter = 0;
		schedule();
	}
	inode->i_mtime = inode->i_ctime = CURRENT_TIME;
	inode->i_dirt = 1;
}

/*
 * Called when a inode is released. Note that this is different
 * from ext_open: open gets called at every open, but release
 * gets called only when /all/ the files are closed.
 */
void ext_release(struct inode * inode, struct file * filp)
{
	printk("ext_release not implemented\n");
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆国产精品一区二区三区 | 国产精品一级二级三级| 国产精品伦一区二区三级视频| 欧美日韩视频第一区| 99国产欧美久久久精品| 狠狠色丁香婷综合久久| 三级亚洲高清视频| 椎名由奈av一区二区三区| 精品成人在线观看| 欧美欧美午夜aⅴ在线观看| 99久久久无码国产精品| 国产精品一区二区你懂的| 毛片一区二区三区| 天堂成人免费av电影一区| 亚洲激情在线播放| 国产精品乱人伦| 国产亚洲成年网址在线观看| 精品国产91洋老外米糕| 日韩视频123| 日韩一区二区三区视频在线观看| 欧美日韩精品一区二区三区蜜桃| 99精品视频一区| 成人国产精品免费| 成人综合婷婷国产精品久久蜜臀| 国产一区二区在线观看视频| 蜜芽一区二区三区| 玖玖九九国产精品| 免费看日韩a级影片| 视频一区二区不卡| 日韩国产欧美三级| 日韩成人av影视| 喷水一区二区三区| 日韩极品在线观看| 日韩福利电影在线| 免费观看30秒视频久久| 日韩av成人高清| 麻豆久久久久久| 精品亚洲成a人| 国产在线观看一区二区| 国产精品一色哟哟哟| 国产麻豆9l精品三级站| 国产成人福利片| 成人性生交大片免费看在线播放| 国产99一区视频免费| 成人午夜伦理影院| 成人91在线观看| 成人黄页在线观看| 91视视频在线观看入口直接观看www | 日韩高清电影一区| 久久精品免费看| 国产精品 日产精品 欧美精品| 国产麻豆91精品| 成人激情综合网站| 91国偷自产一区二区三区观看| 91官网在线免费观看| 欧美日韩亚洲高清一区二区| 91精品国产综合久久香蕉的特点| 日韩一级二级三级| 国产三区在线成人av| 亚洲国产精品黑人久久久| 亚洲人成伊人成综合网小说| 一区二区三区在线看| 日韩精品一二三| 国产成人综合网站| 色综合久久中文字幕| 欧美性生活影院| 777午夜精品视频在线播放| 精品电影一区二区三区| 中文字幕中文字幕一区| 亚洲成人三级小说| 国产精品一区二区你懂的| 色视频成人在线观看免| 4438成人网| 国产精品福利一区二区三区| 午夜成人在线视频| 国产精品一区二区x88av| 欧美在线观看视频一区二区三区 | 在线成人高清不卡| 久久综合999| 有码一区二区三区| 国内精品国产三级国产a久久 | 欧美在线免费视屏| 欧美成人福利视频| 亚洲裸体在线观看| 极品少妇xxxx精品少妇| 色综合网色综合| 欧美精品一区二区三区一线天视频| 国产精品国产成人国产三级| 免费欧美在线视频| 色婷婷综合久色| 久久综合九色综合97婷婷女人| 亚洲一区二区三区四区的| 国产精品一区二区久久不卡| 欧美日韩高清在线播放| 中文字幕综合网| 蜜桃视频在线观看一区二区| 色欧美乱欧美15图片| 久久久久一区二区三区四区| 亚洲一区二区影院| av在线不卡电影| 精品国产露脸精彩对白| 亚洲综合色成人| 99热精品一区二区| 久久综合999| 奇米影视一区二区三区| 91电影在线观看| 中文字幕人成不卡一区| 国产高清在线观看免费不卡| 日韩免费在线观看| 午夜视频久久久久久| 在线免费观看日韩欧美| 中文字幕视频一区| 国产精品18久久久久久vr| 日韩一卡二卡三卡四卡| 一区二区三区久久久| av在线这里只有精品| 久久久久久久综合| 久久99久久久欧美国产| 日韩亚洲欧美一区| 三级影片在线观看欧美日韩一区二区| 91免费小视频| 亚洲欧洲日本在线| eeuss鲁片一区二区三区在线看| 久久久久国产精品麻豆| 国内精品免费在线观看| 精品国产污网站| 精品一区二区精品| 精品va天堂亚洲国产| 极品少妇一区二区| 久久九九影视网| 高潮精品一区videoshd| 日本一区二区成人在线| 国产成人精品亚洲777人妖| 精品国产髙清在线看国产毛片| 日本成人在线网站| 欧美大白屁股肥臀xxxxxx| 麻豆一区二区三| 久久久精品蜜桃| 粉嫩av一区二区三区在线播放| 国产精品日日摸夜夜摸av| 99国产精品久久久久久久久久久| 国产精品国产三级国产aⅴ入口| 99热这里都是精品| 一区二区国产盗摄色噜噜| 欧美日韩一区二区三区不卡| 亚洲黄色片在线观看| 欧美久久久久中文字幕| 久久精品国产99久久6| 国产欧美日韩不卡免费| 成人a免费在线看| 亚洲黄色录像片| 日韩一级完整毛片| 国产成人午夜99999| 国产精品久久久久四虎| 在线影视一区二区三区| 日本 国产 欧美色综合| 国产精品久久久一本精品| 99re66热这里只有精品3直播| 一区二区三区欧美久久| 日韩一卡二卡三卡四卡| 国产91在线|亚洲| 亚洲一区二区精品久久av| 欧美一区二区三区日韩视频| 国产一区二区三区免费播放| 亚洲欧洲另类国产综合| 欧美亚洲综合在线| 国产一区三区三区| 亚洲精品国产一区二区三区四区在线| 欧美色男人天堂| 国产一二三精品| 一区二区三区欧美久久| 亚洲精品在线观看视频| 91在线观看高清| 久久超碰97人人做人人爱| 中文字幕在线一区免费| 欧美一区二区三区不卡| 丁香婷婷深情五月亚洲| 亚洲444eee在线观看| 国产欧美一区二区三区网站| 欧美丝袜丝交足nylons图片| 国产精品夜夜嗨| 婷婷成人激情在线网| 国产欧美精品一区aⅴ影院 | 久久在线免费观看| 91福利资源站| 国产suv一区二区三区88区| 日韩精品一级中文字幕精品视频免费观看 | 在线影视一区二区三区| 国产一区二区在线影院| 五月天精品一区二区三区| 国产精品免费av| 日韩精品在线网站| 欧美亚洲日本国产| 成人中文字幕合集| 久久99精品国产.久久久久久| 亚洲综合一区二区| 国产精品久久久久久久第一福利| 精品三级在线看| 欧美精品tushy高清| 色综合咪咪久久|