On Sun, Jul 22, 2012 at 07:05:10PM +0200, Davidlohr Bueso wrote: > From: Davidlohr Bueso <dave@xxxxxxx> > > Note that sun labels are no longer checked to see if there were changes. > > Signed-off-by: Davidlohr Bueso <dave@xxxxxxx> Reviewed-by: Petr Uzel <petr.uzel@xxxxxxx> > --- > fdisks/fdisk.c | 23 +++++------------------ > fdisks/fdisk.h | 10 +++------- > fdisks/fdiskaixlabel.c | 1 + > fdisks/fdiskbsdlabel.c | 30 ++++++++++++++++-------------- > fdisks/fdiskdoslabel.c | 24 ++++++++++++++++++++---- > fdisks/fdiskdoslabel.h | 1 - > fdisks/fdiskmaclabel.c | 1 + > fdisks/fdisksgilabel.c | 15 +++++++++------ > fdisks/fdisksgilabel.h | 1 - > fdisks/fdisksunlabel.c | 9 ++++++--- > fdisks/fdisksunlabel.h | 1 - > fdisks/utils.c | 13 +++++++++++++ > 12 files changed, 74 insertions(+), 55 deletions(-) > > diff --git a/fdisks/fdisk.c b/fdisks/fdisk.c > index 27002f6..7212840 100644 > --- a/fdisks/fdisk.c > +++ b/fdisks/fdisk.c > @@ -1458,24 +1458,11 @@ static void new_partition(struct fdisk_context *cxt) > dos_new_partition(cxt); > } > > -static void > -write_table(struct fdisk_context *cxt) { > - int i; > - > - if (disklabel == DOS_LABEL) > - dos_write_table(cxt); > - else if (disklabel == SGI_LABEL) > - /* no test on change? the printf below might be mistaken */ > - sgi_write_table(cxt); > - else if (disklabel == SUN_LABEL) { > - int needw = 0; > - > - for (i=0; i<8; i++) > - if (ptes[i].changed) > - needw = 1; > - if (needw) > - sun_write_table(cxt); > - } > +static void write_table(struct fdisk_context *cxt) > +{ > + int errcode = fdisk_label_write_table(cxt); > + if (errcode) > + fdisk_error_fatal(cxt, errcode); > > printf(_("The partition table has been altered!\n\n")); > reread_partition_table(cxt, 1); > diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h > index 816e127..577303b 100644 > --- a/fdisks/fdisk.h > +++ b/fdisks/fdisk.h > @@ -145,6 +145,8 @@ struct fdisk_label { > > /* probe disk label */ > int (*probe)(struct fdisk_context *cxt); > + /* write in-memory changes to disk */ > + int (*write)(struct fdisk_context *cxt); > /* delete partition */ > void (*part_delete)(struct fdisk_context *cxt, int partnum); > }; > @@ -169,6 +171,7 @@ extern const char *fdisk_error_name(enum fdisk_error errcode); > extern void fdisk_error_fatal(struct fdisk_context *cxt, enum fdisk_error errcode); > extern int fdisk_label_change(struct fdisk_context *cxt, const char *name); > extern int fdisk_label_partition_delete(struct fdisk_context *cxt, int partnum); > +extern int fdisk_label_write_table(struct fdisk_context *cxt); > > /* prototypes for fdisk.c */ > extern char *disk_device, *line_ptr; > @@ -273,13 +276,6 @@ static inline void read_sector(struct fdisk_context *cxt, sector_t secno, unsign > fdisk_error_fatal(cxt, FDISK_ERROR_READ); > } > > -static inline void write_sector(struct fdisk_context *cxt, sector_t secno, unsigned char *buf) > -{ > - seek_sector(cxt, secno); > - if (write(cxt->dev_fd, buf, cxt->sector_size) != (ssize_t) cxt->sector_size) > - fdisk_error_fatal(cxt, FDISK_ERROR_WRITE); > -} > - > static inline sector_t get_start_sect(struct partition *p) > { > return read4_little_endian(p->start4); > diff --git a/fdisks/fdiskaixlabel.c b/fdisks/fdiskaixlabel.c > index 45f3aa9..d264027 100644 > --- a/fdisks/fdiskaixlabel.c > +++ b/fdisks/fdiskaixlabel.c > @@ -69,5 +69,6 @@ const struct fdisk_label aix_label = > { > .name = "aix", > .probe = aix_probe_label, > + .write = NULL, > .part_delete = NULL, > }; > diff --git a/fdisks/fdiskbsdlabel.c b/fdisks/fdiskbsdlabel.c > index c7f3f86..b827a5b 100644 > --- a/fdisks/fdiskbsdlabel.c > +++ b/fdisks/fdiskbsdlabel.c > @@ -63,7 +63,6 @@ > > static void xbsd_delete_part (struct fdisk_context *cxt, int partnum); > static void xbsd_new_part (struct fdisk_context *cxt); > -static void xbsd_write_disklabel (struct fdisk_context *cxt); > static int xbsd_create_disklabel (struct fdisk_context *cxt); > static void xbsd_edit_disklabel (void); > static void xbsd_write_bootstrap (struct fdisk_context *cxt); > @@ -140,6 +139,21 @@ is_bsd_partition_type(int type) { > } > #endif > > +static int xbsd_write_disklabel (struct fdisk_context *cxt) > +{ > +#if defined (__alpha__) > + printf (_("Writing disklabel to %s.\n"), cxt->dev_path); > + xbsd_writelabel (cxt, NULL, &xbsd_dlabel); > +#else > + printf (_("Writing disklabel to %s.\n"), > + partname(cxt->dev_path, xbsd_part_index+1, 0)); > + xbsd_writelabel (cxt, xbsd_part, &xbsd_dlabel); > +#endif > + reread_partition_table(cxt, 0); /* no exit yet */ > + > + return 0; > +} > + > void > bsd_command_prompt (struct fdisk_context *cxt) > { > @@ -376,19 +390,6 @@ xbsd_print_disklabel (struct fdisk_context *cxt, int show_all) { > } > } > > -static void > -xbsd_write_disklabel (struct fdisk_context *cxt) { > -#if defined (__alpha__) > - printf (_("Writing disklabel to %s.\n"), cxt->dev_path); > - xbsd_writelabel (cxt, NULL, &xbsd_dlabel); > -#else > - printf (_("Writing disklabel to %s.\n"), > - partname(cxt->dev_path, xbsd_part_index+1, 0)); > - xbsd_writelabel (cxt, xbsd_part, &xbsd_dlabel); > -#endif > - reread_partition_table(cxt, 0); /* no exit yet */ > -} > - > static int > xbsd_create_disklabel (struct fdisk_context *cxt) { > char c; > @@ -846,5 +847,6 @@ const struct fdisk_label bsd_label = > { > .name = "bsd", > .probe = osf_probe_label, > + .write = xbsd_write_disklabel, > .part_delete = xbsd_delete_part, > }; > diff --git a/fdisks/fdiskdoslabel.c b/fdisks/fdiskdoslabel.c > index e32088e..65609c5 100644 > --- a/fdisks/fdiskdoslabel.c > +++ b/fdisks/fdiskdoslabel.c > @@ -657,9 +657,18 @@ void dos_new_partition(struct fdisk_context *cxt) > } > } > > -void dos_write_table(struct fdisk_context *cxt) > +static int write_sector(struct fdisk_context *cxt, sector_t secno, > + unsigned char *buf) > { > - int i; > + seek_sector(cxt, secno); > + if (write(cxt->dev_fd, buf, cxt->sector_size) != (ssize_t) cxt->sector_size) > + return FDISK_ERROR_WRITE; > + return 0; > +} > + > +static int dos_write_table(struct fdisk_context *cxt) > +{ > + int i, rc = 0; > > /* MBR (primary partitions) */ > if (!MBRbuffer_changed) { > @@ -669,7 +678,9 @@ void dos_write_table(struct fdisk_context *cxt) > } > if (MBRbuffer_changed) { > write_part_table_flag(cxt->mbr); > - write_sector(cxt, 0, cxt->mbr); > + rc = write_sector(cxt, 0, cxt->mbr); > + if (rc) > + goto done; > } > /* EBR (logical partitions) */ > for (i = 4; i < partitions; i++) { > @@ -677,14 +688,19 @@ void dos_write_table(struct fdisk_context *cxt) > > if (pe->changed) { > write_part_table_flag(pe->sectorbuffer); > - write_sector(cxt, pe->offset, pe->sectorbuffer); > + rc = write_sector(cxt, pe->offset, pe->sectorbuffer); > + if (rc) > + goto done; > } > } > +done: > + return rc; > } > > const struct fdisk_label dos_label = > { > .name = "dos", > .probe = dos_probe_label, > + .write = dos_write_table, > .part_delete = dos_delete_partition, > }; > diff --git a/fdisks/fdiskdoslabel.h b/fdisks/fdiskdoslabel.h > index 4aa16e5..8a2c6dd 100644 > --- a/fdisks/fdiskdoslabel.h > +++ b/fdisks/fdiskdoslabel.h > @@ -50,6 +50,5 @@ extern int is_dos_partition(int t); > extern void dos_init(struct fdisk_context *cxt); > extern void dos_add_partition(struct fdisk_context *cxt, int n, int sys); > extern void dos_new_partition(struct fdisk_context *cxt); > -extern void dos_write_table(struct fdisk_context *cxt); > > #endif > diff --git a/fdisks/fdiskmaclabel.c b/fdisks/fdiskmaclabel.c > index 198a2d0..19c99f6 100644 > --- a/fdisks/fdiskmaclabel.c > +++ b/fdisks/fdiskmaclabel.c > @@ -84,5 +84,6 @@ const struct fdisk_label mac_label = > { > .name = "mac", > .probe = mac_probe_label, > + .write = NULL, > .part_delete = NULL, > }; > diff --git a/fdisks/fdisksgilabel.c b/fdisks/fdisksgilabel.c > index 51b0e1f..39ba58d 100644 > --- a/fdisks/fdisksgilabel.c > +++ b/fdisks/fdisksgilabel.c > @@ -329,8 +329,8 @@ create_sgiinfo(struct fdisk_context *cxt) { > > sgiinfo *fill_sgiinfo(void); > > -void > -sgi_write_table(struct fdisk_context *cxt) { > +static int sgi_write_table(struct fdisk_context *cxt) > +{ > sgilabel->csum = 0; > sgilabel->csum = SSWAP32(two_s_complement_32bit_sum( > (unsigned int*)sgilabel, > @@ -338,9 +338,9 @@ sgi_write_table(struct fdisk_context *cxt) { > assert(two_s_complement_32bit_sum( > (unsigned int*)sgilabel, sizeof(*sgilabel)) == 0); > if (lseek(cxt->dev_fd, 0, SEEK_SET) < 0) > - fdisk_error_fatal(cxt, FDISK_ERROR_SEEK); > + return FDISK_ERROR_SEEK; > if (write(cxt->dev_fd, sgilabel, SECTOR_SIZE) != SECTOR_SIZE) > - fdisk_error_fatal(cxt, FDISK_ERROR_WRITE); > + return FDISK_ERROR_WRITE; > if (! strncmp((char *) sgilabel->directory[0].vol_file_name, "sgilabel", 8)) { > /* > * keep this habit of first writing the "sgilabel". > @@ -350,11 +350,13 @@ sgi_write_table(struct fdisk_context *cxt) { > int infostartblock = SSWAP32(sgilabel->directory[0].vol_file_start); > if (lseek(cxt->dev_fd, (off_t) infostartblock* > SECTOR_SIZE, SEEK_SET) < 0) > - fdisk_error_fatal(cxt, FDISK_ERROR_SEEK); > + return FDISK_ERROR_SEEK; > if (write(cxt->dev_fd, info, SECTOR_SIZE) != SECTOR_SIZE) > - fdisk_error_fatal(cxt, FDISK_ERROR_WRITE); > + return FDISK_ERROR_WRITE; > free(info); > } > + > + return 0; > } > > static int > @@ -882,5 +884,6 @@ const struct fdisk_label sgi_label = > { > .name = "sgi", > .probe = sgi_probe_label, > + .write = sgi_write_table, > .part_delete = sgi_delete_partition, > }; > diff --git a/fdisks/fdisksgilabel.h b/fdisks/fdisksgilabel.h > index 98cf093..14f488f 100644 > --- a/fdisks/fdisksgilabel.h > +++ b/fdisks/fdisksgilabel.h > @@ -120,7 +120,6 @@ extern void sgi_add_partition( struct fdisk_context *cxt, int n, int sys ); > extern void create_sgilabel( struct fdisk_context *cxt ); > extern void create_sgiinfo(struct fdisk_context *cxt); > extern int verify_sgi(struct fdisk_context *cxt, int verbose ); > -extern void sgi_write_table( struct fdisk_context *cxt ); > extern void sgi_set_ilfact( void ); > extern void sgi_set_rspeed( void ); > extern void sgi_set_pcylcount( void ); > diff --git a/fdisks/fdisksunlabel.c b/fdisks/fdisksunlabel.c > index c74ffbb..2cae2dd 100644 > --- a/fdisks/fdisksunlabel.c > +++ b/fdisks/fdisksunlabel.c > @@ -625,7 +625,7 @@ void sun_set_pcylcount(struct fdisk_context *cxt) > _("Number of physical cylinders"))); > } > > -void sun_write_table(struct fdisk_context *cxt) > +static int sun_write_table(struct fdisk_context *cxt) > { > unsigned short *ush = (unsigned short *)sunlabel; > unsigned short csum = 0; > @@ -634,9 +634,11 @@ void sun_write_table(struct fdisk_context *cxt) > csum ^= *ush++; > sunlabel->cksum = csum; > if (lseek(cxt->dev_fd, 0, SEEK_SET) < 0) > - fdisk_error_fatal(cxt, FDISK_ERROR_SEEK); > + return FDISK_ERROR_SEEK; > if (write(cxt->dev_fd, sunlabel, SECTOR_SIZE) != SECTOR_SIZE) > - fdisk_error_fatal(cxt, FDISK_ERROR_WRITE); > + return FDISK_ERROR_WRITE; > + > + return 0; > } > > int sun_get_sysid(struct fdisk_context *cxt, int i) > @@ -648,5 +650,6 @@ const struct fdisk_label sun_label = > { > .name = "sun", > .probe = sun_probe_label, > + .write = sun_write_table, > .part_delete = sun_delete_partition, > }; > diff --git a/fdisks/fdisksunlabel.h b/fdisks/fdisksunlabel.h > index 47aa30a..0ede6e3 100644 > --- a/fdisks/fdisksunlabel.h > +++ b/fdisks/fdisksunlabel.h > @@ -82,7 +82,6 @@ extern int sun_change_sysid(struct fdisk_context *cxt, int i, uint16_t sys); > extern void sun_list_table(struct fdisk_context *cxt, int xtra); > extern void verify_sun(struct fdisk_context *cxt); > extern void add_sun_partition(struct fdisk_context *cxt, int n, int sys); > -extern void sun_write_table(struct fdisk_context *cxt); > extern void sun_set_alt_cyl(struct fdisk_context *cxt); > extern void sun_set_ncyl(struct fdisk_context *cxt, int cyl); > extern void sun_set_xcyl(struct fdisk_context *cxt); > diff --git a/fdisks/utils.c b/fdisks/utils.c > index c8b8f7e..9b5092d 100644 > --- a/fdisks/utils.c > +++ b/fdisks/utils.c > @@ -82,6 +82,19 @@ done: > } > > /** > + * fdisk_label_write_table: > + * @cxt: fdisk context > + * > + * Write in-memory changes to disk > + * > + * Returns 0 on success, otherwise, a corresponding error. > + */ > +int fdisk_label_write_table(struct fdisk_context *cxt) > +{ > + return cxt->label->write(cxt); > +} > + > +/** > * fdisk_label_partition_delete: > * @cxt: fdisk context > * @partnum: partition number to delete > -- > 1.7.4.1 > > > > > -- > 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 Petr -- Petr Uzel IRC: ptr_uzl @ freenode
Attachment:
pgprPI8rBPYvN.pgp
Description: PGP signature