diff options
Diffstat (limited to 'fs/inode.c')
| -rw-r--r-- | fs/inode.c | 47 | 
1 files changed, 26 insertions, 21 deletions
diff --git a/fs/inode.c b/fs/inode.c index 5abb097ab1b..df2ef15d03d 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -213,8 +213,7 @@ static void init_once(void * foo, struct kmem_cache * cachep, unsigned long flag  {  	struct inode * inode = (struct inode *) foo; -	if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == -	    SLAB_CTOR_CONSTRUCTOR) +	if (flags & SLAB_CTOR_CONSTRUCTOR)  		inode_init_once(inode);  } @@ -251,7 +250,7 @@ void clear_inode(struct inode *inode)  	BUG_ON(inode->i_state & I_CLEAR);  	wait_on_inode(inode);  	DQUOT_DROP(inode); -	if (inode->i_sb && inode->i_sb->s_op->clear_inode) +	if (inode->i_sb->s_op->clear_inode)  		inode->i_sb->s_op->clear_inode(inode);  	if (S_ISBLK(inode->i_mode) && inode->i_bdev)  		bd_forget(inode); @@ -276,7 +275,7 @@ static void dispose_list(struct list_head *head)  	while (!list_empty(head)) {  		struct inode *inode; -		inode = list_entry(head->next, struct inode, i_list); +		inode = list_first_entry(head, struct inode, i_list);  		list_del(&inode->i_list);  		if (inode->i_data.nrpages) @@ -525,7 +524,12 @@ repeat:   */  struct inode *new_inode(struct super_block *sb)  { -	static unsigned long last_ino; +	/* +	 * On a 32bit, non LFS stat() call, glibc will generate an EOVERFLOW +	 * error if st_ino won't fit in target struct field. Use 32bit counter +	 * here to attempt to avoid that. +	 */ +	static unsigned int last_ino;  	struct inode * inode;  	spin_lock_prefetch(&inode_lock); @@ -684,27 +688,28 @@ static unsigned long hash(struct super_block *sb, unsigned long hashval)   */  ino_t iunique(struct super_block *sb, ino_t max_reserved)  { -	static ino_t counter; +	/* +	 * On a 32bit, non LFS stat() call, glibc will generate an EOVERFLOW +	 * error if st_ino won't fit in target struct field. Use 32bit counter +	 * here to attempt to avoid that. +	 */ +	static unsigned int counter;  	struct inode *inode; -	struct hlist_head * head; +	struct hlist_head *head;  	ino_t res; +  	spin_lock(&inode_lock); -retry: -	if (counter > max_reserved) { -		head = inode_hashtable + hash(sb,counter); +	do { +		if (counter <= max_reserved) +			counter = max_reserved + 1;  		res = counter++; +		head = inode_hashtable + hash(sb, res);  		inode = find_inode_fast(sb, head, res); -		if (!inode) { -			spin_unlock(&inode_lock); -			return res; -		} -	} else { -		counter = max_reserved + 1; -	} -	goto retry; -	 -} +	} while (inode != NULL); +	spin_unlock(&inode_lock); +	return res; +}  EXPORT_SYMBOL(iunique);  struct inode *igrab(struct inode *inode) @@ -1041,7 +1046,7 @@ static void generic_forget_inode(struct inode *inode)  		if (!(inode->i_state & (I_DIRTY|I_LOCK)))  			list_move(&inode->i_list, &inode_unused);  		inodes_stat.nr_unused++; -		if (!sb || (sb->s_flags & MS_ACTIVE)) { +		if (sb->s_flags & MS_ACTIVE) {  			spin_unlock(&inode_lock);  			return;  		}  | 
