Re: [PATCH 23/31] swim: Don't needlessly re-read sectors

Finn Thain <[email protected]> Mon, 27 Jul 2026 10:30:06 +1000 (AEST)
Newsgroups org.kernel.vger.linux-m68k,org.kernel.vger.linux-block,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Sun, 26 Jul 2026, Laurent Vivier wrote:

> >    swim_drive(base, fs->location);
> >    swim_READY_timeout(base);
> >   -	for (i = req_sector; i < req_sector + sectors_nb; i++) {
> > -		int x;
> > -		track = i / fs->secpercyl;
> > -		x = i % fs->secpercyl;
> > -		side = x / fs->secpertrack;
> > -		sector = x % fs->secpertrack + 1;
> > -
> > -		try = 5;
> > -		do {
> > -			ret = swim_read_sector(fs, side, track, sector,
> > -						buffer);
> > -			if (try-- == 0)
> > -				return BLK_STS_IOERR;
> > -		} while (ret != 512);
> > -
> > -		buffer += ret;
> > +	while (sectors_nb) {
> > +		unsigned int cyl, x, head, sector, n, ret;
> > +
> > +		cyl = req_sector / fs->secpercyl;
> > +		x = req_sector % fs->secpercyl;
> > +		head = (x >= fs->secpertrack) ? 1 : 0;
> > +		sector = x % fs->secpertrack;
> > +		n = min(sectors_nb, fs->secpertrack - sector);
> > +
> > +		swim_track(fs, cyl);
> > +		swim_head(base, head);
> > +
> > +		ret = swim_read_sector_range(fs, head, cyl, sector + 1, n,
> > buffer);
> > +		if (ret != n)
> > +			++failures;
> > +		if (failures >= 5)
> > +			return BLK_STS_IOERR;
> 
> Old code failed after 5 retries on the same sector, new code fails after 
> 5 incomplete ranges anywhere in it, even if earlier errors were 
> recovered and request made progress.
> 
> Is this what you want?
> 

No, it was an oversight. I've since revised this so that the failure 
counter is only incremented when there is no progress and gets reset when 
we proceeed to the next sector range on the next track.