From 4f1f485f34153c1862643d677ec79bc0f43ff425 Mon Sep 17 00:00:00 2001 From: Bruce Evans Date: Sat, 30 Mar 2002 16:02:43 +0000 Subject: [PATCH] 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. --- sys/kern/subr_disklabel.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sys/kern/subr_disklabel.c b/sys/kern/subr_disklabel.c index 05339cbcf96..d69e9069c98 100644 --- a/sys/kern/subr_disklabel.c +++ b/sys/kern/subr_disklabel.c @@ -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));