Date: Mon, 6 Feb 2006 17:10:07 GMT From: Gilbert C Healton <ghealton@overpass.exit109.com> To: freebsd-usb@FreeBSD.org Subject: Re: usb/86767: [usb] bogus "slice starts beyond end of the disk:..." Message-ID: <200602061710.k16HA7Te014254@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR usb/86767; it has been noted by GNATS. From: Gilbert C Healton <ghealton@overpass.exit109.com> To: bug-followup@FreeBSD.org Cc: Subject: Re: usb/86767: [usb] bogus "slice starts beyond end of the disk:..." Date: Mon, 6 Feb 2006 12:08:01 -0500 (EST) >Fix: There are actually two bugs in two different sections of the kernel. Individual fixes for each problem follow: 86767-beyond.patch fixes main "slice starts beyond end of the disk:..." problem. Floppy disks are not expected to contain partition tables. See additional documentation within the patch. 86767-unsupportedUFI.patch fixes "umass0: contained Unsupported UFI command 0x35" problem also reported in 86767. Originally I thought it was another symptom of the same problem. USB floppy drives now return "success" on SYNCHRONIZE_CACHE requests These patches have been running for some months without causing any problems. 86767-beyond.patch -------------------------------------------------------------- [] FreeBSD bug: kern/86767 bogus "slice starts beyond end of the disk:..." mount. [] Most accesses to USB floppy drives, especially mounts, tend to result in bogus "slice starts beyond end of the disk:..." errors. [] if the boot parameter block claims the device is a floppy media then it is NOW assumed there is no partition table to check. [] Much thanks to Bruce Evans <bde@zeta.org.au> for hints on where to drop this patch. --- sys/msdosfs/bootsect.h Fri Aug 27 20:48:06 1999 +++ sys/msdosfs/bootsect.h Mon Oct 3 18:04:27 2005 @@ -94,6 +94,34 @@ struct bootsector710 bs710; }; + + /* selected media description bytes within bsPBP. used to detect + * media that only has one slice on it. for now this is expected + * to be floppy media. + ghealton@exit109.com & ... @lumeta.com */ + /* (as of 2005-09 floppy media description bytes were available at + http://support.microsoft.com/default.aspx?scid=kb;en-us;140418 + http://www.win.tue.nl/~aeb/linux/fs/fat/fat-1.html) + /* size DOS Capicty sides tks spt */ +#define MSDOS_MEDIA_ONESLICE0 0xF9 /* 5.25 3.0 1200KB 2 80 15 */ +#define MSDOS_MEDIA_ONESLICE1 0xFF /* 5.25 1.1 320KB 2 40 8 */ + +#define MSDOS_MEDIA_ONESLICE2 0xF0 /* 3.5 ?.? 2880KB 2 80 36 */ + +#define MSDOS_MEDIA_oneslice(c) ( \ + ( md >= MSDOS_MEDIA_ONESLICE0 && md <= MSDOS_MEDIA_ONESLICE1 ) \ + || ( md == MSDOS_MEDIA_ONESLICE2 ) \ + ) + /* if floppies with slice tables are ever used I suspose + that a check for s1-s4 could be made to verify the + first byte of each slice table is 0x00 or 0x80 AND + at most one byte has the 0x80 value in it AND the + remaining bytes of each slice table are not all zeros. If + this test is met you might be able to assume a slice + table exists. But I would make such a compile-option for + those expressly asking for it. */ + + #if 0 /* * Shorthand for fields in the bpb. --- sys/kern/subr_diskmbr.c Fri Jan 28 05:22:07 2000 +++ sys/kern/subr_diskmbr.c Mon Oct 3 18:16:19 2005 @@ -42,6 +42,7 @@ #include <sys/systm.h> #include <sys/buf.h> #include <sys/conf.h> +#include <msdosfs/bootsect.h> /* BOOTSIG0, BOOTSIG1, MSDOS_MEDIA_oneslice */ #ifdef PC98 #define PC98_ATCOMPAT #define dsinit atcompat_dsinit @@ -200,13 +201,26 @@ /* Weakly verify it. */ cp = bp->b_data; sname = dsname(dev, dkunit(dev), WHOLE_DISK_SLICE, RAW_PART, partname); - if (cp[0x1FE] != 0x55 || cp[0x1FF] != 0xAA) { + if (cp[0x1FE] != BOOTSIG0 || cp[0x1FF] != BOOTSIG1) { if (bootverbose) printf("%s: invalid primary partition table: no magic\n", sname); error = EINVAL; goto done; } + + { /* ghealton@exit109.com also ....@lumeta.com */ + /* check if media description byte within range of known floppy medias */ + + u_char md = cp[0x15]; /* set local easy access variable */ + + if ( MSDOS_MEDIA_oneslice(md) ) { + /* this media only uses a single slice (e.g., floppies) */ + + error = 0; + goto done; /* no partition table to process */ + } + } /* Make a copy of the partition table to avoid alignment problems. */ memcpy(&dpcopy[0], cp + DOSPARTOFF, sizeof(dpcopy)); 86767-unsupportedUFI.patch -------------------------------------------------------------- [] FreeBSD bug: kern/86767 bogus "slice starts beyond end of the disk:..." mount. (also umass0: contained Unsupported UFI command 0x35, which this patch addresses) [] The unmount "unsupported UFI command" and "cache sync" errors are caused by UFI operations not supporting SYNCHRONIZE_CACHE. They now no-operation on SYNCHRONIZE_CACHE requests. Not an ideal solution, but it does get rid of the message. --- sys/dev/usb/umass.c Mon Sep 20 01:30:42 2004 +++ sys/dev/usb/umass.c Thu Oct 13 20:11:34 2005 @@ -2880,6 +2880,13 @@ } switch (cmd[0]) { + /* { ghealton@exit109.com.com */ + /* Commands which we ignore (for floppy drives) */ + /* (a better way should occur, but that's all for now folks) */ + case SYNCHRONIZE_CACHE: + return 1; /* return success */ + /* } */ + /* Commands of which the format has been verified. They should work. */ case TEST_UNIT_READY: case REZERO_UNIT: -------------------------------------------------------------- ghealton@exit109.com http://www.exit109.com/~ghealton/ -------------------------------------------------------------- Computers should be fun playthings or useful tools... not obstacles to overcome.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200602061710.k16HA7Te014254>