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

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

?? file.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 *  linux/fs/ext2/file.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/file.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 *
 *  ext2 fs regular file handling primitives
 */

#include <asm/segment.h>
#include <asm/system.h>

#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	NBUF	32

#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

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

static int ext2_file_read (struct inode *, struct file *, char *, int);
static int ext2_file_write (struct inode *, struct file *, char *, int);
static void ext2_release_file (struct inode *, struct file *);

/*
 * We have mostly NULL's here: the current defaults are ok for
 * the ext2 filesystem.
 */
static struct file_operations ext2_file_operations = {
	NULL,			/* lseek - default */
	ext2_file_read,		/* read */
	ext2_file_write,	/* write */
	NULL,			/* readdir - bad */
	NULL,			/* select - default */
	ext2_ioctl,		/* ioctl */
	generic_mmap,  		/* mmap */
	NULL,			/* no special open is needed */
	ext2_release_file,	/* release */
	ext2_sync_file		/* fsync */
};

struct inode_operations ext2_file_inode_operations = {
	&ext2_file_operations,/* default file operations */
	NULL,			/* create */
	NULL,			/* lookup */
	NULL,			/* link */
	NULL,			/* unlink */
	NULL,			/* symlink */
	NULL,			/* mkdir */
	NULL,			/* rmdir */
	NULL,			/* mknod */
	NULL,			/* rename */
	NULL,			/* readlink */
	NULL,			/* follow_link */
	ext2_bmap,		/* bmap */
	ext2_truncate,		/* truncate */
	ext2_permission		/* permission */
};

static int ext2_file_read (struct inode * inode, struct file * filp,
		    char * buf, int count)
{
	int read, left, chars;
	int block, blocks, offset;
	int bhrequest, uptodate;
	struct buffer_head ** bhb, ** bhe;
	struct buffer_head * bhreq[NBUF];
	struct buffer_head * buflist[NBUF];
	struct super_block * sb;
	unsigned int size;
	int err;

	if (!inode) {
		printk ("ext2_file_read: inode = NULL\n");
		return -EINVAL;
	}
	sb = inode->i_sb;
	if (!S_ISREG(inode->i_mode)) {
		ext2_warning (sb, "ext2_file_read", "mode = %07o",
			      inode->i_mode);
		return -EINVAL;
	}
	offset = filp->f_pos;
	size = inode->i_size;
	if (offset > size)
		left = 0;
	else
		left = size - offset;
	if (left > count)
		left = count;
	if (left <= 0)
		return 0;
	read = 0;
	block = offset >> EXT2_BLOCK_SIZE_BITS(sb);
	offset &= (sb->s_blocksize - 1);
	size = (size + sb->s_blocksize - 1) >> EXT2_BLOCK_SIZE_BITS(sb);
	blocks = (left + offset + sb->s_blocksize - 1) >> EXT2_BLOCK_SIZE_BITS(sb);
	bhb = bhe = buflist;
	if (filp->f_reada) {
		blocks += read_ahead[MAJOR(inode->i_dev)] >>
			(EXT2_BLOCK_SIZE_BITS(sb) - 9);
		if (block + blocks > size)
			blocks = size - block;
	}

	/*
	 * We do this in a two stage process.  We first try and request
	 * as many blocks as we can, then we wait for the first one to
	 * complete, and then we try and wrap up as many as are actually
	 * done.  This routine is rather generic, in that it can be used
	 * in a filesystem by substituting the appropriate function in
	 * for getblk
	 *
	 * This routine is optimized to make maximum use of the various
	 * buffers and caches.
	 */

	do {
		bhrequest = 0;
		uptodate = 1;
		while (blocks) {
			--blocks;
			*bhb = ext2_getblk (inode, block++, 0, &err);
			if (*bhb && !(*bhb)->b_uptodate) {
				uptodate = 0;
				bhreq[bhrequest++] = *bhb;
			}

			if (++bhb == &buflist[NBUF])
				bhb = buflist;

			/*
			 * If the block we have on hand is uptodate, go ahead
			 * and complete processing
			 */
			if (uptodate)
				break;

			if (bhb == bhe)
				break;
		}

		/*
		 * Now request them all
		 */
		if (bhrequest)
			ll_rw_block (READ, bhrequest, bhreq);

		do {
			/*
			 * Finish off all I/O that has actually completed
			 */
			if (*bhe) {
				wait_on_buffer (*bhe);
				if (!(*bhe)->b_uptodate) { /* read error? */
				        brelse(*bhe);
					if (++bhe == &buflist[NBUF])
					  bhe = buflist;
					left = 0;
					break;
				}
			}
			if (left < sb->s_blocksize - offset)
				chars = left;
			else
				chars = sb->s_blocksize - offset;
			filp->f_pos += chars;
			left -= chars;
			read += chars;
			if (*bhe) {
				memcpy_tofs (buf, offset + (*bhe)->b_data,
					     chars);
				brelse (*bhe);
				buf += chars;
			} else {
				while (chars-- > 0)
					put_fs_byte (0, buf++);
			}
			offset = 0;
			if (++bhe == &buflist[NBUF])
				bhe = buflist;
		} while (left > 0 && bhe != bhb && (!*bhe || !(*bhe)->b_lock));
	} while (left > 0);

	/*
	 * Release the read-ahead blocks
	 */
	while (bhe != bhb) {
		brelse (*bhe);
		if (++bhe == &buflist[NBUF])
			bhe = buflist;
	}
	if (!read)
		return -EIO;
	filp->f_reada = 1;
	if (!IS_RDONLY(inode)) {
		inode->i_atime = CURRENT_TIME;
		inode->i_dirt = 1;
	}
	return read;
}

static int ext2_file_write (struct inode * inode, struct file * filp,
			    char * buf, int count)
{
	off_t pos;
	int written, c;
	struct buffer_head * bh;
	char * p;
	struct super_block * sb;
	int err;

	if (!inode) {
		printk("ext2_file_write: inode = NULL\n");
		return -EINVAL;
	}
	sb = inode->i_sb;
	if (sb->s_flags & MS_RDONLY)
		/*
		 * This fs has been automatically remounted ro because of errors
		 */
		return -ENOSPC;

	if (!S_ISREG(inode->i_mode)) {
		ext2_warning (sb, "ext2_file_write", "mode = %07o\n",
			      inode->i_mode);
		return -EINVAL;
	}
/*
 * ok, append may not work when many processes are writing at the same time
 * but so what. That way leads to madness anyway.
 */
	if (filp->f_flags & O_APPEND)
		pos = inode->i_size;
	else
		pos = filp->f_pos;
	written = 0;
	while (written < count) {
		bh = ext2_getblk (inode, pos / sb->s_blocksize, 1, &err);
		if (!bh) {
			if (!written)
				written = err;
			break;
		}
		c = sb->s_blocksize - (pos % sb->s_blocksize);
		if (c > count-written)
			c = count - written;
		if (c != sb->s_blocksize && !bh->b_uptodate) {
			ll_rw_block (READ, 1, &bh);
			wait_on_buffer (bh);
			if (!bh->b_uptodate) {
				brelse (bh);
				if (!written)
					written = -EIO;
				break;
			}
		}
		p = (pos % sb->s_blocksize) + bh->b_data;
		pos += c;
		if (pos > inode->i_size) {
			inode->i_size = pos;
			inode->i_dirt = 1;
		}
		written += c;
		memcpy_fromfs (p, buf, c);
		buf += c;
		bh->b_uptodate = 1;
		bh->b_dirt = 1;
		brelse (bh);
	}
	inode->i_ctime = inode->i_mtime = CURRENT_TIME;
	filp->f_pos = pos;
	inode->i_dirt = 1;
	return written;
}

/*
 * Called when a inode is released. Note that this is different
 * from ext2_open: open gets called at every open, but release
 * gets called only when /all/ the files are closed.
 */
static void ext2_release_file (struct inode * inode, struct file * filp)
{
	if (filp->f_mode & 2)
		ext2_discard_prealloc (inode);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区成人6969| 不卡高清视频专区| 国产一区二区三区四区五区美女 | 欧美丰满嫩嫩电影| 久久久精品tv| 日韩av电影天堂| k8久久久一区二区三区| 欧美老女人在线| 亚洲视频在线观看一区| 国产精品一品二品| 欧美一区二区三区视频免费| 一区二区三区精品| 成+人+亚洲+综合天堂| 2023国产精品| 日产国产高清一区二区三区| 91黄色激情网站| 国产精品久久久久久久久动漫| 蜜臀va亚洲va欧美va天堂| 欧美视频完全免费看| 亚洲视频在线观看一区| 成人免费观看av| 国产亚洲综合色| 久久精品国产一区二区三| 欧美日韩国产首页| 亚洲国产综合在线| 在线亚洲高清视频| 亚洲一卡二卡三卡四卡五卡| 色中色一区二区| 亚洲免费观看高清完整版在线观看熊| 国产在线国偷精品免费看| 日韩欧美一区二区三区在线| 日韩影视精彩在线| 欧美一区二区三区四区高清 | 777奇米四色成人影色区| 亚洲午夜三级在线| 欧美三级日韩在线| 午夜电影网一区| 91精品国产色综合久久久蜜香臀| 一区二区三区av电影| 91在线丨porny丨国产| 亚洲三级电影网站| 色av成人天堂桃色av| 亚洲香蕉伊在人在线观| 欧美美女网站色| 免费黄网站欧美| 国产人妖乱国产精品人妖| 国产成人精品免费网站| 中文字幕一区免费在线观看| 色综合天天综合网国产成人综合天 | 国产精品久久久久一区二区三区共| 国产福利91精品一区二区三区| 久久精品一区二区三区不卡牛牛 | 日本特黄久久久高潮| 欧美一二三区精品| 国产麻豆成人传媒免费观看| 国产精品女主播av| 91久久免费观看| 青青青爽久久午夜综合久久午夜| 日韩情涩欧美日韩视频| 国产成人久久精品77777最新版本| 国产欧美1区2区3区| 色综合久久天天| 九九国产精品视频| 亚洲欧美区自拍先锋| 日韩一区二区三区高清免费看看| 精品亚洲国产成人av制服丝袜 | 日韩精品一区二区在线| 国产成人精品1024| 首页综合国产亚洲丝袜| 久久久综合精品| 欧美日韩中文国产| 国产黄人亚洲片| 午夜激情久久久| 国产欧美1区2区3区| 欧美日韩国产高清一区二区| 国产精品系列在线播放| 亚洲综合在线电影| 久久人人爽人人爽| 欧美人与禽zozo性伦| 国产白丝精品91爽爽久久| 亚洲第一电影网| 国产精品国产三级国产三级人妇 | 91福利视频久久久久| 精品一区二区三区不卡 | 精品在线播放午夜| 亚洲精选视频在线| 久久久久久久久99精品| 欧美日本不卡视频| 日本道精品一区二区三区| 国产成人鲁色资源国产91色综| 婷婷久久综合九色国产成人| 亚洲伦理在线精品| 中文字幕电影一区| 久久久久久亚洲综合影院红桃 | 日韩成人精品视频| 自拍偷在线精品自拍偷无码专区 | 亚洲免费观看高清完整版在线观看| 精品久久久久一区| 欧美视频一区在线观看| 99久久精品国产一区二区三区| 国产在线国偷精品产拍免费yy| 天天操天天干天天综合网| 亚洲欧美色图小说| 自拍偷在线精品自拍偷无码专区| 国产午夜久久久久| 久久婷婷综合激情| 日韩免费看的电影| 日韩一区二区三区四区| 7878成人国产在线观看| 欧美日韩日日摸| 欧美日韩成人综合天天影院| 色哟哟一区二区在线观看 | 国产成人午夜视频| 精东粉嫩av免费一区二区三区| 丝袜亚洲另类欧美综合| 亚洲国产成人91porn| 亚洲综合另类小说| 午夜精品久久久久久久99水蜜桃| 一区二区三区av电影| 亚洲国产日韩一区二区| 午夜精品福利在线| 日韩福利电影在线观看| 麻豆精品一区二区av白丝在线| 美女网站色91| 国产久卡久卡久卡久卡视频精品| 国产一区在线观看麻豆| 床上的激情91.| 97成人超碰视| 欧美日本一区二区三区| 欧美电影免费观看高清完整版在线| 欧美一级电影网站| www激情久久| 国产精品色哟哟网站| 亚洲免费av网站| 天天综合色天天综合| 久久成人久久爱| 国产a视频精品免费观看| 国产成人综合在线| 色狠狠桃花综合| 欧美福利一区二区| 中文字幕精品一区二区精品绿巨人| 国产精品高潮呻吟| 婷婷六月综合亚洲| 国产在线不卡一区| 色婷婷久久99综合精品jk白丝| 欧美色倩网站大全免费| 精品久久久久99| 日韩美女久久久| 美女免费视频一区二区| 国产激情视频一区二区在线观看 | 久久久久国产精品免费免费搜索| 中文字幕第一区综合| 亚洲免费观看视频| 国产一区二区伦理| 欧美在线观看禁18| 亚洲精品一区二区三区影院| 亚洲免费观看高清| 国产麻豆精品95视频| 欧美特级限制片免费在线观看| 精品成人一区二区三区| 亚洲欧美另类久久久精品2019| 美女诱惑一区二区| 色婷婷久久一区二区三区麻豆| 精品区一区二区| 亚洲自拍偷拍综合| 成人免费视频视频在线观看免费| 69p69国产精品| 亚洲区小说区图片区qvod| 久久99精品久久久久久久久久久久 | 亚洲日本护士毛茸茸| 久久精品国产99久久6| 欧美综合一区二区三区| 国产日韩欧美激情| 免费高清在线一区| 欧美三区免费完整视频在线观看| 欧美国产禁国产网站cc| 老司机午夜精品| 欧美人xxxx| 一区二区高清视频在线观看| 国产成人午夜99999| 日韩欧美在线不卡| 亚洲va国产va欧美va观看| av综合在线播放| 国产拍欧美日韩视频二区| 青青草成人在线观看| 欧美午夜视频网站| 亚洲女同女同女同女同女同69| 国产一区二区三区四| 精品对白一区国产伦| 蜜臀久久99精品久久久久宅男| 欧洲色大大久久| 亚洲精品免费在线观看| 91在线观看高清| 国产精品久久久久影院老司 | 日韩一区在线看| 粉嫩aⅴ一区二区三区四区五区| 亚洲精品一线二线三线| 国产麻豆成人精品| 久久精品人人做人人综合| 国产一区二三区好的|