X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fext2%2Fialloc.c;h=299ea3f92d5a6335d86b882989f57c103fa7f62d;hb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;hp=cbd6ae8992addd616299b789c08da05e5a811be1;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index cbd6ae899..299ea3f92 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c @@ -18,6 +18,9 @@ #include #include #include +#include +#include + #include "ext2.h" #include "xattr.h" #include "acl.h" @@ -124,6 +127,7 @@ void ext2_free_inode (struct inode * inode) if (!is_bad_inode(inode)) { /* Quota is already initialized in iput() */ ext2_xattr_delete_inode(inode); + DLIMIT_FREE_INODE(sb, inode->i_xid); DQUOT_FREE_INODE(inode); DQUOT_DROP(inode); } @@ -465,6 +469,10 @@ struct inode *ext2_new_inode(struct inode *dir, int mode) if (!inode) return ERR_PTR(-ENOMEM); + if (DLIMIT_ALLOC_INODE(sb, inode->i_xid)) { + err = -ENOSPC; + goto fail_dlim; + } ei = EXT2_I(inode); sbi = EXT2_SB(sb); es = sbi->s_es; @@ -579,7 +587,8 @@ got: inode->i_blocks = 0; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; memset(ei->i_data, 0, sizeof(ei->i_data)); - ei->i_flags = EXT2_I(dir)->i_flags & ~EXT2_BTREE_FL; + ei->i_flags = EXT2_I(dir)->i_flags & + ~(EXT2_BTREE_FL|EXT2_IUNLINK_FL|EXT2_BARRIER_FL); if (S_ISLNK(mode)) ei->i_flags &= ~(EXT2_IMMUTABLE_FL|EXT2_APPEND_FL); /* dirsync is only applied to directories */ @@ -620,12 +629,15 @@ got: return inode; fail2: + DLIMIT_FREE_INODE(sb, inode->i_xid); inode->i_flags |= S_NOQUOTA; inode->i_nlink = 0; iput(inode); return ERR_PTR(err); fail: + DLIMIT_FREE_INODE(sb, inode->i_xid); +fail_dlim: make_bad_inode(inode); iput(inode); return ERR_PTR(err); @@ -663,7 +675,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", - percpu_counter_read(EXT2_SB(sb)->s_freeinodes_counter), + percpu_counter_read(&EXT2_SB(sb)->s_freeinodes_counter), desc_count, bitmap_count); unlock_super(sb); return desc_count; @@ -724,7 +736,7 @@ void ext2_check_inodes_bitmap (struct super_block * sb) bitmap_count += x; } brelse(bitmap_bh); - if (percpu_counter_read(EXT2_SB(sb)->s_freeinodes_counter) != + if (percpu_counter_read(&EXT2_SB(sb)->s_freeinodes_counter) != bitmap_count) ext2_error(sb, "ext2_check_inodes_bitmap", "Wrong free inodes count in super block, "