Re: [PATCH] fdisk: isolate dos label logic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2012-05-02 at 14:17 +0200, Karel Zak wrote:
> On Sun, Apr 29, 2012 at 12:02:45AM +0200, Davidlohr Bueso wrote:
> > I know. It's big and ugly, but not so evil to read.
> 
> David, test your patches! Please. This patch was completely broken.

I did - I ran fdisk locally and through the test scripts. What did I
break?

> 
> > --- a/fdisk/fdisk.c
> > +++ b/fdisk/fdisk.c
> ...
> > -/*
> > - * Raw disk label. For DOS-type partition tables the MBR,
> > - * with descriptions of the primary partitions.
> > - */
> > -unsigned char *MBRbuffer;
> > -
> > -int MBRbuffer_changed;
> 
> No, in .c file has to be definition and in .h file is "extern ...".
> 
> > diff --git a/fdisk/fdisk.h b/fdisk/fdisk.h
> > index cff6b60..2032db7 100644
> > --- a/fdisk/fdisk.h
> > +++ b/fdisk/fdisk.h
> > @@ -87,12 +87,14 @@ extern void update_units(void);
> >  extern char read_chars(char *mesg);
> >  extern void set_changed(int);
> >  extern void set_all_unchanged(void);
> > +extern int warn_geometry(void);
> > +extern void warn_limits(void);
> > +extern void warn_alignment(void);
> >  
> >  #define PLURAL	0
> >  #define SINGULAR 1
> >  extern const char * str_units(int);
> >  
> > -extern unsigned long long get_start_sect(struct partition *p);
> >  extern unsigned long long get_nr_sects(struct partition *p);
> >  
> >  enum labeltype {
> > @@ -107,6 +109,66 @@ enum labeltype {
> >  
> >  extern enum labeltype disklabel;
> >  
> > +/*
> > + * Raw disk label. For DOS-type partition tables the MBR,
> > + * with descriptions of the primary partitions.
> > + */
> > +int MBRbuffer_changed;
> > +unsigned char *MBRbuffer;
> 
> this belong to fdisk.c, to fdisk.h belong:
> 
>      extern int MBRbuffer_changed;
>      extern unsigned char *MBRbuffer;
> 
> > +/* start_sect and nr_sects are stored little endian on all machines */
> > +/* moreover, they are not aligned correctly */
> > +static void
> > +store4_little_endian(unsigned char *cp, unsigned int val) {
> 
> this is header file, so "static inline ..."
> 
>     Karel
> 
> 
> >From 96f817fb169ac38fe5535cb8c6d2fdf9b2cb8f10 Mon Sep 17 00:00:00 2001
> From: Karel Zak <kzak@xxxxxxxxxx>
> Date: Wed, 2 May 2012 14:05:51 +0200
> Subject: [PATCH] fdisk: fix fdiskdoslabel.c global variables
> 
> Signed-off-by: Karel Zak <kzak@xxxxxxxxxx>
> ---
>  fdisk/fdisk.c         |    4 +++-
>  fdisk/fdisk.h         |   21 ++++++++++-----------
>  fdisk/fdiskdoslabel.c |    4 ++++
>  fdisk/fdiskdoslabel.h |   14 ++++++++------
>  4 files changed, 25 insertions(+), 18 deletions(-)
> 
> diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c
> index 6695266..acc84d1 100644
> --- a/fdisk/fdisk.c
> +++ b/fdisk/fdisk.c
> @@ -54,6 +54,9 @@
>  
>  static void delete_partition(int i);
>  
> +unsigned char *MBRbuffer;
> +int MBRbuffer_changed;
> +
>  #define hex_val(c)	({ \
>  				char _c = (c); \
>  				isdigit(_c) ? _c - '0' : \
> @@ -145,7 +148,6 @@ char	*disk_device,			/* must be specified */
>  	line_buffer[LINE_LENGTH];
>  
>  int	fd,				/* the disk */
> -	ext_index,			/* the prime extended partition */
>  	nowarn = 0,			/* no warnings for fdisk -l/-s */
>  	dos_compatible_flag = 0,	/* disabled by default */
>  	dos_changed = 0,
> diff --git a/fdisk/fdisk.h b/fdisk/fdisk.h
> index da86e30..3a1cfd7 100644
> --- a/fdisk/fdisk.h
> +++ b/fdisk/fdisk.h
> @@ -77,7 +77,6 @@ extern unsigned int read_int(unsigned int low, unsigned int dflt,
>  extern void print_menu(enum menutype);
>  extern void print_partition_size(int num, unsigned long long start, unsigned long long stop, int sysid);
>  
> -extern unsigned char *MBRbuffer;
>  extern void zeroize_mbr_buffer(void);
>  
>  extern unsigned int heads, cylinders, sector_size;
> @@ -113,12 +112,12 @@ extern enum labeltype disklabel;
>   * Raw disk label. For DOS-type partition tables the MBR,
>   * with descriptions of the primary partitions.
>   */
> -int MBRbuffer_changed;
> -unsigned char *MBRbuffer;
> +extern unsigned char *MBRbuffer;
> +extern int MBRbuffer_changed;
>  
>  /* start_sect and nr_sects are stored little endian on all machines */
>  /* moreover, they are not aligned correctly */
> -static void
> +static inline void
>  store4_little_endian(unsigned char *cp, unsigned int val) {
>  	cp[0] = (val & 0xff);
>  	cp[1] = ((val >> 8) & 0xff);
> @@ -126,45 +125,45 @@ store4_little_endian(unsigned char *cp, unsigned int val) {
>  	cp[3] = ((val >> 24) & 0xff);
>  }
>  
> -static unsigned int read4_little_endian(const unsigned char *cp)
> +static inline unsigned int read4_little_endian(const unsigned char *cp)
>  {
>  	return (unsigned int)(cp[0]) + ((unsigned int)(cp[1]) << 8)
>  		+ ((unsigned int)(cp[2]) << 16)
>  		+ ((unsigned int)(cp[3]) << 24);
>  }
>  
> -static void set_nr_sects(struct partition *p, unsigned long long nr_sects)
> +static inline void set_nr_sects(struct partition *p, unsigned long long nr_sects)
>  {
>  	store4_little_endian(p->size4, nr_sects);
>  }
>  
> -static void set_start_sect(struct partition *p, unsigned int start_sect)
> +static inline void set_start_sect(struct partition *p, unsigned int start_sect)
>  {
>  	store4_little_endian(p->start4, start_sect);
>  }
>  
> -static void seek_sector(int fd, unsigned long long secno)
> +static inline void seek_sector(int fd, unsigned long long secno)
>  {
>  	off_t offset = (off_t) secno * sector_size;
>  	if (lseek(fd, offset, SEEK_SET) == (off_t) -1)
>  		fatal(unable_to_seek);
>  }
>  
> -static void read_sector(int fd, unsigned long long secno, unsigned char *buf)
> +static inline void read_sector(int fd, unsigned long long secno, unsigned char *buf)
>  {
>  	seek_sector(fd, secno);
>  	if (read(fd, buf, sector_size) != sector_size)
>  		fatal(unable_to_read);
>  }
>  
> -static void write_sector(int fd, unsigned long long secno, unsigned char *buf)
> +static inline void write_sector(int fd, unsigned long long secno, unsigned char *buf)
>  {
>  	seek_sector(fd, secno);
>  	if (write(fd, buf, sector_size) != sector_size)
>  		fatal(unable_to_write);
>  }
>  
> -static unsigned long long get_start_sect(struct partition *p)
> +static inline unsigned long long get_start_sect(struct partition *p)
>  {
>  	return read4_little_endian(p->start4);
>  }
> diff --git a/fdisk/fdiskdoslabel.c b/fdisk/fdiskdoslabel.c
> index 04fdf84..6a9a044 100644
> --- a/fdisk/fdiskdoslabel.c
> +++ b/fdisk/fdiskdoslabel.c
> @@ -12,6 +12,10 @@
>  #include "fdisk.h"
>  #include "fdiskdoslabel.h"
>  
> +struct pte ptes[MAXIMUM_PARTS];
> +unsigned long long extended_offset;
> +int ext_index;
> +
>  /* Allocate a buffer and read a partition table sector */
>  static void read_pte(int fd, int pno, unsigned long long offset)
>  {
> diff --git a/fdisk/fdiskdoslabel.h b/fdisk/fdiskdoslabel.h
> index b444243..f5568df 100644
> --- a/fdisk/fdiskdoslabel.h
> +++ b/fdisk/fdiskdoslabel.h
> @@ -15,27 +15,29 @@ struct pte {
>  	char changed;			/* boolean */
>  	unsigned long long offset;	/* disk sector number */
>  	unsigned char *sectorbuffer;	/* disk sector contents */
> -} ptes[MAXIMUM_PARTS];
> +};
> +
> +extern struct pte ptes[MAXIMUM_PARTS];
>  
>  #define pt_offset(b, n)	((struct partition *)((b) + 0x1be + \
>  					      (n) * sizeof(struct partition)))
>  
> -int ext_index; /* the prime extended partition */
> -unsigned long long extended_offset;
> +extern int ext_index; /* the prime extended partition */
> +extern unsigned long long extended_offset;
>  
> -static void write_part_table_flag(unsigned char *b)
> +static inline void write_part_table_flag(unsigned char *b)
>  {
>  	b[510] = 0x55;
>  	b[511] = 0xaa;
>  }
>  
>  /* A valid partition table sector ends in 0x55 0xaa */
> -static unsigned int part_table_flag(unsigned char *b)
> +static inline unsigned int part_table_flag(unsigned char *b)
>  {
>  	return ((unsigned int) b[510]) + (((unsigned int) b[511]) << 8);
>  }
>  
> -static unsigned long long get_partition_start(struct pte *pe)
> +static inline unsigned long long get_partition_start(struct pte *pe)
>  {
>  	return pe->offset + get_start_sect(pe->part_table);
>  }
> -- 
> 1.7.7.6
> 
> 
> 


--
To unsubscribe from this list: send the line "unsubscribe util-linux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux