|
#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 |
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; |
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; |
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), |
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 |
} |
} |
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" : |
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 |
} |
} |
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++) { |
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; |
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; |
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])); |
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); |
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 |
} |
} |
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 |
} |
} |