aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/super.c68
-rw-r--r--fs/jbd2/journal.c72
2 files changed, 4 insertions, 136 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index e5ab520724da..8036392b2121 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -51,8 +51,6 @@ struct proc_dir_entry *ext4_proc_root;
51 51
52static int ext4_load_journal(struct super_block *, struct ext4_super_block *, 52static int ext4_load_journal(struct super_block *, struct ext4_super_block *,
53 unsigned long journal_devnum); 53 unsigned long journal_devnum);
54static int ext4_create_journal(struct super_block *, struct ext4_super_block *,
55 unsigned int);
56static void ext4_commit_super(struct super_block *sb, 54static void ext4_commit_super(struct super_block *sb,
57 struct ext4_super_block *es, int sync); 55 struct ext4_super_block *es, int sync);
58static void ext4_mark_recovery_complete(struct super_block *sb, 56static void ext4_mark_recovery_complete(struct super_block *sb,
@@ -1006,7 +1004,7 @@ enum {
1006 Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, 1004 Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl,
1007 Opt_reservation, Opt_noreservation, Opt_noload, Opt_nobh, Opt_bh, 1005 Opt_reservation, Opt_noreservation, Opt_noload, Opt_nobh, Opt_bh,
1008 Opt_commit, Opt_min_batch_time, Opt_max_batch_time, 1006 Opt_commit, Opt_min_batch_time, Opt_max_batch_time,
1009 Opt_journal_update, Opt_journal_inum, Opt_journal_dev, 1007 Opt_journal_update, Opt_journal_dev,
1010 Opt_journal_checksum, Opt_journal_async_commit, 1008 Opt_journal_checksum, Opt_journal_async_commit,
1011 Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, 1009 Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
1012 Opt_data_err_abort, Opt_data_err_ignore, 1010 Opt_data_err_abort, Opt_data_err_ignore,
@@ -1048,7 +1046,6 @@ static const match_table_t tokens = {
1048 {Opt_min_batch_time, "min_batch_time=%u"}, 1046 {Opt_min_batch_time, "min_batch_time=%u"},
1049 {Opt_max_batch_time, "max_batch_time=%u"}, 1047 {Opt_max_batch_time, "max_batch_time=%u"},
1050 {Opt_journal_update, "journal=update"}, 1048 {Opt_journal_update, "journal=update"},
1051 {Opt_journal_inum, "journal=%u"},
1052 {Opt_journal_dev, "journal_dev=%u"}, 1049 {Opt_journal_dev, "journal_dev=%u"},
1053 {Opt_journal_checksum, "journal_checksum"}, 1050 {Opt_journal_checksum, "journal_checksum"},
1054 {Opt_journal_async_commit, "journal_async_commit"}, 1051 {Opt_journal_async_commit, "journal_async_commit"},
@@ -1102,7 +1099,7 @@ static ext4_fsblk_t get_sb_block(void **data)
1102} 1099}
1103 1100
1104static int parse_options(char *options, struct super_block *sb, 1101static int parse_options(char *options, struct super_block *sb,
1105 unsigned int *inum, unsigned long *journal_devnum, 1102 unsigned long *journal_devnum,
1106 ext4_fsblk_t *n_blocks_count, int is_remount) 1103 ext4_fsblk_t *n_blocks_count, int is_remount)
1107{ 1104{
1108 struct ext4_sb_info *sbi = EXT4_SB(sb); 1105 struct ext4_sb_info *sbi = EXT4_SB(sb);
@@ -1226,16 +1223,6 @@ static int parse_options(char *options, struct super_block *sb,
1226 } 1223 }
1227 set_opt(sbi->s_mount_opt, UPDATE_JOURNAL); 1224 set_opt(sbi->s_mount_opt, UPDATE_JOURNAL);
1228 break; 1225 break;
1229 case Opt_journal_inum:
1230 if (is_remount) {
1231 printk(KERN_ERR "EXT4-fs: cannot specify "
1232 "journal on remount\n");
1233 return 0;
1234 }
1235 if (match_int(&args[0], &option))
1236 return 0;
1237 *inum = option;
1238 break;
1239 case Opt_journal_dev: 1226 case Opt_journal_dev:
1240 if (is_remount) { 1227 if (is_remount) {
1241 printk(KERN_ERR "EXT4-fs: cannot specify " 1228 printk(KERN_ERR "EXT4-fs: cannot specify "
@@ -2035,7 +2022,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
2035 ext4_fsblk_t sb_block = get_sb_block(&data); 2022 ext4_fsblk_t sb_block = get_sb_block(&data);
2036 ext4_fsblk_t logical_sb_block; 2023 ext4_fsblk_t logical_sb_block;
2037 unsigned long offset = 0; 2024 unsigned long offset = 0;
2038 unsigned int journal_inum = 0;
2039 unsigned long journal_devnum = 0; 2025 unsigned long journal_devnum = 0;
2040 unsigned long def_mount_opts; 2026 unsigned long def_mount_opts;
2041 struct inode *root; 2027 struct inode *root;
@@ -2155,8 +2141,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
2155 set_opt(sbi->s_mount_opt, DELALLOC); 2141 set_opt(sbi->s_mount_opt, DELALLOC);
2156 2142
2157 2143
2158 if (!parse_options((char *) data, sb, &journal_inum, &journal_devnum, 2144 if (!parse_options((char *) data, sb, &journal_devnum, NULL, 0))
2159 NULL, 0))
2160 goto failed_mount; 2145 goto failed_mount;
2161 2146
2162 sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | 2147 sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
@@ -2460,9 +2445,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
2460 goto failed_mount4; 2445 goto failed_mount4;
2461 } 2446 }
2462 } 2447 }
2463 } else if (journal_inum) {
2464 if (ext4_create_journal(sb, es, journal_inum))
2465 goto failed_mount3;
2466 } else if (test_opt(sb, NOLOAD) && !(sb->s_flags & MS_RDONLY) && 2448 } else if (test_opt(sb, NOLOAD) && !(sb->s_flags & MS_RDONLY) &&
2467 EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) { 2449 EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) {
2468 printk(KERN_ERR "EXT4-fs: required journal recovery " 2450 printk(KERN_ERR "EXT4-fs: required journal recovery "
@@ -2926,48 +2908,6 @@ static int ext4_load_journal(struct super_block *sb,
2926 return 0; 2908 return 0;
2927} 2909}
2928 2910
2929static int ext4_create_journal(struct super_block *sb,
2930 struct ext4_super_block *es,
2931 unsigned int journal_inum)
2932{
2933 journal_t *journal;
2934 int err;
2935
2936 if (sb->s_flags & MS_RDONLY) {
2937 printk(KERN_ERR "EXT4-fs: readonly filesystem when trying to "
2938 "create journal.\n");
2939 return -EROFS;
2940 }
2941
2942 journal = ext4_get_journal(sb, journal_inum);
2943 if (!journal)
2944 return -EINVAL;
2945
2946 printk(KERN_INFO "EXT4-fs: creating new journal on inode %u\n",
2947 journal_inum);
2948
2949 err = jbd2_journal_create(journal);
2950 if (err) {
2951 printk(KERN_ERR "EXT4-fs: error creating journal.\n");
2952 jbd2_journal_destroy(journal);
2953 return -EIO;
2954 }
2955
2956 EXT4_SB(sb)->s_journal = journal;
2957
2958 ext4_update_dynamic_rev(sb);
2959 EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
2960 EXT4_SET_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL);
2961
2962 es->s_journal_inum = cpu_to_le32(journal_inum);
2963 sb->s_dirt = 1;
2964
2965 /* Make sure we flush the recovery flag to disk. */
2966 ext4_commit_super(sb, es, 1);
2967
2968 return 0;
2969}
2970
2971static void ext4_commit_super(struct super_block *sb, 2911static void ext4_commit_super(struct super_block *sb,
2972 struct ext4_super_block *es, int sync) 2912 struct ext4_super_block *es, int sync)
2973{ 2913{
@@ -3209,7 +3149,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
3209 /* 3149 /*
3210 * Allow the "check" option to be passed as a remount option. 3150 * Allow the "check" option to be passed as a remount option.
3211 */ 3151 */
3212 if (!parse_options(data, sb, NULL, NULL, &n_blocks_count, 1)) { 3152 if (!parse_options(data, sb, NULL, &n_blocks_count, 1)) {
3213 err = -EINVAL; 3153 err = -EINVAL;
3214 goto restore_opts; 3154 goto restore_opts;
3215 } 3155 }
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index 34ef98057202..b10d7283ba5b 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -66,7 +66,6 @@ EXPORT_SYMBOL(jbd2_journal_update_format);
66EXPORT_SYMBOL(jbd2_journal_check_used_features); 66EXPORT_SYMBOL(jbd2_journal_check_used_features);
67EXPORT_SYMBOL(jbd2_journal_check_available_features); 67EXPORT_SYMBOL(jbd2_journal_check_available_features);
68EXPORT_SYMBOL(jbd2_journal_set_features); 68EXPORT_SYMBOL(jbd2_journal_set_features);
69EXPORT_SYMBOL(jbd2_journal_create);
70EXPORT_SYMBOL(jbd2_journal_load); 69EXPORT_SYMBOL(jbd2_journal_load);
71EXPORT_SYMBOL(jbd2_journal_destroy); 70EXPORT_SYMBOL(jbd2_journal_destroy);
72EXPORT_SYMBOL(jbd2_journal_abort); 71EXPORT_SYMBOL(jbd2_journal_abort);
@@ -1163,77 +1162,6 @@ static int journal_reset(journal_t *journal)
1163} 1162}
1164 1163
1165/** 1164/**
1166 * int jbd2_journal_create() - Initialise the new journal file
1167 * @journal: Journal to create. This structure must have been initialised
1168 *
1169 * Given a journal_t structure which tells us which disk blocks we can
1170 * use, create a new journal superblock and initialise all of the
1171 * journal fields from scratch.
1172 **/
1173int jbd2_journal_create(journal_t *journal)
1174{
1175 unsigned long long blocknr;
1176 struct buffer_head *bh;
1177 journal_superblock_t *sb;
1178 int i, err;
1179
1180 if (journal->j_maxlen < JBD2_MIN_JOURNAL_BLOCKS) {
1181 printk (KERN_ERR "Journal length (%d blocks) too short.\n",
1182 journal->j_maxlen);
1183 journal_fail_superblock(journal);
1184 return -EINVAL;
1185 }
1186
1187 if (journal->j_inode == NULL) {
1188 /*
1189 * We don't know what block to start at!
1190 */
1191 printk(KERN_EMERG
1192 "%s: creation of journal on external device!\n",
1193 __func__);
1194 BUG();
1195 }
1196
1197 /* Zero out the entire journal on disk. We cannot afford to
1198 have any blocks on disk beginning with JBD2_MAGIC_NUMBER. */
1199 jbd_debug(1, "JBD: Zeroing out journal blocks...\n");
1200 for (i = 0; i < journal->j_maxlen; i++) {
1201 err = jbd2_journal_bmap(journal, i, &blocknr);
1202 if (err)
1203 return err;
1204 bh = __getblk(journal->j_dev, blocknr, journal->j_blocksize);
1205 lock_buffer(bh);
1206 memset (bh->b_data, 0, journal->j_blocksize);
1207 BUFFER_TRACE(bh, "marking dirty");
1208 mark_buffer_dirty(bh);
1209 BUFFER_TRACE(bh, "marking uptodate");
1210 set_buffer_uptodate(bh);
1211 unlock_buffer(bh);
1212 __brelse(bh);
1213 }
1214
1215 sync_blockdev(journal->j_dev);
1216 jbd_debug(1, "JBD: journal cleared.\n");
1217
1218 /* OK, fill in the initial static fields in the new superblock */
1219 sb = journal->j_superblock;
1220
1221 sb->s_header.h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER);
1222 sb->s_header.h_blocktype = cpu_to_be32(JBD2_SUPERBLOCK_V2);
1223
1224 sb->s_blocksize = cpu_to_be32(journal->j_blocksize);
1225 sb->s_maxlen = cpu_to_be32(journal->j_maxlen);
1226 sb->s_first = cpu_to_be32(1);
1227
1228 journal->j_transaction_sequence = 1;
1229
1230 journal->j_flags &= ~JBD2_ABORT;
1231 journal->j_format_version = 2;
1232
1233 return journal_reset(journal);
1234}
1235
1236/**
1237 * void jbd2_journal_update_superblock() - Update journal sb on disk. 1165 * void jbd2_journal_update_superblock() - Update journal sb on disk.
1238 * @journal: The journal to update. 1166 * @journal: The journal to update.
1239 * @wait: Set to '0' if you don't want to wait for IO completion. 1167 * @wait: Set to '0' if you don't want to wait for IO completion.