]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
md: override md superblock recovery_offset for journal device
authorShaohua Li <shli@fb.com>
Thu, 13 Aug 2015 21:31:56 +0000 (14:31 -0700)
committerNeilBrown <neilb@suse.com>
Sat, 24 Oct 2015 06:16:18 +0000 (17:16 +1100)
Journal device stores data in a log structure. We need record the log
start. Here we override md superblock recovery_offset for this purpose.
This field of a journal device is meaningless otherwise.

Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: NeilBrown <neilb@suse.com>
drivers/md/md.c
drivers/md/md.h
include/uapi/linux/raid/md_p.h

index 391341a772c78fa8e697143cb6570a50af4faf49..3592beb6931e16c653d019838a80d6e1578e4fb8 100644 (file)
@@ -1646,6 +1646,7 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
                                return -EINVAL;
                        }
                        set_bit(Journal, &rdev->flags);
+                       rdev->journal_tail = le64_to_cpu(sb->journal_tail);
                        break;
                default:
                        rdev->saved_raid_disk = role;
@@ -1721,6 +1722,9 @@ static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev)
                        sb->feature_map |=
                                cpu_to_le32(MD_FEATURE_RECOVERY_BITMAP);
        }
+       /* Note: recovery_offset and journal_tail share space  */
+       if (test_bit(Journal, &rdev->flags))
+               sb->journal_tail = cpu_to_le64(rdev->journal_tail);
        if (test_bit(Replacement, &rdev->flags))
                sb->feature_map |=
                        cpu_to_le32(MD_FEATURE_REPLACEMENT);
@@ -8097,6 +8101,8 @@ static int remove_and_add_spares(struct mddev *mddev,
                        continue;
                if (test_bit(Faulty, &rdev->flags))
                        continue;
+               if (test_bit(Journal, &rdev->flags))
+                       continue;
                if (mddev->ro &&
                    ! (rdev->saved_raid_disk >= 0 &&
                       !test_bit(Bitmap_sync, &rdev->flags)))
index 88dc6312f5d5307a2f3057da3ecfe6fb5eb8056b..2b0f62fb61463edce7e6a559286ed662c8996578 100644 (file)
@@ -87,10 +87,16 @@ struct md_rdev {
                                         * array and could again if we did a partial
                                         * resync from the bitmap
                                         */
-       sector_t        recovery_offset;/* If this device has been partially
+       union {
+               sector_t recovery_offset;/* If this device has been partially
                                         * recovered, this is where we were
                                         * up to.
                                         */
+               sector_t journal_tail;  /* If this device is a journal device,
+                                        * this is the journal tail (journal
+                                        * recovery start point)
+                                        */
+       };
 
        atomic_t        nr_pending;     /* number of pending requests.
                                         * only maintained for arrays that
index eaaab52077a38065e79c1cb3c47755386019805f..a5f54ff26c206bc2cc525371ed1c657862377db4 100644 (file)
@@ -258,7 +258,10 @@ struct mdp_superblock_1 {
        __le64  data_offset;    /* sector start of data, often 0 */
        __le64  data_size;      /* sectors in this device that can be used for data */
        __le64  super_offset;   /* sector start of this superblock */
-       __le64  recovery_offset;/* sectors before this offset (from data_offset) have been recovered */
+       union {
+               __le64  recovery_offset;/* sectors before this offset (from data_offset) have been recovered */
+               __le64  journal_tail;/* journal tail of journal device (from data_offset) */
+       };
        __le32  dev_number;     /* permanent identifier of this  device - not role in raid */
        __le32  cnt_corrected_read; /* number of read errors that were corrected by re-writing */
        __u8    device_uuid[16]; /* user-space setable, ignored by kernel */