[PATCH RFC 3/3] md/raid1: fix incorrect sector range in serialization
Xiao Ni <[email protected]>
| Newsgroups | gmane.linux.raid |
|---|---|
| Message-ID | <[email protected]> |
md/raid1: fix incorrect sector range in serialization Fix off-by-one error in sector range calculation for serialization. The range should be [lo, hi] inclusive, where hi = lo + sectors - 1, not lo + sectors. The current implementation causes false collision detection for consecutive writes. For example, when writing: - R1 to sectors 0-1023 (hi = 1024) - R2 to sectors 1024-2047 (lo = 1024) R1's hi equals R2's lo, causing raid1_rb_iter_first() to return true and triggering unnecessary serialization, even though these requests don't actually overlap. Signed-off-by: Xiao Ni <[email protected]> --- drivers/md/raid1.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 029aa458ffb2..e3d9ba71796f 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -62,7 +62,7 @@ static int check_and_add_serial(struct mddev *mddev, struct r1bio *r1_bio, unsigned long flags; int ret = 0; sector_t lo = r1_bio->sector; - sector_t hi = lo + r1_bio->sectors; + sector_t hi = lo + r1_bio->sectors - 1; struct serial *serial = &mddev->serial[idx]; spin_lock_irqsave(&serial->serial_lock, flags); @@ -100,7 +100,7 @@ static void remove_serial(struct r1bio *r1_bio) int found = 0; struct mddev *mddev = r1_bio->mddev; sector_t lo = r1_bio->sector; - sector_t hi = r1_bio->sector + r1_bio->sectors; + sector_t hi = r1_bio->sector + r1_bio->sectors - 1; int idx = sector_to_idx(lo); struct serial *serial = &mddev->serial[idx]; -- 2.50.1 (Apple Git-155)