> Date: Fri, 19 Nov 2010 21:24:37 +0000
> From: Miod Vallat <m...@online.fr>
> 
> When editing MBR partitions under fdisk(8), you always get asked whether
> you want to edit the MBR in C/H/S or LBA mode.
> 
> On modern non-x86 platforms using MBR-style partitions, C/H/S doesn't
> make any sense. What about adding a `always use LBA' option to fdisk(8)
> (to later be used in the installation media for, say, loongson)?

On modern x86 platforms C/H/S probably doesn't make sense either.

> Index: sbin/fdisk/cmd.c
> ===================================================================
> RCS file: /cvs/src/sbin/fdisk/cmd.c,v
> retrieving revision 1.45
> diff -u -p -r1.45 cmd.c
> --- sbin/fdisk/cmd.c  2 Jul 2010 02:54:09 -0000       1.45
> +++ sbin/fdisk/cmd.c  19 Nov 2010 21:28:05 -0000
> @@ -144,6 +144,7 @@ Xedit(cmd_t *cmd, disk_t *disk, mbr_t *m
>  {
>       int pn, num, ret;
>       prt_t *pp;
> +     extern int l_flag;
>  
>       ret = CMD_CONT;
>  
> @@ -179,7 +180,7 @@ Xedit(cmd_t *cmd, disk_t *disk, mbr_t *m
>       }
>  
>       /* Change table entry */
> -     if (ask_yn("Do you wish to edit in CHS mode?")) {
> +     if (!l_flag && ask_yn("Do you wish to edit in CHS mode?")) {
>               int maxcyl, maxhead, maxsect;
>  
>               /* Shorter */
> Index: sbin/fdisk/fdisk.8
> ===================================================================
> RCS file: /cvs/src/sbin/fdisk/fdisk.8,v
> retrieving revision 1.72
> diff -u -p -r1.72 fdisk.8
> --- sbin/fdisk/fdisk.8        5 Jul 2010 21:57:13 -0000       1.72
> +++ sbin/fdisk/fdisk.8        19 Nov 2010 21:28:05 -0000
> @@ -31,7 +31,7 @@
>  .Nd MBR partition maintenance program
>  .Sh SYNOPSIS
>  .Nm fdisk
> -.Op Fl eiuy
> +.Op Fl eiluy
>  .Oo
>  .Fl c Ar cylinders
>  .Fl h Ar heads
> @@ -119,6 +119,10 @@ In the default template, MBR partition n
>  MBR partition spanning the entire disk, except for a zone left at the start
>  for booting.
>  This mode is designed to initialize the MBR the very first time.
> +.It Fl l
> +In the
> +.Nm
> +interactive editor, always use LBA values for partition boundaries.
>  .It Fl u
>  Update MBR bootcode, preserving existing MBR partition table.
>  The MBR bootcode extends from offset 0x000 to the start of the MBR partition 
> table
> Index: sbin/fdisk/fdisk.c
> ===================================================================
> RCS file: /cvs/src/sbin/fdisk/fdisk.c,v
> retrieving revision 1.51
> diff -u -p -r1.51 fdisk.c
> --- sbin/fdisk/fdisk.c        25 May 2010 18:51:02 -0000      1.51
> +++ sbin/fdisk/fdisk.c        19 Nov 2010 21:28:05 -0000
> @@ -42,6 +42,7 @@ static unsigned char builtin_mbr[] = {
>  #include "mbrcode.h"
>  };
>  
> +int  l_flag;
>  int  y_flag;
>  
>  static void
> @@ -50,11 +51,12 @@ usage(void)
>       extern char * __progname;
>  
>       fprintf(stderr, "usage: %s "
> -         "[-eiuy] [-c cylinders -h heads -s sectors] [-f mbrfile] disk\n"
> +         "[-eiluy] [-c cylinders -h heads -s sectors] [-f mbrfile] disk\n"
>           "\t-i: initialize disk with virgin MBR\n"
>           "\t-u: update MBR code, preserve partition table\n"
>           "\t-e: edit MBRs on disk interactively\n"
>           "\t-f: specify non-standard MBR template\n"
> +         "\t-l: edit partitions in LBA mode\n"
>           "\t-chs: specify disk geometry\n"
>           "\t-y: do not ask questions\n"
>           "`disk' may be of the forms: sd0 or /dev/rsd0c.\n",
> @@ -79,7 +81,7 @@ main(int argc, char *argv[])
>       mbr_t mbr;
>       char mbr_buf[DEV_BSIZE];
>  
> -     while ((ch = getopt(argc, argv, "ieuf:c:h:s:y")) != -1) {
> +     while ((ch = getopt(argc, argv, "ieuf:c:h:s:yl")) != -1) {
>               const char *errstr;
>  
>               switch(ch) {
> @@ -114,6 +116,9 @@ main(int argc, char *argv[])
>               case 'y':
>                       y_flag = 1;
>                       break;
> +             case 'l':
> +                     l_flag = 1;
> +                     break;
>               default:
>                       usage();
>               }
> @@ -129,6 +134,8 @@ main(int argc, char *argv[])
>  
>       /* Put in supplied geometry if there */
>       if (c_arg | h_arg | s_arg) {
> +             if (l_flag)
> +                     errx(1, "-l and -chs can't be used together");
>               usermetrics = malloc(sizeof(DISK_metrics));
>               if (usermetrics != NULL) {
>                       if (c_arg && h_arg && s_arg) {

Reply via email to