fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / fs / ext2 / ialloc.c
index cbd6ae8..4452ad3 100644 (file)
  *        David S. Miller (davem@caip.rutgers.edu), 1995
  */
 
-#include <linux/config.h>
 #include <linux/quotaops.h>
 #include <linux/sched.h>
 #include <linux/backing-dev.h>
 #include <linux/buffer_head.h>
 #include <linux/random.h>
+#include <linux/vs_dlimit.h>
+#include <linux/vs_tag.h>
 #include "ext2.h"
 #include "xattr.h"
 #include "acl.h"
@@ -57,8 +58,8 @@ read_inode_bitmap(struct super_block * sb, unsigned long block_group)
        if (!bh)
                ext2_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;
 }
@@ -126,6 +127,7 @@ void ext2_free_inode (struct inode * inode)
                ext2_xattr_delete_inode(inode);
                DQUOT_FREE_INODE(inode);
                DQUOT_DROP(inode);
+               DLIMIT_FREE_INODE(inode);
        }
 
        es = EXT2_SB(sb)->s_es;
@@ -465,6 +467,11 @@ struct inode *ext2_new_inode(struct inode *dir, int mode)
        if (!inode)
                return ERR_PTR(-ENOMEM);
 
+       inode->i_tag = dx_current_fstag(sb);
+       if (DLIMIT_ALLOC_INODE(inode)) {
+               err = -ENOSPC;
+               goto fail_dlim;
+       }
        ei = EXT2_I(inode);
        sbi = EXT2_SB(sb);
        es = sbi->s_es;
@@ -575,11 +582,11 @@ got:
        inode->i_mode = mode;
 
        inode->i_ino = ino;
-       inode->i_blksize = PAGE_SIZE;   /* This is the optimal IO size (for stat), not the fs block 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_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 */
@@ -605,27 +612,37 @@ got:
        insert_inode_hash(inode);
 
        if (DQUOT_ALLOC_INODE(inode)) {
-               DQUOT_DROP(inode);
-               err = -ENOSPC;
-               goto fail2;
+               err = -EDQUOT;
+               goto fail_drop;
        }
+
        err = ext2_init_acl(inode, dir);
-       if (err) {
-               DQUOT_FREE_INODE(inode);
-               goto fail2;
-       }
+       if (err)
+               goto fail_free_drop;
+
+       err = ext2_init_security(inode,dir);
+       if (err)
+               goto fail_free_drop;
+
        mark_inode_dirty(inode);
        ext2_debug("allocating inode %lu\n", inode->i_ino);
        ext2_preread_inode(inode);
        return inode;
 
-fail2:
+fail_free_drop:
+       DQUOT_FREE_INODE(inode);
+
+fail_drop:
+       DQUOT_DROP(inode);
+       DLIMIT_FREE_INODE(inode);
        inode->i_flags |= S_NOQUOTA;
        inode->i_nlink = 0;
        iput(inode);
        return ERR_PTR(err);
 
 fail:
+       DLIMIT_FREE_INODE(inode);
+fail_dlim:
        make_bad_inode(inode);
        iput(inode);
        return ERR_PTR(err);
@@ -642,7 +659,6 @@ unsigned long ext2_count_free_inodes (struct super_block * sb)
        unsigned long bitmap_count = 0;
        struct buffer_head *bitmap_bh = NULL;
 
-       lock_super (sb);
        es = EXT2_SB(sb)->s_es;
        for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
                unsigned x;
@@ -663,9 +679,8 @@ 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;
 #else
        for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
@@ -693,43 +708,3 @@ unsigned long ext2_count_dirs (struct super_block * sb)
        return count;
 }
 
-#ifdef CONFIG_EXT2_CHECK
-/* Called at mount-time, super-block is locked */
-void ext2_check_inodes_bitmap (struct super_block * sb)
-{
-       struct ext2_super_block * es = EXT2_SB(sb)->s_es;
-       unsigned long desc_count = 0, bitmap_count = 0;
-       struct buffer_head *bitmap_bh = NULL;
-       int i;
-
-       for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
-               struct ext2_group_desc *desc;
-               unsigned x;
-
-               desc = ext2_get_group_desc(sb, i, NULL);
-               if (!desc)
-                       continue;
-               desc_count += le16_to_cpu(desc->bg_free_inodes_count);
-               brelse(bitmap_bh);
-               bitmap_bh = read_inode_bitmap(sb, i);
-               if (!bitmap_bh)
-                       continue;
-               
-               x = ext2_count_free(bitmap_bh, EXT2_INODES_PER_GROUP(sb) / 8);
-               if (le16_to_cpu(desc->bg_free_inodes_count) != x)
-                       ext2_error (sb, "ext2_check_inodes_bitmap",
-                                   "Wrong free inodes count in group %d, "
-                                   "stored = %d, counted = %lu", i,
-                                   le16_to_cpu(desc->bg_free_inodes_count), x);
-               bitmap_count += x;
-       }
-       brelse(bitmap_bh);
-       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, "
-                           "stored = %lu, counted = %lu",
-                           (unsigned long)le32_to_cpu(es->s_free_inodes_count),
-                           bitmap_count);
-}
-#endif