Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

md: Turn rdev->sb_offset into a sector-based quantity.

Rename it to sb_start to make sure all users have been converted.

Signed-off-by: Andre Noll <maan@systemlinux.org>
Signed-off-by: Neil Brown <neilb@suse.de>

authored by

Andre Noll and committed by
Neil Brown
0f420358 b73df2d3

+44 -49
+5 -5
drivers/md/bitmap.c
··· 225 225 || test_bit(Faulty, &rdev->flags)) 226 226 continue; 227 227 228 - target = (rdev->sb_offset << 1) + offset + index * (PAGE_SIZE/512); 228 + target = rdev->sb_start + offset + index * (PAGE_SIZE/512); 229 229 230 230 if (sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)) { 231 231 page->index = index; ··· 262 262 /* bitmap runs in to metadata */ 263 263 return -EINVAL; 264 264 if (rdev->data_offset + mddev->size*2 265 - > rdev->sb_offset*2 + bitmap->offset) 265 + > rdev->sb_start + bitmap->offset) 266 266 /* data runs in to bitmap */ 267 267 return -EINVAL; 268 - } else if (rdev->sb_offset*2 < rdev->data_offset) { 268 + } else if (rdev->sb_start < rdev->data_offset) { 269 269 /* METADATA BITMAP DATA */ 270 - if (rdev->sb_offset*2 270 + if (rdev->sb_start 271 271 + bitmap->offset 272 272 + page->index*(PAGE_SIZE/512) + size/512 273 273 > rdev->data_offset) ··· 277 277 /* DATA METADATA BITMAP - no problems */ 278 278 } 279 279 md_super_write(mddev, rdev, 280 - (rdev->sb_offset<<1) + bitmap->offset 280 + rdev->sb_start + bitmap->offset 281 281 + page->index * (PAGE_SIZE/512), 282 282 size, 283 283 page);
+38 -43
drivers/md/md.c
··· 356 356 357 357 static sector_t calc_num_sectors(mdk_rdev_t *rdev, unsigned chunk_size) 358 358 { 359 - sector_t num_sectors = rdev->sb_offset * 2; 359 + sector_t num_sectors = rdev->sb_start; 360 360 361 361 if (chunk_size) 362 362 num_sectors &= ~((sector_t)chunk_size/512 - 1); ··· 383 383 put_page(rdev->sb_page); 384 384 rdev->sb_loaded = 0; 385 385 rdev->sb_page = NULL; 386 - rdev->sb_offset = 0; 386 + rdev->sb_start = 0; 387 387 rdev->size = 0; 388 388 } 389 389 } ··· 529 529 return 0; 530 530 531 531 532 - if (!sync_page_io(rdev->bdev, rdev->sb_offset<<1, size, rdev->sb_page, READ)) 532 + if (!sync_page_io(rdev->bdev, rdev->sb_start, size, rdev->sb_page, READ)) 533 533 goto fail; 534 534 rdev->sb_loaded = 1; 535 535 return 0; ··· 666 666 char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; 667 667 mdp_super_t *sb; 668 668 int ret; 669 - sector_t sb_offset; 670 669 671 670 /* 672 - * Calculate the position of the superblock, 671 + * Calculate the position of the superblock (512byte sectors), 673 672 * it's at the end of the disk. 674 673 * 675 674 * It also happens to be a multiple of 4Kb. 676 675 */ 677 - sb_offset = calc_dev_sboffset(rdev->bdev) / 2; 678 - rdev->sb_offset = sb_offset; 676 + rdev->sb_start = calc_dev_sboffset(rdev->bdev); 679 677 680 678 ret = read_disk_sb(rdev, MD_SB_BYTES); 681 679 if (ret) return ret; ··· 1005 1007 size *= 2; /* convert to sectors */ 1006 1008 if (rdev->mddev->bitmap_offset) 1007 1009 return 0; /* can't move bitmap */ 1008 - rdev->sb_offset = calc_dev_sboffset(rdev->bdev) / 2; 1009 - if (!size || size > rdev->sb_offset*2) 1010 - size = rdev->sb_offset*2; 1011 - md_super_write(rdev->mddev, rdev, rdev->sb_offset << 1, rdev->sb_size, 1010 + rdev->sb_start = calc_dev_sboffset(rdev->bdev); 1011 + if (!size || size > rdev->sb_start) 1012 + size = rdev->sb_start; 1013 + md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, 1012 1014 rdev->sb_page); 1013 1015 md_super_wait(rdev->mddev); 1014 1016 return size/2; /* kB for sysfs */ ··· 1046 1048 { 1047 1049 struct mdp_superblock_1 *sb; 1048 1050 int ret; 1049 - sector_t sb_offset; 1051 + sector_t sb_start; 1050 1052 char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; 1051 1053 int bmask; 1052 1054 1053 1055 /* 1054 - * Calculate the position of the superblock. 1056 + * Calculate the position of the superblock in 512byte sectors. 1055 1057 * It is always aligned to a 4K boundary and 1056 1058 * depeding on minor_version, it can be: 1057 1059 * 0: At least 8K, but less than 12K, from end of device ··· 1060 1062 */ 1061 1063 switch(minor_version) { 1062 1064 case 0: 1063 - sb_offset = rdev->bdev->bd_inode->i_size >> 9; 1064 - sb_offset -= 8*2; 1065 - sb_offset &= ~(sector_t)(4*2-1); 1066 - /* convert from sectors to K */ 1067 - sb_offset /= 2; 1065 + sb_start = rdev->bdev->bd_inode->i_size >> 9; 1066 + sb_start -= 8*2; 1067 + sb_start &= ~(sector_t)(4*2-1); 1068 1068 break; 1069 1069 case 1: 1070 - sb_offset = 0; 1070 + sb_start = 0; 1071 1071 break; 1072 1072 case 2: 1073 - sb_offset = 4; 1073 + sb_start = 8; 1074 1074 break; 1075 1075 default: 1076 1076 return -EINVAL; 1077 1077 } 1078 - rdev->sb_offset = sb_offset; 1078 + rdev->sb_start = sb_start; 1079 1079 1080 1080 /* superblock is rarely larger than 1K, but it can be larger, 1081 1081 * and it is safe to read 4k, so we do that ··· 1087 1091 if (sb->magic != cpu_to_le32(MD_SB_MAGIC) || 1088 1092 sb->major_version != cpu_to_le32(1) || 1089 1093 le32_to_cpu(sb->max_dev) > (4096-256)/2 || 1090 - le64_to_cpu(sb->super_offset) != (rdev->sb_offset<<1) || 1094 + le64_to_cpu(sb->super_offset) != rdev->sb_start || 1091 1095 (le32_to_cpu(sb->feature_map) & ~MD_FEATURE_ALL) != 0) 1092 1096 return -EINVAL; 1093 1097 ··· 1123 1127 rdev->sb_size = (rdev->sb_size | bmask) + 1; 1124 1128 1125 1129 if (minor_version 1126 - && rdev->data_offset < sb_offset + (rdev->sb_size/512)) 1130 + && rdev->data_offset < sb_start + (rdev->sb_size/512)) 1127 1131 return -EINVAL; 1128 1132 1129 1133 if (sb->level == cpu_to_le32(LEVEL_MULTIPATH)) ··· 1159 1163 if (minor_version) 1160 1164 rdev->size = ((rdev->bdev->bd_inode->i_size>>9) - le64_to_cpu(sb->data_offset)) / 2; 1161 1165 else 1162 - rdev->size = rdev->sb_offset; 1166 + rdev->size = rdev->sb_start / 2; 1163 1167 if (rdev->size < le64_to_cpu(sb->data_size)/2) 1164 1168 return -EINVAL; 1165 1169 rdev->size = le64_to_cpu(sb->data_size)/2; ··· 1346 1350 if (size && size < rdev->mddev->size) 1347 1351 return 0; /* component must fit device */ 1348 1352 size *= 2; /* convert to sectors */ 1349 - if (rdev->sb_offset < rdev->data_offset/2) { 1353 + if (rdev->sb_start < rdev->data_offset) { 1350 1354 /* minor versions 1 and 2; superblock before data */ 1351 1355 max_size = (rdev->bdev->bd_inode->i_size >> 9); 1352 1356 max_size -= rdev->data_offset; ··· 1357 1361 return 0; 1358 1362 } else { 1359 1363 /* minor version 0; superblock after data */ 1360 - sector_t sb_offset; 1361 - sb_offset = (rdev->bdev->bd_inode->i_size >> 9) - 8*2; 1362 - sb_offset &= ~(sector_t)(4*2 - 1); 1363 - max_size = rdev->size*2 + sb_offset - rdev->sb_offset*2; 1364 + sector_t sb_start; 1365 + sb_start = (rdev->bdev->bd_inode->i_size >> 9) - 8*2; 1366 + sb_start &= ~(sector_t)(4*2 - 1); 1367 + max_size = rdev->size*2 + sb_start - rdev->sb_start; 1364 1368 if (!size || size > max_size) 1365 1369 size = max_size; 1366 - rdev->sb_offset = sb_offset/2; 1370 + rdev->sb_start = sb_start; 1367 1371 } 1368 1372 sb = (struct mdp_superblock_1 *) page_address(rdev->sb_page); 1369 1373 sb->data_size = cpu_to_le64(size); 1370 - sb->super_offset = rdev->sb_offset*2; 1374 + sb->super_offset = rdev->sb_start; 1371 1375 sb->sb_csum = calc_sb_1_csum(sb); 1372 - md_super_write(rdev->mddev, rdev, rdev->sb_offset << 1, rdev->sb_size, 1376 + md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, 1373 1377 rdev->sb_page); 1374 1378 md_super_wait(rdev->mddev); 1375 1379 return size/2; /* kB for sysfs */ ··· 1806 1810 dprintk("%s ", bdevname(rdev->bdev,b)); 1807 1811 if (!test_bit(Faulty, &rdev->flags)) { 1808 1812 md_super_write(mddev,rdev, 1809 - rdev->sb_offset<<1, rdev->sb_size, 1813 + rdev->sb_start, rdev->sb_size, 1810 1814 rdev->sb_page); 1811 1815 dprintk(KERN_INFO "(write) %s's sb offset: %llu\n", 1812 1816 bdevname(rdev->bdev,b), 1813 - (unsigned long long)rdev->sb_offset); 1817 + (unsigned long long)rdev->sb_start); 1814 1818 rdev->sb_events = mddev->events; 1815 1819 1816 1820 } else ··· 3573 3577 * We don't want the data to overlap the metadata, 3574 3578 * Internal Bitmap issues has handled elsewhere. 3575 3579 */ 3576 - if (rdev->data_offset < rdev->sb_offset) { 3580 + if (rdev->data_offset < rdev->sb_start) { 3577 3581 if (mddev->size && 3578 3582 rdev->data_offset + mddev->size*2 3579 - > rdev->sb_offset*2) { 3583 + > rdev->sb_start) { 3580 3584 printk("md: %s: data overlaps metadata\n", 3581 3585 mdname(mddev)); 3582 3586 return -EINVAL; 3583 3587 } 3584 3588 } else { 3585 - if (rdev->sb_offset*2 + rdev->sb_size/512 3589 + if (rdev->sb_start + rdev->sb_size/512 3586 3590 > rdev->data_offset) { 3587 3591 printk("md: %s: metadata overlaps data\n", 3588 3592 mdname(mddev)); ··· 4351 4355 4352 4356 if (!mddev->persistent) { 4353 4357 printk(KERN_INFO "md: nonpersistent superblock ...\n"); 4354 - rdev->sb_offset = rdev->bdev->bd_inode->i_size >> BLOCK_SIZE_BITS; 4358 + rdev->sb_start = rdev->bdev->bd_inode->i_size / 512; 4355 4359 } else 4356 - rdev->sb_offset = calc_dev_sboffset(rdev->bdev) / 2; 4360 + rdev->sb_start = calc_dev_sboffset(rdev->bdev); 4357 4361 rdev->size = calc_num_sectors(rdev, mddev->chunk_size) / 2; 4358 4362 4359 4363 err = bind_rdev_to_array(rdev, mddev); ··· 4420 4424 } 4421 4425 4422 4426 if (mddev->persistent) 4423 - rdev->sb_offset = calc_dev_sboffset(rdev->bdev) / 2; 4427 + rdev->sb_start = calc_dev_sboffset(rdev->bdev); 4424 4428 else 4425 - rdev->sb_offset = 4426 - rdev->bdev->bd_inode->i_size >> BLOCK_SIZE_BITS; 4429 + rdev->sb_start = rdev->bdev->bd_inode->i_size / 512; 4427 4430 4428 4431 rdev->size = calc_num_sectors(rdev, mddev->chunk_size) / 2; 4429 4432 ··· 4623 4628 * linear and raid0 always use whatever space is available. We can only 4624 4629 * consider changing this number if no resync or reconstruction is 4625 4630 * happening, and if the new size is acceptable. It must fit before the 4626 - * sb_offset or, if that is <data_offset, it must fit before the size 4631 + * sb_start or, if that is <data_offset, it must fit before the size 4627 4632 * of each device. If num_sectors is zero, we find the largest size 4628 4633 * that fits. 4629 4634
+1 -1
include/linux/raid/md_k.h
··· 59 59 int sb_loaded; 60 60 __u64 sb_events; 61 61 sector_t data_offset; /* start of data in array */ 62 - sector_t sb_offset; 62 + sector_t sb_start; /* offset of the super block (in 512byte sectors) */ 63 63 int sb_size; /* bytes in the superblock */ 64 64 int preferred_minor; /* autorun support */ 65 65