mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4eb7e4907 | ||
|
|
c5a91199e3 | ||
|
|
144bddbf5b | ||
|
|
36ef451e6b | ||
|
|
1064e5b9cc | ||
|
|
d121ffa3f0 | ||
|
|
57f18c5f59 | ||
|
|
3b2a8777b1 | ||
|
|
89ead069f9 | ||
|
|
05de40cdeb | ||
|
|
a74103dba7 | ||
|
|
b4868c21bf | ||
|
|
8826028bdc | ||
|
|
09aa7f2010 | ||
|
|
e7d3638c6b | ||
|
|
68b0b4c268 | ||
|
|
caeb4470cd | ||
|
|
8b11ea73ac | ||
|
|
45e20a5044 | ||
|
|
105b30a805 | ||
|
|
70a7fc3e72 | ||
|
|
2d3774932b | ||
|
|
a5c1923d32 | ||
|
|
0348a8443e | ||
|
|
dba9616a5b |
@@ -14,6 +14,7 @@ List of all individuals having contributed content to s390-tools
|
||||
- Christof Schmitt
|
||||
- Claudio Imbrenda
|
||||
- Clemens von Mann
|
||||
- cvs2git
|
||||
- Dan Horak
|
||||
- Despina Papadopoulou
|
||||
- Eberhard Pasch
|
||||
@@ -21,6 +22,7 @@ List of all individuals having contributed content to s390-tools
|
||||
- Erwin Vicari
|
||||
- Eugene Crosser
|
||||
- Eugene Dvurechenski
|
||||
- Eugene (jno) Dvurechenski
|
||||
- Farhan Ali
|
||||
- Fedor Loshakov
|
||||
- Felix Beck
|
||||
@@ -60,6 +62,7 @@ List of all individuals having contributed content to s390-tools
|
||||
- Martin Schwidefsky
|
||||
- Maxim Shchetynin
|
||||
- Melissa Howland
|
||||
- Michael
|
||||
- Michael Ernst
|
||||
- Michael Holzheu
|
||||
- Michael Mueller
|
||||
@@ -74,9 +77,11 @@ List of all individuals having contributed content to s390-tools
|
||||
- Ralph Wuerthner
|
||||
- Rene Trumpp
|
||||
- Rolf Schaefer
|
||||
- root
|
||||
- Sa Liu
|
||||
- Sascha Silbe
|
||||
- Sebastian Ott
|
||||
- Seshagiri N Ippili
|
||||
- Seshagiri N. Ippili
|
||||
- Simon Sturm
|
||||
- Stefan Bader
|
||||
|
||||
13
CHANGELOG.md
13
CHANGELOG.md
@@ -1,6 +1,19 @@
|
||||
Release history for s390-tools (MIT version)
|
||||
--------------------------------------------
|
||||
|
||||
* __v2.3.0 (2018-01-30)__
|
||||
|
||||
For Linux kernel version: 4.15
|
||||
|
||||
Changes of existing tools:
|
||||
- lscpumf: Add support for IBM z14 hardware counters
|
||||
- libdasd: Introduce libdasd and use for dasd tools
|
||||
- zipl: Always build and link without PIE
|
||||
|
||||
Bug Fixes:
|
||||
- zgetdump: Fix handling of DASD multi-volume dump for partitions above 4 GB
|
||||
- zdev: Fix zdev dracut module aborting on unknown root device
|
||||
|
||||
* __v2.2.0 (2017-12-07)__
|
||||
|
||||
For Linux kernel version: 4.14
|
||||
|
||||
14
common.mak
14
common.mak
@@ -5,7 +5,7 @@ COMMON_INCLUDED = true
|
||||
# The variable "DISTRELEASE" should be overwritten in rpm spec files with:
|
||||
# "make DISTRELEASE=%{release}" and "make install DISTRELEASE=%{release}"
|
||||
VERSION = 2
|
||||
RELEASE = 2
|
||||
RELEASE = 3
|
||||
PATCHLEVEL = 0
|
||||
DISTRELEASE = build-$(shell date +%Y%m%d)
|
||||
S390_TOOLS_RELEASE = $(VERSION).$(RELEASE).$(PATCHLEVEL)-$(DISTRELEASE)
|
||||
@@ -218,12 +218,22 @@ endif
|
||||
export AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP INSTALL CFLAGS CXXFLAGS \
|
||||
LDFLAGS CPPFLAGS ALL_CFLAGS ALL_CXXFLAGS ALL_LDFLAGS ALL_CPPFLAGS
|
||||
|
||||
ifneq ($(shell $(CC_SILENT) -dumpspecs 2>/dev/null | grep -e '[^f]no-pie'),)
|
||||
NO_PIE_CFLAGS := -fno-pie
|
||||
NO_PIE_LINKFLAGS := -no-pie
|
||||
NO_PIE_LDFLAGS := -no-pie
|
||||
else
|
||||
NO_PIE_CFLAGS :=
|
||||
NO_PIE_LINKFLAGS :=
|
||||
NO_PIE_LDFLAGS :=
|
||||
endif
|
||||
|
||||
# Overwrite implicite makefile rules for having nice compile output
|
||||
%.o: %.c
|
||||
$(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c $< -o $@
|
||||
ifeq ("${C}","1")
|
||||
$(CHECKTOOL) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c $< -o $@
|
||||
endif
|
||||
$(CC) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c $< -o $@
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) $(ALL_CPPFLAGS) $(ALL_CXXFLAGS) -c $< -o $@
|
||||
|
||||
@@ -4,10 +4,12 @@ include ../common.mak
|
||||
|
||||
|
||||
CPUMF_DATADIR = $(TOOLS_DATADIR)/cpumf
|
||||
DATA_FILES = cpum-cf-hw-counter.map cpum-cf-generic.ctr \
|
||||
DATA_FILES = cpum-cf-hw-counter.map \
|
||||
cpum-cf-cfvn-1.ctr cpum-cf-cfvn-3.ctr \
|
||||
cpum-cf-csvn-generic.ctr \
|
||||
cpum-cf-extended-z10.ctr cpum-cf-extended-z196.ctr \
|
||||
cpum-cf-extended-zEC12.ctr cpum-sf-modes.ctr \
|
||||
cpum-cf-extended-z13.ctr
|
||||
cpum-cf-extended-z13.ctr cpum-cf-extended-z14.ctr
|
||||
LIB_FILES = bin/cpumf_helper
|
||||
USRBIN_SCRIPTS = bin/lscpumf
|
||||
USRSBIN_SCRIPTS = bin/chcpumf
|
||||
|
||||
@@ -210,6 +210,7 @@ my $system_z_hwtype_map = {
|
||||
2828 => 'IBM zEnterprise BC12',
|
||||
2964 => 'IBM z13',
|
||||
2965 => 'IBM z13s',
|
||||
3906 => 'IBM z14',
|
||||
};
|
||||
|
||||
sub get_hardware_type()
|
||||
@@ -228,6 +229,28 @@ sub get_hardware_type()
|
||||
return $type;
|
||||
}
|
||||
|
||||
sub get_cpum_cf_version()
|
||||
{
|
||||
my $SL;
|
||||
|
||||
my $v = {
|
||||
cfvn => 0,
|
||||
csvn => 0,
|
||||
};
|
||||
|
||||
return $v unless open($SL, '<', $SERVICE_LEVELS);
|
||||
while (my $line = <$SL>) {
|
||||
# CPU-MF: Counter facility: version=3.5
|
||||
if ($line =~ m/^CPU-MF: Counter facility: version=(\d+)\.(\d+)/) {
|
||||
$v->{cfvn} = $1; # Counter First Version Number
|
||||
$v->{csvn} = $2; # Counter Second Version Number
|
||||
last;
|
||||
}
|
||||
}
|
||||
close($SL);
|
||||
return $v
|
||||
}
|
||||
|
||||
sub cpumf_load_ctrdef($;$)
|
||||
{
|
||||
my $hw_type = shift();
|
||||
@@ -236,10 +259,20 @@ sub cpumf_load_ctrdef($;$)
|
||||
my $ctrmap = cpumf_hardware_counter_map();
|
||||
return unless $ctrmap;
|
||||
|
||||
# Obtain CPU-MF counter facility versions
|
||||
my $version = get_cpum_cf_version();
|
||||
|
||||
# List of "generic" counter sets
|
||||
my @def = ();
|
||||
push @def, "cfvn-" . $version->{cfvn};
|
||||
push @def, "csvn-generic";
|
||||
|
||||
my $h = {};
|
||||
# Load generic counter sets
|
||||
cpumf_parse_ctrdef($ctrmap->{0}, $h) or
|
||||
croak "Failed to read generic counter definition: $!\n";
|
||||
# Load counter set definition
|
||||
foreach my $ent (@def) {
|
||||
cpumf_parse_ctrdef($ctrmap->{$ent}, $h) or
|
||||
croak "Failed to read counter definition for $ent: $!\n";
|
||||
}
|
||||
# Load hardware model specific counter set(s)
|
||||
if ($hw_type && $ctrmap->{$hw_type}) {
|
||||
# Hardware-model specific counter sets are:
|
||||
@@ -322,7 +355,7 @@ sub cpumf_helper_main()
|
||||
GetOptions(
|
||||
"i|info" => \$conf->{opt_info},
|
||||
"c|counter=i" => \$conf->{opt_ctr},
|
||||
"ctr-def=i" => \$conf->{opt_ctrdef},
|
||||
"ctr-def=s" => \$conf->{opt_ctrdef},
|
||||
"hardware-type" => \$conf->{opt_hwtype},
|
||||
"ctr-set-names" => \$conf->{opt_ctrset_names},
|
||||
"ctr-set-ids" => \$conf->{opt_ctrset_ids},
|
||||
@@ -427,11 +460,13 @@ B<--ctr-def> option and specify the System z hardware type.
|
||||
|
||||
Displays the System z hardware type.
|
||||
|
||||
=item B<--ctr-def> I<hardware_type>
|
||||
=item B<--ctr-def> I<ctr-definition>
|
||||
|
||||
Displays detailed information about a particular counter set for the specified
|
||||
System z hardware type, I<hardware_type>. If you specify zero for
|
||||
I<hardware_type>, type-independent counter sets are displayed.
|
||||
Displays detailed information about the specified counter definition.
|
||||
Valid counter definitions start with C<cfvn-> or <csvn-> followed by
|
||||
the counter first/second version number of the CPU-Measurement Counter
|
||||
Facility. To display counter information of model-specific counter
|
||||
sets, specify the System z hardware type for I<ctr-definition>.
|
||||
|
||||
=item B<--ctr-set-names>
|
||||
|
||||
|
||||
48
cpumf/data/cpum-cf-cfvn-1.ctr
Normal file
48
cpumf/data/cpum-cf-cfvn-1.ctr
Normal file
@@ -0,0 +1,48 @@
|
||||
Counter: 0 Name:CPU_CYCLES
|
||||
Description:
|
||||
Cycle Count
|
||||
.
|
||||
Counter: 1 Name:INSTRUCTIONS
|
||||
Description:
|
||||
Instruction Count
|
||||
.
|
||||
Counter: 2 Name:L1I_DIR_WRITES
|
||||
Description:
|
||||
Level-1 I-Cache Directory Write Count
|
||||
.
|
||||
Counter: 3 Name:L1I_PENALTY_CYCLES
|
||||
Description:
|
||||
Level-1 I-Cache Penalty Cycle Count
|
||||
.
|
||||
Counter: 4 Name:L1D_DIR_WRITES
|
||||
Description:
|
||||
Level-1 D-Cache Directory Write Count
|
||||
.
|
||||
Counter: 5 Name:L1D_PENALTY_CYCLES
|
||||
Description:
|
||||
Level-1 D-Cache Penalty Cycle Count
|
||||
.
|
||||
Counter: 32 Name:PROBLEM_STATE_CPU_CYCLES
|
||||
Description:
|
||||
Problem-State Cycle Count
|
||||
.
|
||||
Counter: 33 Name:PROBLEM_STATE_INSTRUCTIONS
|
||||
Description:
|
||||
Problem-State Instruction Count
|
||||
.
|
||||
Counter: 34 Name:PROBLEM_STATE_L1I_DIR_WRITES
|
||||
Description:
|
||||
Problem-State Level-1 I-Cache Directory Write Count
|
||||
.
|
||||
Counter: 35 Name:PROBLEM_STATE_L1I_PENALTY_CYCLES
|
||||
Description:
|
||||
Problem-State Level-1 I-Cache Penalty Cycle Count
|
||||
.
|
||||
Counter: 36 Name:PROBLEM_STATE_L1D_DIR_WRITES
|
||||
Description:
|
||||
Problem-State Level-1 D-Cache Directory Write Count
|
||||
.
|
||||
Counter: 37 Name:PROBLEM_STATE_L1D_PENALTY_CYCLES
|
||||
Description:
|
||||
Problem-State Level-1 D-Cache Penalty Cycle Count
|
||||
.
|
||||
32
cpumf/data/cpum-cf-cfvn-3.ctr
Normal file
32
cpumf/data/cpum-cf-cfvn-3.ctr
Normal file
@@ -0,0 +1,32 @@
|
||||
Counter: 0 Name:CPU_CYCLES
|
||||
Description:
|
||||
Cycle Count
|
||||
.
|
||||
Counter: 1 Name:INSTRUCTIONS
|
||||
Description:
|
||||
Instruction Count
|
||||
.
|
||||
Counter: 2 Name:L1I_DIR_WRITES
|
||||
Description:
|
||||
Level-1 I-Cache Directory Write Count
|
||||
.
|
||||
Counter: 3 Name:L1I_PENALTY_CYCLES
|
||||
Description:
|
||||
Level-1 I-Cache Penalty Cycle Count
|
||||
.
|
||||
Counter: 4 Name:L1D_DIR_WRITES
|
||||
Description:
|
||||
Level-1 D-Cache Directory Write Count
|
||||
.
|
||||
Counter: 5 Name:L1D_PENALTY_CYCLES
|
||||
Description:
|
||||
Level-1 D-Cache Penalty Cycle Count
|
||||
.
|
||||
Counter: 32 Name:PROBLEM_STATE_CPU_CYCLES
|
||||
Description:
|
||||
Problem-State Cycle Count
|
||||
.
|
||||
Counter: 33 Name:PROBLEM_STATE_INSTRUCTIONS
|
||||
Description:
|
||||
Problem-State Instruction Count
|
||||
.
|
||||
@@ -1,51 +1,3 @@
|
||||
Counter: 0 Name:CPU_CYCLES
|
||||
Description:
|
||||
Cycle Count
|
||||
.
|
||||
Counter: 1 Name:INSTRUCTIONS
|
||||
Description:
|
||||
Instruction Count
|
||||
.
|
||||
Counter: 2 Name:L1I_DIR_WRITES
|
||||
Description:
|
||||
Level-1 I-Cache Directory Write Count
|
||||
.
|
||||
Counter: 3 Name:L1I_PENALTY_CYCLES
|
||||
Description:
|
||||
Level-1 I-Cache Penalty Cycle Count
|
||||
.
|
||||
Counter: 4 Name:L1D_DIR_WRITES
|
||||
Description:
|
||||
Level-1 D-Cache Directory Write Count
|
||||
.
|
||||
Counter: 5 Name:L1D_PENALTY_CYCLES
|
||||
Description:
|
||||
Level-1 D-Cache Penalty Cycle Count
|
||||
.
|
||||
Counter: 32 Name:PROBLEM_STATE_CPU_CYCLES
|
||||
Description:
|
||||
Problem-State Cycle Count
|
||||
.
|
||||
Counter: 33 Name:PROBLEM_STATE_INSTRUCTIONS
|
||||
Description:
|
||||
Problem-State Instruction Count
|
||||
.
|
||||
Counter: 34 Name:PROBLEM_STATE_L1I_DIR_WRITES
|
||||
Description:
|
||||
Problem-State Level-1 I-Cache Directory Write Count
|
||||
.
|
||||
Counter: 35 Name:PROBLEM_STATE_L1I_PENALTY_CYCLES
|
||||
Description:
|
||||
Problem-State Level-1 I-Cache Penalty Cycle Count
|
||||
.
|
||||
Counter: 36 Name:PROBLEM_STATE_L1D_DIR_WRITES
|
||||
Description:
|
||||
Problem-State Level-1 D-Cache Directory Write Count
|
||||
.
|
||||
Counter: 37 Name:PROBLEM_STATE_L1D_PENALTY_CYCLES
|
||||
Description:
|
||||
Problem-State Level-1 D-Cache Penalty Cycle Count
|
||||
.
|
||||
Counter: 64 Name:PRNG_FUNCTIONS
|
||||
Description:
|
||||
Total number of the PRNG functions issued by the CPU
|
||||
303
cpumf/data/cpum-cf-extended-z14.ctr
Normal file
303
cpumf/data/cpum-cf-extended-z14.ctr
Normal file
@@ -0,0 +1,303 @@
|
||||
# Counter decriptions for the
|
||||
# IBM z14 extended counter and MT-diagnostic counter set
|
||||
#
|
||||
# Notes for transactional-execution mode symbolic names:
|
||||
# TX .. transactional-execution mode
|
||||
# NC .. nonconstrained
|
||||
# C .. constrained
|
||||
#
|
||||
# Undefined counters in the extended counter set:
|
||||
# 142
|
||||
# 158-161
|
||||
# 176-223
|
||||
# 227-231
|
||||
# 233-242
|
||||
# 246-255
|
||||
# Undefined counters in the MT-diagnostic counter set:
|
||||
# 450-495
|
||||
#
|
||||
#
|
||||
# Extended Counter Set
|
||||
# ---------------------------------------------------------------------
|
||||
Counter:128 Name:L1D_WRITES_RO_EXCL
|
||||
A directory write to the Level-1 Data cache where the line was
|
||||
originally in a Read-Only state in the cache but has been updated
|
||||
to be in the Exclusive state that allows stores to the cache line
|
||||
.
|
||||
Counter:129 Name:DTLB2_WRITES
|
||||
Description:
|
||||
A translation has been written into The Translation Lookaside
|
||||
Buffer 2 (TLB2) and the request was made by the data cache
|
||||
.
|
||||
Counter:130 Name:DTLB2_MISSES
|
||||
Description:
|
||||
A TLB2 miss is in progress for a request made by the data cache.
|
||||
Incremented by one for every TLB2 miss in progress for the Level-1
|
||||
Data cache on this cycle
|
||||
.
|
||||
Counter:131 Name:DTLB2_HPAGE_WRITES
|
||||
Description:
|
||||
A translation entry was written into the Combined Region and Segment
|
||||
Table Entry array in the Level-2 TLB for a one-megabyte page or a
|
||||
Last Host Translation was done
|
||||
.
|
||||
Counter:132 Name:DTLB2_GPAGE_WRITES
|
||||
Description:
|
||||
A translation entry for a two-gigabyte page was written into the
|
||||
Level-2 TLB
|
||||
.
|
||||
Counter:133 Name:L1D_L2D_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the
|
||||
returned cache line was sourced from the Level-2 Data cache
|
||||
.
|
||||
Counter:134 Name:ITLB2_WRITES
|
||||
Description:
|
||||
A translation entry has been written into the Translation Lookaside
|
||||
Buffer 2 (TLB2) and the request was made by the instruction cache
|
||||
.
|
||||
Counter:135 Name:ITLB2_MISSES
|
||||
Description:
|
||||
A TLB2 miss is in progress for a request made by the instruction cache.
|
||||
Incremented by one for every TLB2 miss in progress for the Level-1
|
||||
Instruction cache in a cycle
|
||||
.
|
||||
Counter:136 Name:L1I_L2I_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from the Level-2 Instruction cache
|
||||
.
|
||||
Counter:137 Name:TLB2_PTE_WRITES
|
||||
Description:
|
||||
A translation entry was written into the Page Table Entry array in the
|
||||
Level-2 TLB
|
||||
.
|
||||
Counter:138 Name:TLB2_CRSTE_WRITES
|
||||
Description:
|
||||
Translation entries were written into the Combined Region and Segment
|
||||
Table Entry array and the Page Table Entry array in the Level-2 TLB
|
||||
.
|
||||
Counter:139 Name:TLB2_ENGINES_BUSY
|
||||
Description:
|
||||
The number of Level-2 TLB translation engines busy in a cycle
|
||||
.
|
||||
Counter:140 Name:TX_C_TEND
|
||||
Description:
|
||||
A TEND instruction has completed in a constrained transactional-execution
|
||||
mode
|
||||
.
|
||||
Counter:141 Name:TX_NC_TEND
|
||||
Description:
|
||||
A TEND instruction has completed in a non-constrained
|
||||
transactional-execution mode
|
||||
.
|
||||
Counter:143 Name:L1C_TLB2_MISSES
|
||||
Description:
|
||||
Increments by one for any cycle where a level-1 cache or level-2 TLB miss
|
||||
is in progress
|
||||
.
|
||||
Counter:144 Name:L1D_ONCHIP_L3_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from an On-Chip Level-3 cache without intervention
|
||||
.
|
||||
Counter:145 Name:L1D_ONCHIP_MEMORY_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from On-Chip memory
|
||||
.
|
||||
Counter:146 Name:L1D_ONCHIP_L3_SOURCED_WRITES_IV
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from an On-Chip Level-3 cache with intervention
|
||||
.
|
||||
Counter:147 Name:L1D_ONCLUSTER_L3_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from On-Cluster Level-3 cache withountervention
|
||||
.
|
||||
Counter:148 Name:L1D_ONCLUSTER_MEMORY_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from an On-Cluster memory
|
||||
.
|
||||
Counter:149 Name:L1D_ONCLUSTER_L3_SOURCED_WRITES_IV
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from an On-Cluster Level-3 cache with intervention
|
||||
.
|
||||
Counter:150 Name:L1D_OFFCLUSTER_L3_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from an Off-Cluster Level-3 cache without
|
||||
intervention
|
||||
.
|
||||
Counter:151 Name:L1D_OFFCLUSTER_MEMORY_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from Off-Cluster memory
|
||||
.
|
||||
Counter:152 Name:L1D_OFFCLUSTER_L3_SOURCED_WRITES_IV
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from an Off-Cluster Level-3 cache with intervention
|
||||
.
|
||||
Counter:153 Name:L1D_OFFDRAWER_L3_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from an Off-Drawer Level-3 cache without
|
||||
intervention
|
||||
.
|
||||
Counter:154 Name:L1D_OFFDRAWER_MEMORY_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from Off-Drawer memory
|
||||
.
|
||||
Counter:155 Name:L1D_OFFDRAWER_L3_SOURCED_WRITES_IV
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from an Off-Drawer Level-3 cache with intervention
|
||||
.
|
||||
Counter:156 Name:L1D_ONDRAWER_L4_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from On-Drawer Level-4 cache
|
||||
.
|
||||
Counter:157 Name:L1D_OFFDRAWER_L4_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from Off-Drawer Level-4 cache
|
||||
.
|
||||
Counter:158 Name:L1D_ONCHIP_L3_SOURCED_WRITES_RO
|
||||
Description:
|
||||
A directory write to the Level-1 Data cache directory where the returned
|
||||
cache line was sourced from On-Chip L3 but a read-only invalidate was
|
||||
done to remove other copies of the cache line
|
||||
.
|
||||
Counter:162 Name:L1I_ONCHIP_L3_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache ine was sourced from an On-Chip Level-3 cache without
|
||||
intervention
|
||||
.
|
||||
Counter:163 Name:L1I_ONCHIP_MEMORY_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache ine was sourced from On-Chip memory
|
||||
.
|
||||
Counter:164 Name:L1I_ONCHIP_L3_SOURCED_WRITES_IV
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache ine was sourced from an On-Chip Level-3 cache with
|
||||
intervention
|
||||
.
|
||||
Counter:165 Name:L1I_ONCLUSTER_L3_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from an On-Cluster Level-3 cache without
|
||||
intervention
|
||||
.
|
||||
Counter:166 Name:L1I_ONCLUSTER_MEMORY_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from an On-Cluster memory
|
||||
.
|
||||
Counter:167 Name:L1I_ONCLUSTER_L3_SOURCED_WRITES_IV
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from On-Cluster Level-3 cache with
|
||||
intervention
|
||||
.
|
||||
Counter:168 Name:L1I_OFFCLUSTER_L3_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from an Off-Cluster Level-3 cache without
|
||||
intervention
|
||||
.
|
||||
Counter:169 Name:L1I_OFFCLUSTER_MEMORY_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from Off-Cluster memory
|
||||
.
|
||||
Counter:170 Name:L1I_OFFCLUSTER_L3_SOURCED_WRITES_IV
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from an Off-Cluster Level-3 cache with
|
||||
intervention
|
||||
.
|
||||
Counter:171 Name:L1I_OFFDRAWER_L3_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from an Off-Drawer Level-3 cache without
|
||||
intervention
|
||||
.
|
||||
Counter:172 Name:L1I_OFFDRAWER_MEMORY_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from Off-Drawer memory
|
||||
.
|
||||
Counter:173 Name:L1I_OFFDRAWER_L3_SOURCED_WRITES_IV
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from an Off-Drawer Level-3 cache with
|
||||
intervention
|
||||
.
|
||||
Counter:174 Name:L1I_ONDRAWER_L4_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from On-Drawer Level-4 cache
|
||||
.
|
||||
Counter:175 Name:L1I_OFFDRAWER_L4_SOURCED_WRITES
|
||||
Description:
|
||||
A directory write to the Level-1 Instruction cache directory where the
|
||||
returned cache line was sourced from Off-Drawer Level-4 cache
|
||||
.
|
||||
Counter:224 Name:BCD_DFP_EXECUTION_SLOTS
|
||||
Description:
|
||||
Count of floating point execution slots used for finished Binary Coded
|
||||
Decimal to Decimal Floating Point conversions. Instructions: CDZT,
|
||||
CXZT, CZDT, CZXT
|
||||
.
|
||||
Counter:225 Name:VX_BCD_EXECUTION_SLOTS
|
||||
Description:
|
||||
Count of floating point execution slots used for finished vector arithmetic
|
||||
Binary Coded Decimal instructions. Instructions: VAP, VSP, VMPVMSP, VDP,
|
||||
VSDP, VRP, VLIP, VSRP, VPSOPVCP, VTP, VPKZ, VUPKZ, VCVB, VCVBG, VCVDVCVDG
|
||||
.
|
||||
Counter:226 Name:DECIMAL_INSTRUCTIONS
|
||||
Description:
|
||||
Decimal instructions dispatched. Instructions: CVB, CVD, AP, CP, DP, ED,
|
||||
EDMK, MP, SRP, SP, ZAP
|
||||
.
|
||||
Counter:232 Name:LAST_HOST_TRANSLATIONS
|
||||
Description:
|
||||
Last Host Translation done
|
||||
.
|
||||
Counter:243 Name:TX_NC_TABORT
|
||||
Description:
|
||||
A transaction abort has occurred in a non-constrained
|
||||
transactional-execution mode
|
||||
.
|
||||
Counter:244 Name:TX_C_TABORT_NO_SPECIAL
|
||||
Description:
|
||||
A transaction abort has occurred in a constrained transactional-execution
|
||||
mode and the CPU is not using any special logic to allow the transaction
|
||||
to complete
|
||||
.
|
||||
Counter:245 Name:TX_C_TABORT_SPECIAL
|
||||
Description:
|
||||
A transaction abort has occurred in a constrained transactional-execution
|
||||
mode and the CPU is using special logic to allow the transaction to
|
||||
complete
|
||||
.
|
||||
#
|
||||
# MT-diagnostic counter set
|
||||
# ---------------------------------------------------------------------
|
||||
Counter:448 Name:MT_DIAG_CYCLES_ONE_THR_ACTIVE
|
||||
Description:
|
||||
Cycle count with one thread active
|
||||
.
|
||||
Counter:449 Name:MT_DIAG_CYCLES_TWO_THR_ACTIVE
|
||||
Description:
|
||||
Cycle count with two threads active
|
||||
.
|
||||
@@ -1,11 +1,22 @@
|
||||
# CPU-measurement facilities
|
||||
#
|
||||
# Mapping of IBM System z hardware types to extended counter set defintions
|
||||
# Mapping of:
|
||||
# 1. CPU-MF counter first/second version numbers to "generic" counter
|
||||
# definitions
|
||||
# 2. IBM z Systems hardware to respective extended counter set definitions
|
||||
#
|
||||
#
|
||||
{
|
||||
# Definition # File name
|
||||
0 => 'cpum-cf-generic.ctr',
|
||||
|
||||
# CFVN
|
||||
'cfvn-1' => 'cpum-cf-cfvn-1.ctr',
|
||||
'cfvn-3' => 'cpum-cf-cfvn-3.ctr',
|
||||
|
||||
# CSVN
|
||||
'csvn-generic' => 'cpum-cf-csvn-generic.ctr',
|
||||
|
||||
# Extended counters
|
||||
2097 => 'cpum-cf-extended-z10.ctr',
|
||||
2098 => 'cpum-cf-extended-z10.ctr',
|
||||
2817 => 'cpum-cf-extended-z196.ctr',
|
||||
@@ -14,4 +25,5 @@
|
||||
2828 => 'cpum-cf-extended-zEC12.ctr',
|
||||
2964 => 'cpum-cf-extended-z13.ctr',
|
||||
2965 => 'cpum-cf-extended-z13.ctr',
|
||||
3906 => 'cpum-cf-extended-z14.ctr',
|
||||
};
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
* dasdfmt - Format DASD ECKD devices for use by Linux
|
||||
*
|
||||
* Copyright IBM Corp. 1999, 2017
|
||||
* Copyright Red Hat Inc. 2017
|
||||
*
|
||||
* s390-tools is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See LICENSE for details.
|
||||
@@ -12,6 +13,7 @@
|
||||
#include <sys/time.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#include "lib/dasd_base.h"
|
||||
#include "lib/dasd_sys.h"
|
||||
#include "lib/util_opt.h"
|
||||
#include "lib/util_prg.h"
|
||||
@@ -26,6 +28,7 @@
|
||||
#define SEC_PER_HOUR (60 * 60)
|
||||
|
||||
static int filedes;
|
||||
static char dev_filename[PATH_MAX];
|
||||
static int disk_disabled;
|
||||
static format_data_t format_params;
|
||||
static format_mode_t mode;
|
||||
@@ -33,7 +36,6 @@ static char *prog_name;
|
||||
static volatile sig_atomic_t program_interrupt_in_progress;
|
||||
static int reqsize;
|
||||
|
||||
|
||||
static const struct util_prg prg = {
|
||||
.desc = "Use dasdfmt to format a DASD ECKD device for use by Linux.\n"
|
||||
"DEVICE is the node of the device (e.g. '/dev/dasda').",
|
||||
@@ -265,24 +267,6 @@ static void draw_progress(dasdfmt_info_t *info, int cyl, unsigned int cylinders,
|
||||
}
|
||||
}
|
||||
|
||||
static int reread_partition_table(void)
|
||||
{
|
||||
int i = 0;
|
||||
int rc = -1;
|
||||
|
||||
/* If the BLKRRPART ioctl fails, it is most likely due to
|
||||
the device just beeing in use by udev. So it is worthwhile
|
||||
to retry the ioctl after a second as it is likely to succeed.
|
||||
*/
|
||||
while (rc && (i < 5)) {
|
||||
++i;
|
||||
rc = ioctl(filedes, BLKRRPART, NULL);
|
||||
if (rc)
|
||||
sleep(1);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function for recs_per_track.
|
||||
*/
|
||||
@@ -312,16 +296,18 @@ static unsigned int recs_per_track(struct dasd_eckd_characteristics *rdc,
|
||||
kn = ceil_quot(kl + 6, 232) + 1;
|
||||
return 1729 / (10 + 9 + ceil_quot(kl + 6 * kn, 34) +
|
||||
9 + ceil_quot(dl + 6 * dn, 34));
|
||||
} else
|
||||
} else {
|
||||
return 1729 / (10 + 9 + ceil_quot(dl + 6 * dn, 34));
|
||||
}
|
||||
case 0x9345:
|
||||
dn = ceil_quot(dl + 6, 232) + 1;
|
||||
if (kl) {
|
||||
kn = ceil_quot(kl + 6, 232) + 1;
|
||||
return 1420 / (18 + 7 + ceil_quot(kl + 6 * kn, 34) +
|
||||
ceil_quot(dl + 6 * dn, 34));
|
||||
} else
|
||||
} else {
|
||||
return 1420 / (18 + 7 + ceil_quot(dl + 6 * dn, 34));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -404,7 +390,7 @@ static void evaluate_format_error(dasdfmt_info_t *info, format_check_t *cdata,
|
||||
break;
|
||||
case DASD_FMT_ERR_RECORD_ID:
|
||||
ERRMSG("Invalid record ID at cyl: %d trk: %d rec: %d.\n",
|
||||
cyl, head, cdata->rec);
|
||||
cyl, head, cdata->rec);
|
||||
break;
|
||||
case DASD_FMT_ERR_KEY_LENGTH:
|
||||
ERRMSG("Invalid key length (found %d, expected %d) "
|
||||
@@ -414,6 +400,30 @@ static void evaluate_format_error(dasdfmt_info_t *info, format_check_t *cdata,
|
||||
}
|
||||
}
|
||||
|
||||
static void disk_enable(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = dasd_disk_enable(filedes);
|
||||
if (err != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: (prepare device) IOCTL "
|
||||
"BIODASDENABLE failed (%s)\n", prog_name,
|
||||
strerror(err));
|
||||
disk_disabled = 0;
|
||||
}
|
||||
|
||||
static void disk_disable(const char *device)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = dasd_disk_disable(device, &filedes);
|
||||
if (err != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: (prepare device) IOCTL "
|
||||
"BIODASDDISABLE failed. (%s)\n", prog_name,
|
||||
strerror(err));
|
||||
disk_disabled = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* signal handler:
|
||||
* enables the disk again in case of SIGTERM, SIGINT and SIGQUIT
|
||||
@@ -428,27 +438,18 @@ static void program_interrupt_signal(int sig)
|
||||
|
||||
if (disk_disabled) {
|
||||
printf("Re-accessing the device...\n");
|
||||
rc = ioctl(filedes, BIODASDENABLE, &format_params);
|
||||
if (rc)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: (signal handler) IOCTL "
|
||||
"BIODASDENABLE failed (%s)\n", prog_name,
|
||||
strerror(errno));
|
||||
disk_enable();
|
||||
}
|
||||
|
||||
printf("Rereading the partition table...\n");
|
||||
rc = reread_partition_table();
|
||||
rc = dasd_reread_partition_table(dev_filename, 5);
|
||||
if (rc) {
|
||||
ERRMSG("%s: (signal handler) Re-reading partition table "
|
||||
"failed. (%s)\n", prog_name, strerror(errno));
|
||||
"failed. (%s)\n", prog_name, strerror(rc));
|
||||
} else {
|
||||
printf("Exiting...\n");
|
||||
}
|
||||
|
||||
rc = close(filedes);
|
||||
if (rc)
|
||||
ERRMSG("%s: (signal handler) Unable to close device (%s)\n",
|
||||
prog_name, strerror(errno));
|
||||
|
||||
signal(sig, SIG_DFL);
|
||||
raise(sig);
|
||||
}
|
||||
@@ -497,30 +498,15 @@ static void get_device_name(char *devname,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Retrieve DASD information
|
||||
*/
|
||||
static void get_device_info(dasdfmt_info_t *info)
|
||||
static void get_blocksize(const char *device, unsigned int *blksize)
|
||||
{
|
||||
dasd_information2_t dasd_info;
|
||||
int err;
|
||||
|
||||
if (ioctl(filedes, BIODASDINFO2, &dasd_info))
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: the ioctl call to retrieve "
|
||||
"device information failed (%s).\n",
|
||||
prog_name, strerror(errno));
|
||||
|
||||
info->dasd_info = dasd_info;
|
||||
}
|
||||
|
||||
/*
|
||||
* Retrieve blocksize of device
|
||||
*/
|
||||
static void get_blocksize(unsigned int *blksize)
|
||||
{
|
||||
if (ioctl(filedes, BLKSSZGET, blksize) != 0)
|
||||
err = dasd_get_blocksize(device, blksize);
|
||||
if (err != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: the ioctl to get the blocksize "
|
||||
"of the device failed (%s).\n", prog_name,
|
||||
strerror(errno));
|
||||
strerror(err));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -534,7 +520,7 @@ static void check_blocksize(dasdfmt_info_t *info, unsigned int blksize)
|
||||
info->dasd_info.format == DASD_FORMAT_NONE)
|
||||
return;
|
||||
|
||||
get_blocksize(&dev_blksize);
|
||||
get_blocksize(dev_filename, &dev_blksize);
|
||||
if (dev_blksize != blksize) {
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "WARNING: Device is formatted with a "
|
||||
"different blocksize (%d).\nUse --mode=full to "
|
||||
@@ -576,16 +562,15 @@ static void check_layout(dasdfmt_info_t *info, unsigned int intensity)
|
||||
*/
|
||||
static void check_disk(dasdfmt_info_t *info, char *devname)
|
||||
{
|
||||
int ro, errno_save;
|
||||
int err;
|
||||
bool ro;
|
||||
|
||||
if (ioctl(filedes, BLKROGET, &ro) != 0) {
|
||||
errno_save = errno;
|
||||
close(filedes);
|
||||
err = dasd_is_ro(devname, &ro);
|
||||
if (err != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE,
|
||||
"%s: the ioctl call to retrieve read/write "
|
||||
"status information failed (%s)\n",
|
||||
prog_name, strerror(errno_save));
|
||||
}
|
||||
prog_name, strerror(err));
|
||||
|
||||
if (ro)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "Disk is read only!\n");
|
||||
@@ -775,9 +760,11 @@ static format_check_t check_track_format(dasdfmt_info_t *info, format_data_t *p)
|
||||
.stop_unit = p->stop_unit
|
||||
}, 0
|
||||
};
|
||||
int err;
|
||||
|
||||
if (ioctl(filedes, BIODASDCHECKFMT, &cdata)) {
|
||||
if (errno == ENOTTY) {
|
||||
err = dasd_check_format(dev_filename, &cdata);
|
||||
if (err != 0) {
|
||||
if (err == ENOTTY) {
|
||||
ERRMSG("%s: Missing kernel support for format checking",
|
||||
prog_name);
|
||||
if (mode == EXPAND) {
|
||||
@@ -788,7 +775,7 @@ static format_check_t check_track_format(dasdfmt_info_t *info, format_data_t *p)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, ".\n");
|
||||
}
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Could no check format: %s\n",
|
||||
prog_name, strerror(errno));
|
||||
prog_name, strerror(err));
|
||||
}
|
||||
|
||||
return cdata;
|
||||
@@ -804,7 +791,7 @@ static int process_tracks(dasdfmt_info_t *info, unsigned int cylinders,
|
||||
format_data_t step = *format_params;
|
||||
unsigned long step_value;
|
||||
unsigned long cur_trk;
|
||||
int cyl = 0;
|
||||
int cyl = 0, err;
|
||||
|
||||
check_hashmarks(info);
|
||||
|
||||
@@ -827,10 +814,11 @@ static int process_tracks(dasdfmt_info_t *info, unsigned int cylinders,
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (ioctl(filedes, BIODASDFMT, &step) != 0)
|
||||
err = dasd_format_disk(filedes, &step);
|
||||
if (err != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: the ioctl call "
|
||||
"to format tracks failed. (%s)\n",
|
||||
prog_name, strerror(errno));
|
||||
prog_name, strerror(err));
|
||||
}
|
||||
|
||||
cyl = cur_trk / heads + 1;
|
||||
@@ -965,7 +953,7 @@ static int dasdfmt_get_volser(char *devname, dasd_information2_t *dasd_info,
|
||||
unsigned int blksize;
|
||||
volume_label_t vlabel;
|
||||
|
||||
get_blocksize(&blksize);
|
||||
get_blocksize(devname, &blksize);
|
||||
|
||||
if ((strncmp(dasd_info->type, "ECKD", 4) == 0) &&
|
||||
!dasd_info->FBA_layout) {
|
||||
@@ -992,25 +980,25 @@ static void dasdfmt_write_labels(dasdfmt_info_t *info, volume_label_t *vlabel,
|
||||
format5_label_t f5;
|
||||
format7_label_t f7;
|
||||
unsigned int blksize;
|
||||
int rc;
|
||||
int rc, fd;
|
||||
void *ipl1_record, *ipl2_record;
|
||||
int ipl1_record_len, ipl2_record_len;
|
||||
|
||||
|
||||
if (info->verbosity > 0)
|
||||
printf("Retrieving dasd information... ");
|
||||
|
||||
get_blocksize(&blksize);
|
||||
get_blocksize(dev_filename, &blksize);
|
||||
|
||||
/*
|
||||
* Don't rely on the cylinders returned by HDIO_GETGEO, they might be
|
||||
* to small. geo is only used to get the number of sectors, which may
|
||||
* vary depending on the format.
|
||||
*/
|
||||
if (ioctl(filedes, HDIO_GETGEO, &geo) != 0)
|
||||
rc = dasd_get_geo(dev_filename, &geo);
|
||||
if (rc != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: (write labels) IOCTL "
|
||||
"HDIO_GETGEO failed (%s).\n",
|
||||
prog_name, strerror(errno));
|
||||
prog_name, strerror(rc));
|
||||
|
||||
if (info->verbosity > 0)
|
||||
printf("ok\n");
|
||||
@@ -1036,26 +1024,40 @@ static void dasdfmt_write_labels(dasdfmt_info_t *info, volume_label_t *vlabel,
|
||||
ipl2_record_len = sizeof(ipl2.data);
|
||||
}
|
||||
|
||||
if (lseek(filedes, 0, SEEK_SET) != 0)
|
||||
fd = open(dev_filename, O_RDWR);
|
||||
if (fd < 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Unable to open device "
|
||||
"'%s' (%s)\n", prog_name, dev_filename,
|
||||
strerror(errno));
|
||||
|
||||
if (lseek(fd, 0, SEEK_SET) != 0) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: lseek command 0 failed "
|
||||
"(%s)\n", prog_name, strerror(errno));
|
||||
}
|
||||
|
||||
rc = write(filedes, ipl1_record, ipl1_record_len);
|
||||
if (rc != ipl1_record_len)
|
||||
rc = write(fd, ipl1_record, ipl1_record_len);
|
||||
if (rc != ipl1_record_len) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Writing the bootstrap IPL1 "
|
||||
"failed, only wrote %d bytes.\n", prog_name, rc);
|
||||
}
|
||||
|
||||
label_position = blksize;
|
||||
rc = lseek(filedes, label_position, SEEK_SET);
|
||||
if (rc != label_position)
|
||||
rc = lseek(fd, label_position, SEEK_SET);
|
||||
if (rc != label_position) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: lseek command to %i failed "
|
||||
"(%s).\n", prog_name, label_position,
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
rc = write(filedes, ipl2_record, ipl2_record_len);
|
||||
if (rc != ipl2_record_len)
|
||||
rc = write(fd, ipl2_record, ipl2_record_len);
|
||||
if (rc != ipl2_record_len) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Writing the bootstrap IPL2 "
|
||||
"failed, only wrote %d bytes.\n", prog_name, rc);
|
||||
}
|
||||
|
||||
/* write VTOC */
|
||||
vtoc_init_format4_label(&f4, geo.cylinders, cylinders, heads,
|
||||
@@ -1071,32 +1073,36 @@ static void dasdfmt_write_labels(dasdfmt_info_t *info, volume_label_t *vlabel,
|
||||
if (info->verbosity > 0)
|
||||
printf("Writing label...\n");
|
||||
|
||||
rc = lseek(filedes, label_position, SEEK_SET);
|
||||
if (rc != label_position)
|
||||
rc = lseek(fd, label_position, SEEK_SET);
|
||||
if (rc != label_position) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: lseek command to %i failed "
|
||||
"(%s).\n", prog_name, label_position,
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: cdl volume labels do not contain the 'formatted_blocks' part
|
||||
* and ldl labels do not contain the key field
|
||||
*/
|
||||
if (info->cdl_format) {
|
||||
rc = write(filedes, vlabel, (sizeof(*vlabel) -
|
||||
sizeof(vlabel->formatted_blocks)));
|
||||
rc = write(fd, vlabel, (sizeof(*vlabel) -
|
||||
sizeof(vlabel->formatted_blocks)));
|
||||
} else {
|
||||
vlabel->ldl_version = 0xf2; /* EBCDIC '2' */
|
||||
vlabel->formatted_blocks = cylinders * heads * geo.sectors;
|
||||
rc = write(filedes, &vlabel->vollbl, (sizeof(*vlabel)
|
||||
- sizeof(vlabel->volkey)));
|
||||
rc = write(fd, &vlabel->vollbl, (sizeof(*vlabel)
|
||||
- sizeof(vlabel->volkey)));
|
||||
}
|
||||
|
||||
if (((rc != sizeof(*vlabel) - sizeof(vlabel->formatted_blocks)) &&
|
||||
info->cdl_format) ||
|
||||
((rc != (sizeof(*vlabel) - sizeof(vlabel->volkey))) &&
|
||||
(!info->cdl_format)))
|
||||
!info->cdl_format)) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Error writing volume label "
|
||||
"(%d).\n", prog_name, rc);
|
||||
}
|
||||
|
||||
if (info->verbosity > 0)
|
||||
printf("Writing VTOC... ");
|
||||
@@ -1104,48 +1110,62 @@ static void dasdfmt_write_labels(dasdfmt_info_t *info, volume_label_t *vlabel,
|
||||
label_position = (VTOC_START_CC * heads + VTOC_START_HH) *
|
||||
geo.sectors * blksize;
|
||||
|
||||
rc = lseek(filedes, label_position, SEEK_SET);
|
||||
if (rc != label_position)
|
||||
rc = lseek(fd, label_position, SEEK_SET);
|
||||
if (rc != label_position) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: lseek command to %i failed "
|
||||
"(%s).\n", prog_name, label_position,
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
/* write VTOC FMT4 DSCB */
|
||||
rc = write(filedes, &f4, sizeof(format4_label_t));
|
||||
if (rc != sizeof(format4_label_t))
|
||||
rc = write(fd, &f4, sizeof(format4_label_t));
|
||||
if (rc != sizeof(format4_label_t)) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Error writing FMT4 label "
|
||||
"(%d).\n", prog_name, rc);
|
||||
}
|
||||
|
||||
label_position += blksize;
|
||||
|
||||
rc = lseek(filedes, label_position, SEEK_SET);
|
||||
if (rc != label_position)
|
||||
rc = lseek(fd, label_position, SEEK_SET);
|
||||
if (rc != label_position) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: lseek to %i failed (%s).\n",
|
||||
prog_name, label_position, strerror(errno));
|
||||
}
|
||||
|
||||
/* write VTOC FMT5 DSCB */
|
||||
rc = write(filedes, &f5, sizeof(format5_label_t));
|
||||
if (rc != sizeof(format5_label_t))
|
||||
rc = write(fd, &f5, sizeof(format5_label_t));
|
||||
if (rc != sizeof(format5_label_t)) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Error writing FMT5 label "
|
||||
"(%d).\n", prog_name, rc);
|
||||
}
|
||||
|
||||
if ((cylinders * heads) > BIG_DISK_SIZE) {
|
||||
label_position += blksize;
|
||||
|
||||
rc = lseek(filedes, label_position, SEEK_SET);
|
||||
if (rc != label_position)
|
||||
rc = lseek(fd, label_position, SEEK_SET);
|
||||
if (rc != label_position) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: lseek to %i failed "
|
||||
"(%s).\n", prog_name, label_position,
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
/* write VTOC FMT 7 DSCB (only on big disks) */
|
||||
rc = write(filedes, &f7, sizeof(format7_label_t));
|
||||
if (rc != sizeof(format7_label_t))
|
||||
rc = write(fd, &f7, sizeof(format7_label_t));
|
||||
if (rc != sizeof(format7_label_t)) {
|
||||
close(fd);
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Error writing FMT7 "
|
||||
"label (rc=%d).\n", prog_name, rc);
|
||||
}
|
||||
}
|
||||
|
||||
fsync(filedes);
|
||||
fsync(fd);
|
||||
|
||||
close(fd);
|
||||
|
||||
if (info->verbosity > 0)
|
||||
printf("ok\n");
|
||||
@@ -1225,27 +1245,25 @@ static void dasdfmt_prepare_and_format(dasdfmt_info_t *info,
|
||||
.intensity = ((p->intensity & ~DASD_FMT_INT_FMT_NOR0)
|
||||
| DASD_FMT_INT_INVAL)
|
||||
};
|
||||
int err;
|
||||
|
||||
if (!((info->withoutprompt) && (info->verbosity < 1)))
|
||||
if (!(info->withoutprompt && (info->verbosity < 1)))
|
||||
printf("Formatting the device. This may take a while "
|
||||
"(get yourself a coffee).\n");
|
||||
|
||||
if (info->verbosity > 0)
|
||||
printf("Detaching the device...\n");
|
||||
|
||||
if (ioctl(filedes, BIODASDDISABLE, p) != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: (prepare device) IOCTL "
|
||||
"BIODASDDISABLE failed. (%s)\n", prog_name,
|
||||
strerror(errno));
|
||||
disk_disabled = 1;
|
||||
disk_disable(dev_filename);
|
||||
|
||||
if (info->verbosity > 0)
|
||||
printf("Invalidate first track...\n");
|
||||
|
||||
if (ioctl(filedes, BIODASDFMT, &temp) != 0)
|
||||
err = dasd_format_disk(filedes, &temp);
|
||||
if (err != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: (invalidate first track) IOCTL "
|
||||
"BIODASDFMT failed. (%s)\n", prog_name,
|
||||
strerror(errno));
|
||||
strerror(err));
|
||||
|
||||
/* except track 0 from standard formatting procss */
|
||||
p->start_unit = 1;
|
||||
@@ -1260,19 +1278,16 @@ static void dasdfmt_prepare_and_format(dasdfmt_info_t *info,
|
||||
if (info->verbosity > 0)
|
||||
printf("Revalidate first track...\n");
|
||||
|
||||
if (ioctl(filedes, BIODASDFMT, &temp) != 0)
|
||||
err = dasd_format_disk(filedes, &temp);
|
||||
if (err != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: (re-validate first track) IOCTL"
|
||||
" BIODASDFMT failed (%s)\n", prog_name,
|
||||
strerror(errno));
|
||||
strerror(err));
|
||||
|
||||
if (info->verbosity > 0)
|
||||
printf("Re-accessing the device...\n");
|
||||
|
||||
if (ioctl(filedes, BIODASDENABLE, p) != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: (prepare device) IOCTL "
|
||||
"BIODASDENABLE failed. (%s)\n", prog_name,
|
||||
strerror(errno));
|
||||
disk_disabled = 0;
|
||||
disk_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1281,18 +1296,14 @@ static void dasdfmt_prepare_and_format(dasdfmt_info_t *info,
|
||||
static void dasdfmt_expand_format(dasdfmt_info_t *info, unsigned int cylinders,
|
||||
unsigned int heads, format_data_t *p)
|
||||
{
|
||||
if (!((info->withoutprompt) && (info->verbosity < 1)))
|
||||
if (!(info->withoutprompt && (info->verbosity < 1)))
|
||||
printf("Formatting the device. This may take a while "
|
||||
"(get yourself a coffee).\n");
|
||||
|
||||
if (info->verbosity > 0)
|
||||
printf("Detaching the device...\n");
|
||||
|
||||
if (ioctl(filedes, BIODASDDISABLE, p) != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: (prepare device) IOCTL "
|
||||
"BIODASDDISABLE failed. (%s)\n", prog_name,
|
||||
strerror(errno));
|
||||
disk_disabled = 1;
|
||||
disk_disable(dev_filename);
|
||||
|
||||
dasdfmt_format(info, cylinders, heads, p);
|
||||
|
||||
@@ -1302,11 +1313,7 @@ static void dasdfmt_expand_format(dasdfmt_info_t *info, unsigned int cylinders,
|
||||
if (info->verbosity > 0)
|
||||
printf("Re-accessing the device...\n");
|
||||
|
||||
if (ioctl(filedes, BIODASDENABLE, p) != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: (prepare device) IOCTL "
|
||||
"BIODASDENABLE failed. (%s)\n", prog_name,
|
||||
strerror(errno));
|
||||
disk_disabled = 0;
|
||||
disk_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1318,6 +1325,7 @@ static void dasdfmt_quick_format(dasdfmt_info_t *info, unsigned int cylinders,
|
||||
{
|
||||
format_check_t cdata = { .expect = {0}, 0 };
|
||||
format_data_t tmp = *p;
|
||||
int err;
|
||||
|
||||
if (info->force) {
|
||||
printf("Skipping format check due to --force.\n");
|
||||
@@ -1344,25 +1352,20 @@ static void dasdfmt_quick_format(dasdfmt_info_t *info, unsigned int cylinders,
|
||||
}
|
||||
}
|
||||
|
||||
if (!((info->withoutprompt) && (info->verbosity < 1)))
|
||||
if (!(info->withoutprompt && (info->verbosity < 1)))
|
||||
printf("Formatting the first two tracks of the device.\n");
|
||||
|
||||
/* Disable the device before we do anything */
|
||||
if (ioctl(filedes, BIODASDDISABLE, p))
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: the ioctl to disable the device "
|
||||
"failed. (%s)\n", prog_name, strerror(errno));
|
||||
disk_disabled = 1;
|
||||
disk_disable(dev_filename);
|
||||
|
||||
/* Now do the actual formatting of our first two tracks */
|
||||
if (ioctl(filedes, BIODASDFMT, p))
|
||||
err = dasd_format_disk(filedes, p);
|
||||
if (err != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: the ioctl to format the device "
|
||||
"failed. (%s)\n", prog_name, strerror(errno));
|
||||
"failed. (%s)\n", prog_name, strerror(err));
|
||||
|
||||
/* Re-Enable the device so that we can continue working with it */
|
||||
if (ioctl(filedes, BIODASDENABLE, p))
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: the ioctl to enable the device "
|
||||
"failed. (%s)\n", prog_name, strerror(errno));
|
||||
disk_disabled = 0;
|
||||
disk_enable();
|
||||
}
|
||||
|
||||
static void do_format_dasd(dasdfmt_info_t *info, char *devname,
|
||||
@@ -1371,7 +1374,7 @@ static void do_format_dasd(dasdfmt_info_t *info, char *devname,
|
||||
unsigned int heads)
|
||||
{
|
||||
char inp_buffer[5];
|
||||
int count;
|
||||
int count, err;
|
||||
|
||||
p->start_unit = 0;
|
||||
|
||||
@@ -1448,9 +1451,10 @@ static void do_format_dasd(dasdfmt_info_t *info, char *devname,
|
||||
dasdfmt_write_labels(info, vlabel, cylinders, heads);
|
||||
|
||||
printf("Rereading the partition table... ");
|
||||
if (reread_partition_table()) {
|
||||
err = dasd_reread_partition_table(dev_filename, 5);
|
||||
if (err != 0) {
|
||||
ERRMSG("%s: error during rereading the partition "
|
||||
"table: %s.\n", prog_name, strerror(errno));
|
||||
"table: %s.\n", prog_name, strerror(err));
|
||||
} else {
|
||||
printf("ok\n");
|
||||
}
|
||||
@@ -1465,7 +1469,6 @@ int main(int argc, char *argv[])
|
||||
volume_label_t vlabel;
|
||||
char old_volser[7];
|
||||
|
||||
char dev_filename[PATH_MAX];
|
||||
char str[ERR_LENGTH];
|
||||
char buf[7];
|
||||
|
||||
@@ -1636,18 +1639,17 @@ int main(int argc, char *argv[])
|
||||
|
||||
get_device_name(dev_filename, optind, argc, argv);
|
||||
|
||||
filedes = open(dev_filename, O_RDWR);
|
||||
if (filedes == -1)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Unable to open device %s: %s\n",
|
||||
prog_name, dev_filename, strerror(errno));
|
||||
|
||||
get_device_info(&info);
|
||||
rc = dasd_get_info(dev_filename, &info.dasd_info);
|
||||
if (rc != 0)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: the ioctl call to retrieve "
|
||||
"device information failed (%s).\n",
|
||||
prog_name, strerror(rc));
|
||||
|
||||
/* Either let the user specify the blksize or get it from the kernel */
|
||||
if (!info.blksize_specified) {
|
||||
if (!(mode == FULL ||
|
||||
info.dasd_info.format == DASD_FORMAT_NONE) || info.check)
|
||||
get_blocksize(&format_params.blksize);
|
||||
get_blocksize(dev_filename, &format_params.blksize);
|
||||
else
|
||||
format_params = ask_user_for_blksize(format_params);
|
||||
}
|
||||
@@ -1686,9 +1688,5 @@ int main(int argc, char *argv[])
|
||||
do_format_dasd(&info, dev_filename, &vlabel,
|
||||
&format_params, cylinders, heads);
|
||||
|
||||
if (close(filedes) != 0)
|
||||
ERRMSG("%s: error during close: %s\ncontinuing...\n",
|
||||
prog_name, strerror(errno));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -31,120 +31,6 @@
|
||||
* SECTION: Definition needed for DASD-API (see dasd.h) *
|
||||
****************************************************************************/
|
||||
|
||||
#define DASD_IOCTL_LETTER 'D'
|
||||
|
||||
/*
|
||||
* struct dasd_information2_t
|
||||
* represents any data about the device, which is visible to userspace.
|
||||
* including format and features.
|
||||
*/
|
||||
typedef struct dasd_information2_t {
|
||||
unsigned int devno; /* S/390 devno */
|
||||
unsigned int real_devno; /* for aliases */
|
||||
unsigned int schid; /* S/390 subchannel identifier */
|
||||
unsigned int cu_type : 16; /* from SenseID */
|
||||
unsigned int cu_model : 8; /* from SenseID */
|
||||
unsigned int dev_type : 16; /* from SenseID */
|
||||
unsigned int dev_model : 8; /* from SenseID */
|
||||
unsigned int open_count;
|
||||
unsigned int req_queue_len;
|
||||
unsigned int chanq_len; /* length of chanq */
|
||||
char type[4]; /* from discipline.name, */
|
||||
/* 'none' for unknown */
|
||||
unsigned int status; /* current device level */
|
||||
unsigned int label_block; /* where to find the VOLSER */
|
||||
unsigned int FBA_layout; /* fixed block size (like AIXVOL) */
|
||||
unsigned int characteristics_size;
|
||||
unsigned int confdata_size;
|
||||
char characteristics[64]; /* from read_device_characteristics */
|
||||
char configuration_data[256]; /* from read_configuration_data */
|
||||
unsigned int format; /* format info like formatted/cdl/ldl/... */
|
||||
unsigned int features; /* dasd features like 'ro',... */
|
||||
unsigned int reserved0; /* reserved for further use ,... */
|
||||
unsigned int reserved1; /* reserved for further use ,... */
|
||||
unsigned int reserved2; /* reserved for further use ,... */
|
||||
unsigned int reserved3; /* reserved for further use ,... */
|
||||
unsigned int reserved4; /* reserved for further use ,... */
|
||||
unsigned int reserved5; /* reserved for further use ,... */
|
||||
unsigned int reserved6; /* reserved for further use ,... */
|
||||
unsigned int reserved7; /* reserved for further use ,... */
|
||||
} dasd_information2_t;
|
||||
|
||||
|
||||
struct dasd_eckd_characteristics {
|
||||
unsigned short cu_type;
|
||||
struct {
|
||||
unsigned char support:2;
|
||||
unsigned char async:1;
|
||||
unsigned char reserved:1;
|
||||
unsigned char cache_info:1;
|
||||
unsigned char model:3;
|
||||
} __attribute__ ((packed)) cu_model;
|
||||
unsigned short dev_type;
|
||||
unsigned char dev_model;
|
||||
struct {
|
||||
unsigned char mult_burst:1;
|
||||
unsigned char RT_in_LR:1;
|
||||
unsigned char reserved1:1;
|
||||
unsigned char RD_IN_LR:1;
|
||||
unsigned char reserved2:4;
|
||||
unsigned char reserved3:8;
|
||||
unsigned char defect_wr:1;
|
||||
unsigned char XRC_supported:1;
|
||||
unsigned char reserved4:1;
|
||||
unsigned char striping:1;
|
||||
unsigned char reserved5:4;
|
||||
unsigned char cfw:1;
|
||||
unsigned char reserved6:2;
|
||||
unsigned char cache:1;
|
||||
unsigned char dual_copy:1;
|
||||
unsigned char dfw:1;
|
||||
unsigned char reset_alleg:1;
|
||||
unsigned char sense_down:1;
|
||||
} __attribute__ ((packed)) facilities;
|
||||
unsigned char dev_class;
|
||||
unsigned char unit_type;
|
||||
unsigned short no_cyl;
|
||||
unsigned short trk_per_cyl;
|
||||
unsigned char sec_per_trk;
|
||||
unsigned char byte_per_track[3];
|
||||
unsigned short home_bytes;
|
||||
unsigned char formula;
|
||||
union {
|
||||
struct {
|
||||
unsigned char f1;
|
||||
unsigned short f2;
|
||||
unsigned short f3;
|
||||
} __attribute__ ((packed)) f_0x01;
|
||||
struct {
|
||||
unsigned char f1;
|
||||
unsigned char f2;
|
||||
unsigned char f3;
|
||||
unsigned char f4;
|
||||
unsigned char f5;
|
||||
} __attribute__ ((packed)) f_0x02;
|
||||
} __attribute__ ((packed)) factors;
|
||||
unsigned short first_alt_trk;
|
||||
unsigned short no_alt_trk;
|
||||
unsigned short first_dia_trk;
|
||||
unsigned short no_dia_trk;
|
||||
unsigned short first_sup_trk;
|
||||
unsigned short no_sup_trk;
|
||||
unsigned char MDR_ID;
|
||||
unsigned char OBR_ID;
|
||||
unsigned char director;
|
||||
unsigned char rd_trk_set;
|
||||
unsigned short max_rec_zero;
|
||||
unsigned char reserved1;
|
||||
unsigned char RWANY_in_LR;
|
||||
unsigned char factor6;
|
||||
unsigned char factor7;
|
||||
unsigned char factor8;
|
||||
unsigned char reserved2[3];
|
||||
unsigned char reserved3[6];
|
||||
unsigned int long_no_cyl;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* Represents possible format modes that can be specified when formatting
|
||||
* a DASD.
|
||||
@@ -159,17 +45,6 @@ static const char mode_str[3][10] = {
|
||||
"Full", "Quick", "Expand"
|
||||
};
|
||||
|
||||
/*
|
||||
* struct format_data_t
|
||||
* represents all data necessary to format a dasd
|
||||
*/
|
||||
typedef struct format_data_t {
|
||||
unsigned int start_unit; /* from track */
|
||||
unsigned int stop_unit; /* to track */
|
||||
unsigned int blksize; /* sectorsize */
|
||||
unsigned int intensity;
|
||||
} format_data_t;
|
||||
|
||||
/*
|
||||
* values to be used for format_data_t.intensity
|
||||
* 0/8: normal format
|
||||
@@ -183,24 +58,6 @@ typedef struct format_data_t {
|
||||
#define DASD_FMT_INT_COMPAT 8 /* use OS/390 compatible disk layout */
|
||||
#define DASD_FMT_INT_FMT_NOR0 16 /* remove permission to write record zero */
|
||||
|
||||
/*
|
||||
* struct format_check_t
|
||||
* represents all data necessary to evaluate the format of
|
||||
* different tracks of a dasd
|
||||
*/
|
||||
typedef struct format_check_t {
|
||||
/* Input */
|
||||
struct format_data_t expect;
|
||||
|
||||
/* Output */
|
||||
unsigned int result; /* Error indication (DASD_FMT_ERR_*) */
|
||||
unsigned int unit; /* Track that is in error */
|
||||
unsigned int rec; /* Record that is in error */
|
||||
unsigned int num_records; /* Records in the track in error */
|
||||
unsigned int blksize; /* Block-size of first record in error */
|
||||
unsigned int key_length; /* Key length of first record in error */
|
||||
} format_check_t;
|
||||
|
||||
/*
|
||||
* values to be used in format_check_t for indicating
|
||||
* possible format errors
|
||||
@@ -221,33 +78,6 @@ typedef struct format_check_t {
|
||||
#define DASD_FORMAT_LDL 1
|
||||
#define DASD_FORMAT_CDL 2
|
||||
|
||||
/* Disable the volume (for Linux) */
|
||||
#define BIODASDDISABLE _IO(DASD_IOCTL_LETTER,0)
|
||||
/* Enable the volume (for Linux) */
|
||||
#define BIODASDENABLE _IO(DASD_IOCTL_LETTER,1)
|
||||
|
||||
/* Get information on a dasd device (enhanced) */
|
||||
#define BIODASDINFO2 _IOR(DASD_IOCTL_LETTER, 3, dasd_information2_t)
|
||||
|
||||
/* #define BIODASDFORMAT _IOW(IOCTL_LETTER,0,format_data_t) , deprecated */
|
||||
#define BIODASDFMT _IOW(DASD_IOCTL_LETTER,1,format_data_t)
|
||||
|
||||
/* Check device format according to format_data_t */
|
||||
#define BIODASDCHECKFMT _IOWR(DASD_IOCTL_LETTER, 2, format_check_t)
|
||||
|
||||
/****************************************************************************
|
||||
* SECTION: Further IOCTL Definitions (see fs.h and hdreq.h ) *
|
||||
****************************************************************************/
|
||||
/* re-read partition table */
|
||||
#define BLKRRPART _IO(0x12,95)
|
||||
/* get block device sector size */
|
||||
#define BLKSSZGET _IO(0x12,104)
|
||||
/* get read-only status (0 = read_write) */
|
||||
#define BLKROGET _IO(0x12,94)
|
||||
|
||||
/* get device geometry */
|
||||
#define HDIO_GETGEO 0x0301
|
||||
|
||||
/****************************************************************************
|
||||
* SECTION: DASDFMT internal types *
|
||||
****************************************************************************/
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
include ../common.mak
|
||||
|
||||
libs = $(rootdir)/libu2s/libu2s.a \
|
||||
$(rootdir)/libutil/libutil.a
|
||||
$(rootdir)/libutil/libutil.a \
|
||||
$(rootdir)/libdasd/libdasd.a
|
||||
|
||||
all: dasdinfo
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <sys/utsname.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "lib/dasd_base.h"
|
||||
#include "lib/util_base.h"
|
||||
#include "lib/util_file.h"
|
||||
#include "lib/util_opt.h"
|
||||
@@ -29,10 +30,6 @@
|
||||
#include "lib/zt_common.h"
|
||||
|
||||
#define RD_BUFFER_SIZE 80
|
||||
#define BLKSSZGET _IO(0x12,104)
|
||||
#define DASD_IOCTL_LETTER 'D'
|
||||
#define BIODASDINFO _IOR(DASD_IOCTL_LETTER,1,struct dasd_information)
|
||||
#define BIODASDINFO2 _IOR(DASD_IOCTL_LETTER,3,struct dasd_information2)
|
||||
#define TEMP_DEV_MAX_RETRIES 1000
|
||||
|
||||
static const struct util_prg prg = {
|
||||
@@ -100,67 +97,7 @@ struct volume_label {
|
||||
char volid[6];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct dasd_information2 {
|
||||
unsigned int devno;
|
||||
unsigned int real_devno;
|
||||
unsigned int schid;
|
||||
unsigned int cu_type : 16;
|
||||
unsigned int cu_model : 8;
|
||||
unsigned int dev_type : 16;
|
||||
unsigned int dev_model : 8;
|
||||
unsigned int open_count;
|
||||
unsigned int req_queue_len;
|
||||
unsigned int chanq_len;
|
||||
char type[4];
|
||||
unsigned int status;
|
||||
unsigned int label_block;
|
||||
unsigned int FBA_layout;
|
||||
unsigned int characteristics_size;
|
||||
unsigned int confdata_size;
|
||||
char characteristics[64];
|
||||
char configuration_data[256];
|
||||
unsigned int format;
|
||||
unsigned int features;
|
||||
unsigned int reserved0;
|
||||
unsigned int reserved1;
|
||||
unsigned int reserved2;
|
||||
unsigned int reserved3;
|
||||
unsigned int reserved4;
|
||||
unsigned int reserved5;
|
||||
unsigned int reserved6;
|
||||
unsigned int reserved7;
|
||||
};
|
||||
|
||||
struct dasd_information {
|
||||
unsigned int devno;
|
||||
unsigned int real_devno;
|
||||
unsigned int schid;
|
||||
unsigned int cu_type : 16;
|
||||
unsigned int cu_model : 8;
|
||||
unsigned int dev_type : 16;
|
||||
unsigned int dev_model : 8;
|
||||
unsigned int open_count;
|
||||
unsigned int req_queue_len;
|
||||
unsigned int chanq_len;
|
||||
char type[4];
|
||||
unsigned int status;
|
||||
unsigned int label_block;
|
||||
unsigned int FBA_layout;
|
||||
unsigned int characteristics_size;
|
||||
unsigned int confdata_size;
|
||||
char characteristics[64];
|
||||
char configuration_data[256];
|
||||
};
|
||||
|
||||
struct dasd_data
|
||||
{
|
||||
struct dasd_information2 dasd_info;
|
||||
int dasd_info_version;
|
||||
int blksize;
|
||||
};
|
||||
|
||||
static char EBCtoASC[256] =
|
||||
{
|
||||
static char EBCtoASC[256] = {
|
||||
/* 0x00 NUL SOH STX ETX *SEL HT *RNL DEL */
|
||||
0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F,
|
||||
/* 0x08 -GE -SPS -RPT VT FF CR SO SI */
|
||||
@@ -227,12 +164,12 @@ static char EBCtoASC[256] =
|
||||
0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07
|
||||
};
|
||||
|
||||
static char *dinfo_ebcdic_dec (char *source, char *target, int l)
|
||||
static char *dinfo_ebcdic_dec(char *source, char *target, int l)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < l; i++)
|
||||
target[i]=EBCtoASC[(unsigned char)(source[i])];
|
||||
target[i] = EBCtoASC[(unsigned char)(source[i])];
|
||||
|
||||
return target;
|
||||
}
|
||||
@@ -242,51 +179,49 @@ static int dinfo_read_dasd_uid(char *uidfile, char *readbuf)
|
||||
return util_file_read_line(readbuf, RD_BUFFER_SIZE, uidfile);
|
||||
}
|
||||
|
||||
static int dinfo_read_dasd_vlabel (char *device, struct volume_label *vlabel,
|
||||
char *readbuf)
|
||||
static int dinfo_read_dasd_vlabel(char *device, struct volume_label *vlabel,
|
||||
char *readbuf)
|
||||
{
|
||||
struct dasd_data data;
|
||||
struct volume_label tmp;
|
||||
int vlsize = sizeof(struct volume_label);
|
||||
dasd_information2_t dasd_info;
|
||||
unsigned long vlabel_start;
|
||||
unsigned int blksize;
|
||||
char vollbl[5];
|
||||
int f;
|
||||
char *space;
|
||||
|
||||
if ((f = open(device, O_RDONLY)) < 0) {
|
||||
printf("Could not open device node.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (ioctl(f, BLKSSZGET, &data.blksize) != 0) {
|
||||
if (dasd_get_blocksize(device, &blksize) != 0) {
|
||||
printf("Unable to figure out block size.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (ioctl(f, BIODASDINFO2, &data.dasd_info) == 0)
|
||||
data.dasd_info_version = 2;
|
||||
else {
|
||||
if (ioctl(f, BIODASDINFO, &data.dasd_info) != 0) {
|
||||
printf("Unable to figure out DASD informations.\n");
|
||||
goto error;
|
||||
}
|
||||
if (dasd_get_info(device, &dasd_info) != 0) {
|
||||
printf("Unable to figure out DASD informations.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
vlabel_start = data.dasd_info.label_block * data.blksize;
|
||||
if (lseek(f, vlabel_start, SEEK_SET) < 0)
|
||||
f = open(device, O_RDONLY);
|
||||
if (f < 0) {
|
||||
printf("Could not open device node.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
vlabel_start = dasd_info.label_block * blksize;
|
||||
if (lseek(f, vlabel_start, SEEK_SET) < 0)
|
||||
goto error_close;
|
||||
|
||||
bzero(vlabel, vlsize);
|
||||
|
||||
if (read(f, vlabel, vlsize) != vlsize) {
|
||||
printf("Could not read volume label.\n");
|
||||
goto error;
|
||||
goto error_close;
|
||||
}
|
||||
|
||||
if (data.dasd_info.FBA_layout) {
|
||||
if (dasd_info.FBA_layout) {
|
||||
bzero(&tmp, vlsize);
|
||||
memcpy(&tmp, vlabel, vlsize);
|
||||
memcpy(vlabel->vollbl, &tmp, vlsize-4);
|
||||
memcpy(vlabel->vollbl, &tmp, vlsize - 4);
|
||||
}
|
||||
|
||||
close(f);
|
||||
@@ -301,16 +236,17 @@ static int dinfo_read_dasd_vlabel (char *device, struct volume_label *vlabel,
|
||||
(strncmp(vollbl, "CMS1", 4) == 0)) {
|
||||
strncpy(readbuf, vlabel->volid, 6);
|
||||
dinfo_ebcdic_dec(readbuf, readbuf, 6);
|
||||
space = strchr(readbuf,' ');
|
||||
space = strchr(readbuf, ' ');
|
||||
if (space)
|
||||
*space = 0;
|
||||
} else
|
||||
} else {
|
||||
strcpy(readbuf, "");
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
error:
|
||||
error_close:
|
||||
close(f);
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -321,7 +257,7 @@ static void *dinfo_malloc(size_t size)
|
||||
result = malloc(size);
|
||||
if (result == NULL) {
|
||||
printf("Could not allocate %lld bytes of memory",
|
||||
(unsigned long long) size);
|
||||
(unsigned long long)size);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -332,7 +268,7 @@ static char *dinfo_make_path(char *dirname, char *filename)
|
||||
size_t len;
|
||||
|
||||
len = strlen(dirname) + strlen(filename) + 2;
|
||||
result = (char *) dinfo_malloc(len);
|
||||
result = (char *)dinfo_malloc(len);
|
||||
if (result == NULL)
|
||||
return NULL;
|
||||
sprintf(result, "%s/%s", dirname, filename);
|
||||
@@ -342,8 +278,8 @@ static char *dinfo_make_path(char *dirname, char *filename)
|
||||
static int dinfo_create_devnode(dev_t dev, char **devno)
|
||||
{
|
||||
char *result;
|
||||
char * pathname[] = { "/dev", getenv("TMPDIR"), "/tmp",
|
||||
getenv("HOME"), "." , "/"};
|
||||
char *pathname[] = { "/dev", getenv("TMPDIR"), "/tmp",
|
||||
getenv("HOME"), ".", "/"};
|
||||
char filename[] = "dasdinfo0000";
|
||||
mode_t mode;
|
||||
unsigned int path;
|
||||
@@ -354,10 +290,10 @@ static int dinfo_create_devnode(dev_t dev, char **devno)
|
||||
mode = S_IFBLK | S_IRWXU;
|
||||
|
||||
/* Try several locations for the temporary device node. */
|
||||
for (path=0; path < sizeof(pathname) / sizeof(pathname[0]); path++) {
|
||||
for (path = 0; path < UTIL_ARRAY_SIZE(pathname); path++) {
|
||||
if (pathname[path] == NULL)
|
||||
continue;
|
||||
for (retry=0; retry < TEMP_DEV_MAX_RETRIES; retry++) {
|
||||
for (retry = 0; retry < TEMP_DEV_MAX_RETRIES; retry++) {
|
||||
sprintf(filename, "dasdinfo%04d", retry);
|
||||
result = dinfo_make_path(pathname[path], filename);
|
||||
if (result == NULL)
|
||||
@@ -366,7 +302,8 @@ static int dinfo_create_devnode(dev_t dev, char **devno)
|
||||
if (rc == 0) {
|
||||
/* Need this test to cover
|
||||
* 'nodev'-mounted
|
||||
* filesystems. */
|
||||
* filesystems.
|
||||
*/
|
||||
fd = open(result, O_RDONLY);
|
||||
if (fd != -1) {
|
||||
close(fd);
|
||||
@@ -375,8 +312,9 @@ static int dinfo_create_devnode(dev_t dev, char **devno)
|
||||
}
|
||||
remove(result);
|
||||
retry = TEMP_DEV_MAX_RETRIES;
|
||||
} else if (errno != EEXIST)
|
||||
} else if (errno != EEXIST) {
|
||||
retry = TEMP_DEV_MAX_RETRIES;
|
||||
}
|
||||
free(result);
|
||||
}
|
||||
}
|
||||
@@ -400,7 +338,8 @@ static int dinfo_extract_dev(dev_t *dev, char *str)
|
||||
|
||||
bzero(tmp, RD_BUFFER_SIZE);
|
||||
strncpy(tmp, str, RD_BUFFER_SIZE);
|
||||
if ((p = strchr(tmp, ':')) == NULL) {
|
||||
p = strchr(tmp, ':');
|
||||
if (p == NULL) {
|
||||
printf("Error: unable to extract major/minor\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -439,6 +378,7 @@ dinfo_is_busiddir(const char *fpath, const struct stat *UNUSED(sb),
|
||||
char *tempdir;
|
||||
char linkdir[128];
|
||||
ssize_t i;
|
||||
|
||||
if (tflag != FTW_D || (strncmp((fpath + ftwbuf->base), searchbusid,
|
||||
strlen(searchbusid)) != 0))
|
||||
return FTW_CONTINUE;
|
||||
@@ -454,7 +394,7 @@ dinfo_is_busiddir(const char *fpath, const struct stat *UNUSED(sb),
|
||||
if ((i < 0) || (i >= 128))
|
||||
return -1;
|
||||
/* append '\0' because readlink returns non zero terminated string */
|
||||
tempdir[i+1] = '\0';
|
||||
tempdir[i + 1] = '\0';
|
||||
if (strstr(linkdir, "dasd") == NULL)
|
||||
return FTW_CONTINUE;
|
||||
free(busiddir);
|
||||
@@ -470,15 +410,17 @@ dinfo_find_entry(const char *dir, const char *searchstring,
|
||||
{
|
||||
DIR *directory = NULL;
|
||||
struct dirent *dir_entry = NULL;
|
||||
|
||||
directory = opendir(dir);
|
||||
if (directory == NULL)
|
||||
return -1;
|
||||
while ((dir_entry = readdir(directory)) != NULL) {
|
||||
/* compare if the found entry has exactly the same name
|
||||
and type as searched */
|
||||
/* compare if the found entry has exactly the same name and type
|
||||
* as searched
|
||||
*/
|
||||
if ((strncmp(dir_entry->d_name, searchstring,
|
||||
strlen(searchstring)) == 0)
|
||||
&& (dir_entry->d_type & type)) {
|
||||
strlen(searchstring)) == 0) &&
|
||||
(dir_entry->d_type & type)) {
|
||||
*result = strdup(dir_entry->d_name);
|
||||
if (*result == NULL)
|
||||
goto out;
|
||||
@@ -555,7 +497,8 @@ static int dinfo_get_uid_from_devnode(char **uidfile, char *devnode)
|
||||
sprintf(stat_dev, "%d:%d", major(stat_buffer.st_rdev),
|
||||
minor(stat_buffer.st_rdev));
|
||||
|
||||
if ((directory = opendir("/sys/block/")) == NULL) {
|
||||
directory = opendir("/sys/block/");
|
||||
if (directory == NULL) {
|
||||
printf("Error: could not open directory /sys/block\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -573,7 +516,7 @@ static int dinfo_get_uid_from_devnode(char **uidfile, char *devnode)
|
||||
continue;
|
||||
|
||||
if (strncmp(stat_dev, readbuf,
|
||||
MAX(strlen(stat_dev), strlen(readbuf)-1)) == 0) {
|
||||
MAX(strlen(stat_dev), strlen(readbuf) - 1)) == 0) {
|
||||
rc = snprintf(*uidfile, RD_BUFFER_SIZE,
|
||||
"/sys/block/%s/device/uid",
|
||||
dir_entry->d_name);
|
||||
@@ -591,7 +534,7 @@ static int dinfo_get_uid_from_devnode(char **uidfile, char *devnode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char * argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct utsname uname_buf;
|
||||
int version, release;
|
||||
@@ -635,13 +578,13 @@ int main(int argc, char * argv[])
|
||||
print_vlabel = 1;
|
||||
break;
|
||||
case 'i':
|
||||
busid=strdup(optarg);
|
||||
busid = strdup(optarg);
|
||||
break;
|
||||
case 'b':
|
||||
blockdev=strdup(optarg);
|
||||
blockdev = strdup(optarg);
|
||||
break;
|
||||
case 'd':
|
||||
devnode=strdup(optarg);
|
||||
devnode = strdup(optarg);
|
||||
break;
|
||||
case 'e':
|
||||
export = 1;
|
||||
@@ -661,11 +604,11 @@ int main(int argc, char * argv[])
|
||||
}
|
||||
|
||||
uname(&uname_buf);
|
||||
sscanf(uname_buf.release, "%d.%d", &version,&release);
|
||||
if (strcmp(uname_buf.sysname,"Linux") ||
|
||||
sscanf(uname_buf.release, "%d.%d", &version, &release);
|
||||
if (strcmp(uname_buf.sysname, "Linux") ||
|
||||
version < 2 || (version == 2 && release < 6)) {
|
||||
printf("%s %d.%d is not supported\n", uname_buf.sysname,
|
||||
version,release);
|
||||
version, release);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -693,9 +636,9 @@ int main(int argc, char * argv[])
|
||||
|
||||
/* try to read the uid attribute */
|
||||
if (busid) {
|
||||
sprintf(uidfile,"/sys/bus/ccw/devices/%s/uid", busid);
|
||||
sprintf(uidfile, "/sys/bus/ccw/devices/%s/uid", busid);
|
||||
} else if (blockdev) {
|
||||
sprintf(uidfile,"/sys/block/%s/device/uid", blockdev);
|
||||
sprintf(uidfile, "/sys/block/%s/device/uid", blockdev);
|
||||
} else if (devnode) {
|
||||
if (dinfo_get_uid_from_devnode(&uidfile, devnode) != 0)
|
||||
goto error;
|
||||
@@ -715,12 +658,11 @@ int main(int argc, char * argv[])
|
||||
if (!srchuid)
|
||||
break;
|
||||
}
|
||||
if (srchuid) {
|
||||
if (srchuid)
|
||||
srchuid[0] = '\0';
|
||||
}
|
||||
if (export) {
|
||||
if (export)
|
||||
printf("ID_UID=%s\n", readbuf);
|
||||
} else
|
||||
else
|
||||
printf("%s\n", readbuf);
|
||||
if (!print_vlabel && !print_extended_uid)
|
||||
goto out;
|
||||
@@ -729,9 +671,9 @@ int main(int argc, char * argv[])
|
||||
|
||||
if (print_extended_uid) {
|
||||
if (dinfo_read_dasd_uid(uidfile, readbuf) == 0) {
|
||||
if (export) {
|
||||
if (export)
|
||||
printf("ID_XUID=%s\n", readbuf);
|
||||
} else
|
||||
else
|
||||
printf("%s\n", readbuf);
|
||||
if (!print_vlabel)
|
||||
goto out;
|
||||
@@ -768,9 +710,9 @@ int main(int argc, char * argv[])
|
||||
}
|
||||
|
||||
if (dinfo_read_dasd_vlabel(device, &vlabel, readbuf) == 0) {
|
||||
if (export) {
|
||||
printf("ID_SERIAL=%s\n",readbuf);
|
||||
} else
|
||||
if (export)
|
||||
printf("ID_SERIAL=%s\n", readbuf);
|
||||
else
|
||||
printf("%s\n", readbuf);
|
||||
goto out;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -17,139 +17,6 @@
|
||||
* SECTION: Definitions needed for DASD-API (see dasd.h)
|
||||
*******************************************************************************/
|
||||
|
||||
#define DASD_IOCTL_LETTER 'D'
|
||||
|
||||
/*
|
||||
* struct dasd_information_t
|
||||
* represents any data about the device, which is visible to userspace.
|
||||
* including foramt and features.
|
||||
*/
|
||||
typedef struct dasd_information_t {
|
||||
unsigned int devno; /* S/390 devno */
|
||||
unsigned int real_devno; /* for aliases */
|
||||
unsigned int schid; /* S/390 subchannel identifier */
|
||||
unsigned int cu_type : 16; /* from SenseID */
|
||||
unsigned int cu_model : 8; /* from SenseID */
|
||||
unsigned int dev_type : 16; /* from SenseID */
|
||||
unsigned int dev_model : 8; /* from SenseID */
|
||||
unsigned int open_count;
|
||||
unsigned int req_queue_len;
|
||||
unsigned int chanq_len; /* length of chanq */
|
||||
char type[4]; /* from discipline.name, 'none' for unknown */
|
||||
unsigned int status; /* current device level */
|
||||
unsigned int label_block; /* where to find the VOLSER */
|
||||
unsigned int FBA_layout; /* fixed block size (like AIXVOL) */
|
||||
unsigned int characteristics_size;
|
||||
unsigned int confdata_size;
|
||||
char characteristics[64]; /* from read_device_characteristics */
|
||||
char configuration_data[256]; /* from read_configuration_data */
|
||||
} dasd_information_t;
|
||||
|
||||
typedef struct dasd_information2_t {
|
||||
unsigned int devno; /* S/390 devno */
|
||||
unsigned int real_devno; /* for aliases */
|
||||
unsigned int schid; /* S/390 subchannel identifier */
|
||||
unsigned int cu_type : 16; /* from SenseID */
|
||||
unsigned int cu_model : 8; /* from SenseID */
|
||||
unsigned int dev_type : 16; /* from SenseID */
|
||||
unsigned int dev_model : 8; /* from SenseID */
|
||||
unsigned int open_count;
|
||||
unsigned int req_queue_len;
|
||||
unsigned int chanq_len; /* length of chanq */
|
||||
char type[4]; /* from discipline.name, 'none' for unknown */
|
||||
unsigned int status; /* current device level */
|
||||
unsigned int label_block; /* where to find the VOLSER */
|
||||
unsigned int FBA_layout; /* fixed block size (like AIXVOL) */
|
||||
unsigned int characteristics_size;
|
||||
unsigned int confdata_size;
|
||||
unsigned char characteristics[64];/*from read_device_characteristics */
|
||||
unsigned char configuration_data[256];/*from read_configuration_data */
|
||||
unsigned int format; /* format info like formatted/cdl/ldl/... */
|
||||
unsigned int features; /* dasd features like 'ro',... */
|
||||
unsigned int reserved0; /* reserved for further use ,... */
|
||||
unsigned int reserved1; /* reserved for further use ,... */
|
||||
unsigned int reserved2; /* reserved for further use ,... */
|
||||
unsigned int reserved3; /* reserved for further use ,... */
|
||||
unsigned int reserved4; /* reserved for further use ,... */
|
||||
unsigned int reserved5; /* reserved for further use ,... */
|
||||
unsigned int reserved6; /* reserved for further use ,... */
|
||||
unsigned int reserved7; /* reserved for further use ,... */
|
||||
} dasd_information2_t;
|
||||
|
||||
struct dasd_eckd_characteristics {
|
||||
unsigned short cu_type;
|
||||
struct {
|
||||
unsigned char support:2;
|
||||
unsigned char async:1;
|
||||
unsigned char reserved:1;
|
||||
unsigned char cache_info:1;
|
||||
unsigned char model:3;
|
||||
} __attribute__ ((packed)) cu_model;
|
||||
unsigned short dev_type;
|
||||
unsigned char dev_model;
|
||||
struct {
|
||||
unsigned char mult_burst:1;
|
||||
unsigned char RT_in_LR:1;
|
||||
unsigned char reserved1:1;
|
||||
unsigned char RD_IN_LR:1;
|
||||
unsigned char reserved2:4;
|
||||
unsigned char reserved3:8;
|
||||
unsigned char defect_wr:1;
|
||||
unsigned char XRC_supported:1;
|
||||
unsigned char reserved4:1;
|
||||
unsigned char striping:1;
|
||||
unsigned char reserved5:4;
|
||||
unsigned char cfw:1;
|
||||
unsigned char reserved6:2;
|
||||
unsigned char cache:1;
|
||||
unsigned char dual_copy:1;
|
||||
unsigned char dfw:1;
|
||||
unsigned char reset_alleg:1;
|
||||
unsigned char sense_down:1;
|
||||
} __attribute__ ((packed)) facilities;
|
||||
unsigned char dev_class;
|
||||
unsigned char unit_type;
|
||||
unsigned short no_cyl;
|
||||
unsigned short trk_per_cyl;
|
||||
unsigned char sec_per_trk;
|
||||
unsigned char byte_per_track[3];
|
||||
unsigned short home_bytes;
|
||||
unsigned char formula;
|
||||
union {
|
||||
struct {
|
||||
unsigned char f1;
|
||||
unsigned short f2;
|
||||
unsigned short f3;
|
||||
} __attribute__ ((packed)) f_0x01;
|
||||
struct {
|
||||
unsigned char f1;
|
||||
unsigned char f2;
|
||||
unsigned char f3;
|
||||
unsigned char f4;
|
||||
unsigned char f5;
|
||||
} __attribute__ ((packed)) f_0x02;
|
||||
} __attribute__ ((packed)) factors;
|
||||
unsigned short first_alt_trk;
|
||||
unsigned short no_alt_trk;
|
||||
unsigned short first_dia_trk;
|
||||
unsigned short no_dia_trk;
|
||||
unsigned short first_sup_trk;
|
||||
unsigned short no_sup_trk;
|
||||
unsigned char MDR_ID;
|
||||
unsigned char OBR_ID;
|
||||
unsigned char director;
|
||||
unsigned char rd_trk_set;
|
||||
unsigned short max_rec_zero;
|
||||
unsigned char reserved1;
|
||||
unsigned char RWANY_in_LR;
|
||||
unsigned char factor6;
|
||||
unsigned char factor7;
|
||||
unsigned char factor8;
|
||||
unsigned char reserved2[3];
|
||||
unsigned char reserved3[6];
|
||||
unsigned int long_no_cyl;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* values to be used for dasd_information2_t.format
|
||||
* 0x00: NOT formatted
|
||||
@@ -170,21 +37,6 @@ struct dasd_eckd_characteristics {
|
||||
#define DASD_FEATURE_READONLY 1
|
||||
#define DASD_FEATURE_USEDIAG 2
|
||||
|
||||
/* Get information on a dasd device (enhanced) */
|
||||
#define BIODASDINFO _IOR(DASD_IOCTL_LETTER,1,dasd_information_t)
|
||||
#define BIODASDINFO2 _IOR(DASD_IOCTL_LETTER,3,dasd_information2_t)
|
||||
|
||||
/********************************************************************************
|
||||
* SECTION: Further IOCTL Definitions (see fs.h and hdreq.h)
|
||||
*******************************************************************************/
|
||||
/* get block device sector size */
|
||||
#define BLKSSZGET _IO(0x12,104)
|
||||
/* return device size in bytes (u64 *arg) */
|
||||
#define BLKGETSIZE64 _IOR(0x12,114,size_t)
|
||||
|
||||
/* get device geometry */
|
||||
#define HDIO_GETGEO 0x0301
|
||||
|
||||
/********************************************************************************
|
||||
* SECTION: DASDVIEW internal types
|
||||
*******************************************************************************/
|
||||
@@ -215,7 +67,7 @@ typedef struct dasdview_info
|
||||
char device[PATH_MAX];
|
||||
dasd_information2_t dasd_info;
|
||||
int dasd_info_version;
|
||||
int blksize;
|
||||
unsigned int blksize;
|
||||
struct hd_geometry geo;
|
||||
u_int32_t hw_cylinders;
|
||||
|
||||
|
||||
124
fdasd/fdasd.c
124
fdasd/fdasd.c
@@ -11,6 +11,7 @@
|
||||
#include <stdio.h>
|
||||
#include <sys/sysmacros.h>
|
||||
|
||||
#include "lib/dasd_base.h"
|
||||
#include "lib/dasd_sys.h"
|
||||
#include "lib/util_base.h"
|
||||
#include "lib/util_opt.h"
|
||||
@@ -220,8 +221,7 @@ static u_int32_t get_usable_cylinders(fdasd_anchor_t *anc)
|
||||
return anc->f4->DS4DCYL;
|
||||
/* normal volume */
|
||||
if (anc->f4->DS4DEVCT.DS4DEVFG & ALTERNATE_CYLINDERS_USED)
|
||||
cyl = anc->f4->DS4DEVCT.DS4DSCYL -
|
||||
(u_int16_t) anc->f4->DS4DEVAC;
|
||||
cyl = anc->f4->DS4DEVCT.DS4DSCYL - (u_int16_t)anc->f4->DS4DEVAC;
|
||||
else
|
||||
cyl = anc->f4->DS4DEVCT.DS4DSCYL;
|
||||
|
||||
@@ -230,9 +230,8 @@ static u_int32_t get_usable_cylinders(fdasd_anchor_t *anc)
|
||||
|
||||
static void get_addr_of_highest_f1_f8_label(fdasd_anchor_t *anc, cchhb_t *addr)
|
||||
{
|
||||
|
||||
u_int8_t record;
|
||||
/* We have to count the follwing labels:
|
||||
/* We have to count the following labels:
|
||||
* one format 4
|
||||
* one format 5
|
||||
* format 7 only if we have moren then BIG_DISK_SIZE tracks
|
||||
@@ -769,7 +768,7 @@ static int fdasd_parse_conffile(fdasd_anchor_t *anc,
|
||||
} else {
|
||||
errno = 0;
|
||||
anc->confdata[i].start = strtol(token[0],
|
||||
(char **) NULL, 10);
|
||||
(char **)NULL, 10);
|
||||
if (errno != 0 || anc->confdata[i].start == 0) {
|
||||
snprintf(err_str, ERROR_STRING_SIZE,
|
||||
"invalid partition start in config "
|
||||
@@ -784,7 +783,7 @@ static int fdasd_parse_conffile(fdasd_anchor_t *anc,
|
||||
} else {
|
||||
errno = 0;
|
||||
anc->confdata[i].stop = strtol(token[1],
|
||||
(char **) NULL, 10);
|
||||
(char **)NULL, 10);
|
||||
if (errno != 0 || anc->confdata[i].stop == 0) {
|
||||
snprintf(err_str, ERROR_STRING_SIZE,
|
||||
"invalid partition end in config "
|
||||
@@ -884,9 +883,9 @@ static void fdasd_check_conffile_input(fdasd_anchor_t *anc,
|
||||
anc->fspace_trk = start - FIRST_USABLE_TRK;
|
||||
|
||||
if (i < USABLE_PARTITIONS - 1) {
|
||||
if (anc->confdata[i+1].start != 0)
|
||||
if (anc->confdata[i + 1].start != 0)
|
||||
part_info->fspace_trk =
|
||||
anc->confdata[i+1].start-stop-1;
|
||||
anc->confdata[i + 1].start - stop - 1;
|
||||
else
|
||||
part_info->fspace_trk = last_trk - stop;
|
||||
} else if (i == USABLE_PARTITIONS - 1) {
|
||||
@@ -916,8 +915,8 @@ static void fdasd_verify_device(fdasd_anchor_t *anc, char *name)
|
||||
if (!S_ISBLK(dst.st_mode)) {
|
||||
snprintf(err_str, ERROR_STRING_SIZE,
|
||||
"Device '%s' (%d/%d) is not a block device\n", name,
|
||||
(unsigned short) major(dst.st_rdev),
|
||||
(unsigned short) minor(dst.st_rdev));
|
||||
(unsigned short)major(dst.st_rdev),
|
||||
(unsigned short)minor(dst.st_rdev));
|
||||
fdasd_error(anc, device_verification_failed, err_str);
|
||||
}
|
||||
|
||||
@@ -925,8 +924,8 @@ static void fdasd_verify_device(fdasd_anchor_t *anc, char *name)
|
||||
snprintf(err_str, ERROR_STRING_SIZE,
|
||||
"Partition '%s' (%d/%d) detected where device is "
|
||||
"required\n", name,
|
||||
(unsigned short) major(dst.st_rdev),
|
||||
(unsigned short) minor(dst.st_rdev));
|
||||
(unsigned short)major(dst.st_rdev),
|
||||
(unsigned short)minor(dst.st_rdev));
|
||||
fdasd_error(anc, device_verification_failed, err_str);
|
||||
}
|
||||
|
||||
@@ -962,8 +961,8 @@ static void fdasd_verify_device(fdasd_anchor_t *anc, char *name)
|
||||
|
||||
if (anc->verbose) {
|
||||
printf("Verification successful for '%s' (%d/%d)\n", name,
|
||||
(unsigned short) major(dst.st_rdev),
|
||||
(unsigned short) minor(dst.st_rdev));
|
||||
(unsigned short)major(dst.st_rdev),
|
||||
(unsigned short)minor(dst.st_rdev));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1028,15 +1027,13 @@ static void fdasd_verify_options(fdasd_anchor_t *anc)
|
||||
}
|
||||
}
|
||||
|
||||
if (anc->auto_partition &&
|
||||
(options.conffile || anc->print_table)) {
|
||||
if (anc->auto_partition && (options.conffile || anc->print_table)) {
|
||||
fdasd_error(anc, parser_failed,
|
||||
"Option 'auto' cannot be used with "
|
||||
"'config' and 'table'.\n");
|
||||
}
|
||||
|
||||
if (options.conffile &&
|
||||
(anc->print_table)) {
|
||||
if (options.conffile && anc->print_table) {
|
||||
fdasd_error(anc, parser_failed,
|
||||
"Option 'config' cannot be used with"
|
||||
" 'table'.\n");
|
||||
@@ -1232,26 +1229,13 @@ static int fdasd_get_volser(fdasd_anchor_t *anc, char *volser)
|
||||
*/
|
||||
static void fdasd_reread_partition_table(fdasd_anchor_t *anc)
|
||||
{
|
||||
char err_str[ERROR_STRING_SIZE];
|
||||
int fd;
|
||||
|
||||
if (!anc->silent)
|
||||
printf("rereading partition table...\n");
|
||||
|
||||
fd = open(options.device, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
snprintf(err_str, ERROR_STRING_SIZE,
|
||||
"Could not open device '%s' "
|
||||
"in read-only mode!\n", options.device);
|
||||
fdasd_error(anc, unable_to_open_disk, err_str);
|
||||
}
|
||||
|
||||
if (ioctl(fd, BLKRRPART, NULL) != 0) {
|
||||
close(fd);
|
||||
if (dasd_reread_partition_table(options.device, 1) != 0) {
|
||||
fdasd_error(anc, unable_to_ioctl, "Error while rereading "
|
||||
"partition table.\nPlease reboot!");
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1335,7 +1319,7 @@ static void fdasd_write_vtoc_labels(fdasd_anchor_t *anc)
|
||||
while (getpos(anc, k) > -1)
|
||||
k++;
|
||||
|
||||
setpos(anc, k, i-1);
|
||||
setpos(anc, k, i - 1);
|
||||
|
||||
strncpy(ch, "LINUX.V "
|
||||
" ", 44);
|
||||
@@ -1414,7 +1398,7 @@ static void fdasd_write_labels(fdasd_anchor_t *anc)
|
||||
if (anc->vtoc_changed)
|
||||
fdasd_write_vtoc_labels(anc);
|
||||
|
||||
if ((anc->vtoc_changed) || (anc->vlabel_changed))
|
||||
if (anc->vtoc_changed || anc->vlabel_changed)
|
||||
fdasd_reread_partition_table(anc);
|
||||
}
|
||||
|
||||
@@ -1500,9 +1484,9 @@ static void fdasd_reuse_vtoc(fdasd_anchor_t *anc)
|
||||
|
||||
if (!anc->silent) {
|
||||
snprintf(str, INPUT_BUF_SIZE,
|
||||
"WARNING: this will re-create your VTOC "
|
||||
"entries using the partition\n "
|
||||
"information of your existing VTOC. Continue?");
|
||||
"WARNING: this will re-create your VTOC "
|
||||
"entries using the partition\n "
|
||||
"information of your existing VTOC. Continue?");
|
||||
|
||||
if (yes_no(str) != 0)
|
||||
return;
|
||||
@@ -1637,9 +1621,11 @@ static void fdasd_change_part_type(fdasd_anchor_t *anc)
|
||||
printf("\n");
|
||||
|
||||
part_type = 0;
|
||||
while (part_type < 1 || part_type > UTIL_ARRAY_SIZE(partition_types) - 1) {
|
||||
while (!isdigit(part_type =
|
||||
read_char("new partition type: ")));
|
||||
while (part_type < 1 ||
|
||||
part_type > UTIL_ARRAY_SIZE(partition_types) - 1) {
|
||||
do {
|
||||
part_type = read_char("new partition type: ");
|
||||
} while (!isdigit(part_type));
|
||||
part_type -= 48;
|
||||
}
|
||||
|
||||
@@ -2094,7 +2080,8 @@ static void fdasd_check_disk_access(fdasd_anchor_t *anc)
|
||||
{
|
||||
char err_str[ERROR_STRING_SIZE];
|
||||
format1_label_t f1;
|
||||
int fd, pos, ro;
|
||||
int fd, pos;
|
||||
bool ro;
|
||||
|
||||
fd = open(options.device, O_RDONLY);
|
||||
if (fd == -1) {
|
||||
@@ -2127,7 +2114,9 @@ static void fdasd_check_disk_access(fdasd_anchor_t *anc)
|
||||
fdasd_error(anc, unable_to_seek_disk, err_str);
|
||||
}
|
||||
|
||||
if (ioctl(fd, BLKROGET, &ro) != 0) {
|
||||
close(fd);
|
||||
|
||||
if (dasd_is_ro(options.device, &ro) != 0) {
|
||||
snprintf(err_str, ERROR_STRING_SIZE,
|
||||
"Could not get read-only status for device '%s'.",
|
||||
options.device);
|
||||
@@ -2138,8 +2127,6 @@ static void fdasd_check_disk_access(fdasd_anchor_t *anc)
|
||||
"You will not be able to save any changes.\n\n",
|
||||
options.device);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2171,16 +2158,18 @@ static unsigned int recs_per_track(unsigned short dev_type, unsigned int kl,
|
||||
kn = ceil_quot(kl + 6, 232) + 1;
|
||||
return 1729 / (10 + 9 + ceil_quot(kl + 6 * kn, 34) +
|
||||
9 + ceil_quot(dl + 6 * dn, 34));
|
||||
} else
|
||||
} else {
|
||||
return 1729 / (10 + 9 + ceil_quot(dl + 6 * dn, 34));
|
||||
}
|
||||
case DASD_9345_TYPE:
|
||||
dn = ceil_quot(dl + 6, 232) + 1;
|
||||
if (kl) {
|
||||
kn = ceil_quot(kl + 6, 232) + 1;
|
||||
return 1420 / (18 + 7 + ceil_quot(kl + 6 * kn, 34) +
|
||||
ceil_quot(dl + 6 * dn, 34));
|
||||
} else
|
||||
} else {
|
||||
return 1420 / (18 + 7 + ceil_quot(dl + 6 * dn, 34));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -2214,21 +2203,12 @@ static void fdasd_get_geometry(fdasd_anchor_t *anc)
|
||||
struct dasd_eckd_characteristics *characteristics;
|
||||
unsigned long long size_in_bytes;
|
||||
char err_str[ERROR_STRING_SIZE];
|
||||
dasd_information_t dasd_info;
|
||||
int fd, blksize = 0;
|
||||
dasd_information2_t dasd_info;
|
||||
unsigned int blksize = 0;
|
||||
|
||||
fd = open(options.device, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
snprintf(err_str, ERROR_STRING_SIZE,
|
||||
"Could not open device '%s' "
|
||||
"in read-only mode!\n", options.device);
|
||||
fdasd_error(anc, unable_to_open_disk, err_str);
|
||||
}
|
||||
if (ioctl(fd, BLKGETSIZE64, &size_in_bytes) != 0) {
|
||||
close(fd);
|
||||
if (dasd_get_blocksize_in_bytes(options.device, &size_in_bytes) != 0)
|
||||
fdasd_error(anc, unable_to_ioctl,
|
||||
"Could not retrieve disk size.");
|
||||
}
|
||||
/*
|
||||
* If anc->force_virtual is set, we do no real geometry detection.
|
||||
* anc->dev_type and anc->blksize have already been set via command
|
||||
@@ -2247,7 +2227,6 @@ static void fdasd_get_geometry(fdasd_anchor_t *anc)
|
||||
geo.start = 0;
|
||||
anc->label_pos = 2 * anc->blksize;
|
||||
anc->devno = 0;
|
||||
close(fd);
|
||||
if (anc->verbose) {
|
||||
printf("The force option is active. "
|
||||
"The following geometry will be used:\n"
|
||||
@@ -2259,24 +2238,21 @@ static void fdasd_get_geometry(fdasd_anchor_t *anc)
|
||||
return;
|
||||
}
|
||||
|
||||
if (ioctl(fd, HDIO_GETGEO, &geo) != 0) {
|
||||
close(fd);
|
||||
if (dasd_get_geo(options.device, &geo) != 0) {
|
||||
fdasd_error(anc, unable_to_ioctl,
|
||||
"Could not retrieve disk geometry information.");
|
||||
}
|
||||
if (ioctl(fd, BLKSSZGET, &blksize) != 0) {
|
||||
close(fd);
|
||||
if (dasd_get_blocksize(options.device, &blksize) != 0) {
|
||||
fdasd_error(anc, unable_to_ioctl,
|
||||
"Could not retrieve blocksize information.");
|
||||
}
|
||||
/* get disk type */
|
||||
if (ioctl(fd, BIODASDINFO, &dasd_info) != 0) {
|
||||
if (dasd_get_info(options.device, &dasd_info) != 0) {
|
||||
if (anc->verbose)
|
||||
printf("BIODASDINFO ioctl failed,"
|
||||
" use disk geometry only.\n");
|
||||
/* verify that the geometry matches a 3390 DASD */
|
||||
if (!fdasd_verify_geometry(DASD_3390_TYPE, blksize, &geo)) {
|
||||
close(fd);
|
||||
fdasd_error(anc, wrong_disk_type,
|
||||
"Disk geometry does not match a DASD device"
|
||||
" of type 3390.");
|
||||
@@ -2356,8 +2332,6 @@ static void fdasd_get_geometry(fdasd_anchor_t *anc)
|
||||
anc->label_pos = dasd_info.label_block * blksize;
|
||||
anc->devno = dasd_info.devno;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2384,10 +2358,8 @@ fdasd_read_int(unsigned long low, unsigned long dflt, unsigned long high,
|
||||
}
|
||||
|
||||
while (1) {
|
||||
while (!isdigit(read_char(msg_txt))
|
||||
&& (*line_ptr != '-' &&
|
||||
*line_ptr != '+' &&
|
||||
*line_ptr != '\0'))
|
||||
while (!isdigit(read_char(msg_txt)) &&
|
||||
(*line_ptr != '-' && *line_ptr != '+' && *line_ptr != '\0'))
|
||||
continue;
|
||||
if ((*line_ptr == '+' || *line_ptr == '-') && base != lower) {
|
||||
if (*line_ptr == '+')
|
||||
@@ -2411,13 +2383,13 @@ fdasd_read_int(unsigned long low, unsigned long dflt, unsigned long high,
|
||||
break;
|
||||
case 'm':
|
||||
case 'M':
|
||||
trk *= (1024*1024);
|
||||
trk *= (1024 * 1024);
|
||||
trk /= anc->blksize;
|
||||
trk /= geo.sectors;
|
||||
break;
|
||||
case 'g':
|
||||
case 'G':
|
||||
trk *= (1024*1024*1024);
|
||||
trk *= (1024 * 1024 * 1024);
|
||||
trk /= anc->blksize;
|
||||
trk /= geo.sectors;
|
||||
break;
|
||||
@@ -2546,7 +2518,6 @@ static int fdasd_get_partition_data(fdasd_anchor_t *anc, extent_t *part_extent,
|
||||
limit = part_tmp->start_trk - 1;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (start == limit) {
|
||||
@@ -2642,7 +2613,7 @@ static void fdasd_enqueue_new_partition(fdasd_anchor_t *anc)
|
||||
FIRST_USABLE_TRK;
|
||||
}
|
||||
} else {
|
||||
/* there are partitons in front of the new one */
|
||||
/* there are partitions in front of the new one */
|
||||
if (part_info->start_trk == part_info->prev->end_trk + 1) {
|
||||
/* new partition is right behind the previous one */
|
||||
part_info->fspace_trk = part_info->prev->fspace_trk -
|
||||
@@ -2797,7 +2768,7 @@ static void fdasd_remove_partition(fdasd_anchor_t *anc)
|
||||
/*
|
||||
* writes a standard volume label and a standard VTOC with
|
||||
* only one partition to disc. With this function is it
|
||||
* possible to create one partiton in non-interactive mode,
|
||||
* possible to create one partition in non-interactive mode,
|
||||
* which can be used within shell scripts
|
||||
*/
|
||||
static void fdasd_auto_partition(fdasd_anchor_t *anc)
|
||||
@@ -3067,7 +3038,6 @@ int main(int argc, char *argv[])
|
||||
fdasd_recreate_vtoc(&anchor);
|
||||
anchor.option_recreate = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
||||
117
fdasd/fdasd.h
117
fdasd/fdasd.h
@@ -14,125 +14,8 @@
|
||||
* SECTION: Definitions needed for DASD-API (see dasd.h) *
|
||||
*****************************************************************************/
|
||||
|
||||
#define DASD_IOCTL_LETTER 'D'
|
||||
|
||||
#define DASD_PARTN_BITS 2
|
||||
|
||||
/*
|
||||
* struct dasd_information_t
|
||||
* represents any data about the device, which is visible to userspace.
|
||||
* including foramt and featueres.
|
||||
*/
|
||||
typedef struct dasd_information_t {
|
||||
unsigned int devno; /* S/390 devno */
|
||||
unsigned int real_devno; /* for aliases */
|
||||
unsigned int schid; /* S/390 subchannel identifier */
|
||||
unsigned int cu_type : 16; /* from SenseID */
|
||||
unsigned int cu_model : 8; /* from SenseID */
|
||||
unsigned int dev_type : 16; /* from SenseID */
|
||||
unsigned int dev_model : 8; /* from SenseID */
|
||||
unsigned int open_count;
|
||||
unsigned int req_queue_len;
|
||||
unsigned int chanq_len; /* length of chanq */
|
||||
char type[4]; /* from discipline.name, 'none' for */
|
||||
/* unknown */
|
||||
unsigned int status; /* current device level */
|
||||
unsigned int label_block; /* where to find the VOLSER */
|
||||
unsigned int FBA_layout; /* fixed block size (like AIXVOL) */
|
||||
unsigned int characteristics_size;
|
||||
unsigned int confdata_size;
|
||||
char characteristics[64]; /* from read_device_characteristics */
|
||||
char configuration_data[256]; /* from read_configuration_data */
|
||||
} dasd_information_t;
|
||||
|
||||
struct dasd_eckd_characteristics {
|
||||
unsigned short cu_type;
|
||||
struct {
|
||||
unsigned char support:2;
|
||||
unsigned char async:1;
|
||||
unsigned char reserved:1;
|
||||
unsigned char cache_info:1;
|
||||
unsigned char model:3;
|
||||
} __attribute__ ((packed)) cu_model;
|
||||
unsigned short dev_type;
|
||||
unsigned char dev_model;
|
||||
struct {
|
||||
unsigned char mult_burst:1;
|
||||
unsigned char RT_in_LR:1;
|
||||
unsigned char reserved1:1;
|
||||
unsigned char RD_IN_LR:1;
|
||||
unsigned char reserved2:4;
|
||||
unsigned char reserved3:8;
|
||||
unsigned char defect_wr:1;
|
||||
unsigned char XRC_supported:1;
|
||||
unsigned char reserved4:1;
|
||||
unsigned char striping:1;
|
||||
unsigned char reserved5:4;
|
||||
unsigned char cfw:1;
|
||||
unsigned char reserved6:2;
|
||||
unsigned char cache:1;
|
||||
unsigned char dual_copy:1;
|
||||
unsigned char dfw:1;
|
||||
unsigned char reset_alleg:1;
|
||||
unsigned char sense_down:1;
|
||||
} __attribute__ ((packed)) facilities;
|
||||
unsigned char dev_class;
|
||||
unsigned char unit_type;
|
||||
unsigned short no_cyl;
|
||||
unsigned short trk_per_cyl;
|
||||
unsigned char sec_per_trk;
|
||||
unsigned char byte_per_track[3];
|
||||
unsigned short home_bytes;
|
||||
unsigned char formula;
|
||||
union {
|
||||
struct {
|
||||
unsigned char f1;
|
||||
unsigned short f2;
|
||||
unsigned short f3;
|
||||
} __attribute__ ((packed)) f_0x01;
|
||||
struct {
|
||||
unsigned char f1;
|
||||
unsigned char f2;
|
||||
unsigned char f3;
|
||||
unsigned char f4;
|
||||
unsigned char f5;
|
||||
} __attribute__ ((packed)) f_0x02;
|
||||
} __attribute__ ((packed)) factors;
|
||||
unsigned short first_alt_trk;
|
||||
unsigned short no_alt_trk;
|
||||
unsigned short first_dia_trk;
|
||||
unsigned short no_dia_trk;
|
||||
unsigned short first_sup_trk;
|
||||
unsigned short no_sup_trk;
|
||||
unsigned char MDR_ID;
|
||||
unsigned char OBR_ID;
|
||||
unsigned char director;
|
||||
unsigned char rd_trk_set;
|
||||
unsigned short max_rec_zero;
|
||||
unsigned char reserved1;
|
||||
unsigned char RWANY_in_LR;
|
||||
unsigned char factor6;
|
||||
unsigned char factor7;
|
||||
unsigned char factor8;
|
||||
unsigned char reserved2[3];
|
||||
unsigned char reserved3[6];
|
||||
unsigned int long_no_cyl;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* Get information on a dasd device (enhanced) */
|
||||
#define BIODASDINFO _IOR(DASD_IOCTL_LETTER,1,dasd_information_t)
|
||||
|
||||
/*****************************************************************************
|
||||
* SECTION: Further IOCTL Definitions (see fs.h and hdreq.h) *
|
||||
*****************************************************************************/
|
||||
#define BLKROGET _IO(0x12,94) /* get read-only status (0 = read_write) */
|
||||
#define BLKRRPART _IO(0x12,95) /* re-read partition table */
|
||||
#define BLKSSZGET _IO(0x12,104)/* get block device sector size */
|
||||
#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* device size in bytes (u64 *arg)*/
|
||||
|
||||
/* get device geometry */
|
||||
#define HDIO_GETGEO 0x0301
|
||||
|
||||
/*****************************************************************************
|
||||
* SECTION: FDASD internal types *
|
||||
*****************************************************************************/
|
||||
|
||||
@@ -49,7 +49,7 @@ install: all install-scripts
|
||||
install-scripts: lshmc
|
||||
@for i in $^; do \
|
||||
cat $$i | \
|
||||
sed -e 's+%S390_TOOLS_VERSION%+$(S390_TOOLS_RELEASE)+' \
|
||||
sed -e 's/%S390_TOOLS_VERSION%/$(S390_TOOLS_RELEASE)/' \
|
||||
>$(DESTDIR)$(USRSBINDIR)/$$i; \
|
||||
chown $(OWNER).$(GROUP) $(DESTDIR)$(USRSBINDIR)/$$i; \
|
||||
chmod 755 $(DESTDIR)$(USRSBINDIR)/$$i; \
|
||||
|
||||
207
include/lib/dasd_base.h
Normal file
207
include/lib/dasd_base.h
Normal file
@@ -0,0 +1,207 @@
|
||||
/*
|
||||
* dasd_base - Library for DASD related functions
|
||||
*
|
||||
* DASD related helper functions for accessing device information
|
||||
*
|
||||
* Copyright IBM Corp. 2013, 2017
|
||||
* Copyright Red Hat Inc. 2017
|
||||
*
|
||||
* s390-tools is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See LICENSE for details.
|
||||
*/
|
||||
|
||||
#ifndef LIB_DASD_BASE_H
|
||||
#define LIB_DASD_BASE_H
|
||||
|
||||
#ifdef __linux__
|
||||
#include <linux/hdreg.h>
|
||||
#endif
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
typedef struct dasd_information2_t {
|
||||
unsigned int devno; /* S/390 devno */
|
||||
unsigned int real_devno; /* for aliases */
|
||||
unsigned int schid; /* S/390 subchannel identifier */
|
||||
unsigned int cu_type : 16; /* from SenseID */
|
||||
unsigned int cu_model : 8; /* from SenseID */
|
||||
unsigned int dev_type : 16; /* from SenseID */
|
||||
unsigned int dev_model : 8; /* from SenseID */
|
||||
unsigned int open_count;
|
||||
unsigned int req_queue_len;
|
||||
unsigned int chanq_len; /* length of chanq */
|
||||
char type[4]; /* from discipline.name, 'none' for unknown */
|
||||
unsigned int status; /* current device level */
|
||||
unsigned int label_block; /* where to find the VOLSER */
|
||||
unsigned int FBA_layout; /* fixed block size (like AIXVOL) */
|
||||
unsigned int characteristics_size;
|
||||
unsigned int confdata_size;
|
||||
unsigned char characteristics[64];/*from read_device_characteristics */
|
||||
unsigned char configuration_data[256];/*from read_configuration_data */
|
||||
unsigned int format; /* format info like formatted/cdl/ldl/... */
|
||||
unsigned int features; /* dasd features like 'ro',... */
|
||||
unsigned int reserved0; /* reserved for further use ,... */
|
||||
unsigned int reserved1; /* reserved for further use ,... */
|
||||
unsigned int reserved2; /* reserved for further use ,... */
|
||||
unsigned int reserved3; /* reserved for further use ,... */
|
||||
unsigned int reserved4; /* reserved for further use ,... */
|
||||
unsigned int reserved5; /* reserved for further use ,... */
|
||||
unsigned int reserved6; /* reserved for further use ,... */
|
||||
unsigned int reserved7; /* reserved for further use ,... */
|
||||
} dasd_information2_t;
|
||||
|
||||
struct dasd_eckd_characteristics {
|
||||
unsigned short cu_type;
|
||||
struct {
|
||||
unsigned char support:2;
|
||||
unsigned char async:1;
|
||||
unsigned char reserved:1;
|
||||
unsigned char cache_info:1;
|
||||
unsigned char model:3;
|
||||
} __attribute__ ((packed)) cu_model;
|
||||
unsigned short dev_type;
|
||||
unsigned char dev_model;
|
||||
struct {
|
||||
unsigned char mult_burst:1;
|
||||
unsigned char RT_in_LR:1;
|
||||
unsigned char reserved1:1;
|
||||
unsigned char RD_IN_LR:1;
|
||||
unsigned char reserved2:4;
|
||||
unsigned char reserved3:8;
|
||||
unsigned char defect_wr:1;
|
||||
unsigned char XRC_supported:1;
|
||||
unsigned char reserved4:1;
|
||||
unsigned char striping:1;
|
||||
unsigned char reserved5:4;
|
||||
unsigned char cfw:1;
|
||||
unsigned char reserved6:2;
|
||||
unsigned char cache:1;
|
||||
unsigned char dual_copy:1;
|
||||
unsigned char dfw:1;
|
||||
unsigned char reset_alleg:1;
|
||||
unsigned char sense_down:1;
|
||||
} __attribute__ ((packed)) facilities;
|
||||
unsigned char dev_class;
|
||||
unsigned char unit_type;
|
||||
unsigned short no_cyl;
|
||||
unsigned short trk_per_cyl;
|
||||
unsigned char sec_per_trk;
|
||||
unsigned char byte_per_track[3];
|
||||
unsigned short home_bytes;
|
||||
unsigned char formula;
|
||||
union {
|
||||
struct {
|
||||
unsigned char f1;
|
||||
unsigned short f2;
|
||||
unsigned short f3;
|
||||
} __attribute__ ((packed)) f_0x01;
|
||||
struct {
|
||||
unsigned char f1;
|
||||
unsigned char f2;
|
||||
unsigned char f3;
|
||||
unsigned char f4;
|
||||
unsigned char f5;
|
||||
} __attribute__ ((packed)) f_0x02;
|
||||
} __attribute__ ((packed)) factors;
|
||||
unsigned short first_alt_trk;
|
||||
unsigned short no_alt_trk;
|
||||
unsigned short first_dia_trk;
|
||||
unsigned short no_dia_trk;
|
||||
unsigned short first_sup_trk;
|
||||
unsigned short no_sup_trk;
|
||||
unsigned char MDR_ID;
|
||||
unsigned char OBR_ID;
|
||||
unsigned char director;
|
||||
unsigned char rd_trk_set;
|
||||
unsigned short max_rec_zero;
|
||||
unsigned char reserved1;
|
||||
unsigned char RWANY_in_LR;
|
||||
unsigned char factor6;
|
||||
unsigned char factor7;
|
||||
unsigned char factor8;
|
||||
unsigned char reserved2[3];
|
||||
unsigned char reserved3[6];
|
||||
unsigned int long_no_cyl;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*
|
||||
* struct format_data_t
|
||||
* represents all data necessary to format a dasd
|
||||
*/
|
||||
typedef struct format_data_t {
|
||||
unsigned int start_unit; /* from track */
|
||||
unsigned int stop_unit; /* to track */
|
||||
unsigned int blksize; /* sectorsize */
|
||||
unsigned int intensity;
|
||||
} format_data_t;
|
||||
|
||||
/*
|
||||
* struct format_check_t
|
||||
* represents all data necessary to evaluate the format of
|
||||
* different tracks of a dasd
|
||||
*/
|
||||
typedef struct format_check_t {
|
||||
/* Input */
|
||||
struct format_data_t expect;
|
||||
|
||||
/* Output */
|
||||
unsigned int result; /* Error indication (DASD_FMT_ERR_*) */
|
||||
unsigned int unit; /* Track that is in error */
|
||||
unsigned int rec; /* Record that is in error */
|
||||
unsigned int num_records; /* Records in the track in error */
|
||||
unsigned int blksize; /* Block-size of first record in error */
|
||||
unsigned int key_length; /* Key length of first record in error */
|
||||
} format_check_t;
|
||||
|
||||
#ifndef __linux__
|
||||
/* definition from hdreg.h */
|
||||
struct hd_geometry {
|
||||
unsigned char heads;
|
||||
unsigned char sectors;
|
||||
unsigned short cylinders;
|
||||
unsigned long start;
|
||||
};
|
||||
#endif
|
||||
|
||||
#define DASD_IOCTL_LETTER 'D'
|
||||
|
||||
/* Disable the volume (for Linux) */
|
||||
#define BIODASDDISABLE _IO(DASD_IOCTL_LETTER, 0)
|
||||
/* Enable the volume (for Linux) */
|
||||
#define BIODASDENABLE _IO(DASD_IOCTL_LETTER, 1)
|
||||
/* Get information on a dasd device (enhanced) */
|
||||
#define BIODASDINFO2 _IOR(DASD_IOCTL_LETTER, 3, dasd_information2_t)
|
||||
/* #define BIODASDFORMAT _IOW(IOCTL_LETTER,0,format_data_t) , deprecated */
|
||||
#define BIODASDFMT _IOW(DASD_IOCTL_LETTER, 1, format_data_t)
|
||||
/* Check device format according to format_data_t */
|
||||
#define BIODASDCHECKFMT _IOWR(DASD_IOCTL_LETTER, 2, format_check_t)
|
||||
|
||||
/********************************************************************************
|
||||
* SECTION: Further IOCTL Definitions (see fs.h and hdreq.h)
|
||||
*******************************************************************************/
|
||||
/* get read-only status (0 = read_write) */
|
||||
#define BLKROGET _IO(0x12, 94)
|
||||
/* re-read partition table */
|
||||
#define BLKRRPART _IO(0x12, 95)
|
||||
/* get block device sector size */
|
||||
#define BLKSSZGET _IO(0x12, 104)
|
||||
/* return device size in bytes (u64 *arg) */
|
||||
#define BLKGETSIZE64 _IOR(0x12, 114, size_t)
|
||||
|
||||
#ifndef __linux__ /* from <linux/hdreg.h> */
|
||||
#define HDIO_GETGEO 0x0301
|
||||
#endif
|
||||
|
||||
int dasd_check_format(const char *device, format_check_t *p);
|
||||
int dasd_format_disk(int fd, format_data_t *p);
|
||||
int dasd_disk_disable(const char *device, int *fd);
|
||||
int dasd_disk_enable(int fd);
|
||||
int dasd_get_blocksize(const char *device, unsigned int *blksize);
|
||||
int dasd_get_blocksize_in_bytes(const char *device, unsigned long long *blksize);
|
||||
int dasd_get_geo(const char *device, struct hd_geometry *geo);
|
||||
int dasd_get_info(const char *device, dasd_information2_t *info);
|
||||
int dasd_is_ro(const char *device, bool *ro);
|
||||
int dasd_reread_partition_table(const char *device, int ntries);
|
||||
|
||||
#endif /* LIB_DASD_BASE_H */
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "lib/dasd_base.h"
|
||||
|
||||
#define LINE_LENGTH 80
|
||||
#define VTOC_START_CC 0x0
|
||||
@@ -40,14 +41,6 @@
|
||||
|
||||
#define VTOC_ERROR "VTOC error:"
|
||||
|
||||
/* definition from hdreq.h */
|
||||
struct hd_geometry {
|
||||
unsigned char heads;
|
||||
unsigned char sectors;
|
||||
unsigned short cylinders;
|
||||
unsigned long start;
|
||||
};
|
||||
|
||||
typedef struct ttr
|
||||
{
|
||||
u_int16_t tt;
|
||||
|
||||
@@ -8,7 +8,7 @@ clean:
|
||||
rm -f *.o core xcec-bridge
|
||||
|
||||
install: ip_watcher.pl xcec-bridge start_hsnc.sh
|
||||
$(SED) -e 's+%S390_TOOLS_VERSION%+$(S390_TOOLS_RELEASE)+' \
|
||||
$(SED) -e 's/%S390_TOOLS_VERSION%/$(S390_TOOLS_RELEASE)/' \
|
||||
< start_hsnc.sh >$(DESTDIR)$(USRSBINDIR)/start_hsnc.sh; \
|
||||
chown $(OWNER).$(GROUP) $(DESTDIR)$(USRSBINDIR)/start_hsnc.sh; \
|
||||
chmod 755 $(DESTDIR)$(USRSBINDIR)/start_hsnc.sh; \
|
||||
|
||||
@@ -4,7 +4,7 @@ lib = libdasd.a
|
||||
|
||||
all: $(lib)
|
||||
|
||||
objects = dasd_sys.o
|
||||
objects = dasd_sys.o dasd_ioctl.o
|
||||
|
||||
$(lib): $(objects) Makefile
|
||||
|
||||
|
||||
263
libdasd/dasd_ioctl.c
Normal file
263
libdasd/dasd_ioctl.c
Normal file
@@ -0,0 +1,263 @@
|
||||
/*
|
||||
* dasd_ioctl - Library for dasd-related ioctls
|
||||
*
|
||||
* DASD related helper functions for accessing device information via ioctls
|
||||
*
|
||||
* Copyright IBM Corp. 2013, 2017
|
||||
* Copyright Red Hat Inc. 2017
|
||||
*
|
||||
* s390-tools is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See LICENSE for details.
|
||||
*/
|
||||
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "lib/dasd_base.h"
|
||||
|
||||
#define COULD_NOT_OPEN_WARN(device) \
|
||||
warn("Could not open device '%s'", device)
|
||||
|
||||
#define COULD_NOT_CLOSE_WARN \
|
||||
warn("Unable to close device")
|
||||
|
||||
#define RUN_IOCTL(fd, req, argp) \
|
||||
do { \
|
||||
if (ioctl(fd, req, argp) != 0) { \
|
||||
int err = errno; \
|
||||
if (err != EBADF) \
|
||||
dasd_close_device(fd); \
|
||||
return err; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static int dasd_open_device(const char *device, int flags)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = open(device, flags);
|
||||
if (fd == -1)
|
||||
COULD_NOT_OPEN_WARN(device);
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
static void dasd_close_device(int fd)
|
||||
{
|
||||
if (close(fd) != 0)
|
||||
COULD_NOT_CLOSE_WARN;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get DASD block size information for device
|
||||
*
|
||||
* @param[in] device node device node's name
|
||||
* @param[out] blksize the block size
|
||||
*
|
||||
* @retval 0 in case of success
|
||||
* @retval errno in case of failure
|
||||
*
|
||||
*/
|
||||
int dasd_get_blocksize(const char *device, unsigned int *blksize)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = dasd_open_device(device, O_RDONLY);
|
||||
RUN_IOCTL(fd, BLKSSZGET, blksize);
|
||||
dasd_close_device(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get DASD block size information (in bytes) for device
|
||||
*
|
||||
* @param[in] device node device node's name
|
||||
* @param[out] blksize block size in bytes
|
||||
*
|
||||
* @retval 0 in case of success
|
||||
* @retval errno in case of failure
|
||||
*/
|
||||
int dasd_get_blocksize_in_bytes(const char *device, unsigned long long *blksize)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = dasd_open_device(device, O_RDONLY);
|
||||
RUN_IOCTL(fd, BLKGETSIZE64, blksize);
|
||||
dasd_close_device(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get DASD disk information for device
|
||||
*
|
||||
* @param[in] device node device node's name
|
||||
* @param[out] info pointer to dasd information
|
||||
*
|
||||
* @retval 0 in case of success
|
||||
* @retval errno in case of failure
|
||||
*/
|
||||
int dasd_get_info(const char *device, dasd_information2_t *info)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = dasd_open_device(device, O_RDONLY);
|
||||
RUN_IOCTL(fd, BIODASDINFO2, info);
|
||||
dasd_close_device(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get DASD disk geometry information for device
|
||||
*
|
||||
* @param[in] device node device node's name
|
||||
* @param[out] geo pointer to device geometry information
|
||||
*
|
||||
* @retval errno in case of failure
|
||||
* @retval 0 in case of success
|
||||
*/
|
||||
int dasd_get_geo(const char *device, struct hd_geometry *geo)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = dasd_open_device(device, O_RDONLY);
|
||||
RUN_IOCTL(fd, HDIO_GETGEO, geo);
|
||||
dasd_close_device(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get DASD read/write status information for device
|
||||
*
|
||||
* @param[in] device node device node's name
|
||||
* @param[out] ro read-only status (1 for ro, 0 for rw)
|
||||
*
|
||||
* @retval 0 in case of success
|
||||
* @retval errno in case of failure
|
||||
*/
|
||||
int dasd_is_ro(const char *device, bool *ro)
|
||||
{
|
||||
int fd, val;
|
||||
|
||||
fd = dasd_open_device(device, O_RDWR);
|
||||
RUN_IOCTL(fd, BLKROGET, &val);
|
||||
*ro = (val != 0) ? true : false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable DASD disk.
|
||||
*
|
||||
* @param[in] device node device node's name
|
||||
*
|
||||
* @retval 0 in case of success
|
||||
* @retval errno in case of failure
|
||||
*
|
||||
* Note: Before BIODASDFMT can be called, a DASD has to be disabled (or rather
|
||||
* put into a BASIC state) via BIODASDDISABLE. However, if you disable the DASD,
|
||||
* close the file descriptor, and then try to reopen it, it won't work as the
|
||||
* device isn't fully usable anymore. For BIODASDFMT to work, the file
|
||||
* descriptor opened for BIODASDISABLE has to be kept open until BIODASDFMT has
|
||||
* finished.
|
||||
*/
|
||||
int dasd_disk_disable(const char *device, int *fd)
|
||||
{
|
||||
*fd = dasd_open_device(device, O_RDWR);
|
||||
RUN_IOCTL(*fd, BIODASDDISABLE, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable DASD disk
|
||||
*
|
||||
* @param[in] device node device node's name
|
||||
*
|
||||
* @retval 0 in case of success
|
||||
* @retval errno in case of failure
|
||||
*/
|
||||
int dasd_disk_enable(int fd)
|
||||
{
|
||||
RUN_IOCTL(fd, BIODASDENABLE, NULL);
|
||||
dasd_close_device(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Format DASD disk
|
||||
*
|
||||
* @param[in] fd device node's file descriptor
|
||||
* @param[in] p format options
|
||||
*
|
||||
* @retval 0 in case of success
|
||||
* @retval errno in case of failure
|
||||
*/
|
||||
int dasd_format_disk(int fd, format_data_t *p)
|
||||
{
|
||||
RUN_IOCTL(fd, BIODASDFMT, p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check DASD format
|
||||
*
|
||||
* @param[in] device node device node's name
|
||||
* @param[in] p format params
|
||||
*
|
||||
* @retval 0 in case of success
|
||||
* @retval errno in case of failure
|
||||
*/
|
||||
int dasd_check_format(const char *device, format_check_t *p)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = dasd_open_device(device, O_RDONLY);
|
||||
RUN_IOCTL(fd, BIODASDCHECKFMT, p);
|
||||
dasd_close_device(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reread partition table
|
||||
*
|
||||
* @param[in] device node device node's name
|
||||
* @param[in] ntries maximum number of tries
|
||||
*
|
||||
* @retval 0 in case of success
|
||||
* @retval errno in case of failure
|
||||
*/
|
||||
int dasd_reread_partition_table(const char *device, int ntries)
|
||||
{
|
||||
int i, fd, err = 0;
|
||||
|
||||
fd = dasd_open_device(device, O_RDONLY);
|
||||
|
||||
/*
|
||||
* If the BLKRRPART ioctl fails, it is most likely due to the device
|
||||
* just being in use by udev. So it is worthwhile to retry the ioctl
|
||||
* after a second as it is likely to succeed.
|
||||
*/
|
||||
for (i = 0; i < ntries; i++) {
|
||||
if (ioctl(fd, BLKRRPART, NULL) != 0) {
|
||||
err = errno;
|
||||
sleep(1);
|
||||
} else {
|
||||
err = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
dasd_close_device(fd);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_libc.h"
|
||||
#include "lib/util_list.h"
|
||||
|
||||
/*
|
||||
@@ -45,10 +46,8 @@ void util_list_init_offset(struct util_list *list, unsigned long offset)
|
||||
*/
|
||||
struct util_list *util_list_new_offset(unsigned long offset)
|
||||
{
|
||||
struct util_list *list = malloc(sizeof(*list));
|
||||
struct util_list *list = util_malloc(sizeof(*list));
|
||||
|
||||
if (!list)
|
||||
return NULL;
|
||||
util_list_init_offset(list, offset);
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -13,16 +13,13 @@
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <linux/types.h>
|
||||
#include <malloc.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "lib/dasd_base.h"
|
||||
#include "lib/libzds.h"
|
||||
#include "lib/u2s.h"
|
||||
#include "lib/util_base.h"
|
||||
@@ -31,13 +28,6 @@
|
||||
|
||||
/** @cond PRIVATE */
|
||||
|
||||
/******************************************************************************/
|
||||
/* ioctl related definitions */
|
||||
/******************************************************************************/
|
||||
|
||||
/* device size in bytes (u64 *arg) */
|
||||
#define BLKGETSIZE64 _IOR(0x12, 114, size_t)
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* libzds structure definitions */
|
||||
@@ -415,17 +405,7 @@ int lzds_zdsroot_alloc(struct zdsroot **root)
|
||||
memset(tmproot, 0, sizeof(*tmproot));
|
||||
|
||||
tmproot->dasdlist = util_list_new(struct dasd, list);
|
||||
if (!tmproot->dasdlist) {
|
||||
free(tmproot);
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
tmproot->datasetlist = util_list_new(struct dataset, list);
|
||||
if (!tmproot->dasdlist) {
|
||||
util_list_free(tmproot->dasdlist);
|
||||
free(tmproot);
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
*root = tmproot;
|
||||
|
||||
@@ -480,18 +460,11 @@ void lzds_zdsroot_free(struct zdsroot *root)
|
||||
*/
|
||||
static int dasd_read_geometry(struct dasd *dasd)
|
||||
{
|
||||
int fd;
|
||||
unsigned long long size_in_bytes;
|
||||
|
||||
errorlog_clear(dasd->log);
|
||||
fd = open(dasd->device, O_RDONLY);
|
||||
if (fd < 0)
|
||||
return errorlog_add_message(
|
||||
&dasd->log, NULL, EIO,
|
||||
"read geometry: could not open device %s\n",
|
||||
dasd->device);
|
||||
|
||||
if (ioctl(fd, BLKGETSIZE64, &size_in_bytes) != 0)
|
||||
if (dasd_get_blocksize_in_bytes(dasd->device, &size_in_bytes) != 0)
|
||||
return errorlog_add_message(
|
||||
&dasd->log, NULL, EIO,
|
||||
"read geometry: could not get size from device %s\n",
|
||||
@@ -505,7 +478,6 @@ static int dasd_read_geometry(struct dasd *dasd)
|
||||
dasd->label_block = 2;
|
||||
dasd->heads = 15;
|
||||
dasd->cylinders = (size_in_bytes / (dasd->heads * RAWTRACKSIZE));
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -822,10 +794,6 @@ static int errorlog_alloc(struct errorlog **log)
|
||||
return ENOMEM;
|
||||
memset(tmplog, 0, sizeof(*tmplog));
|
||||
tmplog->entries = util_list_new(struct errormsg, list);
|
||||
if (!tmplog->entries) {
|
||||
free(tmplog);
|
||||
return ENOMEM;
|
||||
}
|
||||
*log = tmplog;
|
||||
return 0;
|
||||
}
|
||||
@@ -2203,8 +2171,6 @@ static int dataset_member_analysis(struct dataset *ds)
|
||||
|
||||
dataset_free_memberlist(ds);
|
||||
ds->memberlist = util_list_new(struct pdsmember, list);
|
||||
if (!ds->memberlist)
|
||||
return ENOMEM;
|
||||
|
||||
/* track buffer must be page aligned for O_DIRECT */
|
||||
trackdata = memalign(4096, RAWTRACKSIZE);
|
||||
|
||||
@@ -3,7 +3,7 @@ include ../common.mak
|
||||
all:
|
||||
|
||||
install: qethconf
|
||||
$(SED) -e 's+%S390_TOOLS_VERSION%+$(S390_TOOLS_RELEASE)+' \
|
||||
$(SED) -e 's/%S390_TOOLS_VERSION%/$(S390_TOOLS_RELEASE)/' \
|
||||
< qethconf >$(DESTDIR)$(BINDIR)/qethconf; \
|
||||
chown $(OWNER).$(GROUP) $(DESTDIR)$(BINDIR)/qethconf; \
|
||||
chmod 755 $(DESTDIR)$(BINDIR)/qethconf; \
|
||||
|
||||
@@ -10,13 +10,13 @@ install:
|
||||
@for i in $(SCRIPTS); \
|
||||
do \
|
||||
cat $$i | \
|
||||
sed -e 's+%S390_TOOLS_VERSION%+$(S390_TOOLS_RELEASE)+' \
|
||||
sed -e 's/%S390_TOOLS_VERSION%/$(S390_TOOLS_RELEASE)/' \
|
||||
>$(DESTDIR)$(BINDIR)/$$i; \
|
||||
chown $(OWNER):$(GROUP) $(DESTDIR)$(BINDIR)/$$i; \
|
||||
chmod 755 $(DESTDIR)$(BINDIR)/$$i; \
|
||||
done
|
||||
|
||||
sed -e 's+%S390_TOOLS_VERSION%+$(S390_TOOLS_RELEASE)+' cpictl > \
|
||||
sed -e 's/%S390_TOOLS_VERSION%/$(S390_TOOLS_RELEASE)/' cpictl > \
|
||||
$(DESTDIR)$(TOOLS_LIBDIR)/cpictl
|
||||
chown $(OWNER):$(GROUP) $(DESTDIR)$(TOOLS_LIBDIR)/cpictl
|
||||
chmod 775 $(DESTDIR)$(TOOLS_LIBDIR)/cpictl
|
||||
|
||||
@@ -509,6 +509,7 @@ VM_CMDS="q userid\
|
||||
:q cache\
|
||||
:q nic\
|
||||
:q pav\
|
||||
:q proc\
|
||||
:q proc topology\
|
||||
:q mt\
|
||||
:q qioass\
|
||||
|
||||
@@ -23,7 +23,7 @@ install: install-scripts install-manpages install-usrsbin-scripts $(SUB_DIRS)
|
||||
install-scripts: $(SCRIPTS)
|
||||
@for i in $^; do \
|
||||
cat $$i | \
|
||||
sed -e 's+%S390_TOOLS_VERSION%+$(S390_TOOLS_RELEASE)+' \
|
||||
sed -e 's/%S390_TOOLS_VERSION%/$(S390_TOOLS_RELEASE)/' \
|
||||
>$(DESTDIR)$(BINDIR)/$$i; \
|
||||
chown $(OWNER).$(GROUP) $(DESTDIR)$(BINDIR)/$$i; \
|
||||
chmod 755 $(DESTDIR)$(BINDIR)/$$i; \
|
||||
@@ -32,7 +32,7 @@ install-scripts: $(SCRIPTS)
|
||||
install-usrsbin-scripts: $(USRSBIN_SCRIPTS)
|
||||
@for i in $^; do \
|
||||
cat $$i | \
|
||||
sed -e 's+%S390_TOOLS_VERSION%+$(S390_TOOLS_RELEASE)+' \
|
||||
sed -e 's/%S390_TOOLS_VERSION%/$(S390_TOOLS_RELEASE)/' \
|
||||
>$(DESTDIR)$(USRSBINDIR)/$$i; \
|
||||
chown $(OWNER).$(GROUP) $(DESTDIR)$(USRSBINDIR)/$$i; \
|
||||
chmod 755 $(DESTDIR)$(USRSBINDIR)/$$i; \
|
||||
|
||||
@@ -29,13 +29,21 @@ depends() {
|
||||
}
|
||||
|
||||
installkernel() {
|
||||
local _modules=$(lszdev --by-path / --columns MODULES --no-headings)
|
||||
local _modules=$(lszdev --by-path / --columns MODULES --no-headings 2>/dev/null)
|
||||
|
||||
[ -z "$_modules" ] && return 0
|
||||
[ ! -z "$_modules" ] && instmods $_modules
|
||||
}
|
||||
|
||||
install() {
|
||||
local _tempfile=$(mktemp --tmpdir dracut-zdev.XXXXXX)
|
||||
local _tempfile
|
||||
|
||||
# Exit early if root device type is unknown
|
||||
if ! lszdev --by-path / >/dev/null 2>&1 ; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
_tempfile=$(mktemp --tmpdir dracut-zdev.XXXXXX)
|
||||
|
||||
if chzdev --export - --persistent --by-path / >/dev/null 2>&1 ; then
|
||||
# Use persistent configuration
|
||||
|
||||
@@ -3,7 +3,8 @@ include ../common.mak
|
||||
libs = $(rootdir)/libzds/libzds.a \
|
||||
$(rootdir)/libvtoc/libvtoc.a \
|
||||
$(rootdir)/libu2s/libu2s.a \
|
||||
$(rootdir)/libutil/libutil.a
|
||||
$(rootdir)/libutil/libutil.a \
|
||||
$(rootdir)/libdasd/libdasd.a
|
||||
|
||||
ifeq (${HAVE_FUSE},0)
|
||||
|
||||
|
||||
@@ -242,7 +242,7 @@ static void vol_init(struct vol *vol, struct vol_parm *vol_parm, int ssid,
|
||||
|
||||
sprintf(vol->bus_id, "0.%x.%04x", ssid, vol_parm->devno);
|
||||
vol->blk_size = vol_parm->blk_size << 8;
|
||||
vol->part_off = vol_parm->start_blk * vol->blk_size;
|
||||
vol->part_off = (u64)vol_parm->start_blk * vol->blk_size;
|
||||
vol->part_size = blk_cnt * vol->blk_size;
|
||||
vol->status = dev_from_busid(vol->bus_id, &vol->dev);
|
||||
vol->sign = SIGN_VALID;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Common definitions
|
||||
include ../../common.mak
|
||||
|
||||
CFLAGS_BOOT = -Os -g -I../include -D__ASSEMBLY__ \
|
||||
CFLAGS_BOOT = $(NO_PIE_CFLAGS) -Os -g -I../include -D__ASSEMBLY__ \
|
||||
-DS390_TOOLS_RELEASE=$(S390_TOOLS_RELEASE) \
|
||||
-fno-builtin -ffreestanding -fno-asynchronous-unwind-tables \
|
||||
-fno-delete-null-pointer-checks \
|
||||
@@ -54,11 +54,11 @@ stage3.exec: head.o stage3.o kdump3.o libc.o sclp.o sclp_stage3.o \
|
||||
}' \
|
||||
); \
|
||||
case $$STAGE in \
|
||||
0) SFLAGS="-nostdlib -Wl,-Ttext,0";; \
|
||||
1) SFLAGS="-nostdlib -Wl,-Ttext,0x18";; \
|
||||
1b) SFLAGS="-nostdlib -Wl,-Ttext,0xE000";; \
|
||||
2) SFLAGS="-nostdlib -Wl,-T,stage2.lds";; \
|
||||
3) SFLAGS="-nostdlib -Wl,-T,stage3.lds";; \
|
||||
0) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-Ttext,0";; \
|
||||
1) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-Ttext,0x18";; \
|
||||
1b) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-Ttext,0xE000";; \
|
||||
2) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-T,stage2.lds";; \
|
||||
3) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-T,stage3.lds";; \
|
||||
esac; \
|
||||
$(LINK) $$SFLAGS -m64 $^ -o $@
|
||||
|
||||
@@ -77,7 +77,7 @@ stage3.exec: head.o stage3.o kdump3.o libc.o sclp.o sclp_stage3.o \
|
||||
$< $@
|
||||
|
||||
data.o: $(FILES)
|
||||
$(LD) -r -b binary -o data.o $(FILES)
|
||||
$(LD) $(NO_PIE_LDFLAGS) -r -b binary -o data.o $(FILES)
|
||||
|
||||
data.h: data.o
|
||||
rm -f data.h
|
||||
|
||||
@@ -7,8 +7,8 @@ ALL_CPPFLAGS += -I../include -I../boot \
|
||||
-DZFCPDUMP_FS_RD=$(ZFCPDUMP_FS_RD) \
|
||||
-DZFCPDUMP_PART_IMAGE=$(ZFCPDUMP_PART_IMAGE) \
|
||||
-DZFCPDUMP_PART_RD=$(ZFCPDUMP_PART_RD) \
|
||||
-D_FILE_OFFSET_BITS=64
|
||||
ALL_LDFLAGS += -Wl,-z,noexecstack
|
||||
-D_FILE_OFFSET_BITS=64 $(NO_PIE_CFLAGS)
|
||||
ALL_LDFLAGS += -Wl,-z,noexecstack $(NO_PIE_LDFLAGS)
|
||||
|
||||
libs = $(rootdir)/libutil/libutil.a \
|
||||
$(rootdir)/libu2s/libu2s.a
|
||||
|
||||
Reference in New Issue
Block a user