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

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

?? file.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 *  linux/fs/sysv/file.c
 *
 *  minix/file.c
 *  Copyright (C) 1991, 1992  Linus Torvalds
 *
 *  coh/file.c
 *  Copyright (C) 1993  Pascal Haible, Bruno Haible
 *
 *  sysv/file.c
 *  Copyright (C) 1993  Bruno Haible
 *
 *  SystemV/Coherent regular file handling primitives
 */

#include <asm/segment.h>

#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/sysv_fs.h>
#include <linux/errno.h>
#include <linux/fcntl.h>
#include <linux/stat.h>
#include <linux/string.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/sysv_fs.h>

static int sysv_file_read(struct inode *, struct file *, char *, int);
static int sysv_file_write(struct inode *, struct file *, char *, int);

/*
 * We have mostly NULL's here: the current defaults are ok for
 * the coh filesystem.
 */
static struct file_operations sysv_file_operations = {
	NULL,			/* lseek - default */
	sysv_file_read,		/* read */
	sysv_file_write,	/* write */
	NULL,			/* readdir - bad */
	NULL,			/* select - default */
	NULL,			/* ioctl - default */
	NULL,			/* mmap */
	NULL,			/* no special open is needed */
	NULL,			/* release */
	sysv_sync_file		/* fsync */
};

static struct file_operations sysv_file_operations_with_bmap = {
	NULL,			/* lseek - default */
	sysv_file_read,		/* read */
	sysv_file_write,	/* write */
	NULL,			/* readdir - bad */
	NULL,			/* select - default */
	NULL,			/* ioctl - default */
	generic_mmap,		/* mmap */
	NULL,			/* no special open is needed */
	NULL,			/* release */
	sysv_sync_file		/* fsync */
};

struct inode_operations sysv_file_inode_operations = {
	&sysv_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 */
	NULL,			/* bmap */
	sysv_truncate,		/* truncate */
	NULL			/* permission */
};

struct inode_operations sysv_file_inode_operations_with_bmap = {
	&sysv_file_operations_with_bmap, /* 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 */
	sysv_bmap,		/* bmap */
	sysv_truncate,		/* truncate */
	NULL			/* permission */
};

struct sysv_buffer {
	struct buffer_head * bh;
	char * bh_data;
};

static int sysv_file_read(struct inode * inode, struct file * filp, char * buf, int count)
{
	struct super_block * sb = inode->i_sb;
	int read,left,chars;
	unsigned int block;
	int blocks, offset;
	int bhrequest, bhreqi, uptodate;
	struct sysv_buffer * bhb, * bhe;
	struct buffer_head * bhreq[NBUF];
	struct sysv_buffer buflist[NBUF];
	unsigned int size;

	if (!inode) {
		printk("sysv_file_read: inode = NULL\n");
		return -EINVAL;
	}
	if (!S_ISREG(inode->i_mode)) {
		printk("sysv_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 >> sb->sv_block_size_bits;
	offset &= sb->sv_block_size_1;
	size = (size + sb->sv_block_size_1) >> sb->sv_block_size_bits;
	blocks = (left + offset + sb->sv_block_size_1) >> sb->sv_block_size_bits;
	bhb = bhe = buflist;
	if (filp->f_reada) {
		blocks += read_ahead[MAJOR(inode->i_dev)] >> (sb->sv_block_size_bits - 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.

	   We must remove duplicates from the bhreq array as ll_rw_block
	   doesn't like duplicate requests (it hangs in wait_on_buffer...).
	 */

	do {
		bhrequest = 0;
		uptodate = 1;
		while (blocks) {
			--blocks;
			bhb->bh = sysv_getblk(inode, block++, 0, &bhb->bh_data);
			if (bhb->bh && !bhb->bh->b_uptodate) {
				uptodate = 0;
				if (sb->sv_block_size_ratio_bits > 0) /* block_size < BLOCK_SIZE ? */
					for (bhreqi = 0; bhreqi < bhrequest; bhreqi++)
						if (bhreq[bhreqi] == bhb->bh)
							goto notreq;
				bhreq[bhrequest++] = bhb->bh;
				notreq: ;
			}

			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->bh) {
				wait_on_buffer(bhe->bh);
				if (!bhe->bh->b_uptodate) {	/* read error? */
					brelse(bhe->bh);
					if (++bhe == &buflist[NBUF])
						bhe = buflist;
					left = 0;
					break;
				}
			}
			if (left < sb->sv_block_size - offset)
				chars = left;
			else
				chars = sb->sv_block_size - offset;
			filp->f_pos += chars;
			left -= chars;
			read += chars;
			if (bhe->bh) {
				memcpy_tofs(buf,offset+bhe->bh_data,chars);
				brelse(bhe->bh);
				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->bh || !bhe->bh->b_lock));
	} while (left > 0);

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

static int sysv_file_write(struct inode * inode, struct file * filp, char * buf, int count)
{
	struct super_block * sb = inode->i_sb;
	off_t pos;
	int written,c;
	struct buffer_head * bh;
	char * bh_data;
	char * p;

	if (!inode) {
		printk("sysv_file_write: inode = NULL\n");
		return -EINVAL;
	}
	if (!S_ISREG(inode->i_mode)) {
		printk("sysv_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.
 * But we need to protect against simultaneous truncate as we may end up
 * writing our data into blocks that have meanwhile been incorporated into
 * the freelist, thereby trashing the freelist.
 */
	if (sb->sv_block_size_ratio_bits > 0) /* block_size < BLOCK_SIZE ? */
		coh_lock_inode(inode);
	if (filp->f_flags & O_APPEND)
		pos = inode->i_size;
	else
		pos = filp->f_pos;
	written = 0;
	while (written<count) {
		bh = sysv_getblk (inode, pos >> sb->sv_block_size_bits, 1, &bh_data);
		if (!bh) {
			if (!written)
				written = -ENOSPC;
			break;
		}
		c = sb->sv_block_size - (pos & sb->sv_block_size_1);
		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;
			}
		}
		/* now either c==BLOCK_SIZE or bh->b_uptodate */
		p = (pos & sb->sv_block_size_1) + bh_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;
	if (sb->sv_block_size_ratio_bits > 0) /* block_size < BLOCK_SIZE ? */
		coh_unlock_inode(inode);
	return written;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美男生操女生| 欧美在线制服丝袜| 日韩精品视频网站| 五月婷婷另类国产| 午夜精品在线看| 日本欧美一区二区| 蜜桃在线一区二区三区| 免费在线观看精品| 国产乱子伦一区二区三区国色天香| 免费日韩伦理电影| 国产乱一区二区| 99久久综合色| 欧美另类久久久品| 精品少妇一区二区三区免费观看 | 日本三级亚洲精品| 加勒比av一区二区| 成人免费看的视频| 欧美日韩一二三| 精品对白一区国产伦| 中文子幕无线码一区tr| 亚洲精品成人精品456| 视频在线在亚洲| 风间由美一区二区三区在线观看| 不卡影院免费观看| 欧美在线视频日韩| 精品动漫一区二区三区在线观看| 国产亚洲一本大道中文在线| 亚洲免费电影在线| 日本欧美韩国一区三区| 国产91对白在线观看九色| 一本一本大道香蕉久在线精品| 欧美三级在线视频| 久久综合色8888| 亚洲一本大道在线| 懂色av一区二区三区蜜臀 | 亚洲一区二区三区精品在线| 日韩黄色免费电影| 成人av动漫网站| 欧美精品黑人性xxxx| 国产精品无人区| 日日夜夜免费精品视频| 99久久精品免费精品国产| 91麻豆精品国产91久久久 | 色欧美日韩亚洲| 久久综合久久综合九色| 亚洲h精品动漫在线观看| 国产成人av一区二区三区在线| 欧美专区日韩专区| 日本一区二区成人| 国产一区二区三区| 欧美精三区欧美精三区| 综合婷婷亚洲小说| 国产成人亚洲综合a∨婷婷| 欧美精品三级在线观看| 亚洲视频中文字幕| 国产91清纯白嫩初高中在线观看 | 欧美日韩久久一区二区| 国产精品伦理在线| 国产一区二区主播在线| 日韩视频一区二区在线观看| 亚洲一线二线三线久久久| av中文字幕不卡| 国产精品伦一区二区三级视频| 久久丁香综合五月国产三级网站| 精品视频一区二区三区免费| 亚洲精品久久嫩草网站秘色| 丁香另类激情小说| 国产精品天干天干在线综合| 国产在线播放一区| 精品国产1区2区3区| 麻豆国产一区二区| 日韩视频一区二区| 蓝色福利精品导航| 日韩欧美成人一区二区| 久久99在线观看| 久久综合九色综合久久久精品综合| 婷婷久久综合九色国产成人| 欧美精品视频www在线观看 | 激情综合色丁香一区二区| 91精品午夜视频| 日日骚欧美日韩| 日韩精品资源二区在线| 蜜臀久久99精品久久久久久9| 日韩网站在线看片你懂的| 精品一区二区三区香蕉蜜桃| 2020国产精品自拍| 成人理论电影网| 一区二区三区免费在线观看| 欧美色精品在线视频| 日本欧美久久久久免费播放网| 精品噜噜噜噜久久久久久久久试看| 美女免费视频一区| 中文字幕免费观看一区| 成人深夜视频在线观看| 一区二区国产视频| 日韩欧美一区二区久久婷婷| 国产精品18久久久久久久久| 国产精品成人免费在线| 在线观看中文字幕不卡| 久久91精品国产91久久小草| 国产亚洲va综合人人澡精品| 色悠久久久久综合欧美99| 午夜av电影一区| 久久久精品tv| 欧美亚洲综合久久| 韩国女主播一区| 亚洲精品伦理在线| 久久伊99综合婷婷久久伊| 99久久精品国产一区| 日韩精品高清不卡| 亚洲国产成人在线| 欧美一区二区三区四区视频| 成人亚洲精品久久久久软件| 五月天亚洲婷婷| 最新国产精品久久精品| 日韩一区二区三区在线观看| 91视视频在线观看入口直接观看www| 日本欧美在线观看| 亚洲人成精品久久久久| 欧美tickling挠脚心丨vk| 在线免费av一区| caoporen国产精品视频| 蜜臀精品久久久久久蜜臀| 亚洲另类在线视频| 国产亚洲精品免费| 欧美一区二区免费视频| 91国偷自产一区二区开放时间| 精品一区二区三区免费毛片爱| 亚洲欧美激情一区二区| 国产亚洲美州欧州综合国| 日韩丝袜美女视频| 欧美群妇大交群中文字幕| 91婷婷韩国欧美一区二区| 国产乱色国产精品免费视频| 免费成人在线视频观看| 亚洲国产成人91porn| 亚洲日本乱码在线观看| 国产精品久久久久久户外露出| 欧美不卡123| 日韩一级成人av| 欧美一级xxx| 日韩一区二区精品在线观看| 欧美亚洲国产一区在线观看网站 | 亚洲成人你懂的| 亚洲人成精品久久久久久| 日韩一区欧美一区| 国产日产精品一区| 中国av一区二区三区| 欧美国产精品专区| 久久综合精品国产一区二区三区 | 91亚洲资源网| 99精品欧美一区二区三区小说 | 日本欧美一区二区三区乱码| 午夜精品123| 青青草视频一区| 久久超碰97人人做人人爱| 午夜电影网一区| 日韩成人伦理电影在线观看| 日韩国产欧美在线播放| 美女mm1313爽爽久久久蜜臀| 麻豆91在线播放| 国产麻豆午夜三级精品| 成人永久aaa| 色哟哟欧美精品| 欧美日韩色一区| 日韩精品一区二区三区蜜臀| 精品久久久久久久久久久院品网| 精品女同一区二区| 国产精品动漫网站| 亚洲五月六月丁香激情| 免费看黄色91| jlzzjlzz欧美大全| 欧洲一区二区av| 99久久久精品| 91电影在线观看| 这里只有精品电影| 精品国产1区二区| √…a在线天堂一区| 日日摸夜夜添夜夜添国产精品| 精品亚洲成av人在线观看| 成人av高清在线| 777xxx欧美| 国产午夜精品福利| 亚洲国产日韩一级| 激情文学综合网| 在线观看日韩一区| 国产视频一区在线播放| 亚洲激情网站免费观看| 麻豆91小视频| 日本韩国一区二区| 精品免费视频.| 亚洲伊人伊色伊影伊综合网| 极品少妇xxxx精品少妇偷拍| 色综合网色综合| 国产情人综合久久777777| 亚洲蜜臀av乱码久久精品| 美女尤物国产一区| 一本色道久久综合亚洲91 | 日韩欧美123| 亚洲精选一二三|