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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? super.c

?? 《嵌入式系統(tǒng)設(shè)計與實例開發(fā)實驗教材二源碼》Linux內(nèi)核移植與編譯實驗
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* * super.c * * PURPOSE *  Super block routines for the OSTA-UDF(tm) filesystem. * * DESCRIPTION *  OSTA-UDF(tm) = Optical Storage Technology Association *  Universal Disk Format. * *  This code is based on version 2.00 of the UDF specification, *  and revision 3 of the ECMA 167 standard [equivalent to ISO 13346]. *    http://www.osta.org/ *    http://www.ecma.ch/ *    http://www.iso.org/ * * 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 Dave Boynton *  (C) 1998-2000 Ben Fennema *  (C) 2000 Stelias Computing Inc * * HISTORY * *  09/24/98 dgb  changed to allow compiling outside of kernel, and *                added some debugging. *  10/01/98 dgb  updated to allow (some) possibility of compiling w/2.0.34 *  10/16/98      attempting some multi-session support *  10/17/98      added freespace count for "df" *  11/11/98 gr   added novrs option *  11/26/98 dgb  added fileset,anchor mount options *  12/06/98 blf  really hosed things royally. vat/sparing support. sequenced vol descs *                rewrote option handling based on isofs *  12/20/98      find the free space bitmap (if it exists) */#include "udfdecl.h"    #include <linux/config.h>#include <linux/version.h>#include <linux/blkdev.h>#include <linux/slab.h>#include <linux/kernel.h>#include <linux/locks.h>#include <linux/module.h>#include <linux/stat.h>#include <linux/cdrom.h>#include <linux/nls.h>#include <asm/byteorder.h>#include <linux/udf_fs.h>#include "udf_sb.h"#include "udf_i.h"#include <linux/init.h>#include <asm/uaccess.h>#define VDS_POS_PRIMARY_VOL_DESC	0#define VDS_POS_UNALLOC_SPACE_DESC	1#define VDS_POS_LOGICAL_VOL_DESC	2#define VDS_POS_PARTITION_DESC		3#define VDS_POS_IMP_USE_VOL_DESC	4#define VDS_POS_VOL_DESC_PTR		5#define VDS_POS_TERMINATING_DESC	6#define VDS_POS_LENGTH			7static char error_buf[1024];/* These are the "meat" - everything else is stuffing */static struct super_block *udf_read_super(struct super_block *, void *, int);static void udf_put_super(struct super_block *);static void udf_write_super(struct super_block *);static int udf_remount_fs(struct super_block *, int *, char *);static int udf_check_valid(struct super_block *, int, int);static int udf_vrs(struct super_block *sb, int silent);static int udf_load_partition(struct super_block *, lb_addr *);static int udf_load_logicalvol(struct super_block *, struct buffer_head *, lb_addr *);static void udf_load_logicalvolint(struct super_block *, extent_ad);static void udf_find_anchor(struct super_block *);static int udf_find_fileset(struct super_block *, lb_addr *, lb_addr *);static void udf_load_pvoldesc(struct super_block *, struct buffer_head *);static void udf_load_fileset(struct super_block *, struct buffer_head *, lb_addr *);static void udf_load_partdesc(struct super_block *, struct buffer_head *);static void udf_open_lvid(struct super_block *);static void udf_close_lvid(struct super_block *);static unsigned int udf_count_free(struct super_block *);static int udf_statfs(struct super_block *, struct statfs *);/* UDF filesystem type */static DECLARE_FSTYPE_DEV(udf_fstype, "udf", udf_read_super);/* Superblock operations */static struct super_operations udf_sb_ops = {	read_inode:		udf_read_inode,	write_inode:		udf_write_inode,	put_inode:		udf_put_inode,	delete_inode:		udf_delete_inode,	put_super:		udf_put_super,	write_super:		udf_write_super,	statfs:			udf_statfs,	remount_fs:		udf_remount_fs,};struct udf_options{	unsigned char novrs;	unsigned int blocksize;	unsigned int session;	unsigned int lastblock;	unsigned int anchor;	unsigned int volume;	unsigned short partition;	unsigned int fileset;	unsigned int rootdir;	unsigned int flags;	mode_t umask;	gid_t gid;	uid_t uid;	struct nls_table *nls_map;};static int __init init_udf_fs(void){	printk(KERN_NOTICE "udf: registering filesystem\n");	return register_filesystem(&udf_fstype);}static void __exit exit_udf_fs(void){	printk(KERN_NOTICE "udf: unregistering filesystem\n");	unregister_filesystem(&udf_fstype);}EXPORT_NO_SYMBOLS;module_init(init_udf_fs)module_exit(exit_udf_fs)/* * udf_parse_options * * PURPOSE *	Parse mount options. * * DESCRIPTION *	The following mount options are supported: * *	gid=		Set the default group. *	umask=		Set the default umask. *	uid=		Set the default user. *	bs=			Set the block size. *	unhide		Show otherwise hidden files. *	undelete	Show deleted files in lists. *	adinicb		Embed data in the inode (default) *	noadinicb	Don't embed data in the inode *	shortad		Use short ad's *	longad		Use long ad's (default) *	nostrict	Unset strict conformance *	iocharset=	Set the NLS character set * *	The remaining are for debugging and disaster recovery: * *	novrs		Skip volume sequence recognition  * *	The following expect a offset from 0. * *	session=	Set the CDROM session (default= last session) *	anchor=		Override standard anchor location. (default= 256) *	volume=		Override the VolumeDesc location. (unused) *	partition=	Override the PartitionDesc location. (unused) *	lastblock=	Set the last block of the filesystem/ * *	The following expect a offset from the partition root. * *	fileset=	Override the fileset block location. (unused) *	rootdir=	Override the root directory location. (unused) *		WARNING: overriding the rootdir to a non-directory may *		yield highly unpredictable results. * * PRE-CONDITIONS *	options		Pointer to mount options string. *	uopts		Pointer to mount options variable. * * POST-CONDITIONS *	<return>	0	Mount options parsed okay. *	<return>	-1	Error parsing mount options. * * HISTORY *	July 1, 1997 - Andrew E. Mileski *	Written, tested, and released. */static intudf_parse_options(char *options, struct udf_options *uopt){	char *opt, *val;	uopt->novrs = 0;	uopt->blocksize = 2048;	uopt->partition = 0xFFFF;	uopt->session = 0xFFFFFFFF;	uopt->lastblock = 0;	uopt->anchor = 0;	uopt->volume = 0xFFFFFFFF;	uopt->rootdir = 0xFFFFFFFF;	uopt->fileset = 0xFFFFFFFF;	uopt->nls_map = NULL;	if (!options)		return 1;	for (opt = strtok(options, ","); opt; opt = strtok(NULL, ","))	{		/* Make "opt=val" into two strings */		val = strchr(opt, '=');		if (val)			*(val++) = 0;		if (!strcmp(opt, "novrs") && !val)			uopt->novrs = 1;		else if (!strcmp(opt, "bs") && val)			uopt->blocksize = simple_strtoul(val, NULL, 0);		else if (!strcmp(opt, "unhide") && !val)			uopt->flags |= (1 << UDF_FLAG_UNHIDE);		else if (!strcmp(opt, "undelete") && !val)			uopt->flags |= (1 << UDF_FLAG_UNDELETE);		else if (!strcmp(opt, "noadinicb") && !val)			uopt->flags &= ~(1 << UDF_FLAG_USE_AD_IN_ICB);		else if (!strcmp(opt, "adinicb") && !val)			uopt->flags |= (1 << UDF_FLAG_USE_AD_IN_ICB);		else if (!strcmp(opt, "shortad") && !val)			uopt->flags |= (1 << UDF_FLAG_USE_SHORT_AD);		else if (!strcmp(opt, "longad") && !val)			uopt->flags &= ~(1 << UDF_FLAG_USE_SHORT_AD);		else if (!strcmp(opt, "gid") && val)			uopt->gid = simple_strtoul(val, NULL, 0);		else if (!strcmp(opt, "umask") && val)			uopt->umask = simple_strtoul(val, NULL, 0);		else if (!strcmp(opt, "nostrict") && !val)			uopt->flags &= ~(1 << UDF_FLAG_STRICT);		else if (!strcmp(opt, "uid") && val)			uopt->uid = simple_strtoul(val, NULL, 0);		else if (!strcmp(opt, "session") && val)			uopt->session = simple_strtoul(val, NULL, 0);		else if (!strcmp(opt, "lastblock") && val)			uopt->lastblock = simple_strtoul(val, NULL, 0);		else if (!strcmp(opt, "anchor") && val)			uopt->anchor = simple_strtoul(val, NULL, 0);		else if (!strcmp(opt, "volume") && val)			uopt->volume = simple_strtoul(val, NULL, 0);		else if (!strcmp(opt, "partition") && val)			uopt->partition = simple_strtoul(val, NULL, 0);		else if (!strcmp(opt, "fileset") && val)			uopt->fileset = simple_strtoul(val, NULL, 0);		else if (!strcmp(opt, "rootdir") && val)			uopt->rootdir = simple_strtoul(val, NULL, 0);#ifdef CONFIG_NLS		else if (!strcmp(opt, "iocharset") && val)		{			uopt->nls_map = load_nls(val);			uopt->flags |= (1 << UDF_FLAG_NLS_MAP);		}#endif		else if (!strcmp(opt, "utf8") && !val)			uopt->flags |= (1 << UDF_FLAG_UTF8);		else if (val)		{			printk(KERN_ERR "udf: bad mount option \"%s=%s\"\n",				opt, val);			return 0;		}		else		{			printk(KERN_ERR "udf: bad mount option \"%s\"\n",				opt);			return 0;		}	}	return 1;}voidudf_write_super(struct super_block *sb){	if (!(sb->s_flags & MS_RDONLY))		udf_open_lvid(sb);	sb->s_dirt = 0;}static intudf_remount_fs(struct super_block *sb, int *flags, char *options){	struct udf_options uopt;	uopt.flags = UDF_SB(sb)->s_flags ;	uopt.uid   = UDF_SB(sb)->s_uid ;	uopt.gid   = UDF_SB(sb)->s_gid ;	uopt.umask = UDF_SB(sb)->s_umask ;	if ( !udf_parse_options(options, &uopt) )		return -EINVAL;	UDF_SB(sb)->s_flags = uopt.flags;	UDF_SB(sb)->s_uid   = uopt.uid;	UDF_SB(sb)->s_gid   = uopt.gid;	UDF_SB(sb)->s_umask = uopt.umask;#if UDFFS_RW != 1	*flags |= MS_RDONLY;#endif	if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))		return 0;	if (*flags & MS_RDONLY)		udf_close_lvid(sb);	else		udf_open_lvid(sb);	return 0;}/* * udf_set_blocksize * * PURPOSE *	Set the block size to be used in all transfers. * * DESCRIPTION *	To allow room for a DMA transfer, it is best to guess big when unsure. *	This routine picks 2048 bytes as the blocksize when guessing. This *	should be adequate until devices with larger block sizes become common. * *	Note that the Linux kernel can currently only deal with blocksizes of *	512, 1024, 2048, 4096, and 8192 bytes. * * PRE-CONDITIONS *	sb			Pointer to _locked_ superblock. * * POST-CONDITIONS *	sb->s_blocksize		Blocksize. *	sb->s_blocksize_bits	log2 of blocksize. *	<return>	0	Blocksize is valid. *	<return>	1	Blocksize is invalid. * * HISTORY *	July 1, 1997 - Andrew E. Mileski *	Written, tested, and released. */static  intudf_set_blocksize(struct super_block *sb, int bsize){	/* Use specified block size if specified */	if (bsize)		sb->s_blocksize = bsize;	if (get_hardsect_size(sb->s_dev) > sb->s_blocksize)		sb->s_blocksize = get_hardsect_size(sb->s_dev); 	/* Block size must be an even multiple of 512 */	switch (sb->s_blocksize)	{		case 512: sb->s_blocksize_bits = 9;	break;		case 1024: sb->s_blocksize_bits = 10; break;		case 2048: sb->s_blocksize_bits = 11; break;		case 4096: sb->s_blocksize_bits = 12; break;		case 8192: sb->s_blocksize_bits = 13; break;		default:		{			udf_debug("Bad block size (%ld)\n", sb->s_blocksize);			printk(KERN_ERR "udf: bad block size (%ld)\n", sb->s_blocksize);			return 0;		}	}	/* Set the block size */	set_blocksize(sb->s_dev, sb->s_blocksize);	return sb->s_blocksize;}static intudf_vrs(struct super_block *sb, int silent){	struct VolStructDesc *vsd = NULL;	int sector = 32768;	int sectorsize;	struct buffer_head *bh = NULL;	int iso9660=0;	int nsr02=0;	int nsr03=0;	/* Block size must be a multiple of 512 */	if (sb->s_blocksize & 511)		return 0;	if (sb->s_blocksize < sizeof(struct VolStructDesc))		sectorsize = sizeof(struct VolStructDesc);	else		sectorsize = sb->s_blocksize;	sector += (UDF_SB_SESSION(sb) << sb->s_blocksize_bits);	udf_debug("Starting at sector %u (%ld byte sectors)\n",		(sector >> sb->s_blocksize_bits), sb->s_blocksize);	/* Process the sequence (if applicable) */	for (;!nsr02 && !nsr03; sector += sectorsize)	{		/* Read a block */		bh = udf_tread(sb, sector >> sb->s_blocksize_bits);		if (!bh)			break;		/* Look for ISO  descriptors */		vsd = (struct VolStructDesc *)(bh->b_data +			(sector & (sb->s_blocksize - 1)));		if (vsd->stdIdent[0] == 0)		{			udf_release_data(bh);			break;		}		else if (!strncmp(vsd->stdIdent, STD_ID_CD001, STD_ID_LEN))		{			iso9660 = sector;			switch (vsd->structType)			{				case 0: 					udf_debug("ISO9660 Boot Record found\n");					break;				case 1: 					udf_debug("ISO9660 Primary Volume Descriptor found\n");					break;				case 2: 					udf_debug("ISO9660 Supplementary Volume Descriptor found\n");					break;				case 3: 					udf_debug("ISO9660 Volume Partition Descriptor found\n");					break;				case 255: 					udf_debug("ISO9660 Volume Descriptor Set Terminator found\n");					break;				default: 					udf_debug("ISO9660 VRS (%u) found\n", vsd->structType);					break;			}		}		else if (!strncmp(vsd->stdIdent, STD_ID_BEA01, STD_ID_LEN))

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区高清| 免费在线观看视频一区| 亚洲永久精品大片| 亚洲国产精品一区二区久久| 欧美一级午夜免费电影| 日韩精品一区二区三区在线| 不卡一区二区三区四区| 国产99久久精品| 99热这里都是精品| 欧美一区二区三区日韩视频| 欧美国产日韩一二三区| 在线电影院国产精品| 欧美亚洲一区三区| 久久99久久久欧美国产| 色综合久久久久久久| 欧美日韩激情一区| 久久女同互慰一区二区三区| 亚洲裸体在线观看| 欧美日本国产一区| 国产欧美日韩综合精品一区二区| 国产欧美日韩在线看| 午夜影院久久久| 精品亚洲成a人在线观看 | 免费国产亚洲视频| 国产精品伊人色| 91小视频免费观看| 美女脱光内衣内裤视频久久影院| 国产一区在线看| 91丨porny丨蝌蚪视频| 91精品国产日韩91久久久久久| 欧美国产一区在线| 蜜桃av一区二区三区| 日本高清不卡aⅴ免费网站| 亚洲国产精品成人久久综合一区| 男男成人高潮片免费网站| 欧美日韩亚洲综合一区二区三区| 日韩一区二区三区四区| 国产精品传媒视频| 国产精品一级黄| 欧美精品一区二区在线播放 | 国产a精品视频| 久久五月婷婷丁香社区| 老司机精品视频在线| 欧美性三三影院| 亚洲欧美偷拍另类a∨色屁股| 成人av网址在线| 国产精品乱码人人做人人爱| 韩国成人精品a∨在线观看| 精品久久国产老人久久综合| 日韩av网站在线观看| 欧美精品 国产精品| 亚洲va欧美va人人爽| 欧美久久久久免费| 一区二区三区在线视频播放| 91蜜桃婷婷狠狠久久综合9色| 国产丝袜美腿一区二区三区| 黄色成人免费在线| 国产精品三级av在线播放| 99re这里只有精品6| 亚洲精品五月天| 欧美精品一卡两卡| 精品一区二区三区av| 国产精品久久看| 欧美最新大片在线看| 日本一区中文字幕| 国产视频在线观看一区二区三区 | 亚洲va欧美va人人爽午夜| 欧美肥妇free| 国产精品资源网站| 亚洲一区二三区| 久久―日本道色综合久久| 99vv1com这只有精品| 日本怡春院一区二区| 中文字幕一区二区三区四区| 欧美综合一区二区| 久久国产乱子精品免费女| 亚洲激情五月婷婷| 日韩免费看的电影| 色香蕉成人二区免费| 久久精品av麻豆的观看方式| 中文字幕精品综合| 色天天综合色天天久久| 国产一区久久久| 欧美男女性生活在线直播观看| 不卡的看片网站| 成人精品亚洲人成在线| 国产91在线看| 国产高清精品在线| 国产一区欧美一区| 国产精一区二区三区| 国模套图日韩精品一区二区| 精品一区二区在线观看| 另类小说一区二区三区| 久久99精品国产.久久久久久| 免费在线成人网| 亚洲午夜久久久| 亚洲综合激情网| 一区二区三区成人在线视频| 亚洲人亚洲人成电影网站色| 国产欧美1区2区3区| 国产欧美精品一区| 国产精品色在线| 国产精品久久久久aaaa| 亚洲综合久久久久| 秋霞午夜鲁丝一区二区老狼| 久久精品国产免费| 国产成人无遮挡在线视频| 99热这里都是精品| 欧洲精品一区二区| 欧美日产在线观看| 久久久www成人免费无遮挡大片| 国产精品久久久久久久第一福利| 亚洲三级在线观看| 麻豆国产精品一区二区三区| 国产成人精品www牛牛影视| 日本久久一区二区三区| 91精品国产麻豆国产自产在线| 精品国产伦一区二区三区观看体验 | 日本高清免费不卡视频| 日韩精品一区二区三区视频在线观看| 2欧美一区二区三区在线观看视频| 亚洲人精品一区| 韩国女主播成人在线观看| 欧美三级欧美一级| 国产欧美一区在线| 理论电影国产精品| 欧美体内she精高潮| 国产免费久久精品| 日韩电影网1区2区| 成人福利视频在线看| 精品伦理精品一区| 一区二区三区欧美视频| 国产在线播放一区| 欧美色综合天天久久综合精品| 欧美国产一区二区| 久国产精品韩国三级视频| 色婷婷综合久久久中文字幕| 久久综合九色综合97婷婷女人 | 欧美亚洲图片小说| 亚洲精品国产无天堂网2021| 激情综合色综合久久| 欧美另类高清zo欧美| 亚洲一区视频在线| 91国模大尺度私拍在线视频| 国产精品九色蝌蚪自拍| 国产一区二区h| 精品日产卡一卡二卡麻豆| 五月开心婷婷久久| 欧美日韩三级一区二区| 亚洲成av人片在线观看| 欧美日韩高清在线| 日本视频一区二区| 日韩午夜av电影| 国产精品一区二区三区网站| 久久精品人人做人人爽人人| 狠狠色丁香九九婷婷综合五月| 精品国产一区二区国模嫣然| 国内精品国产成人| 国产精品理论片| av成人免费在线| 一区二区三区四区国产精品| 欧美日韩视频专区在线播放| 青青草视频一区| 久久久亚洲欧洲日产国码αv| 成人午夜电影网站| 亚洲综合色噜噜狠狠| 51精品视频一区二区三区| 久久av老司机精品网站导航| 国产亚洲精品免费| 色综合天天天天做夜夜夜夜做| 香蕉av福利精品导航| 欧美一区二区三区视频在线| 国产不卡在线播放| 亚洲成人免费视频| 国产精品私房写真福利视频| 欧美日韩国产片| 暴力调教一区二区三区| 图片区日韩欧美亚洲| 国产午夜亚洲精品理论片色戒| 欧日韩精品视频| 成人精品小蝌蚪| 精品一二线国产| 亚洲图片欧美综合| 中文字幕的久久| 日韩欧美电影在线| 欧美自拍丝袜亚洲| 91久久精品网| 91玉足脚交白嫩脚丫在线播放| 国产一区二区三区不卡在线观看| 亚洲1区2区3区视频| 中文字幕在线不卡视频| 国产亚洲成av人在线观看导航| 日韩久久久久久| 91精品国产91久久综合桃花| 2020国产精品久久精品美国| 一本色道a无线码一区v| 国内精品写真在线观看| 日韩电影在线看| 午夜精品福利一区二区蜜股av| 亚洲一区二区黄色|