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

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

?? file.c

?? 這是Linux系統下的對UDF文件系統新增的功能
?? C
字號:
/* * file.c * * PURPOSE *  File handling routines for the OSTA-UDF(tm) filesystem. * * CONTACTS *  E-mail regarding any portion of the Linux UDF file system should be *  directed to the development team mailing list (run by majordomo): *    linux_udf@hpesjro.fc.hp.com * * COPYRIGHT *  This file is distributed under the terms of the GNU General Public *  License (GPL). Copies of the GPL can be obtained from: *    ftp://prep.ai.mit.edu/pub/gnu/GPL *  Each contributing author retains all rights to their own work. * *  (C) 1998-1999 Dave Boynton *  (C) 1998-2001 Ben Fennema *  (C) 1999-2000 Stelias Computing Inc * * HISTORY * *  10/02/98 dgb  Attempt to integrate into udf.o *  10/07/98      Switched to using generic_readpage, etc., like isofs *                And it works! *  12/06/98 blf  Added udf_file_read. uses generic_file_read for all cases but *                ICBTAG_FLAG_AD_IN_ICB. *  04/06/99      64 bit file handling on 32 bit systems taken from ext2 file.c *  05/12/99      Preliminary file write support */#include "udfdecl.h"#include <linux/fs.h>#include <linux/udf_fs.h>#include <asm/uaccess.h>#include <linux/kernel.h>#include <linux/string.h> /* memset */#include <linux/errno.h>#include <linux/locks.h>#include "udf_i.h"#include "udf_sb.h"#define NBUF	32typedef void * poll_table; int udf_adinicb_readpage (struct file * file, struct page * page){	struct inode *inode = file->f_dentry->d_inode;	memset((char *)page_address(page), 0, PAGE_SIZE);	memcpy((char *)page_address(page), UDF_I_DATA(inode) + UDF_I_LENEATTR(inode),		inode->i_size);	set_bit(PG_uptodate, &page->flags);	return 0;}/* * Make sure the offset never goes beyond the 32-bit mark.. */static long long udf_file_llseek(struct file * file, long long offset, int origin){	struct inode * inode = file->f_dentry->d_inode;	switch (origin)	{		case 2:		{			offset += inode->i_size;			break;		}		case 1:		{			offset += file->f_pos;			break;		}	}#if BITS_PER_LONG < 64	if (((unsigned long long) offset >> 32) != 0)	{		return -EINVAL;	}#endif	if (offset != file->f_pos)	{		file->f_pos = offset;		file->f_reada = 0;#if LINUX_VERSION_CODE < KERNEL_VERSION(2,2,14)		file->f_version = ++event;#else		file->f_version = ++global_event;#endif	}	return offset;}static inline void remove_suid(struct inode * inode){	unsigned int mode;	/* set S_IGID if S_IXGRP is set, and always set S_ISUID */	mode = (inode->i_mode & S_IXGRP)*(S_ISGID/S_IXGRP) | S_ISUID;	/* was any of the uid bits set? */	mode &= inode->i_mode;	if (mode && !capable(CAP_FSETID))	{		inode->i_mode &= ~mode;		mark_inode_dirty(inode);	}}static ssize_t udf_file_write(struct file * filp, const char * buf,	size_t count, loff_t *ppos){	struct inode *inode = filp->f_dentry->d_inode;	off_t pos;	long block;	int offset;	int written, c;	struct buffer_head * bh, * bufferlist[NBUF];	struct super_block * sb;	int err;	int i, buffercount, write_error, new_buffer;	unsigned long limit;	/* POSIX: mtime/ctime may not change for 0 count */	if (!count)		return 0;	/* This makes the bounds-checking arithmetic later on much more	 * sane. */	write_error = buffercount = 0;	if (!inode)	{		printk("udf_file_write: inode = NULL\n");		return -EINVAL;	}	sb = inode->i_sb;	if (sb->s_flags & MS_RDONLY)	{		return -ENOSPC;	}	if (!S_ISREG(inode->i_mode))	{		udf_warning(sb, "udf_file_write", "mode = %07o", inode->i_mode);		return -EINVAL;	}	remove_suid(inode);	if (filp->f_flags & O_APPEND)		pos = inode->i_size;	else	{		pos = *ppos;		if (pos != *ppos)			return -EINVAL;	}#if BITS_PER_LONG < 64	/* If the fd's pos is already greater than or equal to the file	 * descriptor's offset maximum, then we need to return EFBIG for	 * any non-zero count (and we already tested for zero above). */	if (((off_t) pos) >= 0x7FFFFFFFUL)		return -EFBIG;	/* If we are about to overflow the maximum file size, we also	 * need to return the error, but only if no bytes can be written	 * successfully. */	if (((off_t) pos + count) > 0x7FFFFFFFUL)	{		count = 0x7FFFFFFFL - pos;		if (((ssize_t) count) < 0)			return -EFBIG;	}#endif	limit = current->rlim[RLIMIT_FSIZE].rlim_cur;	if (limit < RLIM_INFINITY)	{		if (((off_t) pos + count) >= limit)		{			count = limit - pos;			if (((ssize_t) count) <= 0)			{				send_sig(SIGXFSZ, current, 0);				return -EFBIG;			}		}	}	if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)	{		if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) +			pos + count))		{			udf_expand_file_adinicb(inode, pos + count, &err);			if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)			{				udf_debug("udf_expand_file_adinicb: err=%d\n", err);				return err;			}		}		else		{			if (pos + count > inode->i_size)				UDF_I_LENALLOC(inode) = pos + count;			else				UDF_I_LENALLOC(inode) = inode->i_size;			pos += udf_file_entry_alloc_offset(inode);		}	}	if (filp->f_flags & O_SYNC)		; /* Do something */	block = pos >> sb->s_blocksize_bits;	offset = pos & (sb->s_blocksize - 1);	c = sb->s_blocksize - offset;	written = 0;	if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)	{		pos -= udf_file_entry_alloc_offset(inode);		if (c > count)			c = count;		c -= copy_from_user(UDF_I_DATA(inode) + pos, buf, c);		if (!c)		{			if (!written)				written = -EFAULT;		}		else		{			pos += c;			written += c;			buf += c;			count -= c;		}		goto out;	}	do	{		bh = udf_getblk(inode, block, 1, &err);		if (!bh)		{			if (!written)				written = err;			break;		}		if (c > count)			c = count;		new_buffer = (!buffer_uptodate(bh) && !buffer_locked(bh) &&			c == sb->s_blocksize);		if (new_buffer)		{			set_bit(BH_Lock, &bh->b_state);			c -= copy_from_user(bh->b_data + offset, buf, c);			if (c != sb->s_blocksize)			{				c = 0;				unlock_buffer(bh);				brelse(bh);				if (!written)					written = -EFAULT;				break;			}			mark_buffer_uptodate(bh, 1);			unlock_buffer(bh);		}		else		{			if (!buffer_uptodate(bh))			{				ll_rw_block(READ, 1, &bh);				wait_on_buffer(bh);				if (!buffer_uptodate(bh))				{					brelse(bh);					if (!written)						written = -EIO;					break;				}			}			c -= copy_from_user(bh->b_data + offset, buf, c);		}		if (!c)		{			brelse(bh);			if (!written)				written = -EFAULT;			break;		}		mark_buffer_dirty(bh, 0);#if LINUX_VERSION_CODE < KERNEL_VERSION(2,2,14)		update_vm_cache(inode, pos, bh->b_data + offset, c);#else		update_vm_cache_conditional(inode, pos, bh->b_data + offset, c,			(unsigned long) buf);#endif		pos += c;		written += c;		buf += c;		count -= c;		if (filp->f_flags & O_SYNC)			bufferlist[buffercount++] = bh;		else			brelse(bh);		if (buffercount == NBUF)		{			ll_rw_block(WRITE, buffercount, bufferlist);			for (i=0; i<buffercount; i++)			{				wait_on_buffer(bufferlist[i]);				if (!buffer_uptodate(bufferlist[i]))					write_error = 1;				brelse(bufferlist[i]);			}			buffercount = 0;		}		if (write_error)			break;		block++;		offset = 0;		c = sb->s_blocksize;	} while (count);	if (buffercount)	{		ll_rw_block(WRITE, buffercount, bufferlist);		for (i=0; i<buffercount; i++)		{			wait_on_buffer(bufferlist[i]);			if (!buffer_uptodate(bufferlist[i]))				write_error = 1;			brelse(bufferlist[i]);		}	}out:	if (pos > inode->i_size)		inode->i_size = pos;	if (filp->f_flags & O_SYNC)		; /* Do something */	inode->i_ctime = inode->i_mtime = CURRENT_TIME;	UDF_I_UCTIME(inode) = UDF_I_UMTIME(inode) = CURRENT_UTIME;	*ppos = pos;	mark_inode_dirty(inode);	return written;}/* * udf_ioctl * * PURPOSE *	Issue an ioctl. * * DESCRIPTION *	Optional - sys_ioctl() will return -ENOTTY if this routine is not *	available, and the ioctl cannot be handled without filesystem help. * *	sys_ioctl() handles these ioctls that apply only to regular files: *		FIBMAP [requires udf_bmap()], FIGETBSZ, FIONREAD *	These ioctls are also handled by sys_ioctl(): *		FIOCLEX, FIONCLEX, FIONBIO, FIOASYNC *	All other ioctls are passed to the filesystem. * *	Refer to sys_ioctl() in fs/ioctl.c *	sys_ioctl() -> . * * PRE-CONDITIONS *	inode			Pointer to inode that ioctl was issued on. *	filp			Pointer to file that ioctl was issued on. *	cmd			The ioctl command. *	arg			The ioctl argument [can be interpreted as a *				user-space pointer if desired]. * * POST-CONDITIONS *	<return>		Success (>=0) or an error code (<=0) that *				sys_ioctl() will return. * * HISTORY *	July 1, 1997 - Andrew E. Mileski *	Written, tested, and released. */int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,	unsigned long arg){	int result = -EINVAL;	if ( permission(inode, MAY_READ) != 0 )	{		udf_debug("no permission to access inode %lu\n",						inode->i_ino);		return -EPERM;	}	if ( !arg )	{		udf_debug("invalid argument to udf_ioctl\n");		return -EINVAL;	}	switch (cmd)	{		case UDF_GETVOLIDENT:			return copy_to_user((char *)arg,				UDF_SB_VOLIDENT(inode->i_sb), 32) ? -EFAULT : 0;		case UDF_RELOCATE_BLOCKS:		{			long old, new;			if (!capable(CAP_SYS_ADMIN)) return -EACCES;			if (get_user(old, (long *)arg)) return -EFAULT;			if ((result = udf_relocate_blocks(inode->i_sb,					old, &new)) == 0)				result = put_user(new, (long *)arg);			return result;		}		case UDF_GETEASIZE:			result = put_user(UDF_I_LENEATTR(inode), (int *)arg);			break;		case UDF_GETEABLOCK:			result = copy_to_user((char *)arg, UDF_I_DATA(inode),				UDF_I_LENEATTR(inode)) ? -EFAULT : 0;			break;	}	return result;}/* * udf_release_file * * PURPOSE *  Called when all references to the file are closed * * DESCRIPTION *  Discard prealloced blocks * * HISTORY * */static int udf_release_file(struct inode * inode, struct file * filp){	if (filp->f_mode & FMODE_WRITE)		udf_discard_prealloc(inode);	return 0;}#if BITS_PER_LONG < 64/* * udf_open_file * * PURPOSE *  Called when an inode is about to be open. * * DESCRIPTION *  Use this to disallow opening RW large files on 32 bit systems. * * HISTORY * */static int udf_open_file(struct inode * inode, struct file * filp){	if (inode->i_size == (uint32_t)-1 && (filp->f_mode & FMODE_WRITE))		return -EFBIG;	return 0;}#endifstatic struct file_operations udf_file_operations = {	udf_file_llseek,		/* llseek */	generic_file_read,		/* read */	udf_file_write,			/* write */	NULL,					/* readdir */	NULL,					/* poll */	udf_ioctl,				/* ioctl */	generic_file_mmap,		/* mmap */#if BITS_PER_LONG < 64	udf_open_file,			/* open */#else	NULL, 					/* open */#endif	NULL,					/* flush */	udf_release_file,		/* release */	udf_sync_file,			/* fsync */	NULL,					/* fasync */	NULL,					/* check_media_change */	NULL,					/* revalidate */	NULL					/* lock */};struct inode_operations udf_file_inode_operations = {	&udf_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 */	generic_readpage,		/* readpage */	NULL,					/* writepage */	udf_bmap,				/* bmap */	udf_truncate,			/* truncate */	NULL,					/* permission */	NULL,					/* smap */	NULL,					/* updatepage */	NULL					/* revalidate */};struct inode_operations udf_file_inode_operations_adinicb = {	&udf_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 */	udf_adinicb_readpage,	/* readpage */	NULL,					/* writepage */	NULL,					/* bmap */	udf_truncate,			/* truncate */	NULL,					/* permission */	NULL,					/* smap */	NULL,					/* updatepage */	NULL					/* revalidate */};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩午夜中文字幕| 日韩理论片中文av| 91精品国产综合久久久久久久 | 欧美最新大片在线看| eeuss国产一区二区三区| 成人综合在线视频| 国产成人av影院| 国产精品一区免费在线观看| 黄页网站大全一区二区| 国产一区二区三区免费在线观看| 美国毛片一区二区三区| 六月丁香综合在线视频| 国产揄拍国内精品对白| 国产一区二区免费视频| 国产成人超碰人人澡人人澡| 成人黄色在线网站| 日本久久电影网| 欧美视频一区二| 欧美日韩国产综合视频在线观看| 777a∨成人精品桃花网| 欧美本精品男人aⅴ天堂| 久久综合色天天久久综合图片| 国产清纯白嫩初高生在线观看91| 中文字幕第一区综合| 亚洲黄网站在线观看| 亚洲成人一区二区在线观看| 免费看日韩a级影片| 精品一区二区三区日韩| 国产成人aaa| 91福利国产成人精品照片| 91精品一区二区三区久久久久久| 精品国产麻豆免费人成网站| 国产欧美一区二区精品性| 依依成人综合视频| 日本特黄久久久高潮| 国产黄色成人av| 91福利在线导航| 久久综合99re88久久爱| 亚洲精品国产视频| 蜜桃av噜噜一区| 91看片淫黄大片一级| 欧美一区二区三区免费| 中文字幕中文在线不卡住| 婷婷一区二区三区| 成人久久视频在线观看| 欧美日韩一区高清| 久久久亚洲精华液精华液精华液| 亚洲品质自拍视频| 国内成+人亚洲+欧美+综合在线 | 欧美人成免费网站| 久久日韩粉嫩一区二区三区| 亚洲综合在线免费观看| 久草在线在线精品观看| 99riav久久精品riav| 欧美丰满高潮xxxx喷水动漫| 亚洲精品一区二区在线观看| 亚洲精品日日夜夜| 免费欧美日韩国产三级电影| 91免费看`日韩一区二区| 欧美一区二区三区在线看| 亚洲人吸女人奶水| 免费在线看一区| 91福利视频久久久久| 26uuu国产一区二区三区| 亚洲激情自拍视频| 黄色日韩网站视频| 欧美午夜不卡在线观看免费| 久久亚洲欧美国产精品乐播| 亚洲一卡二卡三卡四卡无卡久久| 精品一区二区日韩| 国产一二三精品| 91精品国产色综合久久ai换脸| 日韩欧美国产一区在线观看| 一区二区三区不卡视频| 国产精品99久久久| 欧美男生操女生| 国产精品国产三级国产aⅴ入口 | 国产精品视频麻豆| 婷婷久久综合九色综合伊人色| 99久久99久久精品免费看蜜桃| 91精品国产一区二区三区香蕉| 一区二区三区中文字幕电影| 黄页视频在线91| 欧美在线视频全部完| 日韩欧美一区在线| 亚洲观看高清完整版在线观看 | 高清国产一区二区三区| 欧美一区二区高清| 成人一级视频在线观看| 欧美老人xxxx18| 一级中文字幕一区二区| 国产成人在线影院| 精品成人私密视频| 五月天中文字幕一区二区| 欧美三级视频在线观看| 亚洲视频中文字幕| 国产成人a级片| 26uuu亚洲综合色欧美 | 亚洲bt欧美bt精品| 欧美性色欧美a在线播放| 亚洲欧洲色图综合| 99re在线视频这里只有精品| 久久综合色一综合色88| 国产一区二区精品久久99| 精品视频一区二区不卡| 午夜精品国产更新| 色综合视频一区二区三区高清| 国产精品成人免费在线| 国产老肥熟一区二区三区| 国产色产综合产在线视频| 日韩av电影免费观看高清完整版| 欧美电影一区二区三区| 亚洲精品国产一区二区三区四区在线| 一本到不卡免费一区二区| 国产精品福利一区| 日本黄色一区二区| 亚洲三级免费电影| 欧美在线视频你懂得| 亚洲夂夂婷婷色拍ww47| 91精品中文字幕一区二区三区| 午夜视频在线观看一区二区三区| 欧美一区二区三区在线观看视频| 午夜欧美电影在线观看| 欧美成人官网二区| 精品一区二区三区在线播放视频| 国产日韩精品一区二区三区在线| 国产ts人妖一区二区| 国产精品免费免费| 色综合久久久久久久久| 日韩电影在线免费看| 欧美丰满一区二区免费视频 | youjizz久久| 亚洲一区在线观看免费观看电影高清| 日本高清不卡一区| 日韩高清一区二区| 日韩精品最新网址| 99re热这里只有精品视频| 亚洲激情欧美激情| 在线成人高清不卡| 日韩一区精品视频| 久久久精品中文字幕麻豆发布| 国产成人自拍高清视频在线免费播放| 久久免费美女视频| 成人免费不卡视频| 一区二区国产视频| 欧美人狂配大交3d怪物一区| 午夜精品123| 精品日韩欧美在线| 91丨porny丨最新| 日韩电影在线免费观看| 国产精品乱码一区二三区小蝌蚪| 91色在线porny| 久久精品国产99国产精品| 久久久久国产成人精品亚洲午夜| 欧洲一区在线电影| 蜜臀av性久久久久av蜜臀妖精| 国产精品久久久一本精品| 91久久精品午夜一区二区| 国产一区91精品张津瑜| 亚洲乱码国产乱码精品精98午夜| 精品久久久久久综合日本欧美| 高潮精品一区videoshd| 日韩国产在线观看| 日韩视频一区二区三区在线播放| 91视频在线观看| 午夜精品福利在线| 国产婷婷色一区二区三区四区| 欧美综合一区二区三区| 精品在线一区二区三区| 亚洲综合视频在线| 久久精品视频一区| 欧美人xxxx| av一本久道久久综合久久鬼色| 久草热8精品视频在线观看| 亚洲日本护士毛茸茸| 久久精品一区蜜桃臀影院| 在线欧美日韩精品| 成人av动漫网站| 亚洲va韩国va欧美va| 亚洲色欲色欲www| 欧美videossexotv100| 在线亚洲免费视频| av中文一区二区三区| 久久精品国产久精国产爱| 石原莉奈一区二区三区在线观看| 国产欧美精品日韩区二区麻豆天美| 欧美一级日韩一级| 色悠悠久久综合| 成人高清视频免费观看| 麻豆91免费观看| 免费的成人av| 日本在线播放一区二区三区| 亚洲乱码国产乱码精品精小说 | 日韩久久久久久| 精品视频免费在线| 欧美亚洲国产怡红院影院| 国产在线一区观看| 久久99精品视频| 午夜私人影院久久久久| 五月天一区二区|