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

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

?? inode.c

?? elinux jffs初始版本 具體了解JFFS的文件系統!
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  linux/fs/affs/inode.c * *  (c) 1996  Hans-Joachim Widmaier - Rewritten * *  (C) 1993  Ray Burr - Modified for Amiga FFS filesystem. *  *  (C) 1992  Eric Youngdale Modified for ISO9660 filesystem. * *  (C) 1991  Linus Torvalds - minix filesystem */#include <linux/module.h>#include <linux/errno.h>#include <linux/fs.h>#include <linux/malloc.h>#include <linux/stat.h>#include <linux/sched.h>#include <linux/affs_fs.h>#include <linux/kernel.h>#include <linux/mm.h>#include <linux/string.h>#include <linux/locks.h>#include <linux/errno.h>#include <linux/genhd.h>#include <linux/amigaffs.h>#include <linux/major.h>#include <linux/blkdev.h>#include <asm/system.h>#include <asm/segment.h>extern int *blk_size[];extern struct timezone sys_tz;#define MIN(a,b) (((a)<(b))?(a):(b))voidaffs_put_super(struct super_block *sb){	int	 i;	pr_debug("affs_put_super()\n");	lock_super(sb);	for (i = 0; i < sb->u.affs_sb.s_bm_count; i++)		affs_brelse(sb->u.affs_sb.s_bitmap[i].bm_bh);	if (!(sb->s_flags & MS_RDONLY)) {		ROOT_END_S(sb->u.affs_sb.s_root_bh->b_data,sb)->bm_flag = htonl(1);		secs_to_datestamp(CURRENT_TIME,				  &ROOT_END_S(sb->u.affs_sb.s_root_bh->b_data,sb)->disk_altered);		affs_fix_checksum(sb->s_blocksize,sb->u.affs_sb.s_root_bh->b_data,5);		mark_buffer_dirty(sb->u.affs_sb.s_root_bh,1);	}	if (sb->u.affs_sb.s_flags & SF_PREFIX)		kfree(sb->u.affs_sb.s_prefix);	kfree(sb->u.affs_sb.s_bitmap);	affs_brelse(sb->u.affs_sb.s_root_bh);	/* I'm not happy with this. It would be better to save the previous	 * value of this devices blksize_size[][] in the super block and	 * restore it here, but with the affs superblock being quite large	 * already ...	 */	set_blocksize(sb->s_dev,BLOCK_SIZE);	sb->s_dev = 0;	unlock_super(sb);	MOD_DEC_USE_COUNT;	return;}static voidaffs_write_super(struct super_block *sb){	int	 i, clean = 2;	if (!(sb->s_flags & MS_RDONLY)) {		lock_super(sb);		for (i = 0, clean = 1; i < sb->u.affs_sb.s_bm_count; i++) {			if (sb->u.affs_sb.s_bitmap[i].bm_bh) {				if (buffer_dirty(sb->u.affs_sb.s_bitmap[i].bm_bh)) {					clean = 0;					break;				}			}		}		unlock_super(sb);		ROOT_END_S(sb->u.affs_sb.s_root_bh->b_data,sb)->bm_flag = htonl(clean);		secs_to_datestamp(CURRENT_TIME,				  &ROOT_END_S(sb->u.affs_sb.s_root_bh->b_data,sb)->disk_altered);		affs_fix_checksum(sb->s_blocksize,sb->u.affs_sb.s_root_bh->b_data,5);		mark_buffer_dirty(sb->u.affs_sb.s_root_bh,1);		sb->s_dirt = !clean;	/* redo until bitmap synced */	} else		sb->s_dirt = 0;	pr_debug("AFFS: write_super() at %d, clean=%d\n",CURRENT_TIME,clean);}static struct super_operations affs_sops = { 	affs_read_inode,	affs_notify_change,	affs_write_inode,	affs_put_inode,		affs_put_super,	affs_write_super,	affs_statfs,	NULL			/* remount */};intaffs_parent_ino(struct inode *dir){	int root_ino = (dir->i_sb->u.affs_sb.s_root_block);	if (!S_ISDIR (dir->i_mode)) {		printk ("affs_parent_ino: argument is not a directory\n");		return root_ino;	}	if (dir->i_ino == root_ino)		return root_ino;	return dir->u.affs_i.i_parent;}static intparse_options(char *options, uid_t *uid, gid_t *gid, int *mode, int *reserved, int *root,		int *blocksize, char **prefix, char *volume, unsigned long *mount_opts){	char	*this_char, *value;	int	 f;	/* Fill in defaults */	*uid        = 0;	*gid        = 0;	*reserved   = 2;	*root       = -1;	*blocksize  = -1;	*prefix     = "/";	volume[0]   = ':';	volume[1]   = 0;	*mount_opts = 0;	if (!options)		return 1;	for (this_char = strtok(options,","); this_char; this_char = strtok(NULL,",")) {		f = 0;		if ((value = strchr(this_char,'=')) != NULL)			*value++ = 0;		if (!strcmp(this_char,"protect")) {			if (value) {				printk("AFFS: option protect does not take an argument\n");				return 0;			}			*mount_opts |= SF_IMMUTABLE;		}		else if (!strcmp(this_char,"verbose")) {			if (value) {				printk("AFFS: option verbose does not take an argument\n");				return 0;			}			*mount_opts |= SF_VERBOSE;		}		else if ((f = !strcmp(this_char,"uid")) || !strcmp(this_char,"setuid")) {			if (!value)				*uid = current->uid;			else if (!*value) {				printk("AFFS: argument for uid option missing\n");				return 0;			} else {				*uid = simple_strtoul(value,&value,0);				if (*value)					return 0;				if (!f)					*mount_opts |= SF_SETUID;			}		}		else if ((f = !strcmp(this_char,"gid")) || !strcmp(this_char,"setgid")) {			if (!value)				*gid = current->gid;			else if (!*value) {				printk("AFFS: argument for gid option missing\n");				return 0;			} else {				*gid = simple_strtoul(value,&value,0);				if (*value)					return 0;				if (!f)					*mount_opts |= SF_SETGID;			}		}		else if (!strcmp(this_char,"prefix")) {			if (!value) {				printk("AFFS: The prefix option requires an argument\n");				return 0;			}			*prefix = kmalloc(strlen(value) + 1,GFP_KERNEL);			if (!*prefix)				return 0;			strcpy(*prefix,value);			*mount_opts |= SF_PREFIX;		}		else if (!strcmp(this_char,"volume")) {			if (!value) {				printk("AFFS: The volume option requires an argument\n");				return 0;			}			if (strlen(value) > 30)				value[30] = 0;			strcpy(volume,value);		}		else if (!strcmp(this_char,"mode")) {			if (!value || !*value) {				printk("AFFS: The mode option requires an argument\n");				return 0;			}			*mode = simple_strtoul(value,&value,8) & 0777;			if (*value)				return 0;			*mount_opts |= SF_SETMODE;		}		else if (!strcmp(this_char,"reserved")) {			if (!value || !*value) {				printk("AFFS: The reserved option requires an argument\n");				return 0;			}			*reserved = simple_strtoul(value,&value,0);			if (*value)				return 0;		}		else if (!strcmp(this_char,"root")) {			if (!value || !*value) {				printk("AFFS: The root option requires an argument\n");				return 0;			}			*root = simple_strtoul(value,&value,0);			if (*value)				return 0;		}		else if (!strcmp(this_char,"bs")) {			if (!value || !*value) {				printk("AFFS: The bs option requires an argument\n");				return 0;			}			*blocksize = simple_strtoul(value,&value,0);			if (*value)				return 0;			if (*blocksize != 512 && *blocksize != 1024 && *blocksize != 2048			    && *blocksize != 4096) {				printk ("AFFS: Invalid blocksize (512, 1024, 2048, 4096 allowed).\n");				return 0;			}		}		/* Silently ignore the quota options */		else if (!strcmp (this_char, "grpquota")			 || !strcmp (this_char, "noquota")			 || !strcmp (this_char, "quota")			 || !strcmp (this_char, "usrquota"))			;		else {			printk("AFFS: Unrecognized mount option %s\n", this_char);			return 0;		}	}	return 1;}/* This function definitely needs to be split up. Some fine day I'll * hopefully have the guts to do so. Until then: sorry for the mess. */struct super_block *affs_read_super(struct super_block *s,void *data, int silent){	struct buffer_head	*bh = NULL;	struct buffer_head	*bb;	kdev_t			 dev = s->s_dev;	int			 root_block;	int			 size;	__u32			 chksum;	__u32			*bm;	int			 ptype, stype;	int			 mapidx;	int			 num_bm;	int			 i, j;	int			 key;	int			 blocksize;	uid_t			 uid;	gid_t			 gid;	int			 reserved;	int			 az_no;	unsigned long		 mount_flags;	unsigned long		 offset;	pr_debug("affs_read_super(%s)\n",data ? (const char *)data : "no options");	MOD_INC_USE_COUNT;	if (!parse_options(data,&uid,&gid,&i,&reserved,&root_block,	    &blocksize,&s->u.affs_sb.s_prefix,s->u.affs_sb.s_volume,&mount_flags)) {		s->s_dev = 0;		printk("AFFS: error parsing options.\n");		MOD_DEC_USE_COUNT;		return NULL;	}	lock_super(s);	/* Get the size of the device in 512-byte blocks.	 * If we later see that the partition uses bigger	 * blocks, we will have to change it.	 */	size = blksize_size[MAJOR(dev)][MINOR(dev)];	size = (size ? size : BLOCK_SIZE) / 512 * blk_size[MAJOR(dev)][MINOR(dev)];	s->u.affs_sb.s_bitmap  = NULL;	s->u.affs_sb.s_root_bh = NULL;	s->u.affs_sb.s_flags   = mount_flags;	s->u.affs_sb.s_mode    = i;	s->u.affs_sb.s_uid     = uid;	s->u.affs_sb.s_gid     = gid;	if (size == 0) {		s->s_dev = 0;		unlock_super(s);		printk("affs_read_super: could not determine device size\n");		goto out;	}	s->u.affs_sb.s_partition_size = size;	s->u.affs_sb.s_reserved       = reserved;	/* Try to find root block. Its location may depend on the block size. */	s->u.affs_sb.s_hashsize = 0;	if (blocksize > 0) {		chksum = blocksize;		num_bm = blocksize;	} else {		chksum = 512;		num_bm = 4096;	}	for (blocksize = chksum; blocksize <= num_bm; blocksize <<= 1, size >>= 1) {		if (root_block < 0)			s->u.affs_sb.s_root_block = (reserved + size - 1) / 2;		else			s->u.affs_sb.s_root_block = root_block;		pr_debug("Trying bs=%d bytes, root at %d, size=%d blocks (%d reserved)\n",			 blocksize,s->u.affs_sb.s_root_block,size,reserved);		set_blocksize(dev,blocksize);		bh = affs_bread(dev,s->u.affs_sb.s_root_block,blocksize);		if (!bh) {			printk("AFFS: unable to read root block\n");			goto out;		}		if (!affs_checksum_block(blocksize,bh->b_data,&ptype,&stype) &&		    ptype == T_SHORT && stype == ST_ROOT) {			s->s_blocksize          = blocksize;			s->u.affs_sb.s_hashsize = blocksize / 4 - 56;			break;		}		affs_brelse(bh);		bh = NULL;	}	if (!s->u.affs_sb.s_hashsize) {		affs_brelse(bh);		if (!silent)			printk("AFFS: Can't find a valid root block on device %s\n",kdevname(dev));		goto out;	}	root_block = s->u.affs_sb.s_root_block;	s->u.affs_sb.s_partition_size   = size;	s->s_blocksize_bits             = blocksize == 512 ? 9 :					  blocksize == 1024 ? 10 :					  blocksize == 2048 ? 11 : 12;	/* Find out which kind of FS we have */	bb = affs_bread(dev,0,s->s_blocksize);	if (bb) {		chksum = htonl(*(__u32 *)bb->b_data);		/* Dircache filesystems are compatible with non-dircache ones		 * when reading. As long as they aren't supported, writing is		 * not recommended.		 */		if ((chksum == FS_DCFFS || chksum == MUFS_DCFFS || chksum == FS_DCOFS		     || chksum == MUFS_DCOFS) && !(s->s_flags & MS_RDONLY)) {			printk("AFFS: Dircache FS - mounting %s read only.\n",kdevname(dev));			s->s_flags |= MS_RDONLY;		}		switch (chksum) {			case MUFS_FS:			case MUFS_INTLFFS:				s->u.affs_sb.s_flags |= SF_MUFS;				/* fall thru */			case FS_INTLFFS:				s->u.affs_sb.s_flags |= SF_INTL;				break;			case MUFS_DCFFS:			case MUFS_FFS:				s->u.affs_sb.s_flags |= SF_MUFS;				break;			case FS_DCFFS:			case FS_FFS:				break;			case MUFS_OFS:				s->u.affs_sb.s_flags |= SF_MUFS;				/* fall thru */			case FS_OFS:				s->u.affs_sb.s_flags |= SF_OFS;				break;			case MUFS_DCOFS:			case MUFS_INTLOFS:				s->u.affs_sb.s_flags |= SF_MUFS;			case FS_DCOFS:			case FS_INTLOFS:				s->u.affs_sb.s_flags |= SF_INTL | SF_OFS;				break;			default:				printk("AFFS: Unknown filesystem on device %s: %08X\n",				       kdevname(dev),chksum);				affs_brelse(bb);				goto out;		}		affs_brelse(bb);	} else {		printk("AFFS: Can't get boot block.\n");		goto out;	}	if (mount_flags & SF_VERBOSE) {		chksum = ntohl(chksum);		printk("AFFS: Mounting volume \"%*s\": Type=%.3s\\%c, Blocksize=%d\n",		       GET_END_PTR(struct root_end,bh->b_data,blocksize)->disk_name[0],		       &GET_END_PTR(struct root_end,bh->b_data,blocksize)->disk_name[1],		       (char *)&chksum,((char *)&chksum)[3] + '0',blocksize);	}	s->s_magic  = AFFS_SUPER_MAGIC;	s->s_flags |= MS_NODEV | MS_NOSUID;	/* Keep super block in cache */	if (!(s->u.affs_sb.s_root_bh = affs_bread(dev,root_block,s->s_blocksize))) {		printk("AFFS: Can't read root block a second time\n");		goto out;	}	/* Allocate space for bitmaps, zones and others */	size   = s->u.affs_sb.s_partition_size - reserved;	num_bm = (size + s->s_blocksize * 8 - 32 - 1) / (s->s_blocksize * 8 - 32);	az_no  = (size + AFFS_ZONE_SIZE - 1) / (AFFS_ZONE_SIZE - 32);	ptype  = num_bm * sizeof(struct affs_bm_info) + 		 az_no * sizeof(struct affs_alloc_zone) +		 MAX_ZONES * sizeof(struct affs_zone);	pr_debug("num_bm=%d, az_no=%d, sum=%d\n",num_bm,az_no,ptype);	if (!(s->u.affs_sb.s_bitmap = kmalloc(ptype,GFP_KERNEL))) {		printk("AFFS: Not enough memory.\n");		goto out;	}	memset(s->u.affs_sb.s_bitmap,0,ptype);	s->u.affs_sb.s_zones   = (struct affs_zone *)&s->u.affs_sb.s_bitmap[num_bm];	s->u.affs_sb.s_alloc   = (struct affs_alloc_zone *)&s->u.affs_sb.s_zones[MAX_ZONES];	s->u.affs_sb.s_num_az  = az_no;	mapidx = 0;	if (ROOT_END_S(bh->b_data,s)->bm_flag == 0) {		if (!(s->s_flags & MS_RDONLY)) {			printk("AFFS: Bitmap invalid - mounting %s read only.\n",kdevname(dev));			s->s_flags |= MS_RDONLY;		}		affs_brelse(bh);		bh = NULL;		goto nobitmap;	}	/* The following section is ugly, I know. Especially because of the	 * reuse of some variables that are not named properly.	 */	key    = root_block;	ptype  = s->s_blocksize / 4 - 49;	stype  = ptype + 25;	offset = s->u.affs_sb.s_reserved;	az_no  = 0;	while (bh) {		bm = (__u32 *)bh->b_data;		for (i = ptype; i < stype && bm[i]; i++, mapidx++) {			if (mapidx >= num_bm) {				printk("AFFS: Not enough bitmap space!?\n");				goto out;			}			bb = affs_bread(s->s_dev,htonl(bm[i]),s->s_blocksize);			if (bb) {				if (affs_checksum_block(s->s_blocksize,bb->b_data,NULL,NULL) &&				    !(s->s_flags & MS_RDONLY)) {					printk("AFFS: Bitmap (%d,key=%lu) invalid - "

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
97aⅴ精品视频一二三区| 国产人妖乱国产精品人妖| 欧美刺激午夜性久久久久久久| 精品国产乱码久久久久久1区2区| 中文字幕一区二区在线观看| 97se亚洲国产综合自在线观| 欧美日韩亚洲国产综合| wwww国产精品欧美| 亚洲午夜久久久久| 午夜久久久影院| 国产一区二区三区免费在线观看| 激情综合网av| 日韩一区二区免费在线观看| 国产一区二区三区久久久| 中文字幕的久久| 91国偷自产一区二区三区观看| 亚洲综合色区另类av| 欧美电影免费观看完整版| 成人黄色在线视频| 日韩经典中文字幕一区| 欧美成人r级一区二区三区| 国产精品乡下勾搭老头1| 亚洲精品免费在线| 欧美成人精品3d动漫h| av在线一区二区| 日本欧美肥老太交大片| 欧美激情在线一区二区三区| 色综合久久久久网| 另类小说一区二区三区| 综合在线观看色| 精品国免费一区二区三区| eeuss鲁一区二区三区| 日韩不卡一二三区| 中文字幕一区二区三区不卡| 欧美精品1区2区3区| 国产精品香蕉一区二区三区| 午夜日韩在线电影| 国产精品女主播av| 日韩午夜激情免费电影| 99精品国产91久久久久久| 麻豆freexxxx性91精品| 亚洲青青青在线视频| 精品国产伦理网| 欧美人与性动xxxx| 成人av在线播放网址| 久久er99精品| 亚洲电影一级黄| 亚洲色图另类专区| 国产视频不卡一区| 欧美α欧美αv大片| 精品视频在线免费| 一本久道久久综合中文字幕| 国产一区在线精品| 美女国产一区二区三区| 亚洲国产精品久久艾草纯爱| 中文字幕永久在线不卡| 久久久精品天堂| 日韩一区二区三区电影在线观看| 欧美探花视频资源| 色综合 综合色| 成人丝袜高跟foot| 国产精品456| 韩国精品在线观看| 另类欧美日韩国产在线| 性感美女极品91精品| 亚洲影视在线观看| 一区二区在线观看视频在线观看| 亚洲欧洲av色图| 国产精品久久久久aaaa樱花| 日本一区二区成人在线| 国产欧美一区二区三区鸳鸯浴 | bt7086福利一区国产| 韩国成人福利片在线播放| 蜜桃久久久久久久| 免费看欧美女人艹b| 麻豆91小视频| 九一九一国产精品| 国产中文一区二区三区| 国产揄拍国内精品对白| 国产精品正在播放| 国产精品18久久久久久久久久久久| 精品一区二区免费在线观看| 久久成人综合网| 国产成人午夜精品5599| 国产一区 二区 三区一级| 国产精品中文欧美| 99久久婷婷国产综合精品| 97se亚洲国产综合在线| 欧美性感一类影片在线播放| 欧美日韩一区在线| 欧美一区二区性放荡片| 精品国产免费久久| 中文字幕第一区二区| 一区二区三区中文字幕电影 | 日韩精品1区2区3区| 久久99精品网久久| 国产成人丝袜美腿| 91在线免费视频观看| 欧美日韩卡一卡二| 欧美成人欧美edvon| 国产精品久久久久久久久晋中| 亚洲欧美日韩国产综合在线| 肉肉av福利一精品导航| 国内不卡的二区三区中文字幕 | 91美女片黄在线观看91美女| 欧美吻胸吃奶大尺度电影| 777午夜精品免费视频| 久久久久久99久久久精品网站| 国产精品日日摸夜夜摸av| 亚洲午夜精品一区二区三区他趣| 日韩电影在线免费观看| 国产成人在线看| 日本精品免费观看高清观看| 91精品国产一区二区三区香蕉| 久久精品综合网| 亚洲在线观看免费视频| 国产自产视频一区二区三区| 99国产精品久久久| 日韩色在线观看| 亚洲少妇中出一区| 精品亚洲成a人| 色天使久久综合网天天| 精品少妇一区二区三区在线播放 | 天天操天天干天天综合网| 精品一区二区在线观看| 色先锋资源久久综合| 精品国产乱码久久久久久1区2区| 亚洲精品中文字幕在线观看| 国内精品久久久久影院薰衣草| 色综合视频在线观看| 2020日本不卡一区二区视频| 亚洲自拍偷拍图区| 成人免费看的视频| 日韩一级高清毛片| 亚洲永久免费视频| 成人aaaa免费全部观看| 日韩欧美www| 天天亚洲美女在线视频| 99久久精品一区二区| 欧美精品一区二区在线播放| 亚洲午夜久久久久久久久久久| 成人动漫av在线| 久久久99久久| 麻豆精品在线播放| 91福利视频在线| 亚洲天堂2016| 国产成人午夜高潮毛片| 精品少妇一区二区三区 | 日韩欧美黄色影院| 性做久久久久久| 在线看国产日韩| 亚洲免费资源在线播放| 国产99久久久国产精品免费看| 日韩精品一区国产麻豆| 性做久久久久久免费观看欧美| 日本韩国一区二区三区视频| 一区免费观看视频| 成人激情开心网| 国产精品网友自拍| 高清在线不卡av| 久久久国产精品午夜一区ai换脸| 精品一二三四在线| 日韩精品一区二区三区蜜臀| 日本欧美一区二区三区| 欧美精品日韩综合在线| 亚洲h动漫在线| 欧美乱熟臀69xxxxxx| 日精品一区二区| 91精品国产欧美一区二区18| 午夜精品视频在线观看| 欧美日韩精品免费| 日韩精品一卡二卡三卡四卡无卡| 欧美人伦禁忌dvd放荡欲情| 天堂蜜桃一区二区三区| 在线成人午夜影院| 久久国产夜色精品鲁鲁99| 精品久久久久久久久久久久包黑料| 日韩高清电影一区| 精品国内二区三区| 国产99久久久国产精品潘金网站| 国产精品美女视频| 色综合久久中文字幕综合网| 亚洲成人动漫在线观看| 日韩亚洲欧美高清| 国产精品一二三四五| 国产精品国产三级国产aⅴ原创| 99精品视频在线免费观看| 亚洲黄色小视频| 欧美一区二区三区四区高清 | 国产一区二区三区免费在线观看| 久久色在线视频| 99久久精品国产网站| 夜夜亚洲天天久久| 日韩精品在线一区二区| 岛国精品一区二区| 亚洲美女淫视频| 欧美一区二区三区色| 国产成人午夜片在线观看高清观看| 亚洲人成网站影音先锋播放| 91麻豆精品91久久久久同性|