Patch "md/raid5: avoid BUG_ON() while continue reshape after reassembling" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    md/raid5: avoid BUG_ON() while continue reshape after reassembling

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     md-raid5-avoid-bug_on-while-continue-reshape-after-r.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 93edbb56f45b455e56f967ea0a354d18d2067203
Author: Yu Kuai <yukuai3@xxxxxxxxxx>
Date:   Tue Jun 11 21:22:51 2024 +0800

    md/raid5: avoid BUG_ON() while continue reshape after reassembling
    
    [ Upstream commit 305a5170dc5cf3d395bb4c4e9239bca6d0b54b49 ]
    
    Currently, mdadm support --revert-reshape to abort the reshape while
    reassembling, as the test 07revert-grow. However, following BUG_ON()
    can be triggerred by the test:
    
    kernel BUG at drivers/md/raid5.c:6278!
    invalid opcode: 0000 [#1] PREEMPT SMP PTI
    irq event stamp: 158985
    CPU: 6 PID: 891 Comm: md0_reshape Not tainted 6.9.0-03335-g7592a0b0049a #94
    RIP: 0010:reshape_request+0x3f1/0xe60
    Call Trace:
     <TASK>
     raid5_sync_request+0x43d/0x550
     md_do_sync+0xb7a/0x2110
     md_thread+0x294/0x2b0
     kthread+0x147/0x1c0
     ret_from_fork+0x59/0x70
     ret_from_fork_asm+0x1a/0x30
     </TASK>
    
    Root cause is that --revert-reshape update the raid_disks from 5 to 4,
    while reshape position is still set, and after reassembling the array,
    reshape position will be read from super block, then during reshape the
    checking of 'writepos' that is caculated by old reshape position will
    fail.
    
    Fix this panic the easy way first, by converting the BUG_ON() to
    WARN_ON(), and stop the reshape if checkings fail.
    
    Noted that mdadm must fix --revert-shape as well, and probably md/raid
    should enhance metadata validation as well, however this means
    reassemble will fail and there must be user tools to fix the wrong
    metadata.
    
    Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx>
    Signed-off-by: Song Liu <song@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240611132251.1967786-13-yukuai1@xxxxxxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index bba5e61cc1456..41556f5d4dcba 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5821,7 +5821,9 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk
 	safepos = conf->reshape_safe;
 	sector_div(safepos, data_disks);
 	if (mddev->reshape_backwards) {
-		BUG_ON(writepos < reshape_sectors);
+		if (WARN_ON(writepos < reshape_sectors))
+			return MaxSector;
+
 		writepos -= reshape_sectors;
 		readpos += reshape_sectors;
 		safepos += reshape_sectors;
@@ -5839,14 +5841,18 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *sk
 	 * to set 'stripe_addr' which is where we will write to.
 	 */
 	if (mddev->reshape_backwards) {
-		BUG_ON(conf->reshape_progress == 0);
+		if (WARN_ON(conf->reshape_progress == 0))
+			return MaxSector;
+
 		stripe_addr = writepos;
-		BUG_ON((mddev->dev_sectors &
-			~((sector_t)reshape_sectors - 1))
-		       - reshape_sectors - stripe_addr
-		       != sector_nr);
+		if (WARN_ON((mddev->dev_sectors &
+		    ~((sector_t)reshape_sectors - 1)) -
+		    reshape_sectors - stripe_addr != sector_nr))
+			return MaxSector;
 	} else {
-		BUG_ON(writepos != sector_nr + reshape_sectors);
+		if (WARN_ON(writepos != sector_nr + reshape_sectors))
+			return MaxSector;
+
 		stripe_addr = sector_nr;
 	}
 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux