On Wed, Apr 23, 2014 at 10:37:55AM +0200, Otto Moerbeek wrote:

> On Tue, Apr 22, 2014 at 09:51:47PM -0500, Shawn K. Quinn wrote:
> 
> > Either I'm missing something obvious, or something is amiss in disklabel
> > as of the April 19 snapshot for amd64. I'm thinking it's the latter
> > because, as you can see below, 'disklabel -E' has no issue with what
> > 'disklabel -e' complains about:
> > 
> > Script started on Tue Apr 22 21:44:41 2014
> > # disklabel sd0
> > # /dev/rsd0c:
> > type: SCSI
> > disk: SCSI disk
> > label: ST3750528AS
> > duid: e6430fb1fad1094c
> > flags:
> > bytes/sector: 512
> > sectors/track: 63
> > tracks/cylinder: 255
> > sectors/cylinder: 16065
> > cylinders: 91201
> > total sectors: 1953525168
> > boundstart: 64
> > boundend: 1953525168
> > drivedata: 0
> > 
> > 16 partitions:
> > #                size           offset  fstype [fsize bsize  cpg]
> >   a:          2097152               64  4.2BSD   2048 16384    1 # /
> >   b:         70243488          2097216    swap                   # none
> >   c:       1953525168                0  unused
> >   d:          8911776         72340704  4.2BSD   2048 16384    1
> >   e:          8911776        124776832  4.2BSD   2048 16384    1 # /usr
> >   f:        171964064        133688608  4.2BSD   2048 16384    1
> >   g:          8385920        305652672  4.2BSD   2048 16384    1 #
> >   /var/squid
> >   h:         20964853        314038592  4.2BSD   2048 16384    1 #
> >   /usr/local
> >   i:        197091136        335003456  4.2BSD   2048 16384    1 #
> >   /media/shawn-backups
> >   k:        524291584        532094592  4.2BSD   4096 32768    1 #
> >   /media/music
> >   l:        120118048       1056386176  4.2BSD   2048 16384    1
> >   m:         25181216       1176504224  4.2BSD   2048 16384    1 #
> >   /var/www
> >   n:          2097152       1201685440  4.2BSD   2048 16384    1
> >   o:         83901568       1203782592  4.2BSD   2048 16384    1 # /var
> >   p:        665840960       1287684160  4.2BSD   4096 32768    1 # /home
> > # disklabel -E sd0
> > Label editor (enter '?' for help at any prompt)
> > > c
> > partition to change size: [] p
> > Partition p is currently 665840960 sectors in size, and can have a
> > maximum
> > size of 665841008 sectors.
> > size: [665840960]
> > > c
> > partition to change size: [] c
> > Partition must be between 'a' and 'p' (excluding 'c').
> > > q
> > No label changes.
> > # disklabel -e sd0
> > disklabel: partition c: partition extends past end of unit
> > disklabel: partition p: partition extends past end of unit
> > re-edit the label? [y]: n
> > # ^D
> > 
> > Script done on Tue Apr 22 21:45:05 2014
> > 
> > (The editor session after 'disklabel -e' is simply ':q', so it's getting
> > back the same disklabel that I got to edit with no changes.)
> > 
> > -- 
> >   Shawn K. Quinn
> >   [email protected]
> 
> What is happening:
> 
> The code to read back the ascii disklabel (after editing) now ignores
> total sectors (disklabel rev 1.92). 
> 
> Next, checklabel finds a 0 size and assumes a size of 
> sectors/cylinder * cylinders (disklabel.c:1294 in current)
> 
> In your case that's 16065*91201 = 1465144065, which is too small.
> 
> The diff below seems to correct this.

A slightly different fix has been commited,

        -Otto
> 
> 
> Index: disklabel.c
> ===================================================================
> RCS file: /cvs/src/sbin/disklabel/disklabel.c,v
> retrieving revision 1.193
> diff -u -p -r1.193 disklabel.c
> --- disklabel.c       18 Mar 2014 22:36:30 -0000      1.193
> +++ disklabel.c       23 Apr 2014 08:36:01 -0000
> @@ -839,10 +839,10 @@ edit(struct disklabel *lp, int f)
>               starting_sector = DL_GETBSTART(&label);
>               total_sectors = DL_GETDSIZE(&label);
>               memset(&label, 0, sizeof(label));
> -             error = getasciilabel(fp, &label);
>               DL_SETBEND(&label, ending_sector);
>               DL_SETBSTART(&label, starting_sector);
>               DL_SETDSIZE(&label, total_sectors);
> +             error = getasciilabel(fp, &label);
>  
>               if (error == 0) {
>                       if (cmplabel(lp, &label) == 0) {

Reply via email to