Hi there,

mkdosfs seems to be broken with kernel 2.6. I ran into the problem while I was trying to create a fat filesystem on a DVD-RAM medium. As you found out the ioctl for HDIO_GETGEO is broken. So I wrote a hotfix that
just sets heads to 255 and sectors/track to 63. At most harddisks seem to use that geometry that fix should work for larger disks. I only use the hardcoded values in case the ioctl fails. Patch is attached.


Cheers, Alex
--- dosfstools-2.10/mkdosfs/mkdosfs.c   2003-06-14 22:07:08.000000000 +0200
+++ dosfstools-2.10-patched/mkdosfs/mkdosfs.c   2005-03-11 15:31:47.000000000 
+0100
@@ -609,7 +609,7 @@
   long loop_size;
   struct hd_geometry geometry;
   struct floppy_struct param;
-
+  
   if ((0 == device_num) || ((device_num & 0xff00) == 0x0200))
     /* file image or floppy disk */
     {
@@ -765,10 +765,16 @@
     {
       /* Can we get the drive geometry? (Note I'm not too sure about */
       /* whether to use HDIO_GETGEO or HDIO_REQ) */
-      if (ioctl (dev, HDIO_GETGEO, &geometry))
-       die ("unable to get drive geometry for '%s'");
-      bs.secs_track = CT_LE_W(geometry.sectors);       /* Set up the geometry 
information */
-      bs.heads = CT_LE_W(geometry.heads);
+      if (ioctl (dev, HDIO_GETGEO, &geometry)) {
+       /*die ("unable to get drive geometry for '%s'");*/
+       printf("Warning, couldn't read disk geometry, using 255 heads, 63 
cylinders.\n");
+       printf("Good luck.\n");
+       bs.secs_track = CT_LE_W(63);
+       bs.heads= CT_LE_W(255);
+      } else {
+        bs.secs_track = CT_LE_W(geometry.sectors);     /* Set up the geometry 
information */
+        bs.heads = CT_LE_W(geometry.heads);
+      }
     def_hd_params:
       bs.media = (char) 0xf8; /* Set up the media descriptor for a hard drive 
*/
       bs.dir_entries[0] = (char) 0;    /* Default to 512 entries */

Reply via email to