|
@@ -753,13 +753,8 @@ struct drbd_md {
|
|
|
u32 flags;
|
|
|
u32 md_size_sect;
|
|
|
|
|
|
- s32 al_offset; /* signed relative sector offset to al area */
|
|
|
+ s32 al_offset; /* signed relative sector offset to activity log */
|
|
|
s32 bm_offset; /* signed relative sector offset to bitmap */
|
|
|
-
|
|
|
- /* u32 al_nr_extents; important for restoring the AL
|
|
|
- * is stored into ldev->dc.al_extents, which in turn
|
|
|
- * gets applied to act_log->nr_elements
|
|
|
- */
|
|
|
};
|
|
|
|
|
|
struct drbd_backing_dev {
|
|
@@ -1009,7 +1004,6 @@ struct drbd_conf {
|
|
|
struct lru_cache *act_log; /* activity log */
|
|
|
unsigned int al_tr_number;
|
|
|
int al_tr_cycle;
|
|
|
- int al_tr_pos; /* position of the next transaction in the journal */
|
|
|
wait_queue_head_t seq_wait;
|
|
|
atomic_t packet_seq;
|
|
|
unsigned int peer_seq;
|
|
@@ -1151,21 +1145,41 @@ extern int drbd_bmio_clear_n_write(struct drbd_conf *mdev);
|
|
|
extern void drbd_ldev_destroy(struct drbd_conf *mdev);
|
|
|
|
|
|
/* Meta data layout
|
|
|
- We reserve a 128MB Block (4k aligned)
|
|
|
- * either at the end of the backing device
|
|
|
- * or on a separate meta data device. */
|
|
|
+ *
|
|
|
+ * We currently have two possible layouts.
|
|
|
+ * Offsets in (512 byte) sectors.
|
|
|
+ * external:
|
|
|
+ * |----------- md_size_sect ------------------|
|
|
|
+ * [ 4k superblock ][ activity log ][ Bitmap ]
|
|
|
+ * | al_offset == 8 |
|
|
|
+ * | bm_offset = al_offset + X |
|
|
|
+ * ==> bitmap sectors = md_size_sect - bm_offset
|
|
|
+ *
|
|
|
+ * Variants:
|
|
|
+ * old, indexed fixed size meta data:
|
|
|
+ *
|
|
|
+ * internal:
|
|
|
+ * |----------- md_size_sect ------------------|
|
|
|
+ * [data.....][ Bitmap ][ activity log ][ 4k superblock ][padding*]
|
|
|
+ * | al_offset < 0 |
|
|
|
+ * | bm_offset = al_offset - Y |
|
|
|
+ * ==> bitmap sectors = Y = al_offset - bm_offset
|
|
|
+ *
|
|
|
+ * [padding*] are zero or up to 7 unused 512 Byte sectors to the
|
|
|
+ * end of the device, so that the [4k superblock] will be 4k aligned.
|
|
|
+ *
|
|
|
+ * The activity log consists of 4k transaction blocks,
|
|
|
+ * which are written in a ring-buffer, or striped ring-buffer like fashion,
|
|
|
+ * which are writtensize used to be fixed 32kB,
|
|
|
+ * but is about to become configurable.
|
|
|
+ */
|
|
|
|
|
|
-/* The following numbers are sectors */
|
|
|
-/* Allows up to about 3.8TB, so if you want more,
|
|
|
+/* Our old fixed size meta data layout
|
|
|
+ * allows up to about 3.8TB, so if you want more,
|
|
|
* you need to use the "flexible" meta data format. */
|
|
|
-#define MD_RESERVED_SECT (128LU << 11) /* 128 MB, unit sectors */
|
|
|
-#define MD_AL_OFFSET 8 /* 8 Sectors after start of meta area */
|
|
|
-#define MD_AL_SECTORS 64 /* = 32 kB on disk activity log ring buffer */
|
|
|
-#define MD_BM_OFFSET (MD_AL_OFFSET + MD_AL_SECTORS)
|
|
|
-
|
|
|
-/* we do all meta data IO in 4k blocks */
|
|
|
-#define MD_BLOCK_SHIFT 12
|
|
|
-#define MD_BLOCK_SIZE (1<<MD_BLOCK_SHIFT)
|
|
|
+#define MD_128MB_SECT (128LLU << 11) /* 128 MB, unit sectors */
|
|
|
+#define MD_4kB_SECT 8
|
|
|
+#define MD_32kB_SECT 64
|
|
|
|
|
|
/* One activity log extent represents 4M of storage */
|
|
|
#define AL_EXTENT_SHIFT 22
|
|
@@ -1255,7 +1269,6 @@ struct bm_extent {
|
|
|
|
|
|
/* in one sector of the bitmap, we have this many activity_log extents. */
|
|
|
#define AL_EXT_PER_BM_SECT (1 << (BM_EXT_SHIFT - AL_EXTENT_SHIFT))
|
|
|
-#define BM_WORDS_PER_AL_EXT (1 << (AL_EXTENT_SHIFT-BM_BLOCK_SHIFT-LN2_BPL))
|
|
|
|
|
|
#define BM_BLOCKS_PER_BM_EXT_B (BM_EXT_SHIFT - BM_BLOCK_SHIFT)
|
|
|
#define BM_BLOCKS_PER_BM_EXT_MASK ((1<<BM_BLOCKS_PER_BM_EXT_B) - 1)
|
|
@@ -1275,16 +1288,18 @@ struct bm_extent {
|
|
|
*/
|
|
|
|
|
|
#define DRBD_MAX_SECTORS_32 (0xffffffffLU)
|
|
|
-#define DRBD_MAX_SECTORS_BM \
|
|
|
- ((MD_RESERVED_SECT - MD_BM_OFFSET) * (1LL<<(BM_EXT_SHIFT-9)))
|
|
|
-#if DRBD_MAX_SECTORS_BM < DRBD_MAX_SECTORS_32
|
|
|
-#define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_BM
|
|
|
-#define DRBD_MAX_SECTORS_FLEX DRBD_MAX_SECTORS_BM
|
|
|
-#elif !defined(CONFIG_LBDAF) && BITS_PER_LONG == 32
|
|
|
+/* we have a certain meta data variant that has a fixed on-disk size of 128
|
|
|
+ * MiB, of which 4k are our "superblock", and 32k are the fixed size activity
|
|
|
+ * log, leaving this many sectors for the bitmap.
|
|
|
+ */
|
|
|
+
|
|
|
+#define DRBD_MAX_SECTORS_FIXED_BM \
|
|
|
+ ((MD_128MB_SECT - MD_32kB_SECT - MD_4kB_SECT) * (1LL<<(BM_EXT_SHIFT-9)))
|
|
|
+#if !defined(CONFIG_LBDAF) && BITS_PER_LONG == 32
|
|
|
#define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_32
|
|
|
#define DRBD_MAX_SECTORS_FLEX DRBD_MAX_SECTORS_32
|
|
|
#else
|
|
|
-#define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_BM
|
|
|
+#define DRBD_MAX_SECTORS DRBD_MAX_SECTORS_FIXED_BM
|
|
|
/* 16 TB in units of sectors */
|
|
|
#if BITS_PER_LONG == 32
|
|
|
/* adjust by one page worth of bitmap,
|
|
@@ -1792,10 +1807,10 @@ static inline sector_t drbd_md_last_sector(struct drbd_backing_dev *bdev)
|
|
|
switch (meta_dev_idx) {
|
|
|
case DRBD_MD_INDEX_INTERNAL:
|
|
|
case DRBD_MD_INDEX_FLEX_INT:
|
|
|
- return bdev->md.md_offset + MD_AL_OFFSET - 1;
|
|
|
+ return bdev->md.md_offset + MD_4kB_SECT -1;
|
|
|
case DRBD_MD_INDEX_FLEX_EXT:
|
|
|
default:
|
|
|
- return bdev->md.md_offset + bdev->md.md_size_sect;
|
|
|
+ return bdev->md.md_offset + bdev->md.md_size_sect -1;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1861,13 +1876,11 @@ static inline sector_t drbd_md_ss__(struct drbd_conf *mdev,
|
|
|
rcu_read_unlock();
|
|
|
|
|
|
switch (meta_dev_idx) {
|
|
|
- default: /* external, some index */
|
|
|
- return MD_RESERVED_SECT * meta_dev_idx;
|
|
|
+ default: /* external, some index; this is the old fixed size layout */
|
|
|
+ return MD_128MB_SECT * meta_dev_idx;
|
|
|
case DRBD_MD_INDEX_INTERNAL:
|
|
|
/* with drbd08, internal meta data is always "flexible" */
|
|
|
case DRBD_MD_INDEX_FLEX_INT:
|
|
|
- /* sizeof(struct md_on_disk_07) == 4k
|
|
|
- * position: last 4k aligned block of 4k size */
|
|
|
if (!bdev->backing_bdev) {
|
|
|
if (__ratelimit(&drbd_ratelimit_state)) {
|
|
|
dev_err(DEV, "bdev->backing_bdev==NULL\n");
|
|
@@ -1875,8 +1888,9 @@ static inline sector_t drbd_md_ss__(struct drbd_conf *mdev,
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
- return (drbd_get_capacity(bdev->backing_bdev) & ~7ULL)
|
|
|
- - MD_AL_OFFSET;
|
|
|
+ /* sizeof(struct md_on_disk_07) == 4k
|
|
|
+ * position: last 4k aligned block of 4k size */
|
|
|
+ return (drbd_get_capacity(bdev->backing_bdev) & ~7ULL) - 8;
|
|
|
case DRBD_MD_INDEX_FLEX_EXT:
|
|
|
return 0;
|
|
|
}
|