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

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

?? balloc.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 *  linux/fs/sysv/balloc.c
 *
 *  minix/bitmap.c
 *  Copyright (C) 1991, 1992  Linus Torvalds
 *
 *  ext/freelists.c
 *  Copyright (C) 1992  Remy Card (card@masi.ibp.fr)
 *
 *  xenix/alloc.c
 *  Copyright (C) 1992  Doug Evans
 *
 *  coh/alloc.c
 *  Copyright (C) 1993  Pascal Haible, Bruno Haible
 *
 *  sysv/balloc.c
 *  Copyright (C) 1993  Bruno Haible
 *
 *  This file contains code for allocating/freeing blocks.
 */

#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/sysv_fs.h>
#include <linux/string.h>
#include <linux/locks.h>

/* We don't trust the value of
   sb->sv_sbd->s_tfree = *sb->sv_sb_total_free_blocks
   but we nevertheless keep it up to date. */

extern inline void memzero (void * s, size_t count)
{
__asm__("cld\n\t"
	"rep\n\t"
	"stosl"
	:
	:"a" (0),"D" (s),"c" (count/4)
	:"cx","di","memory");
}

void sysv_free_block(struct super_block * sb, unsigned int block)
{
	struct buffer_head * bh;
	char * bh_data;

	if (!sb) {
		printk("sysv_free_block: trying to free block on nonexistent device\n");
		return;
	}
	if (block < sb->sv_firstdatazone || block >= sb->sv_nzones) {
		printk("sysv_free_block: trying to free block not in datazone\n");
		return;
	}
	lock_super(sb);
	if (*sb->sv_sb_flc_count > sb->sv_flc_size) {
		printk("sysv_free_block: flc_count > flc_size\n");
		unlock_super(sb);
		return;
	}
	/* If the free list head in super-block is full, it is copied
	 * into this block being freed:
	 */
	if (*sb->sv_sb_flc_count == sb->sv_flc_size) {
		unsigned short * flc_count;
		unsigned long * flc_blocks;

		if (sb->sv_block_size_ratio_bits > 0) /* block_size < BLOCK_SIZE ? */
			bh = bread(sb->s_dev, (block >> sb->sv_block_size_ratio_bits) + sb->sv_block_base, BLOCK_SIZE);
		else
			bh = getblk(sb->s_dev, (block >> sb->sv_block_size_ratio_bits) + sb->sv_block_base, BLOCK_SIZE);
		if (!bh) {
			printk("sysv_free_block: getblk() or bread() failed\n");
			unlock_super(sb);
			return;
		}
		bh_data = bh->b_data + ((block & sb->sv_block_size_ratio_1) << sb->sv_block_size_bits);
		switch (sb->sv_type) {
			case FSTYPE_XENIX:
				flc_count = &((struct xenix_freelist_chunk *) bh_data)->fl_nfree;
				flc_blocks = &((struct xenix_freelist_chunk *) bh_data)->fl_free[0];
				break;
			case FSTYPE_SYSV4:
				flc_count = &((struct sysv4_freelist_chunk *) bh_data)->fl_nfree;
				flc_blocks = &((struct sysv4_freelist_chunk *) bh_data)->fl_free[0];
				break;
			case FSTYPE_SYSV2:
				flc_count = &((struct sysv2_freelist_chunk *) bh_data)->fl_nfree;
				flc_blocks = &((struct sysv2_freelist_chunk *) bh_data)->fl_free[0];
				break;
			case FSTYPE_COH:
				flc_count = &((struct coh_freelist_chunk *) bh_data)->fl_nfree;
				flc_blocks = &((struct coh_freelist_chunk *) bh_data)->fl_free[0];
				break;
			default: panic("sysv_free_block: invalid fs type\n");
		}
		*flc_count = *sb->sv_sb_flc_count; /* = sb->sv_flc_size */
		memcpy(flc_blocks, sb->sv_sb_flc_blocks, *flc_count * sizeof(sysv_zone_t));
		bh->b_dirt = 1;
		bh->b_uptodate = 1;
		brelse(bh);
		*sb->sv_sb_flc_count = 0;
	} else
	/* If the free list head in super-block is empty, create a new head
	 * in this block being freed:
	 */
	if (*sb->sv_sb_flc_count == 0) { /* Applies only to Coherent FS */
		if (sb->sv_block_size_ratio_bits > 0) /* block_size < BLOCK_SIZE ? */
			bh = bread(sb->s_dev, (block >> sb->sv_block_size_ratio_bits) + sb->sv_block_base, BLOCK_SIZE);
		else
			bh = getblk(sb->s_dev, (block >> sb->sv_block_size_ratio_bits) + sb->sv_block_base, BLOCK_SIZE);
		if (!bh) {
			printk("sysv_free_block: getblk() or bread() failed\n");
			unlock_super(sb);
			return;
		}
		bh_data = bh->b_data + ((block & sb->sv_block_size_ratio_1) << sb->sv_block_size_bits);
		memzero(bh_data, sb->sv_block_size);
		/* this implies ((struct ..._freelist_chunk *) bh_data)->flc_count = 0; */
		bh->b_dirt = 1;
		bh->b_uptodate = 1;
		brelse(bh);
		/* still *sb->sv_sb_flc_count = 0 */
	} else {
		if (sb->sv_block_size_ratio_bits == 0) { /* block_size == BLOCK_SIZE ? */
			/* Throw away block's contents */
			bh = get_hash_table(sb->s_dev, (block >> sb->sv_block_size_ratio_bits) + sb->sv_block_base, BLOCK_SIZE);
			if (bh)
				bh->b_dirt = 0;
			brelse(bh);
		}
	}
	if (sb->sv_convert)
		block = to_coh_ulong(block);
	sb->sv_sb_flc_blocks[(*sb->sv_sb_flc_count)++] = block;
	if (sb->sv_convert)
		*sb->sv_sb_total_free_blocks =
		  to_coh_ulong(from_coh_ulong(*sb->sv_sb_total_free_blocks) + 1);
	else
		*sb->sv_sb_total_free_blocks = *sb->sv_sb_total_free_blocks + 1;
	sb->sv_bh->b_dirt = 1; /* super-block has been modified */
	sb->s_dirt = 1; /* and needs time stamp */
	unlock_super(sb);
}

int sysv_new_block(struct super_block * sb)
{
	unsigned int block;
	struct buffer_head * bh;
	char * bh_data;

	if (!sb) {
		printk("sysv_new_block: trying to get new block from nonexistent device\n");
		return 0;
	}
	lock_super(sb);
	if (*sb->sv_sb_flc_count == 0) { /* Applies only to Coherent FS */
		unlock_super(sb);
		return 0;		/* no blocks available */
	}
	block = sb->sv_sb_flc_blocks[(*sb->sv_sb_flc_count)-1];
	if (sb->sv_convert)
		block = from_coh_ulong(block);
	if (block == 0) { /* Applies only to Xenix FS, SystemV FS */
		unlock_super(sb);
		return 0;		/* no blocks available */
	}
	(*sb->sv_sb_flc_count)--;
	if (block < sb->sv_firstdatazone || block >= sb->sv_nzones) {
		printk("sysv_new_block: new block %d is not in data zone\n",block);
		unlock_super(sb);
		return 0;
	}
	if (*sb->sv_sb_flc_count == 0) { /* the last block continues the free list */
		unsigned short * flc_count;
		unsigned long * flc_blocks;

		if (!(bh = sysv_bread(sb, sb->s_dev, block, &bh_data))) {
			printk("sysv_new_block: cannot read free-list block\n");
			/* retry this same block next time */
			(*sb->sv_sb_flc_count)++;
			unlock_super(sb);
			return 0;
		}
		switch (sb->sv_type) {
			case FSTYPE_XENIX:
				flc_count = &((struct xenix_freelist_chunk *) bh_data)->fl_nfree;
				flc_blocks = &((struct xenix_freelist_chunk *) bh_data)->fl_free[0];
				break;
			case FSTYPE_SYSV4:
				flc_count = &((struct sysv4_freelist_chunk *) bh_data)->fl_nfree;
				flc_blocks = &((struct sysv4_freelist_chunk *) bh_data)->fl_free[0];
				break;
			case FSTYPE_SYSV2:
				flc_count = &((struct sysv2_freelist_chunk *) bh_data)->fl_nfree;
				flc_blocks = &((struct sysv2_freelist_chunk *) bh_data)->fl_free[0];
				break;
			case FSTYPE_COH:
				flc_count = &((struct coh_freelist_chunk *) bh_data)->fl_nfree;
				flc_blocks = &((struct coh_freelist_chunk *) bh_data)->fl_free[0];
				break;
			default: panic("sysv_new_block: invalid fs type\n");
		}
		if (*flc_count > sb->sv_flc_size) {
			printk("sysv_new_block: free-list block with >flc_size entries\n");
			brelse(bh);
			unlock_super(sb);
			return 0;
		}
		*sb->sv_sb_flc_count = *flc_count;
		memcpy(sb->sv_sb_flc_blocks, flc_blocks, *flc_count * sizeof(sysv_zone_t));
		brelse(bh);
	}
	/* Now the free list head in the superblock is valid again. */
	if (sb->sv_block_size_ratio_bits > 0) /* block_size < BLOCK_SIZE ? */
		bh = bread(sb->s_dev, (block >> sb->sv_block_size_ratio_bits) + sb->sv_block_base, BLOCK_SIZE);
	else
		bh = getblk(sb->s_dev, (block >> sb->sv_block_size_ratio_bits) + sb->sv_block_base, BLOCK_SIZE);
	if (!bh) {
		printk("sysv_new_block: getblk() or bread() failed\n");
		unlock_super(sb);
		return 0;
	}
	bh_data = bh->b_data + ((block & sb->sv_block_size_ratio_1) << sb->sv_block_size_bits);
	if (sb->sv_block_size_ratio_bits == 0) /* block_size == BLOCK_SIZE ? */
		if (bh->b_count != 1) {
			printk("sysv_new_block: block already in use\n");
			unlock_super(sb);
			return 0;
		}
	memzero(bh_data,sb->sv_block_size);
	bh->b_dirt = 1;
	bh->b_uptodate = 1;
	brelse(bh);
	if (sb->sv_convert)
		*sb->sv_sb_total_free_blocks =
		  to_coh_ulong(from_coh_ulong(*sb->sv_sb_total_free_blocks) - 1);
	else
		*sb->sv_sb_total_free_blocks = *sb->sv_sb_total_free_blocks - 1;
	sb->sv_bh->b_dirt = 1; /* super-block has been modified */
	sb->s_dirt = 1; /* and needs time stamp */
	unlock_super(sb);
	return block;
}

unsigned long sysv_count_free_blocks(struct super_block * sb)
{
#if 1 /* test */
	int count, old_count;
	unsigned int block;
	struct buffer_head * bh;
	char * bh_data;
	int i;

	/* this causes a lot of disk traffic ... */
	count = 0;
	lock_super(sb);
	if (*sb->sv_sb_flc_count > 0) {
		for (i = *sb->sv_sb_flc_count ; /* i > 0 */ ; ) {
			block = sb->sv_sb_flc_blocks[--i];
			if (sb->sv_convert)
				block = from_coh_ulong(block);
			if (block == 0) /* block 0 terminates list */
				goto done;
			count++;
			if (i == 0)
				break;
		}
		/* block = sb->sv_sb_flc_blocks[0], the last block continues the free list */
		while (1) {
			unsigned short * flc_count;
			unsigned long * flc_blocks;

			if (block < sb->sv_firstdatazone || block >= sb->sv_nzones) {
				printk("sysv_count_free_blocks: new block %d is not in data zone\n",block);
				break;
			}
			if (!(bh = sysv_bread(sb, sb->s_dev, block, &bh_data))) {
				printk("sysv_count_free_blocks: cannot read free-list block\n");
				break;
			}
			switch (sb->sv_type) {
				case FSTYPE_XENIX:
					flc_count = &((struct xenix_freelist_chunk *) bh_data)->fl_nfree;
					flc_blocks = &((struct xenix_freelist_chunk *) bh_data)->fl_free[0];
					break;
				case FSTYPE_SYSV4:
					flc_count = &((struct sysv4_freelist_chunk *) bh_data)->fl_nfree;
					flc_blocks = &((struct sysv4_freelist_chunk *) bh_data)->fl_free[0];
					break;
				case FSTYPE_SYSV2:
					flc_count = &((struct sysv2_freelist_chunk *) bh_data)->fl_nfree;
					flc_blocks = &((struct sysv2_freelist_chunk *) bh_data)->fl_free[0];
					break;
				case FSTYPE_COH:
					flc_count = &((struct coh_freelist_chunk *) bh_data)->fl_nfree;
					flc_blocks = &((struct coh_freelist_chunk *) bh_data)->fl_free[0];
					break;
				default: panic("sysv_count_free_blocks: invalid fs type\n");
			}
			if (*flc_count > sb->sv_flc_size) {
				printk("sysv_count_free_blocks: free-list block with >flc_size entries\n");
				brelse(bh);
				break;
			}
			if (*flc_count == 0) { /* Applies only to Coherent FS */
				brelse(bh);
				break;
			}
			for (i = *flc_count ; /* i > 0 */ ; ) {
				block = flc_blocks[--i];
				if (sb->sv_convert)
					block = from_coh_ulong(block);
				if (block == 0) /* block 0 terminates list */
					break;
				count++;
				if (i == 0)
					break;
			}
			/* block = flc_blocks[0], the last block continues the free list */
			brelse(bh);
			if (block == 0) /* Applies only to Xenix FS and SystemV FS */
				break;
		}
		done: ;
	}
	old_count = *sb->sv_sb_total_free_blocks;
	if (sb->sv_convert)
		old_count = from_coh_ulong(old_count);
	if (count != old_count) {
		printk("sysv_count_free_blocks: free block count was %d, correcting to %d\n",old_count,count);
		if (!(sb->s_flags & MS_RDONLY)) {
			*sb->sv_sb_total_free_blocks = (sb->sv_convert ? to_coh_ulong(count) : count);
			sb->sv_bh->b_dirt = 1; /* super-block has been modified */
			sb->s_dirt = 1; /* and needs time stamp */
		}
	}
	unlock_super(sb);
	return count;
#else
	int count;

	count = *sb->sv_sb_total_free_blocks;
	if (sb->sv_convert)
		count = from_coh_ulong(count);
	return count;
#endif
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
三级影片在线观看欧美日韩一区二区 | 国产精品不卡在线| 亚洲欧美日韩国产成人精品影院| 日韩黄色在线观看| 日本高清无吗v一区| 欧美激情在线免费观看| 久久国产尿小便嘘嘘| 欧美影院一区二区三区| 最近日韩中文字幕| 国产不卡视频在线播放| 精品国产人成亚洲区| 日韩精品免费专区| 欧美日韩国产高清一区| 一区二区成人在线| av一区二区三区在线| 国产午夜精品美女毛片视频| 精品中文字幕一区二区小辣椒| 欧美男同性恋视频网站| 亚洲一区影音先锋| 色婷婷精品大在线视频| 最新成人av在线| 成人国产亚洲欧美成人综合网| 精品人在线二区三区| 日韩电影在线免费看| 欧美性猛片xxxx免费看久爱| 一区二区视频在线| 色综合激情五月| 亚洲欧洲成人自拍| 97se亚洲国产综合自在线观| 亚洲欧洲精品天堂一级| av中文字幕一区| 亚洲色欲色欲www| 色中色一区二区| 亚洲精品日日夜夜| 欧美在线不卡一区| 亚洲大片精品永久免费| 精品视频在线视频| 日本va欧美va精品| 亚洲精品在线三区| 丁香婷婷综合网| 国产精品不卡在线| 91久久人澡人人添人人爽欧美| 亚洲欧洲综合另类| 欧美四级电影网| 婷婷综合另类小说色区| 欧美电影精品一区二区| 国产精品一区二区不卡| 中文字幕成人在线观看| 色综合久久久久综合| 五月婷婷久久综合| 精品久久久影院| 成人av高清在线| 一级女性全黄久久生活片免费| 欧美日韩一区二区在线视频| 日韩电影免费在线看| 久久精品免费在线观看| 91视频91自| 奇米影视一区二区三区小说| 国产亚洲欧美日韩俺去了| 99在线热播精品免费| 天天亚洲美女在线视频| 久久影院午夜论| 欧美主播一区二区三区| 韩国成人精品a∨在线观看| 亚洲欧美日韩在线播放| 日韩午夜激情av| 9人人澡人人爽人人精品| 日韩va亚洲va欧美va久久| 2017欧美狠狠色| 欧美专区日韩专区| 国产福利一区二区三区| 亚洲.国产.中文慕字在线| 国产人成一区二区三区影院| 欧美视频一区二区三区四区| 国产乱码精品一区二区三区av| 亚洲日本护士毛茸茸| 日韩欧美在线123| 91丨porny丨国产| 国产一区在线视频| 爽好多水快深点欧美视频| 国产精品污网站| 精品国偷自产国产一区| 欧美午夜在线一二页| 岛国精品在线播放| 老司机精品视频在线| 亚洲韩国精品一区| 亚洲欧洲精品一区二区三区不卡 | 久久久久久免费网| 欧美视频一区在线| 91老司机福利 在线| 国产一本一道久久香蕉| 免费欧美日韩国产三级电影| 亚洲情趣在线观看| 国产精品少妇自拍| 精品99一区二区| 欧美一区二区三区爱爱| 精品1区2区3区| 91精品1区2区| 成人不卡免费av| 国产美女娇喘av呻吟久久| 日韩av中文字幕一区二区三区| 一区二区三区精品视频| 亚洲卡通欧美制服中文| 中文字幕制服丝袜一区二区三区| www国产精品av| 678五月天丁香亚洲综合网| 欧美午夜一区二区| 欧美日精品一区视频| 欧美在线一区二区| 欧美视频中文一区二区三区在线观看 | 久久久99久久| 精品不卡在线视频| 久久蜜臀精品av| 中文字幕精品—区二区四季| 欧美国产日本视频| 国产精品久久久久久久蜜臀| 中文字幕欧美国产| 成人免费在线视频| 亚洲精品少妇30p| 亚洲午夜久久久久久久久电影院| 亚洲免费av观看| 亚洲自拍都市欧美小说| 日韩影视精彩在线| 久久成人精品无人区| 韩国成人在线视频| a亚洲天堂av| 欧美色图天堂网| 欧美变态口味重另类| 国产三级一区二区| 中文字幕一区二区三区在线不卡| 中文字幕在线不卡| 亚洲自拍偷拍九九九| 美女视频第一区二区三区免费观看网站| 免费观看在线综合色| 国产成人免费在线视频| 91色porny在线视频| 欧美三级视频在线播放| 日韩精品中文字幕在线不卡尤物| 久久久亚洲精品一区二区三区| 国产亚洲制服色| 亚洲在线免费播放| 捆绑紧缚一区二区三区视频| 丁香桃色午夜亚洲一区二区三区| 成人sese在线| 欧美精品一二三区| 久久夜色精品国产噜噜av| 亚洲人一二三区| 热久久一区二区| 成人久久久精品乱码一区二区三区| 国产盗摄女厕一区二区三区| 99re这里都是精品| 日韩视频在线永久播放| 亚洲欧洲韩国日本视频| 视频一区欧美精品| 9人人澡人人爽人人精品| 91精品免费在线| 最新高清无码专区| 国产综合色在线| 欧美丝袜丝交足nylons| 国产精品人成在线观看免费| 日本午夜一区二区| 91麻豆视频网站| 久久网站最新地址| 性做久久久久久| 波多野结衣欧美| 精品国偷自产国产一区| 午夜不卡av在线| a4yy欧美一区二区三区| 久久先锋影音av鲁色资源| 亚洲成人免费电影| 色诱视频网站一区| 欧美国产成人在线| 美女久久久精品| 欧美日本韩国一区| 亚洲精品一卡二卡| 国产美女在线观看一区| 欧美一级高清大全免费观看| 悠悠色在线精品| 91麻豆免费看片| 国产精品成人一区二区艾草| 国产一区二区女| 欧美va亚洲va| 免费在线视频一区| 欧美绝品在线观看成人午夜影视| 亚洲日本在线视频观看| 成人h精品动漫一区二区三区| 精品国产免费一区二区三区四区 | 国产一区二三区| 日韩免费视频线观看| 日本sm残虐另类| 日韩视频免费观看高清完整版 | 国产成人一级电影| 精品国产一区二区在线观看| 午夜成人免费电影| 777a∨成人精品桃花网| 日韩中文字幕亚洲一区二区va在线| 欧美日韩一二三区| 丝袜美腿高跟呻吟高潮一区| 欧美老女人在线| 日本在线不卡一区|