X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fext3%2Fialloc.c;h=58dbb6e606179ee51d871ff9196d69f34392c3ee;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=624f0bb8bd2dd57158b6bc48e2cd88c4f9597e26;hpb=a8e794ca871505c8ea96cc102f4ad555c5231d7f;p=linux-2.6.git diff --git a/fs/ext3/ialloc.c b/fs/ext3/ialloc.c index 624f0bb8b..58dbb6e60 100644 --- a/fs/ext3/ialloc.c +++ b/fs/ext3/ialloc.c @@ -22,8 +22,9 @@ #include #include #include +#include +#include -#include #include #include "xattr.h" @@ -64,8 +65,8 @@ read_inode_bitmap(struct super_block * sb, unsigned long block_group) if (!bh) ext3_error(sb, "read_inode_bitmap", "Cannot read inode bitmap - " - "block_group = %lu, inode_bitmap = %lu", - block_group, (unsigned long) desc->bg_inode_bitmap); + "block_group = %lu, inode_bitmap = %u", + block_group, le32_to_cpu(desc->bg_inode_bitmap)); error_out: return bh; } @@ -97,7 +98,7 @@ void ext3_free_inode (handle_t *handle, struct inode * inode) unsigned long bit; struct ext3_group_desc * gdp; struct ext3_super_block * es; - struct ext3_sb_info *sbi = EXT3_SB(sb); + struct ext3_sb_info *sbi; int fatal = 0, err; if (atomic_read(&inode->i_count) > 1) { @@ -114,6 +115,7 @@ void ext3_free_inode (handle_t *handle, struct inode * inode) printk("ext3_free_inode: inode on nonexistent device\n"); return; } + sbi = EXT3_SB(sb); ino = inode->i_ino; ext3_debug ("freeing inode %lu\n", ino); @@ -124,6 +126,7 @@ void ext3_free_inode (handle_t *handle, struct inode * inode) */ DQUOT_INIT(inode); ext3_xattr_delete_inode(handle, inode); + DLIMIT_FREE_INODE(sb, inode->i_xid); DQUOT_FREE_INODE(inode); DQUOT_DROP(inode); @@ -319,8 +322,6 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent) desc = ext3_get_group_desc (sb, group, &bh); if (!desc || !desc->bg_free_inodes_count) continue; - if (sbi->s_debts[group] >= max_debt) - continue; if (le16_to_cpu(desc->bg_used_dirs_count) >= max_dirs) continue; if (le16_to_cpu(desc->bg_free_inodes_count) < min_inodes) @@ -444,6 +445,16 @@ struct inode *ext3_new_inode(handle_t *handle, struct inode * dir, int mode) inode = new_inode(sb); if (!inode) return ERR_PTR(-ENOMEM); + + if (sb->s_flags & MS_TAGXID) + inode->i_xid = vx_current_xid(); + else + inode->i_xid = 0; + + if (DLIMIT_ALLOC_INODE(sb, inode->i_xid)) { + err = -ENOSPC; + goto out; + } ei = EXT3_I(inode); sbi = EXT3_SB(sb); @@ -559,7 +570,7 @@ got: /* 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->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC; memset(ei->i_data, 0, sizeof(ei->i_data)); ei->i_next_alloc_block = 0; @@ -582,10 +593,11 @@ got: ei->i_file_acl = 0; ei->i_dir_acl = 0; ei->i_dtime = 0; -#ifdef EXT3_PREALLOCATE - ei->i_prealloc_block = 0; - ei->i_prealloc_count = 0; -#endif + ei->i_rsv_window.rsv_start = EXT3_RESERVE_WINDOW_NOT_ALLOCATED; + ei->i_rsv_window.rsv_end = EXT3_RESERVE_WINDOW_NOT_ALLOCATED; + atomic_set(&ei->i_rsv_window.rsv_goal_size, EXT3_DEFAULT_RESERVE_BLOCKS); + atomic_set(&ei->i_rsv_window.rsv_alloc_hit, 0); + seqlock_init(&ei->i_rsv_window.rsv_seqlock); ei->i_block_group = group; ext3_set_inode_flags(inode); @@ -597,6 +609,9 @@ got: spin_unlock(&sbi->s_next_gen_lock); ei->i_state = EXT3_STATE_NEW; + ei->i_extra_isize = + (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) ? + sizeof(struct ext3_inode) - EXT3_GOOD_OLD_INODE_SIZE : 0; ret = inode; if(DQUOT_ALLOC_INODE(inode)) { @@ -619,6 +634,7 @@ got: ext3_debug("allocating inode %lu\n", inode->i_ino); goto really_out; fail: + DLIMIT_FREE_INODE(sb, inode->i_xid); ext3_std_error(sb, err); out: iput(inode); @@ -628,6 +644,7 @@ really_out: return ret; fail2: + DLIMIT_FREE_INODE(sb, inode->i_xid); inode->i_flags |= S_NOQUOTA; inode->i_nlink = 0; iput(inode); @@ -733,6 +750,7 @@ unsigned long ext3_count_free_inodes (struct super_block * sb) if (!gdp) continue; desc_count += le16_to_cpu(gdp->bg_free_inodes_count); + cond_resched(); } return desc_count; #endif