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

From: Finn Thain

Date: Sun Jul 26 2026 - 20:30:35 EST



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.