This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / fs / ext2 / super.c
index 3a06830..ed846dc 100644 (file)
@@ -37,8 +37,6 @@ static void ext2_sync_super(struct super_block *sb,
 static int ext2_remount (struct super_block * sb, int * flags, char * data);
 static int ext2_statfs (struct super_block * sb, struct kstatfs * buf);
 
-static char error_buf[1024];
-
 void ext2_error (struct super_block * sb, const char * function,
                 const char * fmt, ...)
 {
@@ -52,39 +50,19 @@ void ext2_error (struct super_block * sb, const char * function,
                        cpu_to_le16(le16_to_cpu(es->s_state) | EXT2_ERROR_FS);
                ext2_sync_super(sb, es);
        }
-       va_start (args, fmt);
-       vsprintf (error_buf, fmt, args);
-       va_end (args);
-       if (test_opt (sb, ERRORS_PANIC))
-               panic ("EXT2-fs panic (device %s): %s: %s\n",
-                      sb->s_id, function, error_buf);
-       printk (KERN_CRIT "EXT2-fs error (device %s): %s: %s\n",
-               sb->s_id, function, error_buf);
-       if (test_opt (sb, ERRORS_RO)) {
-               printk ("Remounting filesystem read-only\n");
-               sb->s_flags |= MS_RDONLY;
-       }
-}
 
-NORET_TYPE void ext2_panic (struct super_block * sb, const char * function,
-                           const char * fmt, ...)
-{
-       va_list args;
-       struct ext2_sb_info *sbi = EXT2_SB(sb);
+       va_start(args, fmt);
+       printk(KERN_CRIT "EXT2-fs error (device %s): %s: ",sb->s_id, function);
+       vprintk(fmt, args);
+       printk("\n");
+       va_end(args);
 
-       if (!(sb->s_flags & MS_RDONLY)) {
-               sbi->s_mount_state |= EXT2_ERROR_FS;
-               sbi->s_es->s_state =
-                       cpu_to_le16(le16_to_cpu(sbi->s_es->s_state) | EXT2_ERROR_FS);
-               mark_buffer_dirty(sbi->s_sbh);
-               sb->s_dirt = 1;
+       if (test_opt(sb, ERRORS_PANIC))
+               panic("EXT2-fs panic from previous error\n");
+       if (test_opt(sb, ERRORS_RO)) {
+               printk("Remounting filesystem read-only\n");
+               sb->s_flags |= MS_RDONLY;
        }
-       va_start (args, fmt);
-       vsprintf (error_buf, fmt, args);
-       va_end (args);
-       sb->s_flags |= MS_RDONLY;
-       panic ("EXT2-fs panic (device %s): %s: %s\n",
-              sb->s_id, function, error_buf);
 }
 
 void ext2_warning (struct super_block * sb, const char * function,
@@ -92,11 +70,12 @@ void ext2_warning (struct super_block * sb, const char * function,
 {
        va_list args;
 
-       va_start (args, fmt);
-       vsprintf (error_buf, fmt, args);
-       va_end (args);
-       printk (KERN_WARNING "EXT2-fs warning (device %s): %s: %s\n",
-               sb->s_id, function, error_buf);
+       va_start(args, fmt);
+       printk(KERN_WARNING "EXT2-fs warning (device %s): %s: ",
+              sb->s_id, function);
+       vprintk(fmt, args);
+       printk("\n");
+       va_end(args);
 }
 
 void ext2_update_dynamic_rev(struct super_block *sb)
@@ -134,7 +113,7 @@ static void ext2_put_super (struct super_block * sb)
        if (!(sb->s_flags & MS_RDONLY)) {
                struct ext2_super_block *es = sbi->s_es;
 
-               es->s_state = le16_to_cpu(sbi->s_mount_state);
+               es->s_state = cpu_to_le16(sbi->s_mount_state);
                ext2_sync_super(sb, es);
        }
        db_count = sbi->s_gdb_count;
@@ -143,6 +122,9 @@ static void ext2_put_super (struct super_block * sb)
                        brelse (sbi->s_group_desc[i]);
        kfree(sbi->s_group_desc);
        kfree(sbi->s_debts);
+       percpu_counter_destroy(&sbi->s_freeblocks_counter);
+       percpu_counter_destroy(&sbi->s_freeinodes_counter);
+       percpu_counter_destroy(&sbi->s_dirs_counter);
        brelse (sbi->s_sbh);
        sb->s_fs_info = NULL;
        kfree(sbi);
@@ -189,7 +171,7 @@ static int init_inodecache(void)
 {
        ext2_inode_cachep = kmem_cache_create("ext2_inode_cache",
                                             sizeof(struct ext2_inode_info),
-                                            0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT,
+                                            0, SLAB_RECLAIM_ACCOUNT,
                                             init_once, NULL);
        if (ext2_inode_cachep == NULL)
                return -ENOMEM;
@@ -270,7 +252,7 @@ enum {
        Opt_bsd_df, Opt_minix_df, Opt_grpid, Opt_nogrpid,
        Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, Opt_err_ro,
        Opt_nouid32, Opt_check, Opt_nocheck, Opt_debug, Opt_oldalloc, Opt_orlov, Opt_nobh,
-       Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl,
+       Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, Opt_tagxid,
        Opt_ignore, Opt_err,
 };
 
@@ -299,6 +281,7 @@ static match_table_t tokens = {
        {Opt_nouser_xattr, "nouser_xattr"},
        {Opt_acl, "acl"},
        {Opt_noacl, "noacl"},
+       {Opt_tagxid, "tagxid"},
        {Opt_ignore, "grpquota"},
        {Opt_ignore, "noquota"},
        {Opt_ignore, "quota"},
@@ -362,6 +345,11 @@ static int parse_options (char * options,
                case Opt_nouid32:
                        set_opt (sbi->s_mount_opt, NO_UID32);
                        break;
+#ifndef CONFIG_INOXID_NONE
+               case Opt_tagxid:
+                       set_opt (sbi->s_mount_opt, TAG_XID);
+                       break;
+#endif
                case Opt_check:
 #ifdef CONFIG_EXT2_CHECK
                        set_opt (sbi->s_mount_opt, CHECK);
@@ -449,8 +437,8 @@ static int ext2_setup_super (struct super_block * sb,
                (le32_to_cpu(es->s_lastcheck) + le32_to_cpu(es->s_checkinterval) <= get_seconds()))
                printk ("EXT2-fs warning: checktime reached, "
                        "running e2fsck is recommended\n");
-       if (!(__s16) le16_to_cpu(es->s_max_mnt_count))
-               es->s_max_mnt_count = (__s16) cpu_to_le16(EXT2_DFL_MAX_MNT_COUNT);
+       if (!le16_to_cpu(es->s_max_mnt_count))
+               es->s_max_mnt_count = cpu_to_le16(EXT2_DFL_MAX_MNT_COUNT);
        es->s_mnt_count=cpu_to_le16(le16_to_cpu(es->s_mnt_count) + 1);
        ext2_write_super(sb);
        if (test_opt (sb, DEBUG))
@@ -572,6 +560,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
        int blocksize = BLOCK_SIZE;
        int db_count;
        int i, j;
+       __le32 features;
 
        sbi = kmalloc(sizeof(*sbi), GFP_KERNEL);
        if (!sbi)
@@ -646,6 +635,8 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
        if (!parse_options ((char *) data, sbi))
                goto failed_mount;
 
+       if (EXT2_SB(sb)->s_mount_opt & EXT2_MOUNT_TAG_XID)
+               sb->s_flags |= MS_TAGXID;
        sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
                ((EXT2_SB(sb)->s_mount_opt & EXT2_MOUNT_POSIX_ACL) ?
                 MS_POSIXACL : 0);
@@ -661,17 +652,18 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
         * previously didn't change the revision level when setting the flags,
         * so there is a chance incompat flags are set on a rev 0 filesystem.
         */
-       if ((i = EXT2_HAS_INCOMPAT_FEATURE(sb, ~EXT2_FEATURE_INCOMPAT_SUPP))) {
+       features = EXT2_HAS_INCOMPAT_FEATURE(sb, ~EXT2_FEATURE_INCOMPAT_SUPP);
+       if (features) {
                printk("EXT2-fs: %s: couldn't mount because of "
                       "unsupported optional features (%x).\n",
-                      sb->s_id, i);
+                      sb->s_id, le32_to_cpu(features));
                goto failed_mount;
        }
        if (!(sb->s_flags & MS_RDONLY) &&
-           (i = EXT2_HAS_RO_COMPAT_FEATURE(sb, ~EXT2_FEATURE_RO_COMPAT_SUPP))){
+           (features = EXT2_HAS_RO_COMPAT_FEATURE(sb, ~EXT2_FEATURE_RO_COMPAT_SUPP))){
                printk("EXT2-fs: %s: couldn't mount RDWR because of "
                       "unsupported optional features (%x).\n",
-                      sb->s_id, i);
+                      sb->s_id, le32_to_cpu(features));
                goto failed_mount;
        }
        blocksize = BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size);
@@ -694,7 +686,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
                }
                es = (struct ext2_super_block *) (((char *)bh->b_data) + offset);
                sbi->s_es = es;
-               if (es->s_magic != le16_to_cpu(EXT2_SUPER_MAGIC)) {
+               if (es->s_magic != cpu_to_le16(EXT2_SUPER_MAGIC)) {
                        printk ("EXT2-fs: Magic mismatch, very weird !\n");
                        goto failed_mount;
                }
@@ -819,6 +811,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
         */
        sb->s_op = &ext2_sops;
        sb->s_export_op = &ext2_export_ops;
+       sb->s_xattr = ext2_xattr_handlers;
        root = iget(sb, EXT2_ROOT_INO);
        sb->s_root = d_alloc_root(root);
        if (!sb->s_root) {
@@ -937,12 +930,12 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data)
                es->s_state = cpu_to_le16(sbi->s_mount_state);
                es->s_mtime = cpu_to_le32(get_seconds());
        } else {
-               int ret;
-               if ((ret = EXT2_HAS_RO_COMPAT_FEATURE(sb,
-                                              ~EXT2_FEATURE_RO_COMPAT_SUPP))) {
+               __le32 ret = EXT2_HAS_RO_COMPAT_FEATURE(sb,
+                                              ~EXT2_FEATURE_RO_COMPAT_SUPP);
+               if (ret) {
                        printk("EXT2-fs: %s: couldn't remount RDWR because of "
                               "unsupported optional features (%x).\n",
-                              sb->s_id, ret);
+                              sb->s_id, le32_to_cpu(ret));
                        return -EROFS;
                }
                /*