]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - fs/ext4/super.c
Merge branch 'next' into upstream-merge
[net-next-2.6.git] / fs / ext4 / super.c
index 01e60aa6c4786ce61b9436b94d8e4777f34397d0..0348ce0665929f45933bb04fa538d2c18fe863f8 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/init.h>
 #include <linux/blkdev.h>
 #include <linux/parser.h>
-#include <linux/smp_lock.h>
 #include <linux/buffer_head.h>
 #include <linux/exportfs.h>
 #include <linux/vfs.h>
@@ -53,7 +52,7 @@
 #define CREATE_TRACE_POINTS
 #include <trace/events/ext4.h>
 
-struct proc_dir_entry *ext4_proc_root;
+static struct proc_dir_entry *ext4_proc_root;
 static struct kset *ext4_kset;
 struct ext4_lazy_init *ext4_li_info;
 struct mutex ext4_li_mtx;
@@ -717,7 +716,6 @@ static void ext4_put_super(struct super_block *sb)
        destroy_workqueue(sbi->dio_unwritten_wq);
 
        lock_super(sb);
-       lock_kernel();
        if (sb->s_dirt)
                ext4_commit_super(sb, 1);
 
@@ -785,7 +783,6 @@ static void ext4_put_super(struct super_block *sb)
         * Now that we are completely done shutting down the
         * superblock, we need to actually destroy the kobject.
         */
-       unlock_kernel();
        unlock_super(sb);
        kobject_put(&sbi->s_kobj);
        wait_for_completion(&sbi->s_kobj_unregister);
@@ -2457,9 +2454,11 @@ static struct attribute *ext4_attrs[] = {
 
 /* Features this copy of ext4 supports */
 EXT4_INFO_ATTR(lazy_itable_init);
+EXT4_INFO_ATTR(batched_discard);
 
 static struct attribute *ext4_feat_attrs[] = {
        ATTR_LIST(lazy_itable_init),
+       ATTR_LIST(batched_discard),
        NULL,
 };
 
@@ -2900,28 +2899,26 @@ static int ext4_register_li_request(struct super_block *sb,
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        struct ext4_li_request *elr;
        ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count;
-       int ret = 0;
+       int ret;
 
        if (sbi->s_li_request != NULL)
-               goto out;
+               return 0;
 
        if (first_not_zeroed == ngroups ||
            (sb->s_flags & MS_RDONLY) ||
            !test_opt(sb, INIT_INODE_TABLE)) {
                sbi->s_li_request = NULL;
-               goto out;
+               return 0;
        }
 
        if (first_not_zeroed == ngroups) {
                sbi->s_li_request = NULL;
-               goto out;
+               return 0;
        }
 
        elr = ext4_li_request_new(sb, first_not_zeroed);
-       if (!elr) {
-               ret = -ENOMEM;
-               goto out;
-       }
+       if (!elr)
+               return -ENOMEM;
 
        mutex_lock(&ext4_li_mtx);
 
@@ -2942,14 +2939,10 @@ static int ext4_register_li_request(struct super_block *sb,
                if (ret)
                        goto out;
        }
-
-       mutex_unlock(&ext4_li_mtx);
-
 out:
-       if (ret) {
-               mutex_unlock(&ext4_li_mtx);
+       mutex_unlock(&ext4_li_mtx);
+       if (ret)
                kfree(elr);
-       }
        return ret;
 }
 
@@ -3022,8 +3015,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
                sbi->s_sectors_written_start =
                        part_stat_read(sb->s_bdev->bd_part, sectors[1]);
 
-       unlock_kernel();
-
        /* Cleanup superblock name */
        for (cp = sb->s_id; (cp = strchr(cp, '/'));)
                *cp = '!';
@@ -3266,15 +3257,13 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
         * Test whether we have more sectors than will fit in sector_t,
         * and whether the max offset is addressable by the page cache.
         */
-       if ((ext4_blocks_count(es) >
-            (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) ||
-           (ext4_blocks_count(es) >
-            (pgoff_t)(~0ULL) >> (PAGE_CACHE_SHIFT - sb->s_blocksize_bits))) {
+       ret = generic_check_addressable(sb->s_blocksize_bits,
+                                       ext4_blocks_count(es));
+       if (ret) {
                ext4_msg(sb, KERN_ERR, "filesystem"
                         " too large to mount safely on this system");
                if (sizeof(sector_t) < 8)
                        ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled");
-               ret = -EFBIG;
                goto failed_mount;
        }
 
@@ -3605,7 +3594,6 @@ no_journal:
        if (es->s_error_count)
                mod_timer(&sbi->s_err_report, jiffies + 300*HZ); /* 5 minutes */
 
-       lock_kernel();
        kfree(orig_data);
        return 0;
 
@@ -3652,7 +3640,6 @@ out_fail:
        sb->s_fs_info = NULL;
        kfree(sbi->s_blockgroup_lock);
        kfree(sbi);
-       lock_kernel();
 out_free_orig:
        kfree(orig_data);
        return ret;
@@ -3962,9 +3949,12 @@ static int ext4_commit_super(struct super_block *sb, int sync)
        else
                es->s_kbytes_written =
                        cpu_to_le64(EXT4_SB(sb)->s_kbytes_written);
-       ext4_free_blocks_count_set(es, percpu_counter_sum_positive(
+       if (percpu_counter_initialized(&EXT4_SB(sb)->s_freeblocks_counter))
+               ext4_free_blocks_count_set(es, percpu_counter_sum_positive(
                                        &EXT4_SB(sb)->s_freeblocks_counter));
-       es->s_free_inodes_count = cpu_to_le32(percpu_counter_sum_positive(
+       if (percpu_counter_initialized(&EXT4_SB(sb)->s_freeinodes_counter))
+               es->s_free_inodes_count =
+                       cpu_to_le32(percpu_counter_sum_positive(
                                        &EXT4_SB(sb)->s_freeinodes_counter));
        sb->s_dirt = 0;
        BUFFER_TRACE(sbh, "marking dirty");
@@ -4161,8 +4151,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
 #endif
        char *orig_data = kstrdup(data, GFP_KERNEL);
 
-       lock_kernel();
-
        /* Store the original options */
        lock_super(sb);
        old_sb_flags = sb->s_flags;
@@ -4310,7 +4298,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
                        kfree(old_opts.s_qf_names[i]);
 #endif
        unlock_super(sb);
-       unlock_kernel();
        if (enable_quota)
                dquot_resume(sb, -1);
 
@@ -4336,7 +4323,6 @@ restore_opts:
        }
 #endif
        unlock_super(sb);
-       unlock_kernel();
        kfree(orig_data);
        return err;
 }
@@ -4765,15 +4751,15 @@ out:
        return ret;
 }
 
-static int __init init_ext4_fs(void)
+static int __init ext4_init_fs(void)
 {
        int err;
 
        ext4_check_flag_values();
-       err = init_ext4_pageio();
+       err = ext4_init_pageio();
        if (err)
                return err;
-       err = init_ext4_system_zone();
+       err = ext4_init_system_zone();
        if (err)
                goto out5;
        ext4_kset = kset_create_and_add("ext4", NULL, fs_kobj);
@@ -4783,11 +4769,11 @@ static int __init init_ext4_fs(void)
 
        err = ext4_init_feat_adverts();
 
-       err = init_ext4_mballoc();
+       err = ext4_init_mballoc();
        if (err)
                goto out3;
 
-       err = init_ext4_xattr();
+       err = ext4_init_xattr();
        if (err)
                goto out2;
        err = init_inodecache();
@@ -4807,37 +4793,37 @@ out:
        unregister_as_ext3();
        destroy_inodecache();
 out1:
-       exit_ext4_xattr();
+       ext4_exit_xattr();
 out2:
-       exit_ext4_mballoc();
+       ext4_exit_mballoc();
 out3:
        kfree(ext4_feat);
        remove_proc_entry("fs/ext4", NULL);
        kset_unregister(ext4_kset);
 out4:
-       exit_ext4_system_zone();
+       ext4_exit_system_zone();
 out5:
-       exit_ext4_pageio();
+       ext4_exit_pageio();
        return err;
 }
 
-static void __exit exit_ext4_fs(void)
+static void __exit ext4_exit_fs(void)
 {
        ext4_destroy_lazyinit_thread();
        unregister_as_ext2();
        unregister_as_ext3();
        unregister_filesystem(&ext4_fs_type);
        destroy_inodecache();
-       exit_ext4_xattr();
-       exit_ext4_mballoc();
+       ext4_exit_xattr();
+       ext4_exit_mballoc();
        remove_proc_entry("fs/ext4", NULL);
        kset_unregister(ext4_kset);
-       exit_ext4_system_zone();
-       exit_ext4_pageio();
+       ext4_exit_system_zone();
+       ext4_exit_pageio();
 }
 
 MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others");
 MODULE_DESCRIPTION("Fourth Extended Filesystem");
 MODULE_LICENSE("GPL");
-module_init(init_ext4_fs)
-module_exit(exit_ext4_fs)
+module_init(ext4_init_fs)
+module_exit(ext4_exit_fs)