|
@@ -56,7 +56,10 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
|
|
|
struct hd_geometry *geo;
|
|
|
char type[5] = {0,};
|
|
|
char name[7] = {0,};
|
|
|
- struct vtoc_volume_label *vlabel;
|
|
|
+ union label_t {
|
|
|
+ struct vtoc_volume_label vol;
|
|
|
+ struct vtoc_cms_label cms;
|
|
|
+ } *label;
|
|
|
unsigned char *data;
|
|
|
Sector sect;
|
|
|
|
|
@@ -64,9 +67,8 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
|
|
|
goto out_noinfo;
|
|
|
if ((geo = kmalloc(sizeof(struct hd_geometry), GFP_KERNEL)) == NULL)
|
|
|
goto out_nogeo;
|
|
|
- if ((vlabel = kmalloc(sizeof(struct vtoc_volume_label),
|
|
|
- GFP_KERNEL)) == NULL)
|
|
|
- goto out_novlab;
|
|
|
+ if ((label = kmalloc(sizeof(union label_t), GFP_KERNEL)) == NULL)
|
|
|
+ goto out_nolab;
|
|
|
|
|
|
if (ioctl_by_bdev(bdev, BIODASDINFO, (unsigned long)info) != 0 ||
|
|
|
ioctl_by_bdev(bdev, HDIO_GETGEO, (unsigned long)geo) != 0)
|
|
@@ -87,7 +89,7 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
|
|
|
strncpy(name, data + 8, 6);
|
|
|
else
|
|
|
strncpy(name, data + 4, 6);
|
|
|
- memcpy (vlabel, data, sizeof(struct vtoc_volume_label));
|
|
|
+ memcpy(label, data, sizeof(union label_t));
|
|
|
put_dev_sector(sect);
|
|
|
|
|
|
EBCASC(type, 4);
|
|
@@ -100,14 +102,12 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
|
|
|
/*
|
|
|
* VM style CMS1 labeled disk
|
|
|
*/
|
|
|
- int *label = (int *) vlabel;
|
|
|
-
|
|
|
- if (label[13] != 0) {
|
|
|
+ if (label->cms.disk_offset != 0) {
|
|
|
printk("CMS1/%8s(MDSK):", name);
|
|
|
/* disk is reserved minidisk */
|
|
|
- blocksize = label[3];
|
|
|
- offset = label[13];
|
|
|
- size = (label[7] - 1)*(blocksize >> 9);
|
|
|
+ blocksize = label->cms.block_size;
|
|
|
+ offset = label->cms.disk_offset;
|
|
|
+ size = (label->cms.block_count - 1) * (blocksize >> 9);
|
|
|
} else {
|
|
|
printk("CMS1/%8s:", name);
|
|
|
offset = (info->label_block + 1);
|
|
@@ -126,7 +126,7 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
|
|
|
printk("VOL1/%8s:", name);
|
|
|
|
|
|
/* get block number and read then go through format1 labels */
|
|
|
- blk = cchhb2blk(&vlabel->vtoc, geo) + 1;
|
|
|
+ blk = cchhb2blk(&label->vol.vtoc, geo) + 1;
|
|
|
counter = 0;
|
|
|
while ((data = read_dev_sector(bdev, blk*(blocksize/512),
|
|
|
§)) != NULL) {
|
|
@@ -174,7 +174,7 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
|
|
|
}
|
|
|
|
|
|
printk("\n");
|
|
|
- kfree(vlabel);
|
|
|
+ kfree(label);
|
|
|
kfree(geo);
|
|
|
kfree(info);
|
|
|
return 1;
|
|
@@ -182,8 +182,8 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev)
|
|
|
out_readerr:
|
|
|
out_badsect:
|
|
|
out_noioctl:
|
|
|
- kfree(vlabel);
|
|
|
-out_novlab:
|
|
|
+ kfree(label);
|
|
|
+out_nolab:
|
|
|
kfree(geo);
|
|
|
out_nogeo:
|
|
|
kfree(info);
|