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

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

?? file.c

?? 內核是系統的心臟
?? 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一区二区三区免费野_久草精品视频
91在线观看一区二区| 91视频.com| 奇米影视7777精品一区二区| 香港成人在线视频| 欧美aaa在线| 国产成人在线看| caoporn国产一区二区| 欧美午夜影院一区| 日韩一区二区在线观看视频播放| 欧美无砖专区一中文字| 欧美日韩中字一区| 欧美精品一区二| 中文字幕一区二区三区在线播放 | 日韩理论电影院| 国产精品日韩精品欧美在线| 国产精品三级av| 一区二区三区毛片| 午夜精品成人在线视频| 日韩专区中文字幕一区二区| www.在线成人| 日本韩国一区二区| 精品国产1区二区| 亚洲黄色av一区| 国产精品亚洲一区二区三区在线| 91在线国产福利| 久久亚洲欧美国产精品乐播| 亚洲视频1区2区| 国产一区二区按摩在线观看| 在线观看日韩一区| 中文字幕一区二区三区色视频| 日韩精品色哟哟| 欧美亚洲综合在线| 国产精品久久久久久亚洲毛片 | 欧美在线观看一区二区| 欧美另类z0zxhd电影| 亚洲三级在线免费观看| 成人午夜精品在线| 久久蜜桃av一区精品变态类天堂 | 欧美三级三级三级爽爽爽| 欧美日韩综合色| 香蕉加勒比综合久久| 99精品偷自拍| 一区二区在线免费| 一本久道中文字幕精品亚洲嫩| 欧美国产禁国产网站cc| 成人午夜电影久久影院| 在线播放/欧美激情| 日韩欧美国产综合在线一区二区三区| 国产精品久久久久久久久免费樱桃| 蜜臀av性久久久久av蜜臀妖精| 91精品国产黑色紧身裤美女| 日本aⅴ免费视频一区二区三区| 91精品国产综合久久香蕉的特点| 亚洲第一二三四区| 欧美一区二区久久久| 日本女优在线视频一区二区| 欧美精品乱码久久久久久| 蜜乳av一区二区| 国产日韩精品一区二区三区| 不卡的av网站| 国产欧美日韩在线视频| 99精品国产99久久久久久白柏| 亚洲精品免费视频| 欧美日本国产一区| 国产一区二区三区在线看麻豆| 国产精品欧美一级免费| 欧美日韩激情在线| 精东粉嫩av免费一区二区三区| 国产精品免费av| 欧美群妇大交群中文字幕| 国产精品77777竹菊影视小说| 一区二区三区产品免费精品久久75| 欧美日韩日日夜夜| 色综合天天综合在线视频| 日日嗨av一区二区三区四区| 久久精品人人做人人综合 | 欧美一区二区三区精品| 成人深夜在线观看| 韩国在线一区二区| 日韩成人午夜精品| 亚洲一区二区在线免费看| 欧美精品一区二区三区高清aⅴ| 国内精品国产成人| 亚洲电影一区二区三区| 国产成人免费视频网站高清观看视频| 图片区小说区国产精品视频| 亚洲欧洲99久久| 国产精品久久久久久久久免费相片 | 午夜欧美一区二区三区在线播放| 亚洲免费在线观看| 亚洲精品日产精品乱码不卡| 一区二区三区在线看| 亚洲靠逼com| 夜夜爽夜夜爽精品视频| 亚洲综合色视频| 日韩在线观看一区二区| 日韩有码一区二区三区| 日韩电影在线一区二区| 麻豆精品视频在线观看免费| 久久99热这里只有精品| 国产一区二区中文字幕| jvid福利写真一区二区三区| 色屁屁一区二区| 欧美一卡二卡在线| 欧美tk—视频vk| 欧美国产综合色视频| 一区二区三区四区在线播放 | 日韩成人免费电影| 国产精品亚洲一区二区三区妖精 | 99精品视频在线观看免费| 伦理电影国产精品| 成人h版在线观看| 91国产成人在线| 国产精品欧美精品| 天天综合色天天| 91视频免费看| 久久久青草青青国产亚洲免观| 亚洲电影在线免费观看| 美女诱惑一区二区| 91蝌蚪porny| 国产欧美日韩另类一区| 裸体歌舞表演一区二区| 欧美在线|欧美| 国产精品蜜臀在线观看| 国产一区二区三区电影在线观看| 日本国产一区二区| 亚洲人午夜精品天堂一二香蕉| 国产一区二区调教| 欧美精品丝袜中出| 亚洲欧美日韩电影| 欧美伊人久久久久久午夜久久久久| 久久久不卡网国产精品一区| 极品美女销魂一区二区三区| 91精品欧美一区二区三区综合在| 亚洲午夜羞羞片| 欧美精品粉嫩高潮一区二区| 亚洲成人第一页| 欧美一区二区三区小说| 日韩黄色在线观看| 日韩网站在线看片你懂的| 久久99精品国产麻豆婷婷| 久久丝袜美腿综合| 99视频在线精品| 亚洲mv大片欧洲mv大片精品| 日韩欧美一级二级三级久久久| 日韩av在线播放中文字幕| 日韩精品在线网站| 国产91丝袜在线播放0| 亚洲免费观看高清完整版在线| 欧美视频在线一区二区三区 | 91免费看片在线观看| 亚洲午夜精品在线| 日韩视频在线一区二区| 成人avav影音| 亚洲成人免费av| 日韩一二三区不卡| av亚洲精华国产精华精| 日韩精品成人一区二区在线| 中日韩av电影| 欧美日韩三级一区二区| kk眼镜猥琐国模调教系列一区二区| 亚洲人妖av一区二区| 久久久久青草大香线综合精品| www.成人在线| 日本欧美大码aⅴ在线播放| 亚洲欧洲日韩综合一区二区| 精品国精品国产| 欧美色图一区二区三区| aaa欧美日韩| av一区二区不卡| 成人一区二区三区在线观看| 国产乱码精品一区二区三区忘忧草| 亚洲图片欧美色图| 悠悠色在线精品| 亚洲一区二区三区四区不卡| 自拍偷在线精品自拍偷无码专区| 久久久久久久久久久久久女国产乱| 欧美一级片在线| 欧美一区二区三区视频在线观看 | 亚洲视频香蕉人妖| 中文字幕制服丝袜成人av| 国产精品免费av| 亚洲视频你懂的| 亚洲国产精品一区二区久久 | 国产又粗又猛又爽又黄91精品| 日韩电影网1区2区| 精品中文字幕一区二区小辣椒| 美日韩一区二区| 国产专区综合网| 日韩国产欧美在线视频| 亚洲高清视频在线| 天天影视涩香欲综合网| 麻豆高清免费国产一区| 国产91丝袜在线18| 欧美视频在线观看一区| 欧美一区二区黄色| 欧美经典一区二区| 亚洲免费三区一区二区| 奇米亚洲午夜久久精品| 懂色中文一区二区在线播放|