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:
parent
0508986cce
commit
4f1f485f34
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=93431
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user