My project has encountered a problem accessing a very large RAID that is written by an embedded system. Because the disk does not have a Solaris block written in the very first sector of the disk, Solaris 10 is using a default geometry of 255 heads and 63 sectors, but computes the number of cylinders by dividing the total number of sectors by (255 * 63). This number exceeds 16 bits, resulting in the following symptom of the problem: disk I/O encounters a very premature end-of-media/file when attempting to perform any read/write operation (e.g. via dd).
After consulting the OpenSolaris source code, the source of the problem appears to be lines 4266-4273 of usr/src/uts/common/io/cmlb.c ... the fix being contemplated is to extend the logic to use a different combination of default heads and sectors for exceedingly large drives, such that the computed number of cylinders will fit into a UINT16. When a Solaris label is written to the drive in question, the start of sector zero reads "Ciprico-Talon2200-P347 cyl 49780 alt 2 hd 8 sec 2880", so using 8 and 2880 as head and sector defaults is being contemplated. Here are the two questions I have: (a) Is this the only place in the Solaris code base that needs fixing, or does similar code that will also need fixing lurk elsewhere too ? (b) If the fix is made and compiled under OpenSolaris (aka version 11), will the rebuilt kernel module be compatible for execution by the (closed) Solaris (version 10) O/S of our deployment platform ? i.e. will _this_ version 11 kernel module be backwardly compatible with the version 10 module (/kernel/misc/sparcv9/cmlb) ? Any help is much appreciated. Any other ideas of how to solve the dilemma are also welcome! Thanks. This message posted from opensolaris.org _______________________________________________ storage-discuss mailing list [email protected] http://mail.opensolaris.org/mailman/listinfo/storage-discuss
