History

md: superblock changes for PPL

Include information about PPL location and size into mdp_superblock_1 and copy it to/from rdev. Because PPL is mutually exclusive with bitmap, put it in place of 'bitmap_offset'. Add a new flag MD_FEATURE_PPL for 'feature_map', analogically to MD_FEATURE_BITMAP_OFFSET. Add MD_HAS_PPL to mddev->flags to indicate that PPL is enabled on an array.

Artur Paszkiewicz committed 9 years ago

Commit ea0213e1 parent effe6ee5 files · +45 −6Browse files

Unified · Split

5 files
  1. drivers/md/md.c +19 −0
  2. drivers/md/md.h +8 −0
  3. drivers/md/raid0.c +2 −1
  4. drivers/md/raid1.c +2 −1
  5. include/uapi/linux/raid/md_p.h +14 −4
drivers/md/md.c+19−0
@@ -1507,6 +1507,12 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ · 1506 unmodified lines
15071507 } else if (sb->bblog_offset != 0)
15081508 rdev->badblocks.shift = 0;
15091509
1510+ if (le32_to_cpu(sb->feature_map) & MD_FEATURE_PPL) {
1511+ rdev->ppl.offset = (__s16)le16_to_cpu(sb->ppl.offset);
1512+ rdev->ppl.size = le16_to_cpu(sb->ppl.size);
1513+ rdev->ppl.sector = rdev->sb_start + rdev->ppl.offset;
1514+ }
1515+
15101516 if (!refdev) {
15111517 ret = 1;
15121518 } else {
@@ -1619,6 +1625,13 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) · 106 unmodified lines
16191625
16201626 if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)
16211627 set_bit(MD_HAS_JOURNAL, &mddev->flags);
1628+
1629+ if (le32_to_cpu(sb->feature_map) & MD_FEATURE_PPL) {
1630+ if (le32_to_cpu(sb->feature_map) &
1631+ (MD_FEATURE_BITMAP_OFFSET | MD_FEATURE_JOURNAL))
1632+ return -EINVAL;
1633+ set_bit(MD_HAS_PPL, &mddev->flags);
1634+ }
16221635 } else if (mddev->pers == NULL) {
16231636 /* Insist of good event counter while assembling, except for
16241637 * spares (which don't need an event count) */
@@ -1832,6 +1845,12 @@ retry: · 207 unmodified lines
18321845 if (test_bit(MD_HAS_JOURNAL, &mddev->flags))
18331846 sb->feature_map |= cpu_to_le32(MD_FEATURE_JOURNAL);
18341847
1848+ if (test_bit(MD_HAS_PPL, &mddev->flags)) {
1849+ sb->feature_map |= cpu_to_le32(MD_FEATURE_PPL);
1850+ sb->ppl.offset = cpu_to_le16(rdev->ppl.offset);
1851+ sb->ppl.size = cpu_to_le16(rdev->ppl.size);
1852+ }
1853+
18351854 rdev_for_each(rdev2, mddev) {
18361855 i = rdev2->desc_nr;
18371856 if (test_bit(Faulty, &rdev2->flags))
drivers/md/md.h+8−0
@@ -122,6 +122,13 @@ struct md_rdev { · 121 unmodified lines
122122 * sysfs entry */
123123
124124 struct badblocks badblocks;
125+
126+ struct {
127+ short offset; /* Offset from superblock to start of PPL.
128+ * Not used by external metadata. */
129+ unsigned int size; /* Size in sectors of the PPL space */
130+ sector_t sector; /* First sector of the PPL space */
131+ } ppl;
125132 };
126133 enum flag_bits {
127134 Faulty, /* device is known to have a fault */
@@ -226,6 +233,7 @@ enum mddev_flags { · 98 unmodified lines
226233 * supported as calls to md_error() will
227234 * never cause the array to become failed.
228235 */
236+ MD_HAS_PPL, /* The raid array has PPL feature set */
229237 };
230238
231239 enum mddev_sb_flags {
drivers/md/raid0.c+2−1
@@ -29,7 +29,8 @@ · 28 unmodified lines
2929 #define UNSUPPORTED_MDDEV_FLAGS \
3030 ((1L << MD_HAS_JOURNAL) | \
3131 (1L << MD_JOURNAL_CLEAN) | \
32− (1L << MD_FAILFAST_SUPPORTED))
32+ (1L << MD_FAILFAST_SUPPORTED) |\
33+ (1L << MD_HAS_PPL))
3334
3435 static int raid0_congested(struct mddev *mddev, int bits)
3536 {
drivers/md/raid1.c+2−1
@@ -47,7 +47,8 @@ · 46 unmodified lines
4747
4848 #define UNSUPPORTED_MDDEV_FLAGS \
4949 ((1L << MD_HAS_JOURNAL) | \
50− (1L << MD_JOURNAL_CLEAN))
50+ (1L << MD_JOURNAL_CLEAN) | \
51+ (1L << MD_HAS_PPL))
5152
5253 /*
5354 * Number of guaranteed r1bios in case of extreme VM load:
include/uapi/linux/raid/md_p.h+14−4
@@ -242,10 +242,18 @@ struct mdp_superblock_1 { · 241 unmodified lines
242242
243243 __le32 chunksize; /* in 512byte sectors */
244244 __le32 raid_disks;
245− __le32 bitmap_offset; /* sectors after start of superblock that bitmap starts
246− * NOTE: signed, so bitmap can be before superblock
247− * only meaningful of feature_map[0] is set.
248− */
245+ union {
246+ __le32 bitmap_offset; /* sectors after start of superblock that bitmap starts
247+ * NOTE: signed, so bitmap can be before superblock
248+ * only meaningful of feature_map[0] is set.
249+ */
250+
251+ /* only meaningful when feature_map[MD_FEATURE_PPL] is set */
252+ struct {
253+ __le16 offset; /* sectors from start of superblock that ppl starts (signed) */
254+ __le16 size; /* ppl size in sectors */
255+ } ppl;
256+ };
249257
250258 /* These are only valid with feature bit '4' */
251259 __le32 new_level; /* new level we are reshaping to */
@@ -318,6 +326,7 @@ struct mdp_superblock_1 { · 66 unmodified lines
318326 */
319327 #define MD_FEATURE_CLUSTERED 256 /* clustered MD */
320328 #define MD_FEATURE_JOURNAL 512 /* support write cache */
329+#define MD_FEATURE_PPL 1024 /* support PPL */
321330 #define MD_FEATURE_ALL (MD_FEATURE_BITMAP_OFFSET \
322331 |MD_FEATURE_RECOVERY_OFFSET \
323332 |MD_FEATURE_RESHAPE_ACTIVE \
@@ -328,6 +337,7 @@ struct mdp_superblock_1 { · 4 unmodified lines
328337 |MD_FEATURE_RECOVERY_BITMAP \
329338 |MD_FEATURE_CLUSTERED \
330339 |MD_FEATURE_JOURNAL \
340+ |MD_FEATURE_PPL \
331341 )
332342
333343 struct r5l_payload_header {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t