aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c90
1 files changed, 48 insertions, 42 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index df8c8f291831..e720d3e6ec20 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -401,7 +401,8 @@ out:
401 * Return 0 if the superblock checksum type matches the checksum value of that 401 * Return 0 if the superblock checksum type matches the checksum value of that
402 * algorithm. Pass the raw disk superblock data. 402 * algorithm. Pass the raw disk superblock data.
403 */ 403 */
404static int btrfs_check_super_csum(char *raw_disk_sb) 404static int btrfs_check_super_csum(struct btrfs_fs_info *fs_info,
405 char *raw_disk_sb)
405{ 406{
406 struct btrfs_super_block *disk_sb = 407 struct btrfs_super_block *disk_sb =
407 (struct btrfs_super_block *)raw_disk_sb; 408 (struct btrfs_super_block *)raw_disk_sb;
@@ -427,7 +428,7 @@ static int btrfs_check_super_csum(char *raw_disk_sb)
427 } 428 }
428 429
429 if (csum_type >= ARRAY_SIZE(btrfs_csum_sizes)) { 430 if (csum_type >= ARRAY_SIZE(btrfs_csum_sizes)) {
430 pr_err("BTRFS: unsupported checksum algorithm %u\n", 431 btrfs_err(fs_info, "unsupported checksum algorithm %u",
431 csum_type); 432 csum_type);
432 ret = 1; 433 ret = 1;
433 } 434 }
@@ -2780,7 +2781,7 @@ int open_ctree(struct super_block *sb,
2780 * We want to check superblock checksum, the type is stored inside. 2781 * We want to check superblock checksum, the type is stored inside.
2781 * Pass the whole disk block of size BTRFS_SUPER_INFO_SIZE (4k). 2782 * Pass the whole disk block of size BTRFS_SUPER_INFO_SIZE (4k).
2782 */ 2783 */
2783 if (btrfs_check_super_csum(bh->b_data)) { 2784 if (btrfs_check_super_csum(fs_info, bh->b_data)) {
2784 btrfs_err(fs_info, "superblock checksum mismatch"); 2785 btrfs_err(fs_info, "superblock checksum mismatch");
2785 err = -EINVAL; 2786 err = -EINVAL;
2786 brelse(bh); 2787 brelse(bh);
@@ -3624,7 +3625,7 @@ int btrfs_get_num_tolerated_disk_barrier_failures(u64 flags)
3624 } 3625 }
3625 3626
3626 if (min_tolerated == INT_MAX) { 3627 if (min_tolerated == INT_MAX) {
3627 pr_warn("BTRFS: unknown raid flag: %llu\n", flags); 3628 pr_warn("BTRFS: unknown raid flag: %llu", flags);
3628 min_tolerated = 0; 3629 min_tolerated = 0;
3629 } 3630 }
3630 3631
@@ -4114,24 +4115,24 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info,
4114 int ret = 0; 4115 int ret = 0;
4115 4116
4116 if (btrfs_super_magic(sb) != BTRFS_MAGIC) { 4117 if (btrfs_super_magic(sb) != BTRFS_MAGIC) {
4117 pr_err("BTRFS: no valid FS found\n"); 4118 btrfs_err(fs_info, "no valid FS found");
4118 ret = -EINVAL; 4119 ret = -EINVAL;
4119 } 4120 }
4120 if (btrfs_super_flags(sb) & ~BTRFS_SUPER_FLAG_SUPP) 4121 if (btrfs_super_flags(sb) & ~BTRFS_SUPER_FLAG_SUPP)
4121 pr_warn("BTRFS: unrecognized super flag: %llu\n", 4122 btrfs_warn(fs_info, "unrecognized super flag: %llu",
4122 btrfs_super_flags(sb) & ~BTRFS_SUPER_FLAG_SUPP); 4123 btrfs_super_flags(sb) & ~BTRFS_SUPER_FLAG_SUPP);
4123 if (btrfs_super_root_level(sb) >= BTRFS_MAX_LEVEL) { 4124 if (btrfs_super_root_level(sb) >= BTRFS_MAX_LEVEL) {
4124 pr_err("BTRFS: tree_root level too big: %d >= %d\n", 4125 btrfs_err(fs_info, "tree_root level too big: %d >= %d",
4125 btrfs_super_root_level(sb), BTRFS_MAX_LEVEL); 4126 btrfs_super_root_level(sb), BTRFS_MAX_LEVEL);
4126 ret = -EINVAL; 4127 ret = -EINVAL;
4127 } 4128 }
4128 if (btrfs_super_chunk_root_level(sb) >= BTRFS_MAX_LEVEL) { 4129 if (btrfs_super_chunk_root_level(sb) >= BTRFS_MAX_LEVEL) {
4129 pr_err("BTRFS: chunk_root level too big: %d >= %d\n", 4130 btrfs_err(fs_info, "chunk_root level too big: %d >= %d",
4130 btrfs_super_chunk_root_level(sb), BTRFS_MAX_LEVEL); 4131 btrfs_super_chunk_root_level(sb), BTRFS_MAX_LEVEL);
4131 ret = -EINVAL; 4132 ret = -EINVAL;
4132 } 4133 }
4133 if (btrfs_super_log_root_level(sb) >= BTRFS_MAX_LEVEL) { 4134 if (btrfs_super_log_root_level(sb) >= BTRFS_MAX_LEVEL) {
4134 pr_err("BTRFS: log_root level too big: %d >= %d\n", 4135 btrfs_err(fs_info, "log_root level too big: %d >= %d",
4135 btrfs_super_log_root_level(sb), BTRFS_MAX_LEVEL); 4136 btrfs_super_log_root_level(sb), BTRFS_MAX_LEVEL);
4136 ret = -EINVAL; 4137 ret = -EINVAL;
4137 } 4138 }
@@ -4142,47 +4143,48 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info,
4142 */ 4143 */
4143 if (!is_power_of_2(sectorsize) || sectorsize < 4096 || 4144 if (!is_power_of_2(sectorsize) || sectorsize < 4096 ||
4144 sectorsize > BTRFS_MAX_METADATA_BLOCKSIZE) { 4145 sectorsize > BTRFS_MAX_METADATA_BLOCKSIZE) {
4145 pr_err("BTRFS: invalid sectorsize %llu\n", sectorsize); 4146 btrfs_err(fs_info, "invalid sectorsize %llu", sectorsize);
4146 ret = -EINVAL; 4147 ret = -EINVAL;
4147 } 4148 }
4148 /* Only PAGE SIZE is supported yet */ 4149 /* Only PAGE SIZE is supported yet */
4149 if (sectorsize != PAGE_SIZE) { 4150 if (sectorsize != PAGE_SIZE) {
4150 pr_err("BTRFS: sectorsize %llu not supported yet, only support %lu\n", 4151 btrfs_err(fs_info,
4151 sectorsize, PAGE_SIZE); 4152 "sectorsize %llu not supported yet, only support %lu",
4153 sectorsize, PAGE_SIZE);
4152 ret = -EINVAL; 4154 ret = -EINVAL;
4153 } 4155 }
4154 if (!is_power_of_2(nodesize) || nodesize < sectorsize || 4156 if (!is_power_of_2(nodesize) || nodesize < sectorsize ||
4155 nodesize > BTRFS_MAX_METADATA_BLOCKSIZE) { 4157 nodesize > BTRFS_MAX_METADATA_BLOCKSIZE) {
4156 pr_err("BTRFS: invalid nodesize %llu\n", nodesize); 4158 btrfs_err(fs_info, "invalid nodesize %llu", nodesize);
4157 ret = -EINVAL; 4159 ret = -EINVAL;
4158 } 4160 }
4159 if (nodesize != le32_to_cpu(sb->__unused_leafsize)) { 4161 if (nodesize != le32_to_cpu(sb->__unused_leafsize)) {
4160 pr_err("BTRFS: invalid leafsize %u, should be %llu\n", 4162 btrfs_err(fs_info, "invalid leafsize %u, should be %llu",
4161 le32_to_cpu(sb->__unused_leafsize), 4163 le32_to_cpu(sb->__unused_leafsize), nodesize);
4162 nodesize);
4163 ret = -EINVAL; 4164 ret = -EINVAL;
4164 } 4165 }
4165 4166
4166 /* Root alignment check */ 4167 /* Root alignment check */
4167 if (!IS_ALIGNED(btrfs_super_root(sb), sectorsize)) { 4168 if (!IS_ALIGNED(btrfs_super_root(sb), sectorsize)) {
4168 pr_warn("BTRFS: tree_root block unaligned: %llu\n", 4169 btrfs_warn(fs_info, "tree_root block unaligned: %llu",
4169 btrfs_super_root(sb)); 4170 btrfs_super_root(sb));
4170 ret = -EINVAL; 4171 ret = -EINVAL;
4171 } 4172 }
4172 if (!IS_ALIGNED(btrfs_super_chunk_root(sb), sectorsize)) { 4173 if (!IS_ALIGNED(btrfs_super_chunk_root(sb), sectorsize)) {
4173 pr_warn("BTRFS: chunk_root block unaligned: %llu\n", 4174 btrfs_warn(fs_info, "chunk_root block unaligned: %llu",
4174 btrfs_super_chunk_root(sb)); 4175 btrfs_super_chunk_root(sb));
4175 ret = -EINVAL; 4176 ret = -EINVAL;
4176 } 4177 }
4177 if (!IS_ALIGNED(btrfs_super_log_root(sb), sectorsize)) { 4178 if (!IS_ALIGNED(btrfs_super_log_root(sb), sectorsize)) {
4178 pr_warn("BTRFS: log_root block unaligned: %llu\n", 4179 btrfs_warn(fs_info, "log_root block unaligned: %llu",
4179 btrfs_super_log_root(sb)); 4180 btrfs_super_log_root(sb));
4180 ret = -EINVAL; 4181 ret = -EINVAL;
4181 } 4182 }
4182 4183
4183 if (memcmp(fs_info->fsid, sb->dev_item.fsid, BTRFS_UUID_SIZE) != 0) { 4184 if (memcmp(fs_info->fsid, sb->dev_item.fsid, BTRFS_UUID_SIZE) != 0) {
4184 pr_err("BTRFS: dev_item UUID does not match fsid: %pU != %pU\n", 4185 btrfs_err(fs_info,
4185 fs_info->fsid, sb->dev_item.fsid); 4186 "dev_item UUID does not match fsid: %pU != %pU",
4187 fs_info->fsid, sb->dev_item.fsid);
4186 ret = -EINVAL; 4188 ret = -EINVAL;
4187 } 4189 }
4188 4190
@@ -4192,25 +4194,25 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info,
4192 */ 4194 */
4193 if (btrfs_super_bytes_used(sb) < 6 * btrfs_super_nodesize(sb)) { 4195 if (btrfs_super_bytes_used(sb) < 6 * btrfs_super_nodesize(sb)) {
4194 btrfs_err(fs_info, "bytes_used is too small %llu", 4196 btrfs_err(fs_info, "bytes_used is too small %llu",
4195 btrfs_super_bytes_used(sb)); 4197 btrfs_super_bytes_used(sb));
4196 ret = -EINVAL; 4198 ret = -EINVAL;
4197 } 4199 }
4198 if (!is_power_of_2(btrfs_super_stripesize(sb))) { 4200 if (!is_power_of_2(btrfs_super_stripesize(sb))) {
4199 btrfs_err(fs_info, "invalid stripesize %u", 4201 btrfs_err(fs_info, "invalid stripesize %u",
4200 btrfs_super_stripesize(sb)); 4202 btrfs_super_stripesize(sb));
4201 ret = -EINVAL; 4203 ret = -EINVAL;
4202 } 4204 }
4203 if (btrfs_super_num_devices(sb) > (1UL << 31)) 4205 if (btrfs_super_num_devices(sb) > (1UL << 31))
4204 pr_warn("BTRFS: suspicious number of devices: %llu\n", 4206 btrfs_warn(fs_info, "suspicious number of devices: %llu",
4205 btrfs_super_num_devices(sb)); 4207 btrfs_super_num_devices(sb));
4206 if (btrfs_super_num_devices(sb) == 0) { 4208 if (btrfs_super_num_devices(sb) == 0) {
4207 pr_err("BTRFS: number of devices is 0\n"); 4209 btrfs_err(fs_info, "number of devices is 0");
4208 ret = -EINVAL; 4210 ret = -EINVAL;
4209 } 4211 }
4210 4212
4211 if (btrfs_super_bytenr(sb) != BTRFS_SUPER_INFO_OFFSET) { 4213 if (btrfs_super_bytenr(sb) != BTRFS_SUPER_INFO_OFFSET) {
4212 pr_err("BTRFS: super offset mismatch %llu != %u\n", 4214 btrfs_err(fs_info, "super offset mismatch %llu != %u",
4213 btrfs_super_bytenr(sb), BTRFS_SUPER_INFO_OFFSET); 4215 btrfs_super_bytenr(sb), BTRFS_SUPER_INFO_OFFSET);
4214 ret = -EINVAL; 4216 ret = -EINVAL;
4215 } 4217 }
4216 4218
@@ -4219,17 +4221,17 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info,
4219 * and one chunk 4221 * and one chunk
4220 */ 4222 */
4221 if (btrfs_super_sys_array_size(sb) > BTRFS_SYSTEM_CHUNK_ARRAY_SIZE) { 4223 if (btrfs_super_sys_array_size(sb) > BTRFS_SYSTEM_CHUNK_ARRAY_SIZE) {
4222 pr_err("BTRFS: system chunk array too big %u > %u\n", 4224 btrfs_err(fs_info, "system chunk array too big %u > %u",
4223 btrfs_super_sys_array_size(sb), 4225 btrfs_super_sys_array_size(sb),
4224 BTRFS_SYSTEM_CHUNK_ARRAY_SIZE); 4226 BTRFS_SYSTEM_CHUNK_ARRAY_SIZE);
4225 ret = -EINVAL; 4227 ret = -EINVAL;
4226 } 4228 }
4227 if (btrfs_super_sys_array_size(sb) < sizeof(struct btrfs_disk_key) 4229 if (btrfs_super_sys_array_size(sb) < sizeof(struct btrfs_disk_key)
4228 + sizeof(struct btrfs_chunk)) { 4230 + sizeof(struct btrfs_chunk)) {
4229 pr_err("BTRFS: system chunk array too small %u < %zu\n", 4231 btrfs_err(fs_info, "system chunk array too small %u < %zu",
4230 btrfs_super_sys_array_size(sb), 4232 btrfs_super_sys_array_size(sb),
4231 sizeof(struct btrfs_disk_key) 4233 sizeof(struct btrfs_disk_key)
4232 + sizeof(struct btrfs_chunk)); 4234 + sizeof(struct btrfs_chunk));
4233 ret = -EINVAL; 4235 ret = -EINVAL;
4234 } 4236 }
4235 4237
@@ -4238,12 +4240,16 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info,
4238 * but it's still possible that it's the one that's wrong. 4240 * but it's still possible that it's the one that's wrong.
4239 */ 4241 */
4240 if (btrfs_super_generation(sb) < btrfs_super_chunk_root_generation(sb)) 4242 if (btrfs_super_generation(sb) < btrfs_super_chunk_root_generation(sb))
4241 pr_warn("BTRFS: suspicious: generation < chunk_root_generation: %llu < %llu\n", 4243 btrfs_warn(fs_info,
4242 btrfs_super_generation(sb), btrfs_super_chunk_root_generation(sb)); 4244 "suspicious: generation < chunk_root_generation: %llu < %llu",
4245 btrfs_super_generation(sb),
4246 btrfs_super_chunk_root_generation(sb));
4243 if (btrfs_super_generation(sb) < btrfs_super_cache_generation(sb) 4247 if (btrfs_super_generation(sb) < btrfs_super_cache_generation(sb)
4244 && btrfs_super_cache_generation(sb) != (u64)-1) 4248 && btrfs_super_cache_generation(sb) != (u64)-1)
4245 pr_warn("BTRFS: suspicious: generation < cache_generation: %llu < %llu\n", 4249 btrfs_warn(fs_info,
4246 btrfs_super_generation(sb), btrfs_super_cache_generation(sb)); 4250 "suspicious: generation < cache_generation: %llu < %llu",
4251 btrfs_super_generation(sb),
4252 btrfs_super_cache_generation(sb));
4247 4253
4248 return ret; 4254 return ret;
4249} 4255}