mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 06:33:34 +00:00
[PATCH] s390: cms volume label definitions
Moved definition of CMS volume label to vtoc.h and modify partitions/ibm.c to use this volume label definition instead of anonymous array. Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
973bd99375
commit
56dc6a88ec
@ -6,7 +6,7 @@
|
||||
* Bugreports.to..: <Linux390@de.ibm.com>
|
||||
* (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
|
||||
*
|
||||
* $Revision: 1.51 $
|
||||
* $Revision: 1.52 $
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
@ -25,6 +25,7 @@
|
||||
#include <asm/io.h>
|
||||
#include <asm/s390_ext.h>
|
||||
#include <asm/todclk.h>
|
||||
#include <asm/vtoc.h>
|
||||
|
||||
#include "dasd_int.h"
|
||||
#include "dasd_diag.h"
|
||||
@ -329,7 +330,7 @@ dasd_diag_check_device(struct dasd_device *device)
|
||||
struct dasd_diag_private *private;
|
||||
struct dasd_diag_characteristics *rdc_data;
|
||||
struct dasd_diag_bio bio;
|
||||
struct dasd_diag_cms_label *label;
|
||||
struct vtoc_cms_label *label;
|
||||
blocknum_t end_block;
|
||||
unsigned int sb, bsize;
|
||||
int rc;
|
||||
@ -380,7 +381,7 @@ dasd_diag_check_device(struct dasd_device *device)
|
||||
mdsk_term_io(device);
|
||||
|
||||
/* figure out blocksize of device */
|
||||
label = (struct dasd_diag_cms_label *) get_zeroed_page(GFP_KERNEL);
|
||||
label = (struct vtoc_cms_label *) get_zeroed_page(GFP_KERNEL);
|
||||
if (label == NULL) {
|
||||
DEV_MESSAGE(KERN_WARNING, device, "%s",
|
||||
"No memory to allocate initialization request");
|
||||
|
@ -6,7 +6,7 @@
|
||||
* Bugreports.to..: <Linux390@de.ibm.com>
|
||||
* (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
|
||||
*
|
||||
* $Revision: 1.8 $
|
||||
* $Revision: 1.9 $
|
||||
*/
|
||||
|
||||
#define MDSK_WRITE_REQ 0x01
|
||||
@ -44,27 +44,6 @@ struct dasd_diag_characteristics {
|
||||
u8 rdev_features;
|
||||
} __attribute__ ((packed, aligned(4)));
|
||||
|
||||
struct dasd_diag_cms_label {
|
||||
u8 label_id[4];
|
||||
u8 vol_id[6];
|
||||
u16 version_id;
|
||||
u32 block_size;
|
||||
u32 origin_ptr;
|
||||
u32 usable_count;
|
||||
u32 formatted_count;
|
||||
u32 block_count;
|
||||
u32 used_count;
|
||||
u32 fst_size;
|
||||
u32 fst_count;
|
||||
u8 format_date[6];
|
||||
u8 reserved1[2];
|
||||
u32 disk_offset;
|
||||
u32 map_block;
|
||||
u32 hblk_disp;
|
||||
u32 user_disp;
|
||||
u8 reserved2[4];
|
||||
u8 segment_name[8];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#ifdef CONFIG_ARCH_S390X
|
||||
#define DASD_DIAG_FLAGA_DEFAULT DASD_DIAG_FLAGA_FORMAT_64BIT
|
||||
|
@ -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);
|
||||
|
@ -176,4 +176,28 @@ struct vtoc_format7_label
|
||||
struct vtoc_cchhb DS7PTRDS; /* pointer to next FMT7 DSCB */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct vtoc_cms_label {
|
||||
u8 label_id[4]; /* Label identifier */
|
||||
u8 vol_id[6]; /* Volid */
|
||||
u16 version_id; /* Version identifier */
|
||||
u32 block_size; /* Disk block size */
|
||||
u32 origin_ptr; /* Disk origin pointer */
|
||||
u32 usable_count; /* Number of usable cylinders/blocks */
|
||||
u32 formatted_count; /* Maximum number of formatted cylinders/
|
||||
* blocks */
|
||||
u32 block_count; /* Disk size in CMS blocks */
|
||||
u32 used_count; /* Number of CMS blocks in use */
|
||||
u32 fst_size; /* File Status Table (FST) size */
|
||||
u32 fst_count; /* Number of FSTs per CMS block */
|
||||
u8 format_date[6]; /* Disk FORMAT date */
|
||||
u8 reserved1[2];
|
||||
u32 disk_offset; /* Disk offset when reserved*/
|
||||
u32 map_block; /* Allocation Map Block with next hole */
|
||||
u32 hblk_disp; /* Displacement into HBLK data of next hole */
|
||||
u32 user_disp; /* Displacement into user part of Allocation
|
||||
* map */
|
||||
u8 reserved2[4];
|
||||
u8 segment_name[8]; /* Name of shared segment */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#endif /* _ASM_S390_VTOC_H */
|
||||
|
Loading…
Reference in New Issue
Block a user