Magellan Linux

Diff of /trunk/mkinitrd-magellan/busybox/util-linux/fdisk_sgi.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 983 by niro, Fri Apr 24 18:33:46 2009 UTC revision 984 by niro, Sun May 30 11:32:42 2010 UTC
# Line 1  Line 1 
 #if ENABLE_FEATURE_SGI_LABEL  
   
 #define SGI_DEBUG 0  
   
1  /*  /*
2   * Copyright (C) Andreas Neuper, Sep 1998.   * Copyright (C) Andreas Neuper, Sep 1998.
3   *      This file may be modified and redistributed under   *
4   *      the terms of the GNU Public License.   * Licensed under GPLv2, see file LICENSE in this tarball for details.
5   */   */
6    
7    #if ENABLE_FEATURE_SGI_LABEL
8    
9    #define SGI_DEBUG 0
10    
11  #define SGI_VOLHDR      0x00  #define SGI_VOLHDR      0x00
12  /* 1 and 2 were used for drive types no longer supported by SGI */  /* 1 and 2 were used for drive types no longer supported by SGI */
13  #define SGI_SWAP        0x03  #define SGI_SWAP        0x03
# Line 36  struct device_parameter { /* 48 bytes */ Line 36  struct device_parameter { /* 48 bytes */
36   unsigned short nsect;   /* sectors/tracks in cyl 0 or vol 0 */   unsigned short nsect;   /* sectors/tracks in cyl 0 or vol 0 */
37   unsigned short bytes;   unsigned short bytes;
38   unsigned short ilfact;   unsigned short ilfact;
39   unsigned int   flags;           /* controller flags */   unsigned int   flags;   /* controller flags */
40   unsigned int   datarate;   unsigned int   datarate;
41   unsigned int   retries_on_error;   unsigned int   retries_on_error;
42   unsigned int   ms_per_word;   unsigned int   ms_per_word;
# Line 70  typedef struct { Line 70  typedef struct {
70   unsigned int  vol_file_start;   /* number of logical block */   unsigned int  vol_file_start;   /* number of logical block */
71   unsigned int  vol_file_size;    /* number of bytes */   unsigned int  vol_file_size;    /* number of bytes */
72   } directory[15];   } directory[15];
73   struct sgi_partinfo {                  /* 16 * 12 bytes */   struct sgi_partinfo {                   /* 16 * 12 bytes */
74   unsigned int num_sectors;       /* number of blocks */   unsigned int num_sectors;       /* number of blocks */
75   unsigned int start_sector;      /* must be cylinder aligned */   unsigned int start_sector;      /* must be cylinder aligned */
76   unsigned int id;   unsigned int id;
# Line 291  sgi_list_table(int xtra) Line 291  sgi_list_table(int xtra)
291   int kpi = 0;                /* kernel partition ID */   int kpi = 0;                /* kernel partition ID */
292    
293   if (xtra) {   if (xtra) {
294   printf("\nDisk %s (SGI disk label): %d heads, %d sectors\n"   printf("\nDisk %s (SGI disk label): %u heads, %u sectors\n"
295   "%d cylinders, %d physical cylinders\n"   "%u cylinders, %u physical cylinders\n"
296   "%d extra sects/cyl, interleave %d:1\n"   "%u extra sects/cyl, interleave %u:1\n"
297   "%s\n"   "%s\n"
298   "Units = %s of %d * 512 bytes\n\n",   "Units = %s of %u * 512 bytes\n\n",
299   disk_device, g_heads, g_sectors, g_cylinders,   disk_device, g_heads, g_sectors, g_cylinders,
300   SGI_SSWAP16(sgiparam.pcylcount),   SGI_SSWAP16(sgiparam.pcylcount),
301   SGI_SSWAP16(sgiparam.sparecyl),   SGI_SSWAP16(sgiparam.sparecyl),
# Line 304  sgi_list_table(int xtra) Line 304  sgi_list_table(int xtra)
304   str_units(PLURAL), units_per_sector);   str_units(PLURAL), units_per_sector);
305   } else {   } else {
306   printf("\nDisk %s (SGI disk label): "   printf("\nDisk %s (SGI disk label): "
307   "%d heads, %d sectors, %d cylinders\n"   "%u heads, %u sectors, %u cylinders\n"
308   "Units = %s of %d * 512 bytes\n\n",   "Units = %s of %u * 512 bytes\n\n",
309   disk_device, g_heads, g_sectors, g_cylinders,   disk_device, g_heads, g_sectors, g_cylinders,
310   str_units(PLURAL), units_per_sector );   str_units(PLURAL), units_per_sector );
311   }   }
# Line 324  sgi_list_table(int xtra) Line 324  sgi_list_table(int xtra)
324   uint32_t len = sgi_get_num_sectors(i);   uint32_t len = sgi_get_num_sectors(i);
325   kpi++;              /* only count nonempty partitions */   kpi++;              /* only count nonempty partitions */
326   printf(   printf(
327   "%2d: %s %4s %9ld %9ld %9ld  %2x  %s\n",   "%2u: %s %4s %9lu %9lu %9lu  %2x  %s\n",
328  /* fdisk part number */ i+1,  /* fdisk part number */ i+1,
329  /* device */            partname(disk_device, kpi, w+3),  /* device */            partname(disk_device, kpi, w+3),
330  /* flags */             (sgi_get_swappartition() == i) ? "swap" :  /* flags */             (sgi_get_swappartition() == i) ? "swap" :
# Line 345  sgi_list_table(int xtra) Line 345  sgi_list_table(int xtra)
345   uint32_t len = SGI_SSWAP32(sgilabel->directory[i].vol_file_size);   uint32_t len = SGI_SSWAP32(sgilabel->directory[i].vol_file_size);
346   unsigned char *name = sgilabel->directory[i].vol_file_name;   unsigned char *name = sgilabel->directory[i].vol_file_name;
347    
348   printf("%2d: %-10s sector%5u size%8u\n",   printf("%2u: %-10s sector%5u size%8u\n",
349   i, (char*)name, (unsigned int) start, (unsigned int) len);   i, (char*)name, (unsigned int) start, (unsigned int) len);
350   }   }
351   }   }
# Line 507  verify_sgi(int verbose) Line 507  verify_sgi(int verbose)
507   if ((sgi_get_start_sector(Index[0]) != 0) && verbose)   if ((sgi_get_start_sector(Index[0]) != 0) && verbose)
508   printf("The entire disk partition should start "   printf("The entire disk partition should start "
509   "at block 0,\n"   "at block 0,\n"
510   "not at diskblock %d\n",   "not at diskblock %u\n",
511   sgi_get_start_sector(Index[0]));   sgi_get_start_sector(Index[0]));
512   if (SGI_DEBUG)      /* I do not understand how some disks fulfil it */   if (SGI_DEBUG)      /* I do not understand how some disks fulfil it */
513   if ((sgi_get_num_sectors(Index[0]) != lastblock) && verbose)   if ((sgi_get_num_sectors(Index[0]) != lastblock) && verbose)
514   printf("The entire disk partition is only %d diskblock large,\n"   printf("The entire disk partition is only %u diskblock large,\n"
515   "but the disk is %d diskblocks long\n",   "but the disk is %u diskblocks long\n",
516   sgi_get_num_sectors(Index[0]), lastblock);   sgi_get_num_sectors(Index[0]), lastblock);
517   lastblock = sgi_get_num_sectors(Index[0]);   lastblock = sgi_get_num_sectors(Index[0]);
518   } else {   } else {
519   if (verbose)   if (verbose)
520   printf("One Partition (#11) should cover the entire disk\n");   printf("One Partition (#11) should cover the entire disk\n");
521   if (SGI_DEBUG > 2)   if (SGI_DEBUG > 2)
522   printf("sysid=%d\tpartition=%d\n",   printf("sysid=%u\tpartition=%u\n",
523   sgi_get_sysid(Index[0]), Index[0]+1);   sgi_get_sysid(Index[0]), Index[0]+1);
524   }   }
525   for (i = 1, start = 0; i < sortcount; i++) {   for (i = 1, start = 0; i < sortcount; i++) {
# Line 528  verify_sgi(int verbose) Line 528  verify_sgi(int verbose)
528   if ((sgi_get_start_sector(Index[i]) % cylsize) != 0) {   if ((sgi_get_start_sector(Index[i]) % cylsize) != 0) {
529   if (SGI_DEBUG)      /* I do not understand how some disks fulfil it */   if (SGI_DEBUG)      /* I do not understand how some disks fulfil it */
530   if (verbose)   if (verbose)
531   printf("Partition %d does not start on cylinder boundary\n",   printf("Partition %u does not start on cylinder boundary\n",
532   Index[i]+1);   Index[i]+1);
533   }   }
534   if (sgi_get_num_sectors(Index[i]) % cylsize != 0) {   if (sgi_get_num_sectors(Index[i]) % cylsize != 0) {
535   if (SGI_DEBUG)      /* I do not understand how some disks fulfil it */   if (SGI_DEBUG)      /* I do not understand how some disks fulfil it */
536   if (verbose)   if (verbose)
537   printf("Partition %d does not end on cylinder boundary\n",   printf("Partition %u does not end on cylinder boundary\n",
538   Index[i]+1);   Index[i]+1);
539   }   }
540   /* We cannot handle several "entire disk" entries. */   /* We cannot handle several "entire disk" entries. */
541   if (sgi_get_sysid(Index[i]) == SGI_ENTIRE_DISK) continue;   if (sgi_get_sysid(Index[i]) == SGI_ENTIRE_DISK) continue;
542   if (start > sgi_get_start_sector(Index[i])) {   if (start > sgi_get_start_sector(Index[i])) {
543   if (verbose)   if (verbose)
544   printf("Partitions %d and %d overlap by %d sectors\n",   printf("Partitions %u and %u overlap by %u sectors\n",
545   Index[i-1]+1, Index[i]+1,   Index[i-1]+1, Index[i]+1,
546   start - sgi_get_start_sector(Index[i]));   start - sgi_get_start_sector(Index[i]));
547   if (gap > 0) gap = -gap;   if (gap > 0) gap = -gap;
# Line 549  verify_sgi(int verbose) Line 549  verify_sgi(int verbose)
549   }   }
550   if (start < sgi_get_start_sector(Index[i])) {   if (start < sgi_get_start_sector(Index[i])) {
551   if (verbose)   if (verbose)
552   printf("Unused gap of %8u sectors - sectors %8u-%8u\n",   printf("Unused gap of %u sectors - sectors %u-%u\n",
553   sgi_get_start_sector(Index[i]) - start,   sgi_get_start_sector(Index[i]) - start,
554   start, sgi_get_start_sector(Index[i])-1);   start, sgi_get_start_sector(Index[i])-1);
555   gap += sgi_get_start_sector(Index[i]) - start;   gap += sgi_get_start_sector(Index[i]) - start;
# Line 559  verify_sgi(int verbose) Line 559  verify_sgi(int verbose)
559     + sgi_get_num_sectors(Index[i]);     + sgi_get_num_sectors(Index[i]);
560   if (SGI_DEBUG > 1) {   if (SGI_DEBUG > 1) {
561   if (verbose)   if (verbose)
562   printf("%2d:%12d\t%12d\t%12d\n", Index[i],   printf("%2u:%12u\t%12u\t%12u\n", Index[i],
563   sgi_get_start_sector(Index[i]),   sgi_get_start_sector(Index[i]),
564   sgi_get_num_sectors(Index[i]),   sgi_get_num_sectors(Index[i]),
565   sgi_get_sysid(Index[i]));   sgi_get_sysid(Index[i]));
# Line 567  verify_sgi(int verbose) Line 567  verify_sgi(int verbose)
567   }   }
568   if (start < lastblock) {   if (start < lastblock) {
569   if (verbose)   if (verbose)
570   printf("Unused gap of %8u sectors - sectors %8u-%8u\n",   printf("Unused gap of %u sectors - sectors %u-%u\n",
571   lastblock - start, start, lastblock-1);   lastblock - start, start, lastblock-1);
572   gap += lastblock - start;   gap += lastblock - start;
573   add2freelist(start, lastblock);   add2freelist(start, lastblock);
# Line 788  create_sgilabel(void) Line 788  create_sgilabel(void)
788   /* otherwise print error and use truncated version */   /* otherwise print error and use truncated version */
789   g_cylinders = geometry.cylinders;   g_cylinders = geometry.cylinders;
790   printf(   printf(
791  "Warning: BLKGETSIZE ioctl failed on %s.  Using geometry cylinder value of %d.\n"  "Warning: BLKGETSIZE ioctl failed on %s.  Using geometry cylinder value of %u.\n"
792  "This value may be truncated for devices > 33.8 GB.\n", disk_device, g_cylinders);  "This value may be truncated for devices > 33.8 GB.\n", disk_device, g_cylinders);
793   }   }
794   }   }
# Line 799  create_sgilabel(void) Line 799  create_sgilabel(void)
799   old[i].sysid = get_part_table(i)->sys_ind;   old[i].sysid = get_part_table(i)->sys_ind;
800   old[i].start = get_start_sect(get_part_table(i));   old[i].start = get_start_sect(get_part_table(i));
801   old[i].nsect = get_nr_sects(get_part_table(i));   old[i].nsect = get_nr_sects(get_part_table(i));
802   printf("Trying to keep parameters of partition %d\n", i);   printf("Trying to keep parameters of partition %u\n", i);
803   if (SGI_DEBUG)   if (SGI_DEBUG)
804   printf("ID=%02x\tSTART=%d\tLENGTH=%d\n",   printf("ID=%02x\tSTART=%u\tLENGTH=%u\n",
805   old[i].sysid, old[i].start, old[i].nsect);   old[i].sysid, old[i].start, old[i].nsect);
806   }   }
807   }   }

Legend:
Removed from v.983  
changed lines
  Added in v.984