1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-08 13:28:05 +00:00

Fixed handling of short reads in readdisklabel() and writedisklabel().

These functions use DEV_STRATEGY() which can easily return a short
count (with no error) for reads near EOF.  EOF happens for "disks" too
small to contain a label sector (mainly for empty slices).  The functions
didn't understand this at all, and looked for labels in the garbage
in the buffer beyond what DEV_STRATEGY() returned.  The recent UMA
changes combined with my local changes and configuration resulted in
the garbage often containing a valid but garbage label left over from
a previous call.

Bugs in EOF handling in -current limited the problem to "disks" with
size precisely LABELSECTOR sectors.  LABELSECTOR happens to be a very
unusual "disk" size since it is only 0 for non-i386 arches that don't
usually have disks with DOS MBRs.
This commit is contained in:
Bruce Evans 2002-03-30 16:02:43 +00:00
parent 0508986cce
commit 4f1f485f34
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=93431

View File

@ -219,6 +219,8 @@ readdisklabel(dev, lp)
DEV_STRATEGY(bp, 1);
if (bufwait(bp))
msg = "I/O error";
else if (bp->b_resid != 0)
msg = "disk too small for a label";
else for (dlp = (struct disklabel *)bp->b_data;
dlp <= (struct disklabel *)((char *)bp->b_data +
lp->d_secsize - sizeof(*dlp));
@ -323,6 +325,10 @@ writedisklabel(dev, lp)
error = bufwait(bp);
if (error)
goto done;
if (bp->b_resid != 0) {
error = ENOSPC;
goto done;
}
for (dlp = (struct disklabel *)bp->b_data;
dlp <= (struct disklabel *)
((char *)bp->b_data + lp->d_secsize - sizeof(*dlp));