diff options
Diffstat (limited to 'fs/partitions')
-rw-r--r-- | fs/partitions/Kconfig | 2 | ||||
-rw-r--r-- | fs/partitions/ibm.c | 30 |
2 files changed, 16 insertions, 16 deletions
diff --git a/fs/partitions/Kconfig b/fs/partitions/Kconfig index 656bc43431b9..e227a04261ab 100644 --- a/fs/partitions/Kconfig +++ b/fs/partitions/Kconfig | |||
@@ -85,7 +85,7 @@ config ATARI_PARTITION | |||
85 | 85 | ||
86 | config IBM_PARTITION | 86 | config IBM_PARTITION |
87 | bool "IBM disk label and partition support" | 87 | bool "IBM disk label and partition support" |
88 | depends on PARTITION_ADVANCED && ARCH_S390 | 88 | depends on PARTITION_ADVANCED && S390 |
89 | help | 89 | help |
90 | Say Y here if you would like to be able to read the hard disk | 90 | Say Y here if you would like to be able to read the hard disk |
91 | partition table format used by IBM DASD disks operating under CMS. | 91 | partition table format used by IBM DASD disks operating under CMS. |
diff --git a/fs/partitions/ibm.c b/fs/partitions/ibm.c index 6327bcb2d73d..78010ad60e47 100644 --- a/fs/partitions/ibm.c +++ b/fs/partitions/ibm.c | |||
@@ -56,7 +56,10 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev) | |||
56 | struct hd_geometry *geo; | 56 | struct hd_geometry *geo; |
57 | char type[5] = {0,}; | 57 | char type[5] = {0,}; |
58 | char name[7] = {0,}; | 58 | char name[7] = {0,}; |
59 | struct vtoc_volume_label *vlabel; | 59 | union label_t { |
60 | struct vtoc_volume_label vol; | ||
61 | struct vtoc_cms_label cms; | ||
62 | } *label; | ||
60 | unsigned char *data; | 63 | unsigned char *data; |
61 | Sector sect; | 64 | Sector sect; |
62 | 65 | ||
@@ -64,9 +67,8 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev) | |||
64 | goto out_noinfo; | 67 | goto out_noinfo; |
65 | if ((geo = kmalloc(sizeof(struct hd_geometry), GFP_KERNEL)) == NULL) | 68 | if ((geo = kmalloc(sizeof(struct hd_geometry), GFP_KERNEL)) == NULL) |
66 | goto out_nogeo; | 69 | goto out_nogeo; |
67 | if ((vlabel = kmalloc(sizeof(struct vtoc_volume_label), | 70 | if ((label = kmalloc(sizeof(union label_t), GFP_KERNEL)) == NULL) |
68 | GFP_KERNEL)) == NULL) | 71 | goto out_nolab; |
69 | goto out_novlab; | ||
70 | 72 | ||
71 | if (ioctl_by_bdev(bdev, BIODASDINFO, (unsigned long)info) != 0 || | 73 | if (ioctl_by_bdev(bdev, BIODASDINFO, (unsigned long)info) != 0 || |
72 | ioctl_by_bdev(bdev, HDIO_GETGEO, (unsigned long)geo) != 0) | 74 | ioctl_by_bdev(bdev, HDIO_GETGEO, (unsigned long)geo) != 0) |
@@ -87,7 +89,7 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev) | |||
87 | strncpy(name, data + 8, 6); | 89 | strncpy(name, data + 8, 6); |
88 | else | 90 | else |
89 | strncpy(name, data + 4, 6); | 91 | strncpy(name, data + 4, 6); |
90 | memcpy (vlabel, data, sizeof(struct vtoc_volume_label)); | 92 | memcpy(label, data, sizeof(union label_t)); |
91 | put_dev_sector(sect); | 93 | put_dev_sector(sect); |
92 | 94 | ||
93 | EBCASC(type, 4); | 95 | EBCASC(type, 4); |
@@ -100,14 +102,12 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev) | |||
100 | /* | 102 | /* |
101 | * VM style CMS1 labeled disk | 103 | * VM style CMS1 labeled disk |
102 | */ | 104 | */ |
103 | int *label = (int *) vlabel; | 105 | if (label->cms.disk_offset != 0) { |
104 | |||
105 | if (label[13] != 0) { | ||
106 | printk("CMS1/%8s(MDSK):", name); | 106 | printk("CMS1/%8s(MDSK):", name); |
107 | /* disk is reserved minidisk */ | 107 | /* disk is reserved minidisk */ |
108 | blocksize = label[3]; | 108 | blocksize = label->cms.block_size; |
109 | offset = label[13]; | 109 | offset = label->cms.disk_offset; |
110 | size = (label[7] - 1)*(blocksize >> 9); | 110 | size = (label->cms.block_count - 1) * (blocksize >> 9); |
111 | } else { | 111 | } else { |
112 | printk("CMS1/%8s:", name); | 112 | printk("CMS1/%8s:", name); |
113 | offset = (info->label_block + 1); | 113 | offset = (info->label_block + 1); |
@@ -126,7 +126,7 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev) | |||
126 | printk("VOL1/%8s:", name); | 126 | printk("VOL1/%8s:", name); |
127 | 127 | ||
128 | /* get block number and read then go through format1 labels */ | 128 | /* get block number and read then go through format1 labels */ |
129 | blk = cchhb2blk(&vlabel->vtoc, geo) + 1; | 129 | blk = cchhb2blk(&label->vol.vtoc, geo) + 1; |
130 | counter = 0; | 130 | counter = 0; |
131 | while ((data = read_dev_sector(bdev, blk*(blocksize/512), | 131 | while ((data = read_dev_sector(bdev, blk*(blocksize/512), |
132 | §)) != NULL) { | 132 | §)) != NULL) { |
@@ -174,7 +174,7 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev) | |||
174 | } | 174 | } |
175 | 175 | ||
176 | printk("\n"); | 176 | printk("\n"); |
177 | kfree(vlabel); | 177 | kfree(label); |
178 | kfree(geo); | 178 | kfree(geo); |
179 | kfree(info); | 179 | kfree(info); |
180 | return 1; | 180 | return 1; |
@@ -182,8 +182,8 @@ ibm_partition(struct parsed_partitions *state, struct block_device *bdev) | |||
182 | out_readerr: | 182 | out_readerr: |
183 | out_badsect: | 183 | out_badsect: |
184 | out_noioctl: | 184 | out_noioctl: |
185 | kfree(vlabel); | 185 | kfree(label); |
186 | out_novlab: | 186 | out_nolab: |
187 | kfree(geo); | 187 | kfree(geo); |
188 | out_nogeo: | 188 | out_nogeo: |
189 | kfree(info); | 189 | kfree(info); |