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

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

?? file.c

?? 內核是系統的心臟
?? C
字號:
/*
 *  linux/fs/ext/file.c
 *
 *  Copyright (C) 1992 Remy Card (card@masi.ibp.fr)
 *
 *  from
 *
 *  linux/fs/minix/file.c
 *
 *  Copyright (C) 1991, 1992 Linus Torvalds
 *
 *  ext regular file handling primitives
 */

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

#include <linux/sched.h>
#include <linux/ext_fs.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/fcntl.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/ext_fs.h>

static int ext_file_read(struct inode *, struct file *, char *, int);
static int ext_file_write(struct inode *, struct file *, char *, int);

/*
 * We have mostly NULL's here: the current defaults are ok for
 * the ext filesystem.
 */
static struct file_operations ext_file_operations = {
	NULL,			/* lseek - default */
	ext_file_read,	/* read */
	ext_file_write,	/* write */
	NULL,			/* readdir - bad */
	NULL,			/* select - default */
	NULL,			/* ioctl - default */
	generic_mmap,  		/* mmap */
	NULL,			/* no special open is needed */
	NULL,			/* release */
	ext_sync_file			/* fsync */
};

struct inode_operations ext_file_inode_operations = {
	&ext_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 */
	ext_bmap,		/* bmap */
	ext_truncate,		/* truncate */
	NULL			/* permission */
};

static int ext_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];
	unsigned int size;

	if (!inode) {
		printk("ext_file_read: inode = NULL\n");
		return -EINVAL;
	}
	if (!S_ISREG(inode->i_mode)) {
		printk("ext_file_read: mode = %07o\n",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 >> BLOCK_SIZE_BITS;
	offset &= BLOCK_SIZE-1;
	size = (size + (BLOCK_SIZE-1)) >> BLOCK_SIZE_BITS;
	blocks = (left + offset + BLOCK_SIZE - 1) >> BLOCK_SIZE_BITS;
	bhb = bhe = buflist;
	if (filp->f_reada) {
		blocks += read_ahead[MAJOR(inode->i_dev)] / (BLOCK_SIZE >> 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 = ext_getblk(inode, block++, 0);
			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 < BLOCK_SIZE - offset)
				chars = left;
			else
				chars = BLOCK_SIZE - 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 ext_file_write(struct inode * inode, struct file * filp, char * buf, int count)
{
	off_t pos;
	int written,c;
	struct buffer_head * bh;
	char * p;

	if (!inode) {
		printk("ext_file_write: inode = NULL\n");
		return -EINVAL;
	}
	if (!S_ISREG(inode->i_mode)) {
		printk("ext_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 = ext_getblk(inode,pos/BLOCK_SIZE,1);
		if (!bh) {
			if (!written)
				written = -ENOSPC;
			break;
		}
		c = BLOCK_SIZE - (pos % BLOCK_SIZE);
		if (c > count-written)
			c = count-written;
		if (c != BLOCK_SIZE && !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 % BLOCK_SIZE) + 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_mtime = inode->i_ctime = CURRENT_TIME;
	filp->f_pos = pos;
	inode->i_dirt = 1;
	return written;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人妖精视频yjsp地址| 欧美日韩久久久| 亚洲精品水蜜桃| 1024成人网| 亚洲3atv精品一区二区三区| 蜜臀久久99精品久久久久久9| 国产在线视频一区二区| 色悠久久久久综合欧美99| 91精选在线观看| 国产清纯白嫩初高生在线观看91| 亚洲精品中文字幕乱码三区| 蜜桃久久精品一区二区| 国产成人免费9x9x人网站视频| 91性感美女视频| 欧美一二区视频| 亚洲四区在线观看| 日韩高清一区二区| 99免费精品在线| 日韩欧美一级精品久久| 亚洲人xxxx| 国产一区欧美日韩| 欧美日韩在线观看一区二区| 国产日韩精品一区二区三区在线| 亚洲国产成人91porn| 国产99精品国产| 555www色欧美视频| 亚洲视频在线一区二区| 狠狠色狠狠色综合| 欧美体内she精高潮| 欧美国产一区视频在线观看| 婷婷开心激情综合| 9人人澡人人爽人人精品| 日韩三级.com| 亚洲综合激情另类小说区| 高清不卡在线观看| 日韩一级黄色大片| 最近中文字幕一区二区三区| 麻豆国产欧美日韩综合精品二区| 日本道精品一区二区三区| www国产精品av| 日产精品久久久久久久性色 | 国产校园另类小说区| 午夜精品久久久久久久| 91亚洲国产成人精品一区二三| 国产欧美日韩在线看| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美性色综合网| 亚洲图片激情小说| 成人av动漫网站| 国产亚洲一二三区| 久久99精品国产.久久久久久| 欧美日产国产精品| 亚洲一区日韩精品中文字幕| 91色在线porny| 国产精品亲子伦对白| 国产精品一区专区| 精品日韩99亚洲| 欧美bbbbb| 欧美久久久久久久久久| 亚洲精选免费视频| 日本高清免费不卡视频| 中文字幕欧美一| 成人免费毛片片v| 国产精品美女久久久久久2018| 国产精品影音先锋| 国产午夜亚洲精品理论片色戒 | 欧美精品一区男女天堂| 蜜臀av一区二区| 久久 天天综合| 日韩精品中文字幕一区二区三区| 91看片淫黄大片一级在线观看| 色婷婷av一区二区三区软件 | 99视频在线观看一区三区| 欧美国产乱子伦| 国产一区 二区 三区一级| 精品美女一区二区| 蜜桃一区二区三区四区| 精品久久久久99| 美腿丝袜在线亚洲一区| 日韩欧美亚洲国产另类| 极品少妇xxxx精品少妇| 久久众筹精品私拍模特| 国产精品99久久久久久久女警| 久久久91精品国产一区二区三区| 久久66热re国产| 国产精品水嫩水嫩| 99re这里只有精品6| 亚洲蜜臀av乱码久久精品| 欧美系列日韩一区| 亚洲国产日韩精品| 日韩视频在线观看一区二区| 国产精品久久久久久久久久久免费看 | 亚洲人快播电影网| 色婷婷av久久久久久久| 亚洲成人激情社区| 日韩网站在线看片你懂的| 日本中文字幕一区二区视频| 精品国产青草久久久久福利| 欧美一区二区三区小说| 日韩你懂的在线播放| 国产精品亚洲一区二区三区在线| 国产日韩欧美精品一区| 91国在线观看| 蜜臀99久久精品久久久久久软件 | www.在线欧美| 亚洲一区二区三区四区在线观看| 欧美片在线播放| 久久激五月天综合精品| 亚洲国产精品激情在线观看| 91精品办公室少妇高潮对白| 日韩av一区二区三区四区| 久久久99精品免费观看不卡| 91福利社在线观看| 中文字幕高清不卡| 欧美日韩精品欧美日韩精品| 久久99久久精品| 亚洲欧洲国产专区| 91精品久久久久久久91蜜桃| 高清av一区二区| 日一区二区三区| 国产精品九色蝌蚪自拍| 7777精品久久久大香线蕉| 国产丶欧美丶日本不卡视频| 亚洲丰满少妇videoshd| 久久青草欧美一区二区三区| 91福利在线观看| 国产成人免费av在线| 日韩av中文字幕一区二区三区| 国产精品乱子久久久久| 欧美久久久久久久久中文字幕| 亚洲va国产va欧美va观看| 国产亚洲欧美日韩日本| 欧美精品久久99| 99国产精品99久久久久久| 久久99久久精品| 亚洲大片在线观看| 国产亚洲成年网址在线观看| 91精品国产欧美一区二区18| 99re这里都是精品| 欧美乱妇15p| 亚洲一区二区三区中文字幕| 久久精品男人的天堂| 制服丝袜在线91| 日本电影欧美片| 9久草视频在线视频精品| 免费av网站大全久久| 一区二区三区不卡视频| 国产欧美日韩在线视频| 精品对白一区国产伦| 欧美日韩精品一区二区三区| 99久久精品国产观看| 国产专区欧美精品| 天天综合色天天| 一区二区三区中文字幕在线观看| 国产欧美一区二区在线观看| 欧美成人三级在线| 欧美高清hd18日本| 91黄色激情网站| 91欧美一区二区| 国产精品一二一区| 久久99精品视频| 久久国产婷婷国产香蕉| 天天操天天综合网| 一片黄亚洲嫩模| 制服丝袜日韩国产| 欧美日韩亚洲综合一区| 日本乱人伦aⅴ精品| av在线综合网| 丁香婷婷综合激情五月色| 极品少妇xxxx偷拍精品少妇| 久久精品国产99国产| 麻豆精品在线播放| 日本不卡视频在线| 日韩av网站免费在线| 天堂影院一区二区| 亚洲成人三级小说| 亚洲五月六月丁香激情| 一级日本不卡的影视| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲婷婷综合色高清在线| 亚洲人成7777| 亚洲男人的天堂在线aⅴ视频| 中文字幕在线一区二区三区| 国产精品女上位| 欧美日韩国产经典色站一区二区三区 | 成人毛片在线观看| 国产成人免费av在线| 成人精品视频一区二区三区尤物| 国产91综合网| 国产精品99久| 成+人+亚洲+综合天堂| 波多野结衣中文字幕一区二区三区 | 色香蕉久久蜜桃| 99久久夜色精品国产网站| 91一区二区在线观看| 在线中文字幕不卡| 欧美色中文字幕| 欧美人动与zoxxxx乱| 91精品在线一区二区| 欧美一二三区精品|