⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ialloc.c

📁 嵌入式系统设计与实例开发实验教材二源码 多线程应用程序设计 串行端口程序设计 AD接口实验 CAN总线通信实验 GPS通信实验 Linux内核移植与编译实验 IC卡读写实验 SD驱动使
💻 C
📖 第 1 页 / 共 2 页
字号:
			for (j = 0; j < sb->u.ext3_sb.s_groups_count; j++) {				struct buffer_head *temp_buffer;				tmp = ext3_get_group_desc (sb, j, &temp_buffer);				if (tmp &&				    le16_to_cpu(tmp->bg_free_inodes_count) &&				    le16_to_cpu(tmp->bg_free_inodes_count) >=							avefreei) {					if (!gdp || (le16_to_cpu(tmp->bg_free_blocks_count) >						le16_to_cpu(gdp->bg_free_blocks_count))) {						i = j;						gdp = tmp;						bh2 = temp_buffer;					}				}			}		}	} else {		/*		 * Try to place the inode in its parent directory		 */		i = dir->u.ext3_i.i_block_group;		tmp = ext3_get_group_desc (sb, i, &bh2);		if (tmp && le16_to_cpu(tmp->bg_free_inodes_count))			gdp = tmp;		else		{			/*			 * Use a quadratic hash to find a group with a			 * free inode			 */			for (j = 1; j < sb->u.ext3_sb.s_groups_count; j <<= 1) {				i += j;				if (i >= sb->u.ext3_sb.s_groups_count)					i -= sb->u.ext3_sb.s_groups_count;				tmp = ext3_get_group_desc (sb, i, &bh2);				if (tmp &&				    le16_to_cpu(tmp->bg_free_inodes_count)) {					gdp = tmp;					break;				}			}		}		if (!gdp) {			/*			 * That failed: try linear search for a free inode			 */			i = dir->u.ext3_i.i_block_group + 1;			for (j = 2; j < sb->u.ext3_sb.s_groups_count; j++) {				if (++i >= sb->u.ext3_sb.s_groups_count)					i = 0;				tmp = ext3_get_group_desc (sb, i, &bh2);				if (tmp &&				    le16_to_cpu(tmp->bg_free_inodes_count)) {					gdp = tmp;					break;				}			}		}	}	err = -ENOSPC;	if (!gdp)		goto fail;	err = -EIO;	bitmap_nr = load_inode_bitmap (sb, i);	if (bitmap_nr < 0)		goto fail;	bh = sb->u.ext3_sb.s_inode_bitmap[bitmap_nr];	if ((j = ext3_find_first_zero_bit ((unsigned long *) bh->b_data,				      EXT3_INODES_PER_GROUP(sb))) <	    EXT3_INODES_PER_GROUP(sb)) {		BUFFER_TRACE(bh, "get_write_access");		err = ext3_journal_get_write_access(handle, bh);		if (err) goto fail;				if (ext3_set_bit (j, bh->b_data)) {			ext3_error (sb, "ext3_new_inode",				      "bit already set for inode %d", j);			goto repeat;		}		BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");		err = ext3_journal_dirty_metadata(handle, bh);		if (err) goto fail;	} else {		if (le16_to_cpu(gdp->bg_free_inodes_count) != 0) {			ext3_error (sb, "ext3_new_inode",				    "Free inodes count corrupted in group %d",				    i);			/* Is it really ENOSPC? */			err = -ENOSPC;			if (sb->s_flags & MS_RDONLY)				goto fail;			BUFFER_TRACE(bh2, "get_write_access");			err = ext3_journal_get_write_access(handle, bh2);			if (err) goto fail;			gdp->bg_free_inodes_count = 0;			BUFFER_TRACE(bh2, "call ext3_journal_dirty_metadata");			err = ext3_journal_dirty_metadata(handle, bh2);			if (err) goto fail;		}		goto repeat;	}	j += i * EXT3_INODES_PER_GROUP(sb) + 1;	if (j < EXT3_FIRST_INO(sb) || j > le32_to_cpu(es->s_inodes_count)) {		ext3_error (sb, "ext3_new_inode",			    "reserved inode or inode > inodes count - "			    "block_group = %d,inode=%d", i, j);		err = -EIO;		goto fail;	}	BUFFER_TRACE(bh2, "get_write_access");	err = ext3_journal_get_write_access(handle, bh2);	if (err) goto fail;	gdp->bg_free_inodes_count =		cpu_to_le16(le16_to_cpu(gdp->bg_free_inodes_count) - 1);	if (S_ISDIR(mode))		gdp->bg_used_dirs_count =			cpu_to_le16(le16_to_cpu(gdp->bg_used_dirs_count) + 1);	BUFFER_TRACE(bh2, "call ext3_journal_dirty_metadata");	err = ext3_journal_dirty_metadata(handle, bh2);	if (err) goto fail;		BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "get_write_access");	err = ext3_journal_get_write_access(handle, sb->u.ext3_sb.s_sbh);	if (err) goto fail;	es->s_free_inodes_count =		cpu_to_le32(le32_to_cpu(es->s_free_inodes_count) - 1);	BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "call ext3_journal_dirty_metadata");	err = ext3_journal_dirty_metadata(handle, sb->u.ext3_sb.s_sbh);	sb->s_dirt = 1;	if (err) goto fail;	inode->i_uid = current->fsuid;	if (test_opt (sb, GRPID))		inode->i_gid = dir->i_gid;	else if (dir->i_mode & S_ISGID) {		inode->i_gid = dir->i_gid;		if (S_ISDIR(mode))			mode |= S_ISGID;	} else		inode->i_gid = current->fsgid;	inode->i_mode = mode;	inode->i_ino = j;	/* This is the optimal IO size (for stat), not the fs block size */	inode->i_blksize = PAGE_SIZE;	inode->i_blocks = 0;	inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;	inode->u.ext3_i.i_flags = dir->u.ext3_i.i_flags & ~EXT3_INDEX_FL;	if (S_ISLNK(mode))		inode->u.ext3_i.i_flags &= ~(EXT3_IMMUTABLE_FL|EXT3_APPEND_FL);#ifdef EXT3_FRAGMENTS	inode->u.ext3_i.i_faddr = 0;	inode->u.ext3_i.i_frag_no = 0;	inode->u.ext3_i.i_frag_size = 0;#endif	inode->u.ext3_i.i_file_acl = 0;	inode->u.ext3_i.i_dir_acl = 0;	inode->u.ext3_i.i_dtime = 0;	INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan);#ifdef EXT3_PREALLOCATE	inode->u.ext3_i.i_prealloc_count = 0;#endif	inode->u.ext3_i.i_block_group = i;		if (inode->u.ext3_i.i_flags & EXT3_SYNC_FL)		inode->i_flags |= S_SYNC;	if (IS_SYNC(inode))		handle->h_sync = 1;	insert_inode_hash(inode);	inode->i_generation = sb->u.ext3_sb.s_next_generation++;	inode->u.ext3_i.i_state = EXT3_STATE_NEW;	err = ext3_mark_inode_dirty(handle, inode);	if (err) goto fail;		unlock_super (sb);	if(DQUOT_ALLOC_INODE(inode)) {		DQUOT_DROP(inode);		inode->i_flags |= S_NOQUOTA;		inode->i_nlink = 0;		iput(inode);		return ERR_PTR(-EDQUOT);	}	ext3_debug ("allocating inode %lu\n", inode->i_ino);	return inode;fail:	unlock_super(sb);	iput(inode);	ext3_std_error(sb, err);	return ERR_PTR(err);}/* Verify that we are loading a valid orphan from disk */struct inode *ext3_orphan_get (struct super_block * sb, ino_t ino){	ino_t max_ino = le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count);	unsigned long block_group;	int bit;	int bitmap_nr;	struct buffer_head *bh;	struct inode *inode = NULL;		/* Error cases - e2fsck has already cleaned up for us */	if (ino > max_ino) {		ext3_warning(sb, __FUNCTION__,			     "bad orphan ino %ld!  e2fsck was run?\n", ino);		return NULL;	}	block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb);	bit = (ino - 1) % EXT3_INODES_PER_GROUP(sb);	if ((bitmap_nr = load_inode_bitmap(sb, block_group)) < 0 ||	    !(bh = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr])) {		ext3_warning(sb, __FUNCTION__,			     "inode bitmap error for orphan %ld\n", ino);		return NULL;	}	/* Having the inode bit set should be a 100% indicator that this	 * is a valid orphan (no e2fsck run on fs).  Orphans also include	 * inodes that were being truncated, so we can't check i_nlink==0.	 */	if (!ext3_test_bit(bit, bh->b_data) || !(inode = iget(sb, ino)) ||	    is_bad_inode(inode) || NEXT_ORPHAN(inode) > max_ino) {		ext3_warning(sb, __FUNCTION__,			     "bad orphan inode %ld!  e2fsck was run?\n", ino);		printk(KERN_NOTICE "ext3_test_bit(bit=%d, block=%ld) = %d\n",		       bit, bh->b_blocknr, ext3_test_bit(bit, bh->b_data));		printk(KERN_NOTICE "inode=%p\n", inode);		if (inode) {			printk(KERN_NOTICE "is_bad_inode(inode)=%d\n",			       is_bad_inode(inode));			printk(KERN_NOTICE "NEXT_ORPHAN(inode)=%d\n",			       NEXT_ORPHAN(inode));			printk(KERN_NOTICE "max_ino=%ld\n", max_ino);		}		/* Avoid freeing blocks if we got a bad deleted inode */		if (inode && inode->i_nlink == 0)			inode->i_blocks = 0;		iput(inode);		return NULL;	}	return inode;}unsigned long ext3_count_free_inodes (struct super_block * sb){#ifdef EXT3FS_DEBUG	struct ext3_super_block * es;	unsigned long desc_count, bitmap_count, x;	int bitmap_nr;	struct ext3_group_desc * gdp;	int i;	lock_super (sb);	es = sb->u.ext3_sb.s_es;	desc_count = 0;	bitmap_count = 0;	gdp = NULL;	for (i = 0; i < sb->u.ext3_sb.s_groups_count; i++) {		gdp = ext3_get_group_desc (sb, i, NULL);		if (!gdp)			continue;		desc_count += le16_to_cpu(gdp->bg_free_inodes_count);		bitmap_nr = load_inode_bitmap (sb, i);		if (bitmap_nr < 0)			continue;		x = ext3_count_free (sb->u.ext3_sb.s_inode_bitmap[bitmap_nr],				     EXT3_INODES_PER_GROUP(sb) / 8);		printk ("group %d: stored = %d, counted = %lu\n",			i, le16_to_cpu(gdp->bg_free_inodes_count), x);		bitmap_count += x;	}	printk("ext3_count_free_inodes: stored = %lu, computed = %lu, %lu\n",		le32_to_cpu(es->s_free_inodes_count), desc_count, bitmap_count);	unlock_super (sb);	return desc_count;#else	return le32_to_cpu(sb->u.ext3_sb.s_es->s_free_inodes_count);#endif}#ifdef CONFIG_EXT3_CHECK/* Called at mount-time, super-block is locked */void ext3_check_inodes_bitmap (struct super_block * sb){	struct ext3_super_block * es;	unsigned long desc_count, bitmap_count, x;	int bitmap_nr;	struct ext3_group_desc * gdp;	int i;	es = sb->u.ext3_sb.s_es;	desc_count = 0;	bitmap_count = 0;	gdp = NULL;	for (i = 0; i < sb->u.ext3_sb.s_groups_count; i++) {		gdp = ext3_get_group_desc (sb, i, NULL);		if (!gdp)			continue;		desc_count += le16_to_cpu(gdp->bg_free_inodes_count);		bitmap_nr = load_inode_bitmap (sb, i);		if (bitmap_nr < 0)			continue;		x = ext3_count_free (sb->u.ext3_sb.s_inode_bitmap[bitmap_nr],				     EXT3_INODES_PER_GROUP(sb) / 8);		if (le16_to_cpu(gdp->bg_free_inodes_count) != x)			ext3_error (sb, "ext3_check_inodes_bitmap",				    "Wrong free inodes count in group %d, "				    "stored = %d, counted = %lu", i,				    le16_to_cpu(gdp->bg_free_inodes_count), x);		bitmap_count += x;	}	if (le32_to_cpu(es->s_free_inodes_count) != bitmap_count)		ext3_error (sb, "ext3_check_inodes_bitmap",			    "Wrong free inodes count in super block, "			    "stored = %lu, counted = %lu",			    (unsigned long)le32_to_cpu(es->s_free_inodes_count),			    bitmap_count);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -