diff options
Diffstat (limited to 'fs/ext2/ialloc.c')
| -rw-r--r-- | fs/ext2/ialloc.c | 20 | 
1 files changed, 11 insertions, 9 deletions
diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index ad70479aabf..7d66fb0e4cc 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c @@ -81,7 +81,6 @@ static void ext2_release_inode(struct super_block *sb, int group, int dir)  	spin_unlock(sb_bgl_lock(EXT2_SB(sb), group));  	if (dir)  		percpu_counter_dec(&EXT2_SB(sb)->s_dirs_counter); -	sb->s_dirt = 1;  	mark_buffer_dirty(bh);  } @@ -119,7 +118,6 @@ void ext2_free_inode (struct inode * inode)  	 * as writing the quota to disk may need the lock as well.  	 */  	/* Quota is already initialized in iput() */ -	ext2_xattr_delete_inode(inode);  	dquot_free_inode(inode);  	dquot_drop(inode); @@ -286,7 +284,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent)  		int best_ndir = inodes_per_group;  		int best_group = -1; -		get_random_bytes(&group, sizeof(group)); +		group = prandom_u32();  		parent_group = (unsigned)group % ngroups;  		for (i = 0; i < ngroups; i++) {  			group = (parent_group + i) % ngroups; @@ -429,7 +427,8 @@ found:  	return group;  } -struct inode *ext2_new_inode(struct inode *dir, int mode) +struct inode *ext2_new_inode(struct inode *dir, umode_t mode, +			     const struct qstr *qstr)  {  	struct super_block *sb;  	struct buffer_head *bitmap_bh = NULL; @@ -542,7 +541,6 @@ got:  	}  	spin_unlock(sb_bgl_lock(sbi, group)); -	sb->s_dirt = 1;  	mark_buffer_dirty(bh2);  	if (test_opt(sb, GRPID)) {  		inode->i_mode = mode; @@ -572,8 +570,11 @@ got:  	inode->i_generation = sbi->s_next_generation++;  	spin_unlock(&sbi->s_next_gen_lock);  	if (insert_inode_locked(inode) < 0) { -		err = -EINVAL; -		goto fail_drop; +		ext2_error(sb, "ext2_new_inode", +			   "inode number already in use - inode=%lu", +			   (unsigned long) ino); +		err = -EIO; +		goto fail;  	}  	dquot_initialize(inode); @@ -585,7 +586,7 @@ got:  	if (err)  		goto fail_free_drop; -	err = ext2_init_security(inode,dir); +	err = ext2_init_security(inode, dir, qstr);  	if (err)  		goto fail_free_drop; @@ -600,7 +601,7 @@ fail_free_drop:  fail_drop:  	dquot_drop(inode);  	inode->i_flags |= S_NOQUOTA; -	inode->i_nlink = 0; +	clear_nlink(inode);  	unlock_new_inode(inode);  	iput(inode);  	return ERR_PTR(err); @@ -642,6 +643,7 @@ unsigned long ext2_count_free_inodes (struct super_block * sb)  	}  	brelse(bitmap_bh);  	printk("ext2_count_free_inodes: stored = %lu, computed = %lu, %lu\n", +		(unsigned long)  		percpu_counter_read(&EXT2_SB(sb)->s_freeinodes_counter),  		desc_count, bitmap_count);  	return desc_count;  | 
