@@ -5079,6 +5079,7 @@ static int ext4_load_journal(struct super_block *sb,
5079
5079
dev_t journal_dev ;
5080
5080
int err = 0 ;
5081
5081
int really_read_only ;
5082
+ int journal_dev_ro ;
5082
5083
5083
5084
if (WARN_ON_ONCE (!ext4_has_feature_journal (sb )))
5084
5085
return - EFSCORRUPTED ;
@@ -5091,7 +5092,31 @@ static int ext4_load_journal(struct super_block *sb,
5091
5092
} else
5092
5093
journal_dev = new_decode_dev (le32_to_cpu (es -> s_journal_dev ));
5093
5094
5094
- really_read_only = bdev_read_only (sb -> s_bdev );
5095
+ if (journal_inum && journal_dev ) {
5096
+ ext4_msg (sb , KERN_ERR ,
5097
+ "filesystem has both journal inode and journal device!" );
5098
+ return - EINVAL ;
5099
+ }
5100
+
5101
+ if (journal_inum ) {
5102
+ journal = ext4_get_journal (sb , journal_inum );
5103
+ if (!journal )
5104
+ return - EINVAL ;
5105
+ } else {
5106
+ journal = ext4_get_dev_journal (sb , journal_dev );
5107
+ if (!journal )
5108
+ return - EINVAL ;
5109
+ }
5110
+
5111
+ journal_dev_ro = bdev_read_only (journal -> j_dev );
5112
+ really_read_only = bdev_read_only (sb -> s_bdev ) | journal_dev_ro ;
5113
+
5114
+ if (journal_dev_ro && !sb_rdonly (sb )) {
5115
+ ext4_msg (sb , KERN_ERR ,
5116
+ "journal device read-only, try mounting with '-o ro'" );
5117
+ err = - EROFS ;
5118
+ goto err_out ;
5119
+ }
5095
5120
5096
5121
/*
5097
5122
* Are we loading a blank journal or performing recovery after a
@@ -5106,27 +5131,14 @@ static int ext4_load_journal(struct super_block *sb,
5106
5131
ext4_msg (sb , KERN_ERR , "write access "
5107
5132
"unavailable, cannot proceed "
5108
5133
"(try mounting with noload)" );
5109
- return - EROFS ;
5134
+ err = - EROFS ;
5135
+ goto err_out ;
5110
5136
}
5111
5137
ext4_msg (sb , KERN_INFO , "write access will "
5112
5138
"be enabled during recovery" );
5113
5139
}
5114
5140
}
5115
5141
5116
- if (journal_inum && journal_dev ) {
5117
- ext4_msg (sb , KERN_ERR , "filesystem has both journal "
5118
- "and inode journals!" );
5119
- return - EINVAL ;
5120
- }
5121
-
5122
- if (journal_inum ) {
5123
- if (!(journal = ext4_get_journal (sb , journal_inum )))
5124
- return - EINVAL ;
5125
- } else {
5126
- if (!(journal = ext4_get_dev_journal (sb , journal_dev )))
5127
- return - EINVAL ;
5128
- }
5129
-
5130
5142
if (!(journal -> j_flags & JBD2_BARRIER ))
5131
5143
ext4_msg (sb , KERN_INFO , "barriers disabled" );
5132
5144
@@ -5146,8 +5158,7 @@ static int ext4_load_journal(struct super_block *sb,
5146
5158
5147
5159
if (err ) {
5148
5160
ext4_msg (sb , KERN_ERR , "error loading journal" );
5149
- jbd2_journal_destroy (journal );
5150
- return err ;
5161
+ goto err_out ;
5151
5162
}
5152
5163
5153
5164
EXT4_SB (sb )-> s_journal = journal ;
@@ -5167,6 +5178,10 @@ static int ext4_load_journal(struct super_block *sb,
5167
5178
}
5168
5179
5169
5180
return 0 ;
5181
+
5182
+ err_out :
5183
+ jbd2_journal_destroy (journal );
5184
+ return err ;
5170
5185
}
5171
5186
5172
5187
static int ext4_commit_super (struct super_block * sb , int sync )
0 commit comments