aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Ellenberg <lars.ellenberg@linbit.com>2013-03-19 13:16:43 -0400
committerJens Axboe <axboe@kernel.dk>2013-03-22 20:13:59 -0400
commitae8bf312e97d554b6aa32e7b2ceb993812ad0835 (patch)
tree7ed6d4fcf6385c1dbc694cf4f43f884436ae104a
parent9114d79569a3fb858a7ecb1f21cb1dec93dc2f21 (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.c28
-rw-r--r--drivers/block/drbd/drbd_bitmap.c13
-rw-r--r--drivers/block/drbd/drbd_int.h86
-rw-r--r--drivers/block/drbd/drbd_main.c11
-rw-r--r--drivers/block/drbd/drbd_nl.c42
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
354static 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
353static int 372static 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(). */
616static 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
765struct drbd_backing_dev { 760struct 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);
1151extern void drbd_ldev_destroy(struct drbd_conf *mdev); 1145extern 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 */
2837struct meta_data_on_disk { 2838struct 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 */
701static void drbd_md_set_sector_offsets(struct drbd_conf *mdev, 720static 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) {