diff options
author | Lars Ellenberg <lars.ellenberg@linbit.com> | 2013-03-19 13:16:43 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2013-03-22 20:13:59 -0400 |
commit | ae8bf312e97d554b6aa32e7b2ceb993812ad0835 (patch) | |
tree | 7ed6d4fcf6385c1dbc694cf4f43f884436ae104a | |
parent | 9114d79569a3fb858a7ecb1f21cb1dec93dc2f21 (diff) |
drbd: cleanup ondisk meta data layout calculations and defines
Add a comment about our meta data layout variants,
and rename a few defines (e.g. MD_RESERVED_SECT -> MD_128MB_SECT)
to make it clear that they are short hand for fixed constants,
and not arbitrarily to be redefined as one may see fit.
Properly pad struct meta_data_on_disk to 4kB,
and initialize to zero not only the first 512 Byte,
but all of it in drbd_md_sync().
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | drivers/block/drbd/drbd_actlog.c | 28 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_bitmap.c | 13 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_int.h | 86 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 11 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_nl.c | 42 |
5 files changed, 123 insertions, 57 deletions
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 92510f8ad013..b230d91ec430 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c | |||
@@ -209,7 +209,8 @@ int drbd_md_sync_page_io(struct drbd_conf *mdev, struct drbd_backing_dev *bdev, | |||
209 | current->comm, current->pid, __func__, | 209 | current->comm, current->pid, __func__, |
210 | (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ"); | 210 | (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ"); |
211 | 211 | ||
212 | err = _drbd_md_sync_page_io(mdev, bdev, iop, sector, rw, MD_BLOCK_SIZE); | 212 | /* we do all our meta data IO in aligned 4k blocks. */ |
213 | err = _drbd_md_sync_page_io(mdev, bdev, iop, sector, rw, 4096); | ||
213 | if (err) { | 214 | if (err) { |
214 | dev_err(DEV, "drbd_md_sync_page_io(,%llus,%s) failed with error %d\n", | 215 | dev_err(DEV, "drbd_md_sync_page_io(,%llus,%s) failed with error %d\n", |
215 | (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ", err); | 216 | (unsigned long long)sector, (rw & WRITE) ? "WRITE" : "READ", err); |
@@ -350,6 +351,24 @@ static unsigned int rs_extent_to_bm_page(unsigned int rs_enr) | |||
350 | (BM_EXT_SHIFT - BM_BLOCK_SHIFT)); | 351 | (BM_EXT_SHIFT - BM_BLOCK_SHIFT)); |
351 | } | 352 | } |
352 | 353 | ||
354 | static sector_t al_tr_number_to_on_disk_sector(struct drbd_conf *mdev) | ||
355 | { | ||
356 | const unsigned int stripes = 1; | ||
357 | const unsigned int stripe_size_4kB = MD_32kB_SECT/MD_4kB_SECT; | ||
358 | |||
359 | /* transaction number, modulo on-disk ring buffer wrap around */ | ||
360 | unsigned int t = mdev->al_tr_number % (stripe_size_4kB * stripes); | ||
361 | |||
362 | /* ... to aligned 4k on disk block */ | ||
363 | t = ((t % stripes) * stripe_size_4kB) + t/stripes; | ||
364 | |||
365 | /* ... to 512 byte sector in activity log */ | ||
366 | t *= 8; | ||
367 | |||
368 | /* ... plus offset to the on disk position */ | ||
369 | return mdev->ldev->md.md_offset + mdev->ldev->md.al_offset + t; | ||
370 | } | ||
371 | |||
353 | static int | 372 | static int |
354 | _al_write_transaction(struct drbd_conf *mdev) | 373 | _al_write_transaction(struct drbd_conf *mdev) |
355 | { | 374 | { |
@@ -432,13 +451,12 @@ _al_write_transaction(struct drbd_conf *mdev) | |||
432 | if (mdev->al_tr_cycle >= mdev->act_log->nr_elements) | 451 | if (mdev->al_tr_cycle >= mdev->act_log->nr_elements) |
433 | mdev->al_tr_cycle = 0; | 452 | mdev->al_tr_cycle = 0; |
434 | 453 | ||
435 | sector = mdev->ldev->md.md_offset | 454 | sector = al_tr_number_to_on_disk_sector(mdev); |
436 | + mdev->ldev->md.al_offset | ||
437 | + mdev->al_tr_pos * (MD_BLOCK_SIZE>>9); | ||
438 | 455 | ||
439 | crc = crc32c(0, buffer, 4096); | 456 | crc = crc32c(0, buffer, 4096); |
440 | buffer->crc32c = cpu_to_be32(crc); | 457 | buffer->crc32c = cpu_to_be32(crc); |
441 | 458 | ||
459 | /* normal execution path goes through all three branches */ | ||
442 | if (drbd_bm_write_hinted(mdev)) | 460 | if (drbd_bm_write_hinted(mdev)) |
443 | err = -EIO; | 461 | err = -EIO; |
444 | /* drbd_chk_io_error done already */ | 462 | /* drbd_chk_io_error done already */ |
@@ -446,8 +464,6 @@ _al_write_transaction(struct drbd_conf *mdev) | |||
446 | err = -EIO; | 464 | err = -EIO; |
447 | drbd_chk_io_error(mdev, 1, DRBD_META_IO_ERROR); | 465 | drbd_chk_io_error(mdev, 1, DRBD_META_IO_ERROR); |
448 | } else { | 466 | } else { |
449 | /* advance ringbuffer position and transaction counter */ | ||
450 | mdev->al_tr_pos = (mdev->al_tr_pos + 1) % (MD_AL_SECTORS*512/MD_BLOCK_SIZE); | ||
451 | mdev->al_tr_number++; | 467 | mdev->al_tr_number++; |
452 | } | 468 | } |
453 | 469 | ||
diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index 8dc29502dc08..64fbb8385cdc 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c | |||
@@ -612,6 +612,17 @@ static void bm_memset(struct drbd_bitmap *b, size_t offset, int c, size_t len) | |||
612 | } | 612 | } |
613 | } | 613 | } |
614 | 614 | ||
615 | /* For the layout, see comment above drbd_md_set_sector_offsets(). */ | ||
616 | static u64 drbd_md_on_disk_bits(struct drbd_backing_dev *ldev) | ||
617 | { | ||
618 | u64 bitmap_sectors; | ||
619 | if (ldev->md.al_offset == 8) | ||
620 | bitmap_sectors = ldev->md.md_size_sect - ldev->md.bm_offset; | ||
621 | else | ||
622 | bitmap_sectors = ldev->md.al_offset - ldev->md.bm_offset; | ||
623 | return bitmap_sectors << (9 + 3); | ||
624 | } | ||
625 | |||
615 | /* | 626 | /* |
616 | * make sure the bitmap has enough room for the attached storage, | 627 | * make sure the bitmap has enough room for the attached storage, |
617 | * if necessary, resize. | 628 | * if necessary, resize. |
@@ -668,7 +679,7 @@ int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity, int set_new_bits) | |||
668 | words = ALIGN(bits, 64) >> LN2_BPL; | 679 | words = ALIGN(bits, 64) >> LN2_BPL; |
669 | 680 | ||
670 | if (get_ldev(mdev)) { | 681 | if (get_ldev(mdev)) { |
671 | u64 bits_on_disk = ((u64)mdev->ldev->md.md_size_sect-MD_BM_OFFSET) << 12; | 682 | u64 bits_on_disk = drbd_md_on_disk_bits(mdev->ldev); |
672 | put_ldev(mdev); | 683 | put_ldev(mdev); |
673 | if (bits > bits_on_disk) { | 684 | if (bits > bits_on_disk) { |
674 | dev_info(DEV, "bits = %lu\n", bits); | 685 | dev_info(DEV, "bits = %lu\n", bits); |
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index db504d021a6e..60c89e5b298c 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h | |||
@@ -753,13 +753,8 @@ struct drbd_md { | |||
753 | u32 flags; | 753 | u32 flags; |
754 | u32 md_size_sect; | 754 | u32 md_size_sect; |
755 | 755 | ||
756 | s32 al_offset; /* signed relative sector offset to al area */ | 756 | s32 al_offset; /* signed relative sector offset to activity log */ |
757 | s32 bm_offset; /* signed relative sector offset to bitmap */ | 757 | s32 bm_offset; /* signed relative sector offset to bitmap */ |
758 | |||
759 | /* u32 al_nr_extents; important for restoring the AL | ||
760 | * is stored into ldev->dc.al_extents, which in turn | ||
761 | * gets applied to act_log->nr_elements | ||
762 | */ | ||
763 | }; | 758 | }; |
764 | 759 | ||
765 | struct drbd_backing_dev { | 760 | struct drbd_backing_dev { |
@@ -1009,7 +1004,6 @@ struct drbd_conf { | |||
1009 | struct lru_cache *act_log; /* activity log */ | 1004 | struct lru_cache *act_log; /* activity log */ |
1010 | unsigned int al_tr_number; | 1005 | unsigned int al_tr_number; |
1011 | int al_tr_cycle; | 1006 | int al_tr_cycle; |
1012 | int al_tr_pos; /* position of the next transaction in the journal */ | ||
1013 | wait_queue_head_t seq_wait; | 1007 | wait_queue_head_t seq_wait; |
1014 | atomic_t packet_seq; | 1008 | atomic_t packet_seq; |
1015 | unsigned int peer_seq; | 1009 | unsigned int peer_seq; |
@@ -1151,21 +1145,41 @@ extern int drbd_bmio_clear_n_write(struct drbd_conf *mdev); | |||
1151 | extern void drbd_ldev_destroy(struct drbd_conf *mdev); | 1145 | extern void drbd_ldev_destroy(struct drbd_conf *mdev); |
1152 | 1146 | ||
1153 | /* Meta data layout | 1147 | /* Meta data layout |
1154 | We reserve a 128MB Block (4k aligned) | 1148 | * |
1155 | * either at the end of the backing device | 1149 | * We currently have two possible layouts. |
1156 | * or on a separate meta data device. */ | 1150 | * Offsets in (512 byte) sectors. |
1151 | * external: | ||
1152 | * |----------- md_size_sect ------------------| | ||
1153 | * [ 4k superblock ][ activity log ][ Bitmap ] | ||
1154 | * | al_offset == 8 | | ||
1155 | * | bm_offset = al_offset + X | | ||
1156 | * ==> bitmap sectors = md_size_sect - bm_offset | ||
1157 | * | ||
1158 | * Variants: | ||
1159 | * old, indexed fixed size meta data: | ||
1160 | * | ||
1161 | * internal: | ||
1162 | * |----------- md_size_sect ------------------| | ||
1163 | * [data.....][ Bitmap ][ activity log ][ 4k superblock ][padding*] | ||
1164 | * | al_offset < 0 | | ||
1165 | * | bm_offset = al_offset - Y | | ||
1166 | * ==> bitmap sectors = Y = al_offset - bm_offset | ||
1167 | * | ||
1168 | * [padding*] are zero or up to 7 unused 512 Byte sectors to the | ||
1169 | * end of the device, so that the [4k superblock] will be 4k aligned. | ||
1170 | * | ||
1171 | * The activity log consists of 4k transaction blocks, | ||
1172 | * which are written in a ring-buffer, or striped ring-buffer like fashion, | ||
1173 | * which are writtensize used to be fixed 32kB, | ||
1174 | * but is about to become configurable. | ||
1175 | */ | ||
1157 | 1176 | ||
1158 | /* The following numbers are sectors */ | 1177 | /* Our old fixed size meta data layout |
1159 | /* Allows up to about 3.8TB, so if you want more, | 1178 | * allows up to about 3.8TB, so if you want more, |
1160 | * you need to use the "flexible" meta data format. */ | 1179 | * you need to use the "flexible" meta data format. */ |
1161 | #define MD_RESERVED_SECT (128LU << 11) /* 128 MB, unit sectors */ | 1180 | #define MD_128MB_SECT (128LLU << 11) /* 128 MB, unit sectors */ |
1162 | #define MD_AL_OFFSET 8 /* 8 Sectors after start of meta area */ | 1181 | #define MD_4kB_SECT 8 |
1163 | #define MD_AL_SECTORS 64 /* = 32 kB on disk activity log ring buffer */ | 1182 | #define MD_32kB_SECT 64 |
1164 | #define MD_BM_OFFSET (MD_AL_OFFSET + MD_AL_SECTORS) | ||
1165 | |||
1166 | /* we do all meta data IO in 4k blocks */ | ||
1167 | #define MD_BLOCK_SHIFT 12 | ||
1168 | #define MD_BLOCK_SIZE (1<<MD_BLOCK_SHIFT) | ||
1169 | 1183 | ||
1170 | /* One activity log extent represents 4M of storage */ | 1184 | /* One activity log extent represents 4M of storage */ |
1171 | #define AL_EXTENT_SHIFT 22 | 1185 | #define AL_EXTENT_SHIFT 22 |
@@ -1255,7 +1269,6 @@ struct bm_extent { | |||
1255 | 1269 | ||
1256 | /* in one sector of the bitmap, we have this many activity_log extents. */ | 1270 | /* in one sector of the bitmap, we have this many activity_log extents. */ |
1257 | #define AL_EXT_PER_BM_SECT (1 << (BM_EXT_SHIFT - AL_EXTENT_SHIFT)) | 1271 | #define AL_EXT_PER_BM_SECT (1 << (BM_EXT_SHIFT - AL_EXTENT_SHIFT)) |
1258 | #define BM_WORDS_PER_AL_EXT (1 << (AL_EXTENT_SHIFT-BM_BLOCK_SHIFT-LN2_BPL)) | ||
1259 | 1272 | ||
1260 | #define BM_BLOCKS_PER_BM_EXT_B (BM_EXT_SHIFT - BM_BLOCK_SHIFT) | 1273 | #define BM_BLOCKS_PER_BM_EXT_B (BM_EXT_SHIFT - BM_BLOCK_SHIFT) |
1261 | #define BM_BLOCKS_PER_BM_EXT_MASK ((1<<BM_BLOCKS_PER_BM_EXT_B) - 1) | 1274 | #define BM_BLOCKS_PER_BM_EXT_MASK ((1<<BM_BLOCKS_PER_BM_EXT_B) - 1) |
@@ -1275,16 +1288,18 @@ struct bm_extent { | |||
1275 | */ | 1288 | */ |
1276 | 1289 | ||
1277 | #define DRBD_MAX_SECTORS_32 (0xffffffffLU) | 1290 | #define DRBD_MAX_SECTORS_32 (0xffffffffLU) |
1278 | #define DRBD_MAX_SECTORS_BM \ | 1291 | /* we have a certain meta data variant that has a fixed on-disk size of 128 |
1279 | ((MD_RESERVED_SECT - MD_BM_OFFSET) * (1LL<<(BM_EXT_SHIFT-9))) | 1292 | * MiB, of which 4k are our "superblock", and 32k are the fixed size activity |
1280 | #if DRBD_MAX_SECTORS_BM < DRBD_MAX_SECTORS_32 | 1293 | * log, leaving this many sectors for the bitmap. |
1281 | #define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_BM | 1294 | */ |
1282 | #define DRBD_MAX_SECTORS_FLEX DRBD_MAX_SECTORS_BM | 1295 | |
1283 | #elif !defined(CONFIG_LBDAF) && BITS_PER_LONG == 32 | 1296 | #define DRBD_MAX_SECTORS_FIXED_BM \ |
1297 | ((MD_128MB_SECT - MD_32kB_SECT - MD_4kB_SECT) * (1LL<<(BM_EXT_SHIFT-9))) | ||
1298 | #if !defined(CONFIG_LBDAF) && BITS_PER_LONG == 32 | ||
1284 | #define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_32 | 1299 | #define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_32 |
1285 | #define DRBD_MAX_SECTORS_FLEX DRBD_MAX_SECTORS_32 | 1300 | #define DRBD_MAX_SECTORS_FLEX DRBD_MAX_SECTORS_32 |
1286 | #else | 1301 | #else |
1287 | #define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_BM | 1302 | #define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_FIXED_BM |
1288 | /* 16 TB in units of sectors */ | 1303 | /* 16 TB in units of sectors */ |
1289 | #if BITS_PER_LONG == 32 | 1304 | #if BITS_PER_LONG == 32 |
1290 | /* adjust by one page worth of bitmap, | 1305 | /* adjust by one page worth of bitmap, |
@@ -1792,10 +1807,10 @@ static inline sector_t drbd_md_last_sector(struct drbd_backing_dev *bdev) | |||
1792 | switch (meta_dev_idx) { | 1807 | switch (meta_dev_idx) { |
1793 | case DRBD_MD_INDEX_INTERNAL: | 1808 | case DRBD_MD_INDEX_INTERNAL: |
1794 | case DRBD_MD_INDEX_FLEX_INT: | 1809 | case DRBD_MD_INDEX_FLEX_INT: |
1795 | return bdev->md.md_offset + MD_AL_OFFSET - 1; | 1810 | return bdev->md.md_offset + MD_4kB_SECT -1; |
1796 | case DRBD_MD_INDEX_FLEX_EXT: | 1811 | case DRBD_MD_INDEX_FLEX_EXT: |
1797 | default: | 1812 | default: |
1798 | return bdev->md.md_offset + bdev->md.md_size_sect; | 1813 | return bdev->md.md_offset + bdev->md.md_size_sect -1; |
1799 | } | 1814 | } |
1800 | } | 1815 | } |
1801 | 1816 | ||
@@ -1861,13 +1876,11 @@ static inline sector_t drbd_md_ss__(struct drbd_conf *mdev, | |||
1861 | rcu_read_unlock(); | 1876 | rcu_read_unlock(); |
1862 | 1877 | ||
1863 | switch (meta_dev_idx) { | 1878 | switch (meta_dev_idx) { |
1864 | default: /* external, some index */ | 1879 | default: /* external, some index; this is the old fixed size layout */ |
1865 | return MD_RESERVED_SECT * meta_dev_idx; | 1880 | return MD_128MB_SECT * meta_dev_idx; |
1866 | case DRBD_MD_INDEX_INTERNAL: | 1881 | case DRBD_MD_INDEX_INTERNAL: |
1867 | /* with drbd08, internal meta data is always "flexible" */ | 1882 | /* with drbd08, internal meta data is always "flexible" */ |
1868 | case DRBD_MD_INDEX_FLEX_INT: | 1883 | case DRBD_MD_INDEX_FLEX_INT: |
1869 | /* sizeof(struct md_on_disk_07) == 4k | ||
1870 | * position: last 4k aligned block of 4k size */ | ||
1871 | if (!bdev->backing_bdev) { | 1884 | if (!bdev->backing_bdev) { |
1872 | if (__ratelimit(&drbd_ratelimit_state)) { | 1885 | if (__ratelimit(&drbd_ratelimit_state)) { |
1873 | dev_err(DEV, "bdev->backing_bdev==NULL\n"); | 1886 | dev_err(DEV, "bdev->backing_bdev==NULL\n"); |
@@ -1875,8 +1888,9 @@ static inline sector_t drbd_md_ss__(struct drbd_conf *mdev, | |||
1875 | } | 1888 | } |
1876 | return 0; | 1889 | return 0; |
1877 | } | 1890 | } |
1878 | return (drbd_get_capacity(bdev->backing_bdev) & ~7ULL) | 1891 | /* sizeof(struct md_on_disk_07) == 4k |
1879 | - MD_AL_OFFSET; | 1892 | * position: last 4k aligned block of 4k size */ |
1893 | return (drbd_get_capacity(bdev->backing_bdev) & ~7ULL) - 8; | ||
1880 | case DRBD_MD_INDEX_FLEX_EXT: | 1894 | case DRBD_MD_INDEX_FLEX_EXT: |
1881 | return 0; | 1895 | return 0; |
1882 | } | 1896 | } |
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 731a28eedc56..76faeab40c8f 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -2834,6 +2834,7 @@ void conn_md_sync(struct drbd_tconn *tconn) | |||
2834 | rcu_read_unlock(); | 2834 | rcu_read_unlock(); |
2835 | } | 2835 | } |
2836 | 2836 | ||
2837 | /* aligned 4kByte */ | ||
2837 | struct meta_data_on_disk { | 2838 | struct meta_data_on_disk { |
2838 | u64 la_size; /* last agreed size. */ | 2839 | u64 la_size; /* last agreed size. */ |
2839 | u64 uuid[UI_SIZE]; /* UUIDs. */ | 2840 | u64 uuid[UI_SIZE]; /* UUIDs. */ |
@@ -2843,13 +2844,13 @@ struct meta_data_on_disk { | |||
2843 | u32 magic; | 2844 | u32 magic; |
2844 | u32 md_size_sect; | 2845 | u32 md_size_sect; |
2845 | u32 al_offset; /* offset to this block */ | 2846 | u32 al_offset; /* offset to this block */ |
2846 | u32 al_nr_extents; /* important for restoring the AL */ | 2847 | u32 al_nr_extents; /* important for restoring the AL (userspace) */ |
2847 | /* `-- act_log->nr_elements <-- ldev->dc.al_extents */ | 2848 | /* `-- act_log->nr_elements <-- ldev->dc.al_extents */ |
2848 | u32 bm_offset; /* offset to the bitmap, from here */ | 2849 | u32 bm_offset; /* offset to the bitmap, from here */ |
2849 | u32 bm_bytes_per_bit; /* BM_BLOCK_SIZE */ | 2850 | u32 bm_bytes_per_bit; /* BM_BLOCK_SIZE */ |
2850 | u32 la_peer_max_bio_size; /* last peer max_bio_size */ | 2851 | u32 la_peer_max_bio_size; /* last peer max_bio_size */ |
2851 | u32 reserved_u32[3]; | ||
2852 | 2852 | ||
2853 | u8 reserved_u8[4096 - (7*8 + 8*4)]; | ||
2853 | } __packed; | 2854 | } __packed; |
2854 | 2855 | ||
2855 | /** | 2856 | /** |
@@ -2862,6 +2863,10 @@ void drbd_md_sync(struct drbd_conf *mdev) | |||
2862 | sector_t sector; | 2863 | sector_t sector; |
2863 | int i; | 2864 | int i; |
2864 | 2865 | ||
2866 | /* Don't accidentally change the DRBD meta data layout. */ | ||
2867 | BUILD_BUG_ON(UI_SIZE != 4); | ||
2868 | BUILD_BUG_ON(sizeof(struct meta_data_on_disk) != 4096); | ||
2869 | |||
2865 | del_timer(&mdev->md_sync_timer); | 2870 | del_timer(&mdev->md_sync_timer); |
2866 | /* timer may be rearmed by drbd_md_mark_dirty() now. */ | 2871 | /* timer may be rearmed by drbd_md_mark_dirty() now. */ |
2867 | if (!test_and_clear_bit(MD_DIRTY, &mdev->flags)) | 2872 | if (!test_and_clear_bit(MD_DIRTY, &mdev->flags)) |
@@ -2876,7 +2881,7 @@ void drbd_md_sync(struct drbd_conf *mdev) | |||
2876 | if (!buffer) | 2881 | if (!buffer) |
2877 | goto out; | 2882 | goto out; |
2878 | 2883 | ||
2879 | memset(buffer, 0, 512); | 2884 | memset(buffer, 0, sizeof(*buffer)); |
2880 | 2885 | ||
2881 | buffer->la_size = cpu_to_be64(drbd_get_capacity(mdev->this_bdev)); | 2886 | buffer->la_size = cpu_to_be64(drbd_get_capacity(mdev->this_bdev)); |
2882 | for (i = UI_CURRENT; i < UI_SIZE; i++) | 2887 | for (i = UI_CURRENT; i < UI_SIZE; i++) |
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 2af26fc95280..581f6800cc30 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
@@ -696,12 +696,32 @@ out: | |||
696 | return 0; | 696 | return 0; |
697 | } | 697 | } |
698 | 698 | ||
699 | /* initializes the md.*_offset members, so we are able to find | 699 | /* Initializes the md.*_offset members, so we are able to find |
700 | * the on disk meta data */ | 700 | * the on disk meta data. |
701 | * | ||
702 | * We currently have two possible layouts: | ||
703 | * external: | ||
704 | * |----------- md_size_sect ------------------| | ||
705 | * [ 4k superblock ][ activity log ][ Bitmap ] | ||
706 | * | al_offset == 8 | | ||
707 | * | bm_offset = al_offset + X | | ||
708 | * ==> bitmap sectors = md_size_sect - bm_offset | ||
709 | * | ||
710 | * internal: | ||
711 | * |----------- md_size_sect ------------------| | ||
712 | * [data.....][ Bitmap ][ activity log ][ 4k superblock ] | ||
713 | * | al_offset < 0 | | ||
714 | * | bm_offset = al_offset - Y | | ||
715 | * ==> bitmap sectors = Y = al_offset - bm_offset | ||
716 | * | ||
717 | * Activity log size used to be fixed 32kB, | ||
718 | * but is about to become configurable. | ||
719 | */ | ||
701 | static void drbd_md_set_sector_offsets(struct drbd_conf *mdev, | 720 | static void drbd_md_set_sector_offsets(struct drbd_conf *mdev, |
702 | struct drbd_backing_dev *bdev) | 721 | struct drbd_backing_dev *bdev) |
703 | { | 722 | { |
704 | sector_t md_size_sect = 0; | 723 | sector_t md_size_sect = 0; |
724 | unsigned int al_size_sect = MD_32kB_SECT; | ||
705 | int meta_dev_idx; | 725 | int meta_dev_idx; |
706 | 726 | ||
707 | rcu_read_lock(); | 727 | rcu_read_lock(); |
@@ -710,23 +730,23 @@ static void drbd_md_set_sector_offsets(struct drbd_conf *mdev, | |||
710 | switch (meta_dev_idx) { | 730 | switch (meta_dev_idx) { |
711 | default: | 731 | default: |
712 | /* v07 style fixed size indexed meta data */ | 732 | /* v07 style fixed size indexed meta data */ |
713 | bdev->md.md_size_sect = MD_RESERVED_SECT; | 733 | bdev->md.md_size_sect = MD_128MB_SECT; |
714 | bdev->md.md_offset = drbd_md_ss__(mdev, bdev); | 734 | bdev->md.md_offset = drbd_md_ss__(mdev, bdev); |
715 | bdev->md.al_offset = MD_AL_OFFSET; | 735 | bdev->md.al_offset = MD_4kB_SECT; |
716 | bdev->md.bm_offset = MD_BM_OFFSET; | 736 | bdev->md.bm_offset = MD_4kB_SECT + al_size_sect; |
717 | break; | 737 | break; |
718 | case DRBD_MD_INDEX_FLEX_EXT: | 738 | case DRBD_MD_INDEX_FLEX_EXT: |
719 | /* just occupy the full device; unit: sectors */ | 739 | /* just occupy the full device; unit: sectors */ |
720 | bdev->md.md_size_sect = drbd_get_capacity(bdev->md_bdev); | 740 | bdev->md.md_size_sect = drbd_get_capacity(bdev->md_bdev); |
721 | bdev->md.md_offset = 0; | 741 | bdev->md.md_offset = 0; |
722 | bdev->md.al_offset = MD_AL_OFFSET; | 742 | bdev->md.al_offset = MD_4kB_SECT; |
723 | bdev->md.bm_offset = MD_BM_OFFSET; | 743 | bdev->md.bm_offset = MD_4kB_SECT + al_size_sect; |
724 | break; | 744 | break; |
725 | case DRBD_MD_INDEX_INTERNAL: | 745 | case DRBD_MD_INDEX_INTERNAL: |
726 | case DRBD_MD_INDEX_FLEX_INT: | 746 | case DRBD_MD_INDEX_FLEX_INT: |
727 | bdev->md.md_offset = drbd_md_ss__(mdev, bdev); | 747 | bdev->md.md_offset = drbd_md_ss__(mdev, bdev); |
728 | /* al size is still fixed */ | 748 | /* al size is still fixed */ |
729 | bdev->md.al_offset = -MD_AL_SECTORS; | 749 | bdev->md.al_offset = -al_size_sect; |
730 | /* we need (slightly less than) ~ this much bitmap sectors: */ | 750 | /* we need (slightly less than) ~ this much bitmap sectors: */ |
731 | md_size_sect = drbd_get_capacity(bdev->backing_bdev); | 751 | md_size_sect = drbd_get_capacity(bdev->backing_bdev); |
732 | md_size_sect = ALIGN(md_size_sect, BM_SECT_PER_EXT); | 752 | md_size_sect = ALIGN(md_size_sect, BM_SECT_PER_EXT); |
@@ -735,11 +755,11 @@ static void drbd_md_set_sector_offsets(struct drbd_conf *mdev, | |||
735 | 755 | ||
736 | /* plus the "drbd meta data super block", | 756 | /* plus the "drbd meta data super block", |
737 | * and the activity log; */ | 757 | * and the activity log; */ |
738 | md_size_sect += MD_BM_OFFSET; | 758 | md_size_sect += MD_4kB_SECT + al_size_sect; |
739 | 759 | ||
740 | bdev->md.md_size_sect = md_size_sect; | 760 | bdev->md.md_size_sect = md_size_sect; |
741 | /* bitmap offset is adjusted by 'super' block size */ | 761 | /* bitmap offset is adjusted by 'super' block size */ |
742 | bdev->md.bm_offset = -md_size_sect + MD_AL_OFFSET; | 762 | bdev->md.bm_offset = -md_size_sect + MD_4kB_SECT; |
743 | break; | 763 | break; |
744 | } | 764 | } |
745 | rcu_read_unlock(); | 765 | rcu_read_unlock(); |
@@ -1416,7 +1436,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) | |||
1416 | min_md_device_sectors = (2<<10); | 1436 | min_md_device_sectors = (2<<10); |
1417 | } else { | 1437 | } else { |
1418 | max_possible_sectors = DRBD_MAX_SECTORS; | 1438 | max_possible_sectors = DRBD_MAX_SECTORS; |
1419 | min_md_device_sectors = MD_RESERVED_SECT * (new_disk_conf->meta_dev_idx + 1); | 1439 | min_md_device_sectors = MD_128MB_SECT * (new_disk_conf->meta_dev_idx + 1); |
1420 | } | 1440 | } |
1421 | 1441 | ||
1422 | if (drbd_get_capacity(nbc->md_bdev) < min_md_device_sectors) { | 1442 | if (drbd_get_capacity(nbc->md_bdev) < min_md_device_sectors) { |