Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af3a2cd6 authored by NeilBrown's avatar NeilBrown
Browse files

md: Fix read balancing in RAID1 and RAID10 on drives > 2TB



read_balance uses a "unsigned long" for a sector number which
will get truncated beyond 2TB.
This will cause read-balancing to be non-optimal, and can cause
data to be read from the 'wrong' branch during a resync.  This has a
very small chance of returning wrong data.

Reported-by: default avatarJordan Russell <jr-list-2010@quo.to>
Cc: stable@kernel.org
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 2dc40f80
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -418,7 +418,7 @@ static void raid1_end_write_request(struct bio *bio, int error)
 */
static int read_balance(conf_t *conf, r1bio_t *r1_bio)
{
	const unsigned long this_sector = r1_bio->sector;
	const sector_t this_sector = r1_bio->sector;
	int new_disk = conf->last_used, disk = new_disk;
	int wonly_disk = -1;
	const int sectors = r1_bio->sectors;
@@ -434,7 +434,7 @@ static int read_balance(conf_t *conf, r1bio_t *r1_bio)
 retry:
	if (conf->mddev->recovery_cp < MaxSector &&
	    (this_sector + sectors >= conf->next_resync)) {
		/* Choose the first operation device, for consistancy */
		/* Choose the first operational device, for consistancy */
		new_disk = 0;

		for (rdev = rcu_dereference(conf->mirrors[new_disk].rdev);
+1 −1
Original line number Diff line number Diff line
@@ -495,7 +495,7 @@ static int raid10_mergeable_bvec(struct request_queue *q,
 */
static int read_balance(conf_t *conf, r10bio_t *r10_bio)
{
	const unsigned long this_sector = r10_bio->sector;
	const sector_t this_sector = r10_bio->sector;
	int disk, slot, nslot;
	const int sectors = r10_bio->sectors;
	sector_t new_distance, current_distance;