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

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

?? file.c

?? 內核是系統的心臟
?? 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一区二区三区免费野_久草精品视频
3d成人h动漫网站入口| 亚洲aaa精品| 精品国产伦一区二区三区观看方式| 91猫先生在线| 成人97人人超碰人人99| 久久99精品久久久久久国产越南| 婷婷六月综合亚洲| 日韩国产欧美在线视频| 日韩精品亚洲专区| 三级久久三级久久久| 奇米精品一区二区三区在线观看一| 亚洲国产成人va在线观看天堂| 亚洲一区视频在线观看视频| 亚洲自拍偷拍av| 石原莉奈在线亚洲二区| 男女性色大片免费观看一区二区 | 亚洲精品在线观| 在线成人免费视频| 精品电影一区二区三区| 国产日产精品1区| 国产精品久久久久精k8 | 91麻豆精品国产无毒不卡在线观看| 91国产成人在线| 欧美高清视频不卡网| 欧美一级国产精品| 欧美国产1区2区| 亚洲曰韩产成在线| 国产一区二区剧情av在线| 99久久精品99国产精品| 制服丝袜亚洲精品中文字幕| 久久亚洲一级片| 亚洲欧美怡红院| 理论片日本一区| 99久久国产综合精品女不卡| 欧美伦理影视网| 国产精品网站导航| 日韩精品欧美成人高清一区二区| 黄色资源网久久资源365| 成人午夜私人影院| 91精品国产综合久久久久久久| 久久久久久久久伊人| 亚洲高清视频在线| 韩国中文字幕2020精品| 91福利社在线观看| 久久久精品欧美丰满| 亚洲综合在线五月| 国产成a人无v码亚洲福利| 欧美日韩国产影片| 国产精品乱码一区二三区小蝌蚪| 视频一区二区三区在线| 成人三级在线视频| 精品裸体舞一区二区三区| 亚洲国产精品自拍| 99综合电影在线视频| 久久先锋影音av鲁色资源网| 亚洲电影视频在线| 91黄色免费看| 最新国产成人在线观看| 国产精品一二三四区| 337p亚洲精品色噜噜狠狠| 亚洲综合精品自拍| 91在线看国产| 国产日产亚洲精品系列| 韩国成人福利片在线播放| 在线电影欧美成精品| 亚洲成人激情自拍| 在线观看成人小视频| 成人免费在线视频观看| 国产大陆亚洲精品国产| xnxx国产精品| 精品在线你懂的| 欧美电视剧在线看免费| 日韩av在线发布| 欧美日韩不卡视频| 偷拍自拍另类欧美| 欧美精品18+| 免费视频一区二区| 欧美区视频在线观看| 午夜精品在线视频一区| 欧美日韩亚洲综合一区二区三区| 一区二区三区免费看视频| 91啦中文在线观看| 亚洲一区免费在线观看| 欧美四级电影在线观看| 亚洲综合男人的天堂| 欧美主播一区二区三区美女| 亚洲一区二区不卡免费| 欧美性色黄大片| 亚洲一区二区av在线| 欧美剧情电影在线观看完整版免费励志电影 | 亚洲精品成人精品456| 欧美在线看片a免费观看| 亚洲成在人线免费| 欧美一级高清片| 国产伦精品一区二区三区免费 | 亚洲免费电影在线| 欧美在线免费播放| 免费日本视频一区| 日本一区二区高清| 日本道色综合久久| 奇米精品一区二区三区在线观看一 | 成人手机电影网| 亚洲另类春色校园小说| 91精品欧美综合在线观看最新| 老汉av免费一区二区三区| 久久精品亚洲乱码伦伦中文 | 91美女在线视频| 亚洲一级二级在线| 日韩欧美国产一区二区在线播放| 国产精品一区二区久久不卡| 亚洲欧美在线aaa| 欧美一区二区国产| 91麻豆视频网站| 视频在线观看91| 国产精品成人免费在线| 欧美日韩一区二区三区四区| 国产一区91精品张津瑜| 一区二区三区中文字幕| www久久精品| 欧美视频一区二区三区四区| 国产伦精品一区二区三区免费迷| 亚洲一区二区五区| 欧美国产精品中文字幕| 日韩一区二区三| 91精品福利视频| 成人福利视频网站| 秋霞午夜av一区二区三区| 国产蜜臀97一区二区三区| 欧美日韩精品一区二区三区蜜桃 | 国产精品国产三级国产| 欧美高清性hdvideosex| 色天天综合色天天久久| 国产精品小仙女| 免费观看久久久4p| 亚洲午夜激情av| 亚洲乱码精品一二三四区日韩在线| 精品乱人伦小说| 91精品国产色综合久久不卡蜜臀| 91免费版在线看| 95精品视频在线| 白白色亚洲国产精品| 国产酒店精品激情| 久久国产精品一区二区| 天堂午夜影视日韩欧美一区二区| 亚洲欧美另类小说| 国产精品黄色在线观看| 国产午夜精品久久久久久久| 日韩欧美精品在线| 欧美电视剧在线观看完整版| 6080日韩午夜伦伦午夜伦| 欧美视频三区在线播放| 欧美午夜精品电影| 欧美综合在线视频| 欧美视频日韩视频| 91麻豆精品国产自产在线观看一区 | 五月激情综合婷婷| 亚州成人在线电影| 日韩黄色免费网站| 性欧美疯狂xxxxbbbb| 亚洲一区二区中文在线| 亚洲国产精品久久人人爱蜜臀| 亚洲综合免费观看高清完整版| 欧美日韩免费视频| 9191成人精品久久| 欧美欧美午夜aⅴ在线观看| 在线成人免费视频| 欧美精品一区二区三| 久久久精品国产99久久精品芒果| 2022国产精品视频| 国产精品久久久久久久久快鸭| 中文字幕在线观看不卡视频| 日韩美女啊v在线免费观看| 亚洲精品国产一区二区精华液| 亚洲黄色av一区| 视频一区中文字幕| 国产乱妇无码大片在线观看| 国产精品99久久久| 91亚洲国产成人精品一区二区三| 欧美性猛交xxxx乱大交退制版 | 蜜臀av性久久久久蜜臀aⅴ流畅| 美女诱惑一区二区| 国产成人啪午夜精品网站男同| 成人教育av在线| 欧美性色黄大片手机版| 精品久久久久久久久久久久久久久 | 日韩精品影音先锋| 国产亚洲综合色| 一区二区免费看| 韩国中文字幕2020精品| 日本乱人伦一区| 日韩欧美一二三| 亚洲欧美日韩国产中文在线| 日韩高清不卡一区二区| 成人中文字幕电影| 欧美精品色一区二区三区| 国产日韩高清在线| 日韩电影一区二区三区四区| 成人aa视频在线观看| 欧美一区中文字幕| 亚洲精品写真福利|