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.