Commit cffab6bc authored by Peter Oberparleiter's avatar Peter Oberparleiter Committed by Martin Schwidefsky

[S390] dasd: use correct label location for diag fba disks

Partition boundary calculation fails for DASD FBA disks under the
following conditions:
- disk is formatted with CMS FORMAT with a blocksize of more than
  512 bytes
- all of the disk is reserved to a single CMS file using CMS RESERVE
- the disk is accessed using the DIAG mode of the DASD driver

Under these circumstances, the partition detection code tries to
read the CMS label block containing partition-relevant information
from logical block offset 1, while it is in fact located at physical
block offset 1.

Fix this problem by using the correct CMS label block location
depending on the device type as determined by the DASD SENSE ID
information.
Signed-off-by: default avatarPeter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent a9f7f2e7
...@@ -74,6 +74,7 @@ int ibm_partition(struct parsed_partitions *state) ...@@ -74,6 +74,7 @@ int ibm_partition(struct parsed_partitions *state)
} *label; } *label;
unsigned char *data; unsigned char *data;
Sector sect; Sector sect;
sector_t labelsect;
res = 0; res = 0;
blocksize = bdev_logical_block_size(bdev); blocksize = bdev_logical_block_size(bdev);
...@@ -97,11 +98,20 @@ int ibm_partition(struct parsed_partitions *state) ...@@ -97,11 +98,20 @@ int ibm_partition(struct parsed_partitions *state)
ioctl_by_bdev(bdev, HDIO_GETGEO, (unsigned long)geo) != 0) ioctl_by_bdev(bdev, HDIO_GETGEO, (unsigned long)geo) != 0)
goto out_freeall; goto out_freeall;
/*
* Special case for FBA disks: label sector does not depend on
* blocksize.
*/
if ((info->cu_type == 0x6310 && info->dev_type == 0x9336) ||
(info->cu_type == 0x3880 && info->dev_type == 0x3370))
labelsect = info->label_block;
else
labelsect = info->label_block * (blocksize >> 9);
/* /*
* Get volume label, extract name and type. * Get volume label, extract name and type.
*/ */
data = read_part_sector(state, info->label_block*(blocksize/512), data = read_part_sector(state, labelsect, &sect);
&sect);
if (data == NULL) if (data == NULL)
goto out_readerr; goto out_readerr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment