cmd.c:
x86* maxhead should be 255, not 256
make geom less useless by using disklabel for cyl, if available
part.c:
x86* maxhead should be 254, not 255 (other arches?)
maxcyl gets set to 1023 before this function gets called, so it's a
redundant check
Index: src/sbin/fdisk/cmd.c
===================================================================
RCS file: /cvs/src/sbin/fdisk/cmd.c,v
retrieving revision 1.45
diff -p -u -r1.45 cmd.c
--- src/sbin/fdisk/cmd.c 2 Jul 2010 02:54:09 -0000 1.45
+++ src/sbin/fdisk/cmd.c 4 Jul 2011 20:55:22 -0000
@@ -67,9 +67,10 @@ Xreinit(cmd_t *cmd, disk_t *disk, mbr_t
int
Xdisk(cmd_t *cmd, disk_t *disk, mbr_t *mbr, mbr_t *tt, int offset)
{
- int maxcyl = 1024;
- int maxhead = 256;
- int maxsec = 63;
+ u_int32_t maxcyl = 1024;
+ u_int32_t maxhead = 255;
+ u_int32_t maxsec = 63;
+ u_int32_t dmaxcyl = 0;
/* Print out disk info */
DISK_printmetrics(disk, cmd->args);
@@ -80,8 +81,15 @@ Xdisk(cmd_t *cmd, disk_t *disk, mbr_t *m
maxsec = 9999999;
#endif
+ if (disk->label)
+ dmaxcyl = disk->label->cylinders;
+
/* Ask for new info */
if (ask_yn("Change disk geometry?")) {
+ if (dmaxcyl > maxcyl) {
+ printf("Warning setting cyl beyond %u forces LBA\n",
maxcyl);
+ maxcyl = dmaxcyl;
+ }
disk->real->cylinders = ask_num("BIOS Cylinders", ASK_DEC,
disk->real->cylinders, 1, maxcyl, NULL);
disk->real->heads = ask_num("BIOS Heads", ASK_DEC,
Index: src/sbin/fdisk/part.c
===================================================================
RCS file: /cvs/src/sbin/fdisk/part.c,v
retrieving revision 1.50
diff -p -u -r1.50 part.c
--- src/sbin/fdisk/part.c 29 Apr 2009 22:58:24 -0000 1.50
+++ src/sbin/fdisk/part.c 4 Jul 2011 20:38:24 -0000
@@ -212,12 +212,10 @@ PRT_parse(disk_t *disk, void *prt, off_t
int
PRT_check_chs(prt_t *partn)
{
- if ( (partn->shead > 255) ||
+ if ( (partn->shead > 254) ||
(partn->ssect >63) ||
- (partn->scyl > 1023) ||
- (partn->ehead >255) ||
- (partn->esect >63) ||
- (partn->ecyl > 1023) )
+ (partn->ehead >254) ||
+ (partn->esect >63) )
{
return 0;
}