1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
/*
* s390-tools/zipl/include/disk.h
* Functions to handle disk layout specific operations.
*
* Copyright IBM Corp. 2001, 2009.
*
* Author(s): Carsten Otte <cotte@de.ibm.com>
* Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com>
*/
#ifndef DISK_H
#define DISK_H
#include "zipl.h"
#include <stdint.h>
#include <sys/types.h>
/* Type for representing disk block numbers */
typedef uint64_t blocknum_t;
/* Pointer to block on a disk with cyl/head/sec layout */
struct disk_blockptr_chs {
int cyl;
int head;
int sec;
int size;
int blockct;
};
/* Pointer to a block on a disk with linear layout */
struct disk_blockptr_linear {
blocknum_t block;
int size;
int blockct;
};
/* Pointer to a block on disk */
typedef union {
struct disk_blockptr_chs chs;
struct disk_blockptr_linear linear;
} disk_blockptr_t;
/* Disk type identifier */
typedef enum {
disk_type_scsi,
disk_type_fba,
disk_type_diag,
disk_type_eckd_classic,
disk_type_eckd_compatible
} disk_type_t;
/* from linux/hdregs.h */
struct hd_geometry {
unsigned char heads;
unsigned char sectors;
unsigned short cylinders;
unsigned long start;
};
/* Disk information source */
typedef enum {
source_auto,
source_user,
source_script
} source_t;
/* targetbase definition */
typedef enum {
defined_as_device,
defined_as_name
} definition_t;
/* Disk information type */
struct disk_info {
disk_type_t type;
dev_t device;
dev_t partition;
int devno;
int partnum;
int phy_block_size;
int fs_block_size;
uint64_t phy_blocks;
struct hd_geometry geo;
char* name;
char* drv_name;
source_t source;
definition_t targetbase;
};
struct job_target_data;
int disk_get_info(const char* device, struct job_target_data* target,
struct disk_info** info);
int disk_get_info_from_file(const char* filename,
struct job_target_data* target,
struct disk_info** info);
void disk_free_info(struct disk_info* info);
char* disk_get_type_name(disk_type_t type);
int disk_is_large_volume(struct disk_info* info);
int disk_cyl_from_blocknum(blocknum_t blocknum, struct disk_info* info);
int disk_head_from_blocknum(blocknum_t blocknum, struct disk_info* info);
int disk_sec_from_blocknum(blocknum_t blocknum, struct disk_info* info);
void disk_blockptr_from_blocknum(disk_blockptr_t* ptr, blocknum_t blocknum,
struct disk_info* info);
int disk_write_block_aligned(int fd, const void* data, size_t bytecount,
disk_blockptr_t* block, struct disk_info* info);
blocknum_t disk_write_block_buffer(int fd, const void* buffer,
size_t bytecount,
disk_blockptr_t** blocklist,
struct disk_info* info);
void disk_print_devt(dev_t d);
void disk_print_info(struct disk_info* info);
int disk_is_zero_block(disk_blockptr_t* block, struct disk_info* info);
blocknum_t disk_compact_blocklist(disk_blockptr_t* list, blocknum_t count,
struct disk_info* info);
blocknum_t disk_get_blocklist_from_file(const char* filename,
disk_blockptr_t** blocklist,
struct disk_info* pinfo);
int disk_check_subchannel_set(int devno, dev_t device, char* dev_name);
#endif /* not DISK_H */
|