mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
44598496c5 | ||
|
|
2a6a28023b | ||
|
|
e581fa3fea | ||
|
|
0382659f4f | ||
|
|
e767a2b99d | ||
|
|
869f629746 | ||
|
|
7b8d09e62e | ||
|
|
5a8eee163b | ||
|
|
75a45158ad | ||
|
|
16c4074e47 | ||
|
|
2b92bc4c08 | ||
|
|
d0e2caf0ff | ||
|
|
d542138868 | ||
|
|
df133846b5 | ||
|
|
283e0bd5ea | ||
|
|
5ae3ec72b2 | ||
|
|
d9e9f7185f | ||
|
|
532d87d281 | ||
|
|
8600296030 | ||
|
|
3908725d3b | ||
|
|
780133f825 | ||
|
|
82c8148983 | ||
|
|
c12c4af760 | ||
|
|
f595bce3c0 | ||
|
|
0768fbbb20 | ||
|
|
523d833eb3 | ||
|
|
3fc01e7520 | ||
|
|
9259370891 | ||
|
|
7b84e30471 | ||
|
|
9c2a0649f2 | ||
|
|
778292e771 | ||
|
|
c21e464856 | ||
|
|
a060dc22db | ||
|
|
66f0090989 | ||
|
|
5d10b925c8 | ||
|
|
7076d19c7f | ||
|
|
69199219bc | ||
|
|
f0116ee79c | ||
|
|
4ad5e29f2f | ||
|
|
a0d3e3a1a8 | ||
|
|
1261105fe2 | ||
|
|
31866fbfa4 | ||
|
|
e179b7a9ac | ||
|
|
5e4577d76b | ||
|
|
496c257bf2 | ||
|
|
0028f166aa | ||
|
|
97047896ab | ||
|
|
94fcd8dc18 | ||
|
|
afdecb4a57 | ||
|
|
e5f9279295 | ||
|
|
55f0b001d1 | ||
|
|
5f768dd52d | ||
|
|
0daa7ba0b5 | ||
|
|
e748fff347 | ||
|
|
d81c423429 | ||
|
|
c993ad89c5 | ||
|
|
398f9ceac8 | ||
|
|
f0d8bc02a7 | ||
|
|
aba46da2d0 | ||
|
|
ddfe2bf59b |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -3,7 +3,7 @@
|
||||
#
|
||||
*.o
|
||||
*.a
|
||||
*.d
|
||||
*.o.d
|
||||
|
||||
#
|
||||
# Ignore generated executables and other generated files
|
||||
|
||||
10
AUTHORS.md
10
AUTHORS.md
@@ -2,17 +2,19 @@ List of all individuals having contributed content to s390-tools
|
||||
----------------------------------------------------------------
|
||||
|
||||
- Alexey Ishchuk
|
||||
- Andre Wild
|
||||
- Andreas Herrmann
|
||||
- Andre Wild
|
||||
- Antoinette Kaschner
|
||||
- Arnd Bergmann
|
||||
- Axel Wirbser
|
||||
- Benjamin Block
|
||||
- Carsten Otte
|
||||
- Christian Borntraeger
|
||||
- Christian Ehrhardt
|
||||
- Christof Schmitt
|
||||
- Claudio Imbrenda
|
||||
- Clemens von Mann
|
||||
- Dan Horak
|
||||
- Despina Papadopoulou
|
||||
- Eberhard Pasch
|
||||
- Einar Lueck
|
||||
@@ -20,6 +22,7 @@ List of all individuals having contributed content to s390-tools
|
||||
- Eugene Crosser
|
||||
- Eugene Dvurechenski
|
||||
- Farhan Ali
|
||||
- Fedor Loshakov
|
||||
- Felix Beck
|
||||
- Frank Blaschka
|
||||
- Frank Munzert
|
||||
@@ -27,8 +30,9 @@ List of all individuals having contributed content to s390-tools
|
||||
- Fritz Elfert
|
||||
- Gerald Schaefer
|
||||
- Gerhard Tonn
|
||||
- Hans Wippel
|
||||
- Hannes Reinecke
|
||||
- Hans-Joachim Picht
|
||||
- Hans Wippel
|
||||
- Harald Freudenberger
|
||||
- Heiko Carstens
|
||||
- Hendrik Brueckner
|
||||
@@ -64,6 +68,8 @@ List of all individuals having contributed content to s390-tools
|
||||
- Peter Oberparleiter
|
||||
- Peter Tiedemann
|
||||
- Philipp Kern
|
||||
- Philipp Rudo
|
||||
- Rafael Fonseca
|
||||
- Raimund Schroeder
|
||||
- Ralph Wuerthner
|
||||
- Rene Trumpp
|
||||
|
||||
24
CHANGELOG.md
24
CHANGELOG.md
@@ -1,8 +1,32 @@
|
||||
Release history for s390-tools (MIT version)
|
||||
--------------------------------------------
|
||||
|
||||
* __v2.2.0 (2017-12-07)__
|
||||
|
||||
For Linux kernel version: 4.14
|
||||
|
||||
Removed tools:
|
||||
- lsmem/chmem: Moved to util-linux >= 2.30
|
||||
|
||||
Changes of existing tools:
|
||||
- lszcrypt: Add CEX6S support
|
||||
- cpuplugd/mon_tools: Improve systemctl start error handling
|
||||
- systemd: Install also the unit configuration files
|
||||
|
||||
Bug Fixes:
|
||||
- build process: Fix parallel build for libutil
|
||||
- cpi: Add missing Install section to service unit
|
||||
- lsluns: Do not scan (all) if filters match nothing
|
||||
- lsluns: Enhance usage statement and man page
|
||||
- zdev: Use correct path to vmcp binary
|
||||
- ziomon: Re-add missing line in ziomon_fcpconf
|
||||
- ziomon: Fix non-zero return code in ziomon_util
|
||||
- zipl: Remove invalid dasdview command line option
|
||||
|
||||
* __v2.1.0 (2017-09-25)__
|
||||
|
||||
For Linux kernel version: 4.13
|
||||
|
||||
Added new tools:
|
||||
- netboot: Scripts for building a PXE-style netboot image for KVM
|
||||
- 90-cpi.rules/cpictl: New udev rule to update CPI when KVM is used
|
||||
|
||||
47
CODINGSTYLE.md
Normal file
47
CODINGSTYLE.md
Normal file
@@ -0,0 +1,47 @@
|
||||
Coding guidelines for s390-tools
|
||||
================================
|
||||
|
||||
For s390-tools the preferred language is C. We provide libraries, e.g.
|
||||
[`libutil`](libutil) that should be used by all tools if possible.
|
||||
|
||||
The coding style is based on the Linux [kernel guidelines]. Therefore, use
|
||||
the [checkpatch] tool for verification before you submit a patch.
|
||||
|
||||
[kernel guidelines]: https://www.kernel.org/doc/html/latest/process/coding-style.html
|
||||
[checkpatch]: https://github.com/torvalds/linux/blob/master/scripts/checkpatch.pl
|
||||
|
||||
Below we describe some additional things that we want you to consider when
|
||||
writing new code for s390-tools.
|
||||
|
||||
This package started in 2001 and has a long "tradition" - therefore, older tools
|
||||
might not follow all recommendations. Note that when changing existing code,
|
||||
consistency could have priority over applying rules.
|
||||
|
||||
Standard abbreviations
|
||||
----------------------
|
||||
|
||||
The abbreviations below are recommended to be used in the source code.
|
||||
|
||||
| __Short Name__ | __Long Name__ |
|
||||
|:----------------|:--------------------------------------------------|
|
||||
| attr | Attribute |
|
||||
| blk | Block |
|
||||
| buf | Buffer |
|
||||
| col | Column |
|
||||
| count | Count |
|
||||
| desc | Description |
|
||||
| dir | Directory |
|
||||
| fd | File descriptor (open) |
|
||||
| fp | File pointer (fopen) |
|
||||
| len | Length |
|
||||
| lib | Library |
|
||||
| mod | Module |
|
||||
| nr | Number |
|
||||
| parm | Parameter |
|
||||
| path | File path |
|
||||
| ptr | Pointer |
|
||||
| rc | Return code |
|
||||
| size | Size |
|
||||
| src | Source |
|
||||
| str | String |
|
||||
| sym | Symbol |
|
||||
218
CONTRIBUTING.md
218
CONTRIBUTING.md
@@ -42,24 +42,222 @@ Developer's Certificate of Origin 1.1
|
||||
this project or the open source license(s) involved.
|
||||
```
|
||||
|
||||
If you can certify the above, just add a line saying:
|
||||
If you can certify the above, just add a line stating the following at the
|
||||
bottom of each of your commit messages:
|
||||
|
||||
```
|
||||
Signed-off-by: Random Developer <random@developer.example.org>
|
||||
```
|
||||
|
||||
Please use your real name (no pseudonyms or anonymous contributions).
|
||||
Please use your real name and a valid e-mail address (no pseudonyms or anonymous
|
||||
contributions).
|
||||
|
||||
Submitting code
|
||||
---------------
|
||||
The preferred way is to create a github pull request for your code.
|
||||
The preferred way is to create GitHub pull requests for your code contributions.
|
||||
Please create separate pull requests for each logical enhancement, new feature,
|
||||
or fix.
|
||||
|
||||
Coding guidelines
|
||||
-----------------
|
||||
For s390-tools the preferred language is C. We provide libraries, e.g. libutil
|
||||
that should be used by all tools if possible.
|
||||
Before you submit your code please consider our recommendations in the
|
||||
[CODINGSTYLE](CODINGSTYLE.md) document.
|
||||
|
||||
The coding style is based on the Linux kernel guidelines. Therefore, use
|
||||
the checkpatch tool [1] for verification before you submit a patch.
|
||||
GitHub workflow for contributions
|
||||
---------------------------------
|
||||
In the examples below we use this fictive identity:
|
||||
|
||||
[1] https://github.com/torvalds/linux/blob/master/scripts/checkpatch.pl
|
||||
- Name: Random Developer
|
||||
- E-mail: random@developer.example.org
|
||||
- GitHub ID: random-developer
|
||||
|
||||
### Setup GitHub and local git
|
||||
|
||||
1. Create a fork of this repository by clicking the `Fork` button on the top
|
||||
right of the [s390-tools](https://github.com/ibm-s390-tools/s390-tools)
|
||||
main page
|
||||
|
||||
2. Clone your forked repository to your local development system
|
||||
```
|
||||
$ git clone https://github.com/random-developer/s390-tools.git
|
||||
```
|
||||
|
||||
3. Configure a remote called "upstream" pointing to the official
|
||||
s390-tools repository on GitHub
|
||||
```
|
||||
$ cd s390-tools
|
||||
~/s390-tools $ git remote add upstream https://github.com/ibm-s390-tools/s390-tools.git
|
||||
```
|
||||
|
||||
4. Verify your remotes
|
||||
```
|
||||
~/s390-tools $ git remote -v
|
||||
origin https://github.com/random-developer/s390-tools.git (fetch)
|
||||
origin https://github.com/random-developer/s390-tools.git (push)
|
||||
upstream https://github.com/ibm-s390-tools/s390-tools.git (fetch)
|
||||
upstream https://github.com/ibm-s390-tools/s390-tools.git (push)
|
||||
```
|
||||
You now have two remotes: The "origin" remote points to your fork
|
||||
and the "upstream" remote to the official s390-tools repository.
|
||||
|
||||
5. Configure your git user name and e-mail
|
||||
```
|
||||
~/s390-tools $ git config user.name "Random Developer"
|
||||
~/s390-tools $ git config user.email "random@developer.example.com"
|
||||
```
|
||||
|
||||
### Create a pull request
|
||||
|
||||
1. Create and checkout a new branch for your contribution
|
||||
```
|
||||
~/s390-tools $ git checkout -b contrib-doc-pr
|
||||
```
|
||||
|
||||
2. Make your changes to the code
|
||||
```
|
||||
~/s390-tools $ vim CONTRIBUTING.md
|
||||
```
|
||||
|
||||
3. Build and test your contribution
|
||||
```
|
||||
~/s390-tools $ make clean all
|
||||
~/s390-tools $ # Whatever you have to do for testing
|
||||
```
|
||||
|
||||
4. Commit your changes
|
||||
```
|
||||
~/s390-tools $ git add CONTRIBUTING.md
|
||||
~/s390-tools $ git commit -s
|
||||
```
|
||||
|
||||
Provide a meaningful commit message including your "Signed-off-by" line to
|
||||
each commit:
|
||||
```
|
||||
CONTRIBUTING: Outline steps to submit code
|
||||
|
||||
Explain in more detail how to submit s390-tools contributions as GitHub
|
||||
pull requests.
|
||||
|
||||
Signed-off-by: Random Developer <random@developer.example.com>
|
||||
```
|
||||
|
||||
5. Use the [checkpatch] tool to validate your commits
|
||||
```
|
||||
~/s390-tools $ checkpatch.pl --no-tree --git master..HEAD
|
||||
```
|
||||
|
||||
Interpret the checkpatch messages wisely - e.g. the 80 character rule can be
|
||||
ignored for printf format strings.
|
||||
|
||||
[checkpatch]: https://github.com/torvalds/linux/blob/master/scripts/checkpatch.pl
|
||||
|
||||
6. Push the changes to your fork of the repository
|
||||
```
|
||||
~/s390-tools $ git push origin contrib-doc-pr
|
||||
```
|
||||
|
||||
7. Go to the GitHub website of your s390-tools fork and create a pull request
|
||||
for your branch "contrib-doc-pr"
|
||||
|
||||
### Update a pull request during review
|
||||
|
||||
If there are changes requested during the review process, you have to update
|
||||
your code in the pull request.
|
||||
|
||||
To retain the existing review comments, add commits on top of your pull request
|
||||
branch. Depending on the size and number of changes, a rebase of the pull
|
||||
request might be required. This will be communicated during the review.
|
||||
|
||||
1. Update your code with new commits
|
||||
```
|
||||
~/s390-tools $ vi CONTRIBUTING.md
|
||||
~/s390-tools $ git add CONTRIBUTING.md
|
||||
~/s390-tools $ git commit -s -m "CONTRIBUTING: Add update PR info"
|
||||
```
|
||||
|
||||
2. Update your pull request by pushing changes
|
||||
```
|
||||
~/s390-tools $ git push origin contrib-doc-pr
|
||||
```
|
||||
|
||||
### Finalize a pull request
|
||||
|
||||
After the review process is finished or if you are explicitly asked for it,
|
||||
you have to create a clean commit series.
|
||||
|
||||
1. Save branch to "contrib-doc-pr.v1"
|
||||
```
|
||||
$ cd s390-tools
|
||||
~/s390-tools $ git branch contrib-doc-pr.v1
|
||||
```
|
||||
|
||||
2. Use interactive git rebase to merge commits, adjust commit messages,
|
||||
and rebase onto your local master branch
|
||||
```
|
||||
~/s390-tools $ git rebase -i master
|
||||
```
|
||||
|
||||
An editor is started and shows the following:
|
||||
```
|
||||
pick 2c73b9fc CONTRIBUTING: Outline steps to submit code
|
||||
pick fcfb0412 CONTRIBUTING: Add update PR info
|
||||
```
|
||||
|
||||
To merge the update into the original commit, replace "pick fcfb0412"
|
||||
with "squash fcfb0412".
|
||||
|
||||
```
|
||||
pick 2c73b9fc CONTRIBUTING: Outline steps to submit code
|
||||
squash fcfb0412 CONTRIBUTING: Add update PR info
|
||||
```
|
||||
|
||||
Save the document and exit the editor to finish the merge. Another editor
|
||||
window is presented to modify the commit message.
|
||||
|
||||
You now could change the commit message as follows:
|
||||
|
||||
```
|
||||
CONTRIBUTING: Outline steps to submit code
|
||||
|
||||
Explain in more detail how to submit s390-tools contributions as GitHub
|
||||
pull requests and how to update already submitted pull requests.
|
||||
|
||||
Signed-off-by: Random Developer <random@developer.example.com>
|
||||
```
|
||||
|
||||
With interactive rebasing you can also change the order of commits and
|
||||
modify commit messages with "reword".
|
||||
|
||||
3. Use `git push` with the force option to replace the existing pull request
|
||||
with your locally modified commits
|
||||
```
|
||||
~/s390-tools $ git push --force origin contrib-doc-pr
|
||||
```
|
||||
|
||||
### Rebase a pull request
|
||||
|
||||
If changes are made to the master branch in the official s390-tools
|
||||
repository you may be asked to rebase your branch with your contribution
|
||||
onto it. This can be required to prevent any merge conflicts that might
|
||||
arise when integrating your contribution.
|
||||
|
||||
1. Fetch all upstream changes from the official s390-tools repository,
|
||||
rebase your local master branch and update the master branch
|
||||
on your fork
|
||||
```
|
||||
~/s390-tools $ git fetch upstream
|
||||
~/s390-tools $ git checkout master
|
||||
~/s390-tools $ git rebase upstream/master
|
||||
~/s390-tools $ git push origin master
|
||||
```
|
||||
|
||||
2. Rebase your branch with your contribution onto the master branch of
|
||||
the official s390-tools repository
|
||||
```
|
||||
~/s390-tools $ git checkout contrib-doc-pr
|
||||
~/s390-tools $ git rebase master
|
||||
```
|
||||
|
||||
3. Use `git push` with the force option to replace the existing pull
|
||||
request with your locally modified commits
|
||||
```
|
||||
~/s390-tools $ git push --force origin contrib-doc-pr
|
||||
```
|
||||
|
||||
2
Makefile
2
Makefile
@@ -8,7 +8,7 @@ TOOL_DIRS = zipl zdump fdasd dasdfmt dasdview tunedasd \
|
||||
tape390 osasnmpd qetharp ip_watcher qethconf scripts zconf \
|
||||
vmconvert vmcp man mon_tools dasdinfo vmur cpuplugd ipl_tools \
|
||||
ziomon iucvterm hyptop cmsfs-fuse qethqoat zfcpdump zdsfs cpumf \
|
||||
systemd hmcdrvfs cpacfstats zdev dump2tar zkey netboot
|
||||
systemd hmcdrvfs cpacfstats zdev dump2tar zkey netboot etc
|
||||
SUB_DIRS = $(LIB_DIRS) $(TOOL_DIRS)
|
||||
|
||||
all: $(TOOL_DIRS)
|
||||
|
||||
27
README.md
27
README.md
@@ -11,6 +11,7 @@ The package also contains the following files:
|
||||
* [LICENSE](LICENSE): The MIT license that applies to this package
|
||||
* [CHANGELOG](CHANGELOG.md): The history of s390-tools versions
|
||||
* [AUTHORS](AUTHORS.md): A list of all authors of the s390-tools package
|
||||
* [CODINGSTYLE](CODINGSTYLE.md): Recommendations for writing s390-tools code
|
||||
|
||||
Package contents
|
||||
----------------
|
||||
@@ -124,14 +125,13 @@ Package contents
|
||||
- lsscm: List information about available Storage Class Memory
|
||||
Increments.
|
||||
- chchp: Modify channel-path state.
|
||||
- lsluns: List available SCSI LUNs depending on adapter or port.
|
||||
- lsluns: List LUNs discovered in the FC SAN,
|
||||
or show encryption state of attached LUNs.
|
||||
- lszcrypt: Show Information about zcrypt devices and configuration.
|
||||
- chzcrypt: Modify the zcrypt configuration.
|
||||
- znetconf: List and configure network devices for s390 network adapters.
|
||||
- cio_ignore: Query and modify the contents of the CIO device driver
|
||||
blacklist.
|
||||
- lsmem: Display the online status of the available memory.
|
||||
- chmem: Set hotplug memory online or offline.
|
||||
- dasdstat: Configure and format the debugfs based DASD statistics data.
|
||||
|
||||
* zkey:
|
||||
@@ -256,13 +256,14 @@ HAVE_FUSE=0`".
|
||||
The following table provides an overview of the used libraries and
|
||||
build options:
|
||||
|
||||
| __LIBRARY__|__BUILD OPTION__| __TOOLS__ |
|
||||
|------------|:--------------:|:-------------------------------------:|
|
||||
| fuse | `HAVE_FUSE` | cmsfs-fuse, zdsfs, hmcdrvfs, zgetdump |
|
||||
| zlib | `HAVE_ZLIB` | zgetdump, dump2tar |
|
||||
| ncurses | `HAVE_NCURSES` | hyptop |
|
||||
| pfm | `HAVE_PFM` | cpacfstats |
|
||||
| net-snmp | `HAVE_SNMP` | osasnmpd |
|
||||
| __LIBRARY__ | __BUILD OPTION__ | __TOOLS__ |
|
||||
|----------------|:------------------:|:-------------------------------------:|
|
||||
| fuse | `HAVE_FUSE` | cmsfs-fuse, zdsfs, hmcdrvfs, zgetdump |
|
||||
| zlib | `HAVE_ZLIB` | zgetdump, dump2tar |
|
||||
| ncurses | `HAVE_NCURSES` | hyptop |
|
||||
| pfm | `HAVE_PFM` | cpacfstats |
|
||||
| net-snmp | `HAVE_SNMP` | osasnmpd |
|
||||
| glibc-static | `HAVE_LIBC_STATIC` | zfcpdump |
|
||||
|
||||
This table lists additional build or install options:
|
||||
|
||||
@@ -286,9 +287,9 @@ the different tools are provided:
|
||||
http://net-snmp.sourceforge.net
|
||||
|
||||
* lsluns:
|
||||
For executing the lsluns script the sg_luns command must be available.
|
||||
The sg_luns executable is part of the SCSI generic device driver package
|
||||
(sg3 utils/sg utils).
|
||||
For executing the lsluns script the sg_luns and sg_inq commands must
|
||||
be available. The sg_luns and sg_inq executables are part of the
|
||||
SCSI generic device driver package (sg3 utils/sg utils).
|
||||
|
||||
* ziomon tools:
|
||||
For running the ziomon tools the following tools/packages are required:
|
||||
|
||||
12
common.mak
12
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 = 1
|
||||
RELEASE = 2
|
||||
PATCHLEVEL = 0
|
||||
DISTRELEASE = build-$(shell date +%Y%m%d)
|
||||
S390_TOOLS_RELEASE = $(VERSION).$(RELEASE).$(PATCHLEVEL)-$(DISTRELEASE)
|
||||
@@ -113,9 +113,10 @@ DEFAULT_LDFLAGS = -rdynamic
|
||||
# $2: Name of include file to check
|
||||
# $3: Name of required devel package
|
||||
# $4: Option to skip build (e.g. HAVE_FUSE=0)
|
||||
# $5: Additional compiler & linker options (optional)
|
||||
#
|
||||
check_dep=\
|
||||
printf "\#include <%s>" $2 | ( $(CC) $(filter-out --coverage, $(ALL_CFLAGS)) $(ALL_CPPFLAGS) -c -o /dev/null -xc - ) > /dev/null 2>&1; \
|
||||
printf "\#include <%s>\n int main(void) {return 0;}" $2 | ( $(CC) $(filter-out --coverage, $(ALL_CFLAGS)) $(ALL_CPPFLAGS) $5 -o /dev/null -xc - ) > /dev/null 2>&1; \
|
||||
if [ $$? != 0 ]; \
|
||||
then \
|
||||
printf " REQCHK %s (%s)\n" $1 $2; \
|
||||
@@ -167,13 +168,14 @@ MANDIR = $(INSTALLDIR)/usr/share/man
|
||||
VARDIR = $(INSTALLDIR)/var
|
||||
TOOLS_DATADIR = $(INSTALLDIR)/usr/share/s390-tools
|
||||
TOOLS_LIBDIR = $(INSTALLDIR)/lib/s390-tools
|
||||
ZFCPDUMP_DIR = $(INSTALLDIR)/lib/s390-tools/zfcpdump
|
||||
ZFCPDUMP_DIR = $(TOOLS_LIBDIR)/zfcpdump
|
||||
# Systemd support files are installed only if a directory is specified
|
||||
# for SYSTEMDSYSTEMUNITDIR (e.g. /lib/systemd/system)
|
||||
SYSTEMDSYSTEMUNITDIR =
|
||||
|
||||
INSTDIRS = $(USRSBINDIR) $(USRBINDIR) $(BINDIR) $(LIBDIR) $(MANDIR) \
|
||||
$(SYSCONFDIR) $(TOOLS_LIBDIR) $(TOOLS_DATADIR) \
|
||||
$(SYSCONFDIR) $(SYSCONFDIR)/sysconfig \
|
||||
$(TOOLS_LIBDIR) $(TOOLS_DATADIR) \
|
||||
$(ZFCPDUMP_DIR) $(SYSTEMDSYSTEMUNITDIR)
|
||||
OWNER = $(shell id -un)
|
||||
GROUP = $(shell id -gn)
|
||||
@@ -193,12 +195,14 @@ ALL_CFLAGS = -DS390_TOOLS_RELEASE=$(S390_TOOLS_RELEASE) \
|
||||
-DS390_TOOLS_LIBDIR=$(TOOLS_LIBDIR) \
|
||||
-DS390_TOOLS_DATADIR=$(TOOLS_DATADIR) \
|
||||
-DS390_TOOLS_SYSCONFDIR=$(SYSCONFDIR) \
|
||||
-DS390_TOOLS_BINDIR=$(BINDIR) \
|
||||
$(CFLAGS)
|
||||
CXXFLAGS ?= $(DEFAULT_CFLAGS) $(OPT_FLAGS)
|
||||
ALL_CXXFLAGS = -DS390_TOOLS_RELEASE=$(S390_TOOLS_RELEASE) \
|
||||
-DS390_TOOLS_LIBDIR=$(TOOLS_LIBDIR) \
|
||||
-DS390_TOOLS_DATADIR=$(TOOLS_DATADIR) \
|
||||
-DS390_TOOLS_SYSCONFDIR=$(SYSCONFDIR) \
|
||||
-DS390_TOOLS_BINDIR=$(BINDIR) \
|
||||
$(CXXFLAGS)
|
||||
ALL_CPPFLAGS = -I $(rootdir)include $(CPPFLAGS)
|
||||
ALL_LDFLAGS = $(LDFLAGS)
|
||||
|
||||
@@ -197,10 +197,10 @@ int is_online(int cpuid);
|
||||
long get_cmmpages_size();
|
||||
void parse_options(int argc, char **argv);
|
||||
void check_if_started_twice();
|
||||
void store_pid(void);
|
||||
void handle_signals(void);
|
||||
void handle_sighup(void);
|
||||
void reload_daemon(void);
|
||||
int daemonize(void);
|
||||
int check_cmmfiles(void);
|
||||
void check_config();
|
||||
void set_cmm_pages(long size);
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
* it under the terms of the MIT license. See LICENSE for details.
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "cpuplugd.h"
|
||||
|
||||
const char *name = NAME;
|
||||
@@ -49,7 +53,7 @@ void print_version()
|
||||
/*
|
||||
* Store daemon's pid so it can be stopped
|
||||
*/
|
||||
void store_pid(void)
|
||||
static int store_pid(void)
|
||||
{
|
||||
FILE *filp;
|
||||
|
||||
@@ -57,10 +61,62 @@ void store_pid(void)
|
||||
if (!filp) {
|
||||
cpuplugd_error("cannot open pid file %s: %s\n", pid_file,
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
return -1;
|
||||
}
|
||||
fprintf(filp, "%d\n", getpid());
|
||||
fclose(filp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Run daemon in background and write pid file
|
||||
*/
|
||||
int daemonize(void)
|
||||
{
|
||||
int fd, pipe_fds[2], startup_rc = 1;
|
||||
pid_t pid;
|
||||
|
||||
if (pipe(pipe_fds) == -1) {
|
||||
cpuplugd_error("cannot create pipe\n");
|
||||
return -1;
|
||||
}
|
||||
pid = fork();
|
||||
if (pid < 0)
|
||||
goto close_pipe;
|
||||
if (pid != 0) {
|
||||
/* Wait for startup return code from daemon */
|
||||
if (read(pipe_fds[0], &startup_rc, sizeof(startup_rc)) == -1)
|
||||
cpuplugd_error("cannot read from pipe\n");
|
||||
/* On success daemon has written pid file at this point */
|
||||
exit(startup_rc);
|
||||
}
|
||||
/* Create new session */
|
||||
if (setsid() < 0)
|
||||
goto notify_parent;
|
||||
/* Redirect stdin/out/err to /dev/null */
|
||||
fd = open("/dev/null", O_RDWR, 0);
|
||||
if (fd == -1)
|
||||
goto notify_parent;
|
||||
if (dup2(fd, STDIN_FILENO) < 0)
|
||||
goto notify_parent;
|
||||
if (dup2(fd, STDOUT_FILENO) < 0)
|
||||
goto notify_parent;
|
||||
if (dup2(fd, STDERR_FILENO) < 0)
|
||||
goto notify_parent;
|
||||
/* Create pid file */
|
||||
if (store_pid() < 0)
|
||||
goto notify_parent;
|
||||
startup_rc = 0;
|
||||
notify_parent:
|
||||
/* Inform waiting parent about startup return code */
|
||||
if (write(pipe_fds[1], &startup_rc, sizeof(startup_rc)) == -1) {
|
||||
cpuplugd_error("cannot write to pipe\n");
|
||||
startup_rc = 1;
|
||||
}
|
||||
close_pipe:
|
||||
close(pipe_fds[0]);
|
||||
close(pipe_fds[1]);
|
||||
return startup_rc ? -1 : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -418,13 +418,11 @@ int main(int argc, char *argv[])
|
||||
check_config();
|
||||
|
||||
if (!foreground) {
|
||||
rc = daemon(1, 0);
|
||||
rc = daemonize();
|
||||
if (rc < 0)
|
||||
cpuplugd_exit("Detach from terminal failed: %s\n",
|
||||
strerror(errno));
|
||||
}
|
||||
/* Store daemon pid */
|
||||
store_pid();
|
||||
/* Unlock lock file */
|
||||
flock(fd, LOCK_UN);
|
||||
close(fd);
|
||||
|
||||
@@ -456,46 +456,34 @@ static void program_interrupt_signal(int sig)
|
||||
/*
|
||||
* check given device name for blanks and some special characters
|
||||
*/
|
||||
static void get_device_name(dasdfmt_info_t *info, char *name, int argc,
|
||||
char *argv[])
|
||||
static void get_device_name(char *devname,
|
||||
int optind, int argc, char *argv[])
|
||||
{
|
||||
struct util_proc_dev_entry dev_entry;
|
||||
struct stat dev_stat;
|
||||
|
||||
if (info->device_id + 1 < argc)
|
||||
if (optind + 1 < argc)
|
||||
ERRMSG_EXIT(EXIT_MISUSE,
|
||||
"%s: More than one device specified!\n", prog_name);
|
||||
|
||||
if (info->device_id >= argc)
|
||||
if (optind >= argc)
|
||||
ERRMSG_EXIT(EXIT_MISUSE, "%s: No device specified!\n",
|
||||
prog_name);
|
||||
|
||||
if (info->device_id < argc) {
|
||||
strcpy(info->devname, argv[info->device_id]);
|
||||
} else {
|
||||
if ((strchr(name, ' ') != NULL) || (strchr(name, '#') != NULL) ||
|
||||
(strchr(name, '[') != NULL) || (strchr(name, ']') != NULL) ||
|
||||
(strchr(name, '!') != NULL) || (strchr(name, '>') != NULL) ||
|
||||
(strchr(name, '(') != NULL) || (strchr(name, '<') != NULL) ||
|
||||
(strchr(name, ')') != NULL) || (strchr(name, ':') != NULL) ||
|
||||
(strchr(name, '&') != NULL) || (strchr(name, ';') != NULL))
|
||||
ERRMSG_EXIT(EXIT_MISUSE, "%s: Your filename contains "
|
||||
"blanks or special characters!\n",
|
||||
prog_name);
|
||||
if (strlen(argv[optind]) >= PATH_MAX)
|
||||
ERRMSG_EXIT(EXIT_MISUSE, "%s: device name too long!\n",
|
||||
prog_name);
|
||||
strcpy(devname, argv[optind]);
|
||||
|
||||
strncpy(info->devname, name, PATH_MAX - 1);
|
||||
info->devname[PATH_MAX - 1] = '\0';
|
||||
}
|
||||
|
||||
if (stat(info->devname, &dev_stat) != 0)
|
||||
if (stat(devname, &dev_stat) != 0)
|
||||
ERRMSG_EXIT(EXIT_MISUSE, "%s: Could not get information for "
|
||||
"device node %s: %s\n", prog_name, info->devname,
|
||||
"device node %s: %s\n", prog_name, devname,
|
||||
strerror(errno));
|
||||
|
||||
if (minor(dev_stat.st_rdev) & PARTN_MASK) {
|
||||
ERRMSG_EXIT(EXIT_MISUSE, "%s: Unable to format partition %s. "
|
||||
"Please specify a device.\n", prog_name,
|
||||
info->devname);
|
||||
devname);
|
||||
}
|
||||
|
||||
if (util_proc_dev_get_entry(dev_stat.st_rdev, 1, &dev_entry) == 0) {
|
||||
@@ -505,7 +493,7 @@ static void get_device_name(dasdfmt_info_t *info, char *name, int argc,
|
||||
prog_name, dev_entry.name);
|
||||
} else {
|
||||
printf("%s WARNING: Unable to get driver name for device node %s",
|
||||
prog_name, info->devname);
|
||||
prog_name, devname);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -586,7 +574,7 @@ static void check_layout(dasdfmt_info_t *info, unsigned int intensity)
|
||||
/*
|
||||
* check for disk type and set some variables (e.g. usage count)
|
||||
*/
|
||||
static void check_disk(dasdfmt_info_t *info)
|
||||
static void check_disk(dasdfmt_info_t *info, char *devname)
|
||||
{
|
||||
int ro, errno_save;
|
||||
|
||||
@@ -609,13 +597,13 @@ static void check_disk(dasdfmt_info_t *info)
|
||||
if (strncmp(info->dasd_info.type, "ECKD", 4) != 0) {
|
||||
ERRMSG_EXIT(EXIT_FAILURE,
|
||||
"%s: Unsupported disk type\n%s is not an "
|
||||
"ECKD disk!\n", prog_name, info->devname);
|
||||
"ECKD disk!\n", prog_name, devname);
|
||||
}
|
||||
|
||||
if (dasd_sys_raw_track_access(info->devname)) {
|
||||
if (dasd_sys_raw_track_access(devname)) {
|
||||
ERRMSG_EXIT(EXIT_FAILURE,
|
||||
"%s: Device '%s' is in raw-track access mode\n",
|
||||
prog_name, info->devname);
|
||||
prog_name, devname);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -935,7 +923,8 @@ static format_data_t ask_user_for_blksize(format_data_t params)
|
||||
/*
|
||||
* print all information needed to format the device
|
||||
*/
|
||||
static void dasdfmt_print_info(dasdfmt_info_t *info, volume_label_t *vlabel,
|
||||
static void dasdfmt_print_info(dasdfmt_info_t *info, char *devname,
|
||||
volume_label_t *vlabel,
|
||||
unsigned int cylinders, unsigned int heads,
|
||||
format_data_t *p)
|
||||
{
|
||||
@@ -945,7 +934,7 @@ static void dasdfmt_print_info(dasdfmt_info_t *info, volume_label_t *vlabel,
|
||||
cylinders, heads, (cylinders * heads));
|
||||
|
||||
printf("\nI am going to format the device ");
|
||||
printf("%s in the following way:\n", info->devname);
|
||||
printf("%s in the following way:\n", devname);
|
||||
printf(" Device number of device : 0x%x\n", info->dasd_info.devno);
|
||||
printf(" Labelling device : %s\n",
|
||||
(info->writenolabel) ? "no" : "yes");
|
||||
@@ -970,28 +959,19 @@ static void dasdfmt_print_info(dasdfmt_info_t *info, volume_label_t *vlabel,
|
||||
/*
|
||||
* get volser
|
||||
*/
|
||||
static int dasdfmt_get_volser(dasdfmt_info_t *info, char *volser)
|
||||
static int dasdfmt_get_volser(char *devname, dasd_information2_t *dasd_info,
|
||||
char *volser)
|
||||
{
|
||||
unsigned int blksize;
|
||||
int f;
|
||||
volume_label_t vlabel;
|
||||
|
||||
f = open(info->devname, O_RDONLY);
|
||||
if (f == -1)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Unable to open device %s: %s\n",
|
||||
prog_name, info->devname, strerror(errno));
|
||||
|
||||
get_blocksize(&blksize);
|
||||
|
||||
if (close(f) != 0)
|
||||
ERRMSG("%s: error during close: %s\ncontinuing...\n",
|
||||
prog_name, strerror(errno));
|
||||
|
||||
if ((strncmp(info->dasd_info.type, "ECKD", 4) == 0) &&
|
||||
(!info->dasd_info.FBA_layout)) {
|
||||
if ((strncmp(dasd_info->type, "ECKD", 4) == 0) &&
|
||||
!dasd_info->FBA_layout) {
|
||||
/* OS/390 and zOS compatible disk layout */
|
||||
vtoc_read_volume_label(info->devname,
|
||||
info->dasd_info.label_block * blksize,
|
||||
vtoc_read_volume_label(devname,
|
||||
dasd_info->label_block * blksize,
|
||||
&vlabel);
|
||||
vtoc_volume_label_get_volser(&vlabel, volser);
|
||||
return 0;
|
||||
@@ -1385,7 +1365,8 @@ static void dasdfmt_quick_format(dasdfmt_info_t *info, unsigned int cylinders,
|
||||
disk_disabled = 0;
|
||||
}
|
||||
|
||||
static void do_format_dasd(dasdfmt_info_t *info, volume_label_t *vlabel,
|
||||
static void do_format_dasd(dasdfmt_info_t *info, char *devname,
|
||||
volume_label_t *vlabel,
|
||||
format_data_t *p, unsigned int cylinders,
|
||||
unsigned int heads)
|
||||
{
|
||||
@@ -1408,19 +1389,19 @@ static void do_format_dasd(dasdfmt_info_t *info, volume_label_t *vlabel,
|
||||
}
|
||||
|
||||
if ((info->verbosity > 0) || !info->withoutprompt || info->testmode)
|
||||
dasdfmt_print_info(info, vlabel, cylinders, heads, p);
|
||||
dasdfmt_print_info(info, devname, vlabel, cylinders, heads, p);
|
||||
|
||||
count = u2s_get_host_access_count(info->devname);
|
||||
count = u2s_get_host_access_count(devname);
|
||||
if (info->force_host) {
|
||||
if (count > 1) {
|
||||
ERRMSG_EXIT(EXIT_FAILURE,
|
||||
"\n%s: Disk %s is online on OS instances in %d different LPARs.\n"
|
||||
"Note: Your installation might include z/VM systems that are configured to\n"
|
||||
"automatically vary on disks, regardless of whether they are subsequently used.\n\n",
|
||||
prog_name, info->devname, count);
|
||||
prog_name, devname, count);
|
||||
} else if (count < 0) {
|
||||
ERRMSG("\nHosts access information not available for disk %s.\n\n",
|
||||
info->devname);
|
||||
devname);
|
||||
return;
|
||||
}
|
||||
} else if (count > 1)
|
||||
@@ -1429,7 +1410,7 @@ static void do_format_dasd(dasdfmt_info_t *info, volume_label_t *vlabel,
|
||||
"Ensure that the disk is not being used by a system outside your LPAR.\n"
|
||||
"Note: Your installation might include z/VM systems that are configured to\n"
|
||||
"automatically vary on disks, regardless of whether they are subsequently used.\n",
|
||||
info->devname, count);
|
||||
devname, count);
|
||||
|
||||
if (!info->testmode) {
|
||||
if (!info->withoutprompt) {
|
||||
@@ -1480,7 +1461,6 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
dasdfmt_info_t info = {
|
||||
.dasd_info = {0},
|
||||
{0}
|
||||
};
|
||||
volume_label_t vlabel;
|
||||
char old_volser[7];
|
||||
@@ -1624,7 +1604,6 @@ int main(int argc, char *argv[])
|
||||
break;
|
||||
case -1:
|
||||
/* End of options string - start of devices list */
|
||||
info.device_id = optind;
|
||||
break;
|
||||
default:
|
||||
ERRMSG_EXIT(EXIT_MISUSE, "Try '%s --help' for more"
|
||||
@@ -1655,12 +1634,12 @@ int main(int argc, char *argv[])
|
||||
if (info.print_hashmarks)
|
||||
PARSE_PARAM_INTO(info.hashstep, hashstep_str, 10, "hashstep");
|
||||
|
||||
get_device_name(&info, dev_filename, argc, argv);
|
||||
get_device_name(dev_filename, optind, argc, argv);
|
||||
|
||||
filedes = open(info.devname, O_RDWR);
|
||||
filedes = open(dev_filename, O_RDWR);
|
||||
if (filedes == -1)
|
||||
ERRMSG_EXIT(EXIT_FAILURE, "%s: Unable to open device %s: %s\n",
|
||||
prog_name, info.devname, strerror(errno));
|
||||
prog_name, dev_filename, strerror(errno));
|
||||
|
||||
get_device_info(&info);
|
||||
|
||||
@@ -1684,15 +1663,16 @@ int main(int argc, char *argv[])
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (dasdfmt_get_volser(&info, old_volser) == 0)
|
||||
if (dasdfmt_get_volser(dev_filename,
|
||||
&info.dasd_info, old_volser) == 0)
|
||||
vtoc_volume_label_set_volser(&vlabel, old_volser);
|
||||
else
|
||||
ERRMSG_EXIT(EXIT_FAILURE,
|
||||
"%s: VOLSER not found on device %s\n",
|
||||
prog_name, info.devname);
|
||||
prog_name, dev_filename);
|
||||
}
|
||||
|
||||
check_disk(&info);
|
||||
check_disk(&info, dev_filename);
|
||||
|
||||
if (check_param(str, ERR_LENGTH, &format_params) < 0)
|
||||
ERRMSG_EXIT(EXIT_MISUSE, "%s: %s\n", prog_name, str);
|
||||
@@ -1703,7 +1683,8 @@ int main(int argc, char *argv[])
|
||||
if (info.check)
|
||||
check_disk_format(&info, cylinders, heads, &format_params);
|
||||
else
|
||||
do_format_dasd(&info, &vlabel, &format_params, cylinders, heads);
|
||||
do_format_dasd(&info, dev_filename, &vlabel,
|
||||
&format_params, cylinders, heads);
|
||||
|
||||
if (close(filedes) != 0)
|
||||
ERRMSG("%s: error during close: %s\ncontinuing...\n",
|
||||
|
||||
@@ -291,7 +291,6 @@ typedef struct bootstrap2 {
|
||||
|
||||
typedef struct dasdfmt_info {
|
||||
dasd_information2_t dasd_info;
|
||||
char devname[PATH_MAX];
|
||||
int verbosity;
|
||||
int testmode;
|
||||
int withoutprompt;
|
||||
@@ -304,7 +303,6 @@ typedef struct dasdfmt_info {
|
||||
int cdl_format;
|
||||
int blksize_specified;
|
||||
int reqsize_specified;
|
||||
int device_id;
|
||||
int keep_volser;
|
||||
int force_host;
|
||||
int layout_specified;
|
||||
|
||||
@@ -545,6 +545,7 @@ static int dinfo_get_uid_from_devnode(char **uidfile, char *devnode)
|
||||
char *readbuf;
|
||||
DIR *directory = NULL;
|
||||
struct dirent *dir_entry = NULL;
|
||||
int rc = 0;
|
||||
|
||||
if (stat(devnode, &stat_buffer) != 0) {
|
||||
printf("Error: could not stat %s\n", devnode);
|
||||
@@ -573,8 +574,15 @@ static int dinfo_get_uid_from_devnode(char **uidfile, char *devnode)
|
||||
|
||||
if (strncmp(stat_dev, readbuf,
|
||||
MAX(strlen(stat_dev), strlen(readbuf)-1)) == 0) {
|
||||
snprintf(*uidfile, RD_BUFFER_SIZE,
|
||||
"/sys/block/%s/device/uid", dir_entry->d_name);
|
||||
rc = snprintf(*uidfile, RD_BUFFER_SIZE,
|
||||
"/sys/block/%s/device/uid",
|
||||
dir_entry->d_name);
|
||||
if (rc >= RD_BUFFER_SIZE) {
|
||||
fprintf(stderr,
|
||||
"Error: Device name was truncated\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -708,8 +716,7 @@ int main(int argc, char * argv[])
|
||||
break;
|
||||
}
|
||||
if (srchuid) {
|
||||
srchuid[0] = '\n';
|
||||
srchuid[1] = 0;
|
||||
srchuid[0] = '\0';
|
||||
}
|
||||
if (export) {
|
||||
printf("ID_UID=%s\n", readbuf);
|
||||
|
||||
16
etc/Makefile
Normal file
16
etc/Makefile
Normal file
@@ -0,0 +1,16 @@
|
||||
include ../common.mak
|
||||
|
||||
CONFIG_FILES =
|
||||
|
||||
ifneq (${SYSTEMDSYSTEMUNITDIR},)
|
||||
CONFIG_FILES += cpuplugd.conf sysconfig/cpi sysconfig/dumpconf \
|
||||
sysconfig/mon_fsstatd sysconfig/mon_procd
|
||||
endif
|
||||
|
||||
install:
|
||||
for file in $(CONFIG_FILES); do \
|
||||
$(INSTALL) -g $(GROUP) -o $(OWNER) \
|
||||
-m 644 $$file $(DESTDIR)$(SYSCONFDIR)/$$file ; \
|
||||
done
|
||||
|
||||
.PHONY: all install clean
|
||||
@@ -20,5 +20,6 @@ bool util_path_is_readable(const char *fmt, ...);
|
||||
bool util_path_is_writable(const char *fmt, ...);
|
||||
bool util_path_is_dir(const char *fmt, ...);
|
||||
bool util_path_is_reg_file(const char *fmt, ...);
|
||||
bool util_path_exists(const char *fmt, ...);
|
||||
|
||||
#endif /** LIB_UTIL_PATH_H @} */
|
||||
|
||||
@@ -18,12 +18,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* Copyright IBM Corp. 2016, 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.
|
||||
*/
|
||||
struct util_prg_copyright {
|
||||
/** Name of the copyright owner, e.g. IBM */
|
||||
const char *owner;
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#define RELEASE_STRING STRINGIFY (S390_TOOLS_RELEASE)
|
||||
#define TOOLS_LIBDIR STRINGIFY (S390_TOOLS_LIBDIR)
|
||||
#define TOOLS_SYSCONFDIR STRINGIFY (S390_TOOLS_SYSCONFDIR)
|
||||
#define TOOLS_BINDIR STRINGIFY (S390_TOOLS_BINDIR)
|
||||
|
||||
#define __noreturn __attribute__((noreturn))
|
||||
#define __packed __attribute__((packed))
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <lib/zt_common.h>
|
||||
#include "lib/zt_common.h"
|
||||
|
||||
#define IPL_TYPE_LEN_MAX 100
|
||||
#define NSS_NAME_LEN_MAX 8
|
||||
|
||||
@@ -15,7 +15,7 @@ SYSTOOLS = ttyrun
|
||||
|
||||
all: $(PROGRAMS) $(SYSTOOLS)
|
||||
check:
|
||||
install:
|
||||
install: all
|
||||
for prg in $(PROGRAMS); do \
|
||||
$(INSTALL) -g $(GROUP) -o $(OWNER) -m 755 $$prg $(DESTDIR)$(USRBINDIR) ; \
|
||||
done
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
* 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 <ctype.h>
|
||||
#include <getopt.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -28,17 +28,17 @@ objects = util_base.o \
|
||||
util_proc.o \
|
||||
util_rec.o
|
||||
|
||||
util_base_example: util_base_example.o $(rootdir)/libutil/libutil.a
|
||||
util_panic_example: util_panic_example.o $(rootdir)/libutil/libutil.a
|
||||
util_path_example: util_path_example.o $(rootdir)/libutil/libutil.a
|
||||
util_scandir_example: util_scandir_example.o $(rootdir)/libutil/libutil.a
|
||||
util_file_example: util_file_example.o $(rootdir)/libutil/libutil.a
|
||||
util_libc_example: util_libc_example.o $(rootdir)/libutil/libutil.a
|
||||
util_opt_example: util_opt_example.o $(rootdir)/libutil/libutil.a
|
||||
util_opt_command_example: util_opt_command_example.o $(rootdir)/libutil/libutil.a
|
||||
util_panic_example: util_panic_example.o $(rootdir)/libutil/libutil.a
|
||||
util_prg_example: util_prg_example.o $(rootdir)/libutil/libutil.a
|
||||
util_rec_example: util_rec_example.o $(rootdir)/libutil/libutil.a
|
||||
util_base_example: util_base_example.o $(lib)
|
||||
util_panic_example: util_panic_example.o $(lib)
|
||||
util_path_example: util_path_example.o $(lib)
|
||||
util_scandir_example: util_scandir_example.o $(lib)
|
||||
util_file_example: util_file_example.o $(lib)
|
||||
util_libc_example: util_libc_example.o $(lib)
|
||||
util_opt_example: util_opt_example.o $(lib)
|
||||
util_opt_command_example: util_opt_command_example.o $(lib)
|
||||
util_panic_example: util_panic_example.o $(lib)
|
||||
util_prg_example: util_prg_example.o $(lib)
|
||||
util_rec_example: util_rec_example.o $(lib)
|
||||
|
||||
$(lib): $(objects)
|
||||
|
||||
|
||||
@@ -194,3 +194,26 @@ free_str:
|
||||
free(path);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if path to directory or file exists
|
||||
*
|
||||
* This function has the same semantics as "-e path" in bash.
|
||||
*
|
||||
* @param[in] fmt Format string for path to test
|
||||
* @param[in] ... Variable arguments for format string
|
||||
*
|
||||
* @returns true Path exists
|
||||
* false Otherwise
|
||||
*/
|
||||
bool util_path_exists(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char *path;
|
||||
bool rc;
|
||||
|
||||
UTIL_VASPRINTF(&path, fmt, ap);
|
||||
rc = access(path, F_OK) == 0 ? true : false;
|
||||
free(path);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -55,18 +55,22 @@ static void test_util_path_sysfs(void)
|
||||
static void test_path(const char *path)
|
||||
{
|
||||
printf("%-20s: ", path);
|
||||
if (util_path_exists(path))
|
||||
printf("exists=yes ");
|
||||
else
|
||||
printf("exists=no ");
|
||||
if (util_path_is_readable(path))
|
||||
printf("read=yes, ");
|
||||
printf("read=yes ");
|
||||
else
|
||||
printf("read=no , ");
|
||||
printf("read=no ");
|
||||
if (util_path_is_writable(path))
|
||||
printf("write=yes, ");
|
||||
printf("write=yes ");
|
||||
else
|
||||
printf("write=no , ");
|
||||
printf("write=no ");
|
||||
if (util_path_is_reg_file(path))
|
||||
printf("reg_file=yes");
|
||||
printf("reg_file=yes ");
|
||||
else
|
||||
printf("reg_file=no ");
|
||||
printf("reg_file=no ");
|
||||
if (util_path_is_dir(path))
|
||||
printf("dir=yes");
|
||||
else
|
||||
|
||||
@@ -90,17 +90,18 @@ static void fsstatd_open_monwriter(void)
|
||||
/*
|
||||
* Store daemon's pid so it can be stopped
|
||||
*/
|
||||
static void store_pid(void)
|
||||
static int store_pid(void)
|
||||
{
|
||||
FILE *f = fopen(pid_file, "w");
|
||||
|
||||
if (!f) {
|
||||
syslog(LOG_ERR, "cannot open pid file %s: %s", pid_file,
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
return -1;
|
||||
}
|
||||
fprintf(f, "%d\n", getpid());
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -244,41 +245,64 @@ static void fsstatd_write_ent(struct mntent *ent, time_t curr_time,
|
||||
*/
|
||||
static void fsstatd_daemonize(void)
|
||||
{
|
||||
int pipe_fds[2], startup_rc = 1;
|
||||
pid_t pid;
|
||||
|
||||
if (pipe(pipe_fds) == -1) {
|
||||
syslog(LOG_ERR, "pipe error: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Fork off the parent process */
|
||||
pid = fork();
|
||||
if (pid < 0) {
|
||||
syslog(LOG_ERR, "fork error: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
if (pid > 0)
|
||||
exit(0);
|
||||
if (pid > 0) {
|
||||
/* Wait for startup return code from daemon */
|
||||
if (read(pipe_fds[0], &startup_rc, sizeof(startup_rc)) == -1)
|
||||
syslog(LOG_ERR, "pipe read error: %s\n", strerror(errno));
|
||||
/* With startup_rc == 0, pid file was written at this point */
|
||||
exit(startup_rc);
|
||||
}
|
||||
|
||||
/* Change the file mode mask */
|
||||
umask(0);
|
||||
|
||||
/* Store daemon pid */
|
||||
store_pid();
|
||||
/* Catch SIGINT and SIGTERM to clean up pid file on exit */
|
||||
fsstatd_handle_signals();
|
||||
|
||||
/* Create a new SID for the child process */
|
||||
if (setsid() < 0) {
|
||||
syslog(LOG_ERR, "setsid error: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
goto notify_parent;
|
||||
}
|
||||
|
||||
/* Change the current working directory */
|
||||
if (chdir("/") < 0) {
|
||||
syslog(LOG_ERR, "chdir error: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
goto notify_parent;
|
||||
}
|
||||
|
||||
/* Close out the standard file descriptors */
|
||||
close(STDIN_FILENO);
|
||||
close(STDOUT_FILENO);
|
||||
close(STDERR_FILENO);
|
||||
|
||||
/* Store daemon pid */
|
||||
if (store_pid() < 0)
|
||||
goto notify_parent;
|
||||
startup_rc = 0;
|
||||
|
||||
notify_parent:
|
||||
/* Inform waiting parent about startup return code */
|
||||
if (write(pipe_fds[1], &startup_rc, sizeof(startup_rc)) == -1) {
|
||||
syslog(LOG_ERR, "pipe write error: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
if (startup_rc != 0)
|
||||
exit(startup_rc);
|
||||
}
|
||||
|
||||
static int fsstatd_do_work(void)
|
||||
|
||||
@@ -109,17 +109,18 @@ static void procd_open_monwriter(void)
|
||||
/*
|
||||
* Store daemon's pid so it can be stopped
|
||||
*/
|
||||
static void store_pid(void)
|
||||
static int store_pid(void)
|
||||
{
|
||||
FILE *f = fopen(pid_file, "w");
|
||||
|
||||
if (!f) {
|
||||
syslog(LOG_ERR, "cannot open pid file %s: %s", pid_file,
|
||||
strerror(errno));
|
||||
exit(1);
|
||||
return -1;
|
||||
}
|
||||
fprintf(f, "%d\n", getpid());
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -897,41 +898,64 @@ static void read_tasks(void)
|
||||
*/
|
||||
static void procd_daemonize(void)
|
||||
{
|
||||
int pipe_fds[2], startup_rc = 1;
|
||||
pid_t pid;
|
||||
|
||||
if (pipe(pipe_fds) == -1) {
|
||||
syslog(LOG_ERR, "pipe error: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Fork off the parent process */
|
||||
pid = fork();
|
||||
if (pid < 0) {
|
||||
syslog(LOG_ERR, "fork error: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
if (pid > 0)
|
||||
exit(0);
|
||||
if (pid > 0) {
|
||||
/* Wait for startup return code from daemon */
|
||||
if (read(pipe_fds[0], &startup_rc, sizeof(startup_rc)) == -1)
|
||||
syslog(LOG_ERR, "pipe read error: %s\n", strerror(errno));
|
||||
/* With startup_rc == 0, pid file was written at this point */
|
||||
exit(startup_rc);
|
||||
}
|
||||
|
||||
/* Change the file mode mask */
|
||||
umask(0);
|
||||
|
||||
/* Store daemon pid */
|
||||
store_pid();
|
||||
/* Catch SIGINT and SIGTERM to clean up pid file on exit */
|
||||
procd_handle_signals();
|
||||
|
||||
/* Create a new SID for the child process */
|
||||
if (setsid() < 0) {
|
||||
syslog(LOG_ERR, "setsid error: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
goto notify_parent;
|
||||
}
|
||||
|
||||
/* Change the current working directory */
|
||||
if (chdir("/") < 0) {
|
||||
syslog(LOG_ERR, "chdir error: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
goto notify_parent;
|
||||
}
|
||||
|
||||
/* Close out the standard file descriptors */
|
||||
close(STDIN_FILENO);
|
||||
close(STDOUT_FILENO);
|
||||
close(STDERR_FILENO);
|
||||
|
||||
/* Store daemon pid */
|
||||
if (store_pid() < 0)
|
||||
goto notify_parent;
|
||||
startup_rc = 0;
|
||||
|
||||
notify_parent:
|
||||
/* Inform waiting parent about startup return code */
|
||||
if (write(pipe_fds[1], &startup_rc, sizeof(startup_rc)) == -1) {
|
||||
syslog(LOG_ERR, "pipe write error: %s\n", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
if (startup_rc != 0)
|
||||
exit(startup_rc);
|
||||
}
|
||||
|
||||
static int procd_do_work(void)
|
||||
|
||||
@@ -172,11 +172,7 @@ cat <<'EOF' > $builddir/init
|
||||
/sbin/modprobe virtio_net
|
||||
/sbin/udhcpc -O pxeconffile -O pxepathprefix &
|
||||
|
||||
while true
|
||||
do
|
||||
/sbin/pxeboot.script
|
||||
/bin/sleep 1
|
||||
done
|
||||
/sbin/pxeboot.script
|
||||
EOF
|
||||
# --- end init script
|
||||
chmod +x $builddir/init
|
||||
@@ -303,16 +299,26 @@ cat <<'EOF' > $builddir/sbin/pxeboot.script
|
||||
|
||||
set -e
|
||||
|
||||
# Check if a valid pxe conf is available
|
||||
# so far a non configurable 600 sec timeout
|
||||
PXE_CONF=/etc/pxe.conf
|
||||
TIMEOUT=600
|
||||
WAITED=0
|
||||
echo "waiting for pxe config from DHCP (max $TIMEOUT sec)"
|
||||
while [ ! -f $PXE_CONF ]
|
||||
do
|
||||
sleep 1
|
||||
WAITED=$(($WAITED + 1))
|
||||
if [ $WAITED -gt $TIMEOUT ]
|
||||
then
|
||||
echo Error waiting for PXE configuration from DHCP
|
||||
exit
|
||||
fi
|
||||
done
|
||||
|
||||
# Source the DHCP-generated TFTP info
|
||||
# Currently we are just looking for siaddr
|
||||
PXE_CONF=/etc/pxe.conf
|
||||
if [ -f $PXE_CONF ]
|
||||
then
|
||||
. $PXE_CONF
|
||||
else
|
||||
echo waiting for PXE configuration
|
||||
exit
|
||||
fi
|
||||
. $PXE_CONF
|
||||
|
||||
# Retrieve the config (default only for now)
|
||||
CONFIGS=""
|
||||
@@ -347,6 +353,7 @@ then
|
||||
set +e
|
||||
for c in $CONFIGS
|
||||
do
|
||||
echo "fetching config pxelinux.cfg/$c from $siaddr"
|
||||
if /usr/bin/tftp -g -l /tmp/config -r pxelinux.cfg/$c $siaddr
|
||||
then
|
||||
break
|
||||
@@ -361,34 +368,35 @@ then
|
||||
fi
|
||||
|
||||
# Simple config file parsing, only one entry allowed
|
||||
kernel=$(/bin/grep "^[[:space:]]*kernel" /tmp/config | sed "s/^[[:space:]]*kernel[[:space:]]*//")
|
||||
initrd=$(/bin/grep "^[[:space:]]*initrd" /tmp/config | sed "s/^[[:space:]]*initrd[[:space:]]*//")
|
||||
append=$(/bin/grep "^[[:space:]]*append" /tmp/config | sed "s/^[[:space:]]*append[[:space:]]*//")
|
||||
kernel=$(/bin/grep -i "^[[:space:]]*kernel" /tmp/config | sed "s/^[[:space:]]*kernel[[:space:]]*//I")
|
||||
initrd=$(/bin/grep -i "^[[:space:]]*initrd" /tmp/config | sed "s/^[[:space:]]*initrd[[:space:]]*//I")
|
||||
append=$(/bin/grep -i "^[[:space:]]*append" /tmp/config | sed "s/^[[:space:]]*append[[:space:]]*//I")
|
||||
|
||||
if [ -z "$kernel" ]
|
||||
then
|
||||
echo no kernel statement found in config
|
||||
exit
|
||||
else
|
||||
echo fetch kernel $kernel from $siaddr
|
||||
/usr/bin/tftp -g -l /tmp/kernel -r $kernel $siaddr
|
||||
fi
|
||||
|
||||
if [ -n "$initrd" ]
|
||||
then
|
||||
echo fetch initrd $initrd from $siaddr
|
||||
/usr/bin/tftp -g -l /tmp/initrd -r $initrd $siaddr
|
||||
INITRD="--initrd=/tmp/initrd"
|
||||
else
|
||||
INITRD=""
|
||||
fi
|
||||
|
||||
if [ -n "$append" ]
|
||||
then
|
||||
APPEND="--append=$append"
|
||||
if [ -z "$append" ]; then
|
||||
echo "Kexec load: kexec -l /tmp/kernel $INITRD"
|
||||
kexec -l /tmp/kernel $INITRD
|
||||
else
|
||||
APPEND=""
|
||||
echo "Kexec load: kexec -l /tmp/kernel $INITRD --append=\"$append\""
|
||||
kexec -l /tmp/kernel $INITRD --append="$append"
|
||||
fi
|
||||
|
||||
kexec -l /tmp/kernel $INITRD $APPEND
|
||||
kexec -e
|
||||
EOF
|
||||
# -- end pxeboot script
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
include ../common.mak
|
||||
LDLIBS = `net-snmp-config --agent-libs`
|
||||
CFLAGS += `net-snmp-config --cflags`
|
||||
# On some Linux systems `net-snmp-config --agent-libs` introduces -pie,
|
||||
# therefore add -fPIC to prevent link failures.
|
||||
ALL_CFLAGS += -fPIC
|
||||
ALL_CFLAGS += `net-snmp-config --cflags`
|
||||
|
||||
OBJS = ibmOSAMib.o ibmOSAMibUtil.o osasnmpd.o
|
||||
|
||||
|
||||
@@ -375,7 +375,8 @@ CMDS="uname -a\
|
||||
:runlevel\
|
||||
:iptables -L\
|
||||
:ulimit -a\
|
||||
:ps -eo pid,tid,nlwp,policy,user,tname,ni,pri,psr,sgi_p,stat,wchan,start_time,time,pcpu,pmem,vsize,size,rss,share,command\
|
||||
:ps -emo pid,tid,nlwp,policy,user,tname,ni,pri,psr,sgi_p,stat,wchan,start_time,time,pcpu,pmem,vsize,size,rss,share,command\
|
||||
:ps -eHo pid,tid,nlwp,policy,user,tname,ni,pri,psr,sgi_p,stat,wchan,start_time,time,pcpu,pmem,vsize,size,rss,share,command\
|
||||
:ps axX\
|
||||
:dmesg -s 1048576\
|
||||
:last\
|
||||
|
||||
@@ -35,10 +35,12 @@ clean:
|
||||
real_usrbin_dir=$(USRBINDIR); \
|
||||
real_usrsbin_dir=$(USRSBINDIR); \
|
||||
real_toolslib_dir=$(TOOLS_LIBDIR); \
|
||||
real_sysconf_dir=$(SYSCONFDIR); \
|
||||
$(SED) -e "s#@bin_path@#$$real_bin_dir#g" \
|
||||
-e "s#@usrbin_path@#$$real_usrbin_dir#g" \
|
||||
-e "s#@usrsbin_path@#$$real_usrsbin_dir#g" \
|
||||
-e "s#@toolslib_path@#$$real_toolslib_dir#g" \
|
||||
-e "s#@sysconf_path@#$$real_sysconf_dir#g" \
|
||||
-e 's#@S390_TOOLS_RELEASE@#$(S390_TOOLS_RELEASE)#g' \
|
||||
< $< > $@
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ Type=oneshot
|
||||
# Specify a file with the environment variables using the EnvironmentFile=
|
||||
# service property.
|
||||
#
|
||||
EnvironmentFile=/etc/sysconfig/cpi
|
||||
EnvironmentFile=@sysconf_path@/sysconfig/cpi
|
||||
#
|
||||
# Alternatively, you can specify the environment variables directly,
|
||||
# using the Environment= service properties, which can be overridden by
|
||||
@@ -38,3 +38,6 @@ EnvironmentFile=/etc/sysconfig/cpi
|
||||
#
|
||||
# Sending data to the HMC/SE
|
||||
ExecStart=@toolslib_path@/cpictl -e
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
@@ -13,10 +13,11 @@ Documentation=man:cpuplugd(8) man:cpuplugd.conf(5)
|
||||
After=remote-fs.target
|
||||
|
||||
[Service]
|
||||
ExecStart=@usrsbin_path@/cpuplugd -f -c /etc/cpuplugd.conf
|
||||
ExecStart=@usrsbin_path@/cpuplugd -c @sysconf_path@/cpuplugd.conf
|
||||
ExecReload=/bin/kill -HUP $MAINPID
|
||||
KillMode=process
|
||||
Type=simple
|
||||
Type=forking
|
||||
PIDFile=/var/run/cpuplugd.pid
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
@@ -18,7 +18,7 @@ After=remote-fs.target
|
||||
# Specify a file with the environment variables using the EnvironmentFile=
|
||||
# service property.
|
||||
#
|
||||
EnvironmentFile=/etc/sysconfig/mon_fsstatd
|
||||
EnvironmentFile=@sysconf_path@/sysconfig/mon_fsstatd
|
||||
#
|
||||
# Alternatively, you can specify the environment variables directly,
|
||||
# using the Environment= service property, which can be overridden by
|
||||
@@ -30,10 +30,11 @@ EnvironmentFile=/etc/sysconfig/mon_fsstatd
|
||||
|
||||
ExecStartPre=-/sbin/modprobe monwriter
|
||||
ExecStartPre=/sbin/udevadm settle --timeout=10
|
||||
ExecStart=@usrsbin_path@/mon_fsstatd -a -i $FSSTAT_INTERVAL
|
||||
ExecStart=@usrsbin_path@/mon_fsstatd -i $FSSTAT_INTERVAL
|
||||
ExecReload=/bin/kill -HUP $MAINPID
|
||||
KillMode=process
|
||||
Type=simple
|
||||
Type=forking
|
||||
PIDFile=/var/run/mon_fsstatd.pid
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
@@ -18,7 +18,7 @@ After=remote-fs.target
|
||||
# Specify a file with the environment variables using the EnvironmentFile=
|
||||
# service property.
|
||||
#
|
||||
EnvironmentFile=/etc/sysconfig/mon_procd
|
||||
EnvironmentFile=@sysconf_path@/sysconfig/mon_procd
|
||||
#
|
||||
# Alternatively, you can specify the environment variables directly,
|
||||
# using the Environment= service property, which can be overridden by
|
||||
@@ -30,10 +30,11 @@ EnvironmentFile=/etc/sysconfig/mon_procd
|
||||
|
||||
ExecStartPre=-/sbin/modprobe monwriter
|
||||
ExecStartPre=/sbin/udevadm settle --timeout=10
|
||||
ExecStart=@usrsbin_path@/mon_procd -a -i $PROC_INTERVAL
|
||||
ExecStart=@usrsbin_path@/mon_procd -i $PROC_INTERVAL
|
||||
ExecReload=/bin/kill -HUP $MAINPID
|
||||
KillMode=process
|
||||
Type=simple
|
||||
Type=forking
|
||||
PIDFile=/var/run/mon_procd.pid
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
include ../common.mak
|
||||
|
||||
SCRIPTS = lsdasd lstape chccwdev lszfcp cio_ignore znetconf dasdstat
|
||||
USRSBIN_SCRIPTS = lsmem chmem lsluns
|
||||
USRSBIN_SCRIPTS = lsluns
|
||||
MANPAGES= lsdasd.8 lstape.8 chccwdev.8 lszfcp.8 lsluns.8 \
|
||||
cio_ignore.8 znetconf.8 chmem.8 lsmem.8 dasdstat.8
|
||||
cio_ignore.8 znetconf.8 dasdstat.8
|
||||
|
||||
SUB_DIRS = zcrypt scm chp css qeth
|
||||
|
||||
|
||||
334
zconf/chmem
334
zconf/chmem
@@ -1,334 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# chmem - Tool to change memory hotplug status
|
||||
#
|
||||
# Copyright IBM Corp. 2010, 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.
|
||||
#
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Getopt::Long qw(:config no_ignore_case no_auto_abbrev);
|
||||
use File::Basename;
|
||||
|
||||
my $script_name = fileparse($0);
|
||||
my $online = 0;
|
||||
my $offline = 0;
|
||||
my $memdir = "/sys/devices/system/memory";
|
||||
my $block_size = 0;
|
||||
my $max_block_nr = 0;
|
||||
my $devices = {};
|
||||
my $dev_size;
|
||||
my $blocks_per_dev = 0;
|
||||
my $devs_per_block = 0;
|
||||
my $ret = 0;
|
||||
my @entries;
|
||||
|
||||
sub chmem_usage()
|
||||
{
|
||||
print <<HERE;
|
||||
Usage: $script_name [OPTIONS] SIZE|RANGE
|
||||
|
||||
The $script_name command sets a particular size or range of memory online
|
||||
or offline.
|
||||
|
||||
Specify SIZE as <size>[m|M|g|G]. With m or M, <size> specifies the memory
|
||||
size in MB (1024 x 1024 bytes). With g or G, <size> specifies the memory size
|
||||
in GB (1024 x 1024 x 1024 bytes). The default unit is MB.
|
||||
|
||||
Specify RANGE in the form 0x<start>-0x<end> as shown in the output of the
|
||||
lsmem command. <start> is the hexadecimal address of the first byte and <end>
|
||||
is the hexadecimal address of the last byte in the memory range.
|
||||
|
||||
SIZE and RANGE must be aligned to the Linux memory block size, as shown in
|
||||
the output of the lsmem command.
|
||||
|
||||
OPTIONS
|
||||
-e, --enable
|
||||
Set the given RANGE or SIZE of memory online.
|
||||
|
||||
-d, --disable
|
||||
Set the given RANGE or SIZE of memory offline.
|
||||
|
||||
-h, --help
|
||||
Print a short help text, then exit.
|
||||
|
||||
-v, --version
|
||||
Print the version number, then exit.
|
||||
HERE
|
||||
}
|
||||
|
||||
sub chmem_version()
|
||||
{
|
||||
print "$script_name: version %S390_TOOLS_VERSION%\n";
|
||||
print "Copyright IBM Corp. 2010, 2017\n";
|
||||
}
|
||||
|
||||
sub chmem_get_dev_size()
|
||||
{
|
||||
my ($device, $old_device, $block, $old_block) = (0, 0, 0, 0);
|
||||
|
||||
foreach (@entries) {
|
||||
$_ =~ /memory(\d+)/;
|
||||
$block = $1;
|
||||
$device = `cat $_/phys_device`;
|
||||
chomp($device);
|
||||
if ($device > $old_device) {
|
||||
$dev_size = int((($block - $old_block) * $block_size) /
|
||||
($device - $old_device));
|
||||
last;
|
||||
}
|
||||
$dev_size += $block_size;
|
||||
$old_block = $block;
|
||||
}
|
||||
}
|
||||
|
||||
sub chmem_online($)
|
||||
{
|
||||
my $block = shift;
|
||||
|
||||
qx(echo online_movable > $memdir/memory$block/state 2>/dev/null);
|
||||
if ($? >> 8 != 0) {
|
||||
qx(echo online > $memdir/memory$block/state 2>/dev/null);
|
||||
}
|
||||
return $? >> 8;
|
||||
}
|
||||
|
||||
sub chmem_offline($)
|
||||
{
|
||||
my $block = shift;
|
||||
|
||||
qx(echo offline > $memdir/memory$block/state 2>/dev/null);
|
||||
return $? >> 8;;
|
||||
}
|
||||
|
||||
sub chmem_read_attr($$$)
|
||||
# parameters: state, device, block
|
||||
{
|
||||
my @attributes = qw(state phys_device);
|
||||
foreach (0..1) {
|
||||
$_[$_] = `cat $memdir/memory$_[2]/$attributes[$_]`;
|
||||
chomp($_[$_]);
|
||||
}
|
||||
}
|
||||
|
||||
sub chmem_read_devices()
|
||||
{
|
||||
my $block = 0;
|
||||
my $device = 0;
|
||||
my $old_device = 0;
|
||||
my $blocks = 0;
|
||||
my $state;
|
||||
|
||||
foreach (@entries) {
|
||||
$_ =~ /memory(\d+)/;
|
||||
$block = $1;
|
||||
chmem_read_attr($state, $device, $block);
|
||||
if ($device != $old_device) {
|
||||
$devices->{$old_device}->{'id'} = $old_device;
|
||||
$devices->{$old_device}->{'blocks'} = $blocks;
|
||||
$old_device = $device;
|
||||
$blocks = 0;
|
||||
}
|
||||
if ($state eq "online") {
|
||||
$blocks++;
|
||||
}
|
||||
}
|
||||
$devices->{$old_device}->{'blocks'} = $blocks;
|
||||
$devices->{$old_device}->{'id'} = $old_device;
|
||||
}
|
||||
|
||||
sub chmem_dev_action($$)
|
||||
{
|
||||
my ($dev_id, $blocks) = @_;
|
||||
my ($start_block, $end_block, $tmp_block, $max_blocks);
|
||||
my $state;
|
||||
my $i = 0;
|
||||
my $count = 0;
|
||||
|
||||
if ($blocks_per_dev > 0) {
|
||||
$start_block = $dev_id * $blocks_per_dev;
|
||||
$end_block = $start_block + $blocks_per_dev - 1;
|
||||
$max_blocks = $blocks_per_dev;
|
||||
} else {
|
||||
$start_block = int($dev_id / $devs_per_block);
|
||||
$end_block = $start_block;
|
||||
$max_blocks = 1;
|
||||
}
|
||||
if ($blocks > $max_blocks) {
|
||||
$blocks = $max_blocks;
|
||||
}
|
||||
while ($count < $blocks && $i < $max_blocks) {
|
||||
$tmp_block = $online ? $start_block + $i : $end_block - $i;
|
||||
$state = `cat $memdir/memory$tmp_block/state`;
|
||||
chomp($state);
|
||||
if ($offline && $state eq "online") {
|
||||
$count++ unless chmem_offline($tmp_block);
|
||||
}
|
||||
if ($online && $state eq "offline") {
|
||||
$count++ unless chmem_online($tmp_block);
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
return $count;
|
||||
}
|
||||
|
||||
sub chmem_size($)
|
||||
{
|
||||
my $size = shift;
|
||||
my ($blocks, $dev_blocks, $dev_id);
|
||||
|
||||
$blocks = int($size / $block_size);
|
||||
if ($online) {
|
||||
foreach my $device (sort {$b->{'blocks'} <=> $a->{'blocks'} ||
|
||||
$a->{'id'} <=> $b->{'id'}}
|
||||
values %{$devices}) {
|
||||
$dev_blocks = $device->{'blocks'};
|
||||
$dev_id = $device->{'id'};
|
||||
if ($dev_blocks < $blocks_per_dev || $dev_blocks == 0) {
|
||||
$blocks -= chmem_dev_action($dev_id, $blocks);
|
||||
if ($blocks == 0) {
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($blocks > 0) {
|
||||
printf(STDERR "chmem: Could only set %lu MB of memory ".
|
||||
"online.\n", $size - $blocks * $block_size);
|
||||
$ret = 1;
|
||||
}
|
||||
} else {
|
||||
foreach my $device (sort {$a->{'blocks'} <=> $b->{'blocks'} ||
|
||||
$b->{'id'} <=> $a->{'id'}}
|
||||
values %{$devices}) {
|
||||
$dev_blocks = $device->{'blocks'};
|
||||
$dev_id = $device->{'id'};
|
||||
if ($dev_blocks > 0) {
|
||||
$blocks -= chmem_dev_action($dev_id, $blocks);
|
||||
if ($blocks == 0) {
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($blocks > 0) {
|
||||
printf(STDERR "chmem: Could only set %lu MB of memory ".
|
||||
"offline.\n", $size - $blocks * $block_size);
|
||||
$ret = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub chmem_range($$)
|
||||
{
|
||||
my ($start, $end) = @_;
|
||||
my $block = 0;
|
||||
my $state;
|
||||
|
||||
while ($start < $end && $block < $max_block_nr) {
|
||||
$block = int($start / ($block_size << 20));
|
||||
$state = `cat $memdir/memory$block/state`;
|
||||
chomp($state);
|
||||
if ($online && $state eq "offline") {
|
||||
if (chmem_online($block)) {
|
||||
printf(STDERR "chmem: Could not set ".
|
||||
"0x%016x-0x%016x online\n", $start,
|
||||
$start + ($block_size << 20) - 1);
|
||||
$ret = 1;
|
||||
}
|
||||
}
|
||||
if ($offline && $state eq "online") {
|
||||
if (chmem_offline($block)) {
|
||||
printf(STDERR "chmem: Could not set ".
|
||||
"0x%016x-0x%016x offline\n", $start,
|
||||
$start + ($block_size << 20) - 1);
|
||||
$ret = 1;
|
||||
}
|
||||
}
|
||||
$start += $block_size << 20;
|
||||
}
|
||||
}
|
||||
|
||||
sub chmem_check()
|
||||
{
|
||||
$block_size = `cat $memdir/block_size_bytes`;
|
||||
chomp($block_size);
|
||||
if ($block_size =~ /(?:0x)?([[:xdigit:]]+)/) {
|
||||
$block_size = unpack("Q", pack("H16",
|
||||
substr("0" x 16 . $1, -16)));
|
||||
$block_size = $block_size >> 20;
|
||||
} else {
|
||||
die "chmem: Unknown block size format in sysfs.\n";
|
||||
}
|
||||
if ($online == 0 && $offline == 0) {
|
||||
die "chmem: Please specify one of the options -e or -d.\n";
|
||||
}
|
||||
if ($online == 1 && $offline == 1) {
|
||||
die "chmem: You cannot specify both options -e and -d.\n";
|
||||
}
|
||||
|
||||
chmem_get_dev_size();
|
||||
if ($dev_size >= $block_size) {
|
||||
$blocks_per_dev = int($dev_size / $block_size);
|
||||
} else {
|
||||
$devs_per_block = int($block_size / $dev_size);
|
||||
}
|
||||
}
|
||||
|
||||
sub chmem_action()
|
||||
{
|
||||
my ($start, $end, $size, $unit);
|
||||
|
||||
if (!defined($ARGV[0])) {
|
||||
die "chmem: Missing size or range.\n";
|
||||
}
|
||||
if ($ARGV[0] =~ /^0x([[:xdigit:]]+)-0x([[:xdigit:]]+)$/) {
|
||||
$start = unpack("Q", pack("H16", substr("0" x 16 . $1, -16)));
|
||||
$end = unpack("Q", pack("H16", substr("0" x 16 . $2, -16)));
|
||||
if ($start % ($block_size << 20) ||
|
||||
($end + 1) % ($block_size << 20)) {
|
||||
die "chmem: Start address and (end address + 1) must ".
|
||||
"be aligned to memory block size ($block_size MB).\n";
|
||||
}
|
||||
chmem_range($start, $end);
|
||||
} else {
|
||||
if ($ARGV[0] =~ m/^(\d+)([mg]?)$/i) {
|
||||
$size = $1;
|
||||
$unit = $2 || "";
|
||||
if ($unit =~ /g/i) {
|
||||
$size = $size << 10;
|
||||
}
|
||||
if ($size % $block_size) {
|
||||
die "chmem: Size must be aligned to memory ".
|
||||
"block size ($block_size MB).\n";
|
||||
}
|
||||
chmem_size($size);
|
||||
} else {
|
||||
printf(STDERR "chmem: Invalid size or range: %s\n",
|
||||
$ARGV[0]);
|
||||
exit 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Main
|
||||
unless (GetOptions('v|version' => sub {chmem_version(); exit 0;},
|
||||
'h|help' => sub {chmem_usage(); exit 0;},
|
||||
'e|enable' => \$online,
|
||||
'd|disable' => \$offline)) {
|
||||
die "Try '$script_name --help' for more information.\n";
|
||||
};
|
||||
|
||||
@entries = (sort {length($a) <=> length($b) || $a cmp $b} <$memdir/memory*>);
|
||||
if (@entries == 0) {
|
||||
die "chmem: No memory hotplug interface in sysfs ($memdir).\n";
|
||||
}
|
||||
$entries[-1] =~ /memory(\d+)/;
|
||||
$max_block_nr = $1;
|
||||
|
||||
chmem_read_devices();
|
||||
chmem_check();
|
||||
chmem_action();
|
||||
exit $ret;
|
||||
@@ -1,75 +0,0 @@
|
||||
.\" Copyright 2017 IBM Corp.
|
||||
.\" s390-tools is free software; you can redistribute it and/or modify
|
||||
.\" it under the terms of the MIT license. See LICENSE for details.
|
||||
.\"
|
||||
.TH CHMEM 8 "Apr 2010" "s390-tools"
|
||||
.
|
||||
.
|
||||
.SH NAME
|
||||
chmem \- set memory online or offline.
|
||||
.
|
||||
.SH SYNOPSIS
|
||||
.B chmem
|
||||
.RB OPTIONS
|
||||
.RB [SIZE|RANGE]
|
||||
.
|
||||
.
|
||||
.SH DESCRIPTION
|
||||
The chmem command sets a particular size or range of memory online or offline.
|
||||
.
|
||||
.IP "\(hy" 2
|
||||
Specify SIZE as <size>[m|M|g|G]. With m or M, <size> specifies the memory
|
||||
size in MB (1024 x 1024 bytes). With g or G, <size> specifies the memory size
|
||||
in GB (1024 x 1024 x 1024 bytes). The default unit is MB.
|
||||
.
|
||||
.IP "\(hy" 2
|
||||
Specify RANGE in the form 0x<start>-0x<end> as shown in the output of the
|
||||
lsmem command. <start> is the hexadecimal address of the first byte and <end>
|
||||
is the hexadecimal address of the last byte in the memory range.
|
||||
.
|
||||
.PP
|
||||
SIZE and RANGE must be aligned to the Linux memory block size, as shown in
|
||||
the output of the lsmem command.
|
||||
|
||||
Setting memory online can fail if the hypervisor does not have enough memory
|
||||
left, for example because memory was overcommitted. Setting memory offline can
|
||||
fail if Linux cannot free the memory. If only part of the requested memory can
|
||||
be set online or offline, a message tells you how much memory was set online
|
||||
or offline instead of the requested amount.
|
||||
.
|
||||
.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.BR \-h ", " \-\-help
|
||||
Print a short help text, then exit.
|
||||
.
|
||||
.TP
|
||||
.BR \-v ", " \-\-version
|
||||
Print the version number, then exit.
|
||||
.
|
||||
.TP
|
||||
.BR \-e ", " \-\-enable
|
||||
Set the given RANGE or SIZE of memory online.
|
||||
.
|
||||
.TP
|
||||
.BR \-d ", " \-\-disable
|
||||
Set the given RANGE or SIZE of memory offline.
|
||||
.
|
||||
.
|
||||
.SH EXAMPLES
|
||||
.TP
|
||||
.B chmem --enable 1024
|
||||
This command requests 1024 MB of memory to be set online.
|
||||
.
|
||||
.TP
|
||||
.B chmem -e 2g
|
||||
This command requests 2 GB of memory to be set online.
|
||||
.
|
||||
.TP
|
||||
.B chmem --disable 0x00000000e4000000-0x00000000f3ffffff
|
||||
This command requests the memory range starting with 0x00000000e4000000
|
||||
and ending with 0x00000000f3ffffff to be set offline.
|
||||
.
|
||||
.
|
||||
.SH SEE ALSO
|
||||
.BR lsmem (8)
|
||||
78
zconf/lsluns
78
zconf/lsluns
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# lsluns - Tool to list all available LUNs
|
||||
# lsluns - list LUNs discovered in the FC SAN, or show encryption state of attached LUNs
|
||||
#
|
||||
# Copyright IBM Corp. 2008, 2017
|
||||
#
|
||||
@@ -169,32 +169,51 @@ sub get_lun_hash
|
||||
|
||||
sub lsluns_usage {
|
||||
print <<EOD;
|
||||
Usage: $PROGRAM_NAME [<options>]
|
||||
Usage:
|
||||
This tool is designed for environments where all SCSI devices are attached
|
||||
through the zfcp device driver. Expect error messages in mixed environments
|
||||
such as with iSCSI.
|
||||
|
||||
lsluns provides information for LUNs.
|
||||
$PROGRAM_NAME [-c <busid>] ... [-p <wwpn>] ... [-h] [-v]
|
||||
|
||||
The default is to list all LUNs that are available via the attached ports.
|
||||
The display can be limited by specifying an adapter or a port.
|
||||
List LUNs discovered in the Fibre Channel (FC) Storage Area Network (SAN).
|
||||
This causes extra SAN traffic for each target port WWPN.
|
||||
Discovering LUNs only makes sense for NPIV-enabled FCP devices
|
||||
without zfcp automatic LUN scan. zfcp automatic LUN scan is available
|
||||
as of kernel version 2.6.37, if not disabled with zfcp.allow_lun_scan=0.
|
||||
For storage products that do not support a REPORT LUNS
|
||||
well-known logical unit (such as IBM Storwize products),
|
||||
ensure that LUN 0 represents a valid peripheral device type.
|
||||
See the man page for more information.
|
||||
|
||||
$PROGRAM_NAME -a [-c <busid>] ... [-p <wwpn>] ... [-h] [-v]
|
||||
|
||||
Show encryption state of the attached LUNs.
|
||||
This causes extra SAN traffic for each attached LUN.
|
||||
|
||||
For all other uses, such as listing attached LUNs or properties other than
|
||||
encryption, use other tools such as "lszfcp -D" or "lsscsi -tv"
|
||||
or "lszdev zfcp-lun -ii".
|
||||
|
||||
Limit the listing by specifying one or more adapters (FCP device
|
||||
bus-IDs) or target port WWPNs or both.
|
||||
|
||||
Options:
|
||||
-a, --active
|
||||
Shows all activated LUNs.
|
||||
In addition LUN encryption information is provided.
|
||||
e.g. "lsluns -a"
|
||||
-c <busid>, --ccw <busid>
|
||||
Filter LUNs by adapter with the specified FCP device bus-ID. Can be
|
||||
specified multiple times.
|
||||
For example: "$PROGRAM_NAME -c 0.0.3922"
|
||||
|
||||
-c, --ccw
|
||||
Shows LUNs for a specific ccw device.
|
||||
e.g. "lsluns -c 0.0.3922"
|
||||
|
||||
-p, --port
|
||||
Shows LUNs for a specific port.
|
||||
e.g. "lsluns -p 0x5005123456789000"
|
||||
-p <wwpn>, --port <wwpn>
|
||||
Filter LUNs by target port with the specified WWPN. Can be specified
|
||||
multiple times.
|
||||
For example: "$PROGRAM_NAME -p 0x5005123456789000"
|
||||
|
||||
-h, --help
|
||||
Print help message and exit.
|
||||
Print help message and exit.
|
||||
|
||||
-v, --version
|
||||
Display version info and exit.
|
||||
Display version information and exit.
|
||||
EOD
|
||||
exit 0;
|
||||
}
|
||||
@@ -215,11 +234,9 @@ sub get_env_list
|
||||
my $p_ref_list = shift();
|
||||
my @res ;
|
||||
my %res_hash;
|
||||
my @t_arr;
|
||||
|
||||
@res = </sys/bus/ccw/drivers/zfcp/*.*.*/0x*>;
|
||||
return () if (!@res);
|
||||
reload:
|
||||
foreach my $entry (@res) {
|
||||
my $a = ${[split('/', $entry)]}[-2];
|
||||
my $p = ${[split('/', $entry)]}[-1];
|
||||
@@ -227,28 +244,9 @@ reload:
|
||||
next if (@$p_ref_list && "@$p_ref_list" !~ /$p/);
|
||||
push @{ $res_hash{$a} }, $p;
|
||||
}
|
||||
foreach my $a (sort @$a_ref_list) {
|
||||
if ("@{[keys %res_hash]}" !~ /$a/) {
|
||||
print "\tNo valid combination found for adapter '$a'. ",
|
||||
"Removing from resource list.\n";
|
||||
}
|
||||
}
|
||||
|
||||
push @t_arr, map { @{$res_hash{$_}} } keys %res_hash;
|
||||
foreach my $p (@$p_ref_list) {
|
||||
if ("@t_arr" !~ /$p/) {
|
||||
print "\tNo valid combination found for port '$p'. ",
|
||||
"Removing from resource list.\n";
|
||||
}
|
||||
}
|
||||
|
||||
if (!%res_hash) {
|
||||
print "\nNo valid parameters left, ",
|
||||
"using all available resources in system.\n\n";
|
||||
@$a_ref_list = ();
|
||||
@$p_ref_list = ();
|
||||
@t_arr = ();
|
||||
goto reload;
|
||||
print "$PROGRAM_NAME: Adapter and/or port filter(s) did not match anything\n";
|
||||
}
|
||||
return %res_hash;
|
||||
}
|
||||
|
||||
152
zconf/lsluns.8
152
zconf/lsluns.8
@@ -2,62 +2,140 @@
|
||||
.\" s390-tools is free software; you can redistribute it and/or modify
|
||||
.\" it under the terms of the MIT license. See LICENSE for details.
|
||||
.\"
|
||||
.TH LSLUNS 8 "June 2008" "s390-tools"
|
||||
.TH LSLUNS 8 "2017-02-17" "s390-tools"
|
||||
.SH NAME
|
||||
lsluns \- list available LUNs
|
||||
lsluns \- list LUNs discovered in the FC SAN through zfcp, or show encryption state of
|
||||
zfcp-attached LUNs
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B lsluns
|
||||
.RB [ \-h]
|
||||
.RB [ \-v]
|
||||
.RB [ \-c
|
||||
.IR adapter id:0.0.XXXX ]
|
||||
.RB [ \-p
|
||||
.IR port number:0xXXXXXXXXXXXXXXXX ]
|
||||
.RB [\| \-c
|
||||
.IR busid \|]\ .\|.\|.
|
||||
.RB [\| \-p
|
||||
.IR wwpn \|]\ .\|.\|.
|
||||
.\" --active
|
||||
.br
|
||||
.B lsluns \-a
|
||||
.RB [\| \-c
|
||||
.IR busid \|]\ .\|.\|.
|
||||
.RB [\| \-p
|
||||
.IR wwpn \|]\ .\|.\|.
|
||||
.\" --help and --version
|
||||
.br
|
||||
.B lsluns
|
||||
.RB [\| \-h \|]
|
||||
.RB [\| \-v \|]
|
||||
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
.B lsluns
|
||||
does a listing of all available LUNs.
|
||||
This tool is designed for environments where all SCSI devices are attached
|
||||
through the zfcp device driver. Expect error messages in mixed environments
|
||||
such as with iSCSI.
|
||||
|
||||
The default is to list all LUNs that are found. The listing can be
|
||||
limited by specifying an adapter or a port.
|
||||
.B lsluns
|
||||
lists all logical unit numbers (LUNs) discovered in the
|
||||
Fibre Channel (FC) Storage Area Network (SAN).
|
||||
This causes extra SAN traffic for each target port WWPN.
|
||||
|
||||
.B lsluns -a
|
||||
shows the encryption state of the attached LUNs.
|
||||
This causes extra SAN traffic for each attached LUN.
|
||||
|
||||
Limit the listing by specifying one or more adapters (FCP device
|
||||
bus-IDs) or target port WWPNs or both.
|
||||
|
||||
For all other uses, such as listing attached LUNs or properties other than
|
||||
encryption, use other tools such as
|
||||
.B lszfcp \-D
|
||||
or
|
||||
.BR "lsscsi \-tv"
|
||||
or
|
||||
.BR "lszdev zfcp-lun \-ii" .
|
||||
|
||||
.SS Details on lsluns without -a option
|
||||
|
||||
.TP
|
||||
Prerequisite
|
||||
Discovering LUNs only makes sense for NPIV-enabled FCP devices
|
||||
without zfcp automatic LUN scan. zfcp automatic LUN scan is available
|
||||
as of kernel version 2.6.37, if not disabled with zfcp.allow_lun_scan=0.
|
||||
|
||||
With available and enabled zfcp automatic LUN scan,
|
||||
the kernel already performs LUN discovery.
|
||||
|
||||
.TP
|
||||
Temporary LUN Attachment
|
||||
If not attached already, lsluns temporarily attaches LUN 0
|
||||
(or if this fails the WLUN 0xc101000000000000) during runtime.
|
||||
Do not terminate lsluns with a signal. Signals interfere
|
||||
with the removal of temporarily attached LUNs.
|
||||
|
||||
.TP
|
||||
Storage Products
|
||||
Some storage products return a peripheral device type of 31==0x1f
|
||||
with peripheral qualifier 0 in a SCSI standard INQUIRY command
|
||||
for an unmapped FCP LUN 0. Examples are: IBM Storwize products,
|
||||
including IBM V7000, IBM V840, IBM V9000, and IBM SAN Volume Controller.
|
||||
For lsluns to work with such storage products,
|
||||
you must have a host mapping on the storage, which maps some volume
|
||||
to exported FCP LUN 0x0000000000000000 (Storwize host map property "SCSI ID" 0)
|
||||
for each used FCP-device initiator WWPN. The volume can be
|
||||
a minimum-sized thin-provisioned shared stand-in volume.
|
||||
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B -h, --help
|
||||
.BR \-a ", " \-\-active
|
||||
Show the encryption state of the attached LUNs. Encrypted devices are indicated
|
||||
with a bracketed X immediately following the LUN number.
|
||||
.TP
|
||||
.BI \-c\ busid \fR,\ \fB\-\-ccw= busid
|
||||
Filter LUNs by adapter with the specified FCP device bus-ID. This option can be
|
||||
specified multiple times. When used in conjunction with \fB\-p\fR, only those
|
||||
LUNs are listed that also satisfy at least one of the \fB\-p\fR constraints.
|
||||
.TP
|
||||
.BI \-p\ wwpn \fR,\ \fB\-\-port= wwpn
|
||||
Filter LUNs by target port with the specified WWPN. This option can be
|
||||
specified multiple times. When used in conjunction with \fB\-c\fR, only those
|
||||
LUNs are listed that also satisfy at least one of the \fB\-c\fR constraints.
|
||||
.TP
|
||||
.BR \-h ", " \-\-help
|
||||
Print help message and exit.
|
||||
.TP
|
||||
.B -v, --version
|
||||
Display version info and exit.
|
||||
.TP
|
||||
.B -c, --ccw
|
||||
Shows LUNs for a specific adapter.
|
||||
.TP
|
||||
.B -p, --port
|
||||
Shows LUNs for a specific port.
|
||||
.TP
|
||||
.B -a, --active
|
||||
Shows all activated LUNs. In addition information is provided
|
||||
whether the LUN is encrypted or not. This is indicated with a bracketed X
|
||||
right after the LUN number.
|
||||
.BR \-v ", " \-\-version
|
||||
Display version information and exit.
|
||||
|
||||
.SH EXAMPLES
|
||||
.PP
|
||||
.IP "lsluns"
|
||||
.TP
|
||||
.B "lsluns"
|
||||
.RS
|
||||
Shows all available LUNs.
|
||||
Lists all LUNs discovered in the FC SAN.
|
||||
.RE
|
||||
.IP "lsluns -c 0.0.3922"
|
||||
Shows all LUNs found on adapter 0.0.3922.
|
||||
.IP "lsluns -p 0x5005123456789000"
|
||||
Shows all LUNs for port 0x5005123456789000.
|
||||
.IP "lsluns -c 0.0.3922 -p 0x5005123456789000"
|
||||
Shows all LUNs for adapter 0.0.3922 and port 0x5005123456789000.
|
||||
.IP "lsluns -a "
|
||||
.TP
|
||||
.BI "lsluns \-c " 0.0.3922
|
||||
Lists all LUNs discovered in the FC SAN on adapter \fI0.0.3922\fR.
|
||||
.TP
|
||||
.BI "lsluns \-p " 0x5005123456789000
|
||||
Lists all LUNs discovered in the FC SAN on target port
|
||||
\fI0x5005123456789000\fR.
|
||||
.TP
|
||||
.BI "lsluns \-c " 0.0.3922 " \-c " 0.0.fc00 \
|
||||
" \-p " 0x5005123456789000 " \-p " 0x5005abcdefabc000
|
||||
Lists all LUNs discovered in the FC SAN on:
|
||||
adpater \fI0.0.3922\fR and port \fI0x5005123456789000\fR,
|
||||
adapter \fI0.0.3922\fR and port \fI0x5005abcdefabc000\fR,
|
||||
adapter \fI0.0.fc00\fR and port \fI0x5005123456789000\fR, or
|
||||
adapter \fI0.0.fc00\fR and port \fI0x5005abcdefabc000\fR.
|
||||
.TP
|
||||
.B "lsluns -a"
|
||||
adapter = 0.0.3c02
|
||||
port = 0x500507630300c562
|
||||
lun = 0x401040a200000000(X) /dev/sg0 Disk IBM:2107900
|
||||
lun = 0x401040a300000000 /dev/sg1 Disk IBM:2107900
|
||||
|
||||
Shows all active LUNs including the information whether the device is encrypted or not.
|
||||
Shows the encryption status of attached LUNs. A bracketed X suffixed to a LUN
|
||||
indicates that the device is encrypted.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
.BR lszfcp (8),
|
||||
.BR lsscsi (8),
|
||||
.BR lszdev (8)
|
||||
|
||||
172
zconf/lsmem
172
zconf/lsmem
@@ -1,172 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# lsmem - Tool to show memory hotplug status
|
||||
#
|
||||
# Copyright IBM Corp. 2010, 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.
|
||||
#
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Getopt::Long qw(:config no_ignore_case no_auto_abbrev);
|
||||
use File::Basename;
|
||||
|
||||
my $script_name = fileparse($0);
|
||||
my $memdir = "/sys/devices/system/memory";
|
||||
my $block_size = 0;
|
||||
my $list_all = 0;
|
||||
my $dev_size = 0;
|
||||
my @entries;
|
||||
|
||||
|
||||
sub lsmem_read_attr($$$$)
|
||||
# parameters: state, rem, device, block_nr
|
||||
{
|
||||
my @attributes = qw(state removable phys_device);
|
||||
foreach (0..2) {
|
||||
$_[$_] = `cat $memdir/memory$_[3]/$attributes[$_]`;
|
||||
chomp($_[$_]);
|
||||
}
|
||||
}
|
||||
|
||||
sub lsmem_get_dev_size()
|
||||
{
|
||||
my ($device, $old_device, $block, $old_block) = (0, 0, 0, 0);
|
||||
|
||||
foreach (@entries) {
|
||||
$_ =~ /memory(\d+)/;
|
||||
$block = $1;
|
||||
$device = `cat $_/phys_device`;
|
||||
chomp($device);
|
||||
if ($device > $old_device) {
|
||||
$dev_size = int((($block - $old_block) * $block_size) /
|
||||
($device - $old_device));
|
||||
last;
|
||||
}
|
||||
$dev_size += $block_size;
|
||||
$old_block = $block;
|
||||
}
|
||||
}
|
||||
|
||||
sub lsmem_list()
|
||||
{
|
||||
my $block = 0;
|
||||
my ($start, $end, $size) = (0, 0, 0);
|
||||
my ($state, $next_state) = (0, 0);
|
||||
my ($rem, $next_rem) = (0, 0);
|
||||
my ($device, $next_device, $end_dev) = (0, 0, 0);
|
||||
my ($mem_online, $mem_offline) = (0, 0);
|
||||
my $mem_hole;
|
||||
|
||||
$block_size = `cat $memdir/block_size_bytes`;
|
||||
chomp($block_size);
|
||||
if ($block_size =~ /(?:0x)?([[:xdigit:]]+)/) {
|
||||
$block_size = unpack("Q", pack("H16",
|
||||
substr("0" x 16 . $1, -16)));
|
||||
$block_size = $block_size >> 20;
|
||||
} else {
|
||||
die "lsmem: Unknown block size format in sysfs.\n";
|
||||
}
|
||||
lsmem_get_dev_size();
|
||||
# Start with $mem_hole = 1 to initialize $start, $state, $rem, $device
|
||||
$mem_hole = 1;
|
||||
|
||||
print <<HERE;
|
||||
Address Range Size (MB) State Removable Device
|
||||
===============================================================================
|
||||
HERE
|
||||
foreach (@entries) {
|
||||
$_ =~ /memory(\d+)/;
|
||||
$block = $1;
|
||||
if ($mem_hole) {
|
||||
lsmem_read_attr($state, $rem, $device, $block);
|
||||
$start = ($block) * ($block_size << 20);
|
||||
$mem_hole = 0;
|
||||
}
|
||||
# check next block or memory hole
|
||||
$block++;
|
||||
if (-d "$memdir/memory".$block) {
|
||||
lsmem_read_attr($next_state, $next_rem, $next_device,
|
||||
$block);
|
||||
} else {
|
||||
$mem_hole = 1
|
||||
}
|
||||
if ($state ne $next_state || $rem != $next_rem || $list_all ||
|
||||
$mem_hole) {
|
||||
$end = ($block) * ($block_size << 20) - 1;
|
||||
$size = ($end - $start + 1) >> 20;
|
||||
if ($state eq "going-offline") {
|
||||
$state = "on->off";
|
||||
}
|
||||
printf("0x%016x-0x%016x %10lu %-7s ", $start, $end,
|
||||
$size, $state);
|
||||
if ($state eq "online") {
|
||||
printf(" %-9s ", $rem ? "yes" : "no");
|
||||
$mem_online += $size;
|
||||
} else {
|
||||
printf(" %-9s ", "-");
|
||||
$mem_offline += $size;
|
||||
}
|
||||
$end_dev = ($end / $dev_size) >> 20;
|
||||
if ($device == $end_dev) {
|
||||
printf("%d\n", $device);
|
||||
} else {
|
||||
printf("%d-%d\n", $device, $end_dev);
|
||||
}
|
||||
$state = $next_state;
|
||||
$rem = $next_rem;
|
||||
$device = $end_dev + 1;
|
||||
$start = $end + 1;
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
printf("Memory device size : %lu MB\n", $dev_size);
|
||||
printf("Memory block size : %lu MB\n", $block_size);
|
||||
printf("Total online memory : %lu MB\n", $mem_online);
|
||||
printf("Total offline memory: %lu MB\n", $mem_offline);
|
||||
}
|
||||
|
||||
sub lsmem_usage()
|
||||
{
|
||||
print <<HERE;
|
||||
Usage: $script_name [OPTIONS]
|
||||
|
||||
The $script_name command lists the ranges of available memory with their online
|
||||
status. The listed memory blocks correspond to the memory block representation
|
||||
in sysfs. The command also shows the memory block size, the device size, and
|
||||
the amount of memory in online and offline state.
|
||||
|
||||
OPTIONS
|
||||
-a, --all
|
||||
List each individual memory block, instead of combining memory blocks
|
||||
with similar attributes.
|
||||
|
||||
-h, --help
|
||||
Print a short help text, then exit.
|
||||
|
||||
-v, --version
|
||||
Print the version number, then exit.
|
||||
HERE
|
||||
}
|
||||
|
||||
sub lsmem_version()
|
||||
{
|
||||
print "$script_name: version %S390_TOOLS_VERSION%\n";
|
||||
print "Copyright IBM Corp. 2010, 2017\n";
|
||||
}
|
||||
|
||||
|
||||
# Main
|
||||
unless (GetOptions('v|version' => sub {lsmem_version(); exit 0;},
|
||||
'h|help' => sub {lsmem_usage(); exit 0;},
|
||||
'a|all' => \$list_all)) {
|
||||
die "Try '$script_name --help' for more information.\n";
|
||||
};
|
||||
|
||||
@entries = (sort {length($a) <=> length($b) || $a cmp $b} <$memdir/memory*>);
|
||||
if (@entries == 0) {
|
||||
die "lsmem: No memory hotplug interface in sysfs ($memdir).\n";
|
||||
}
|
||||
lsmem_list();
|
||||
@@ -1,73 +0,0 @@
|
||||
.\" Copyright 2017 IBM Corp.
|
||||
.\" s390-tools is free software; you can redistribute it and/or modify
|
||||
.\" it under the terms of the MIT license. See LICENSE for details.
|
||||
.\"
|
||||
.TH LSMEM 8 "Apr 2010" s390\-tools
|
||||
.
|
||||
.
|
||||
.SH NAME
|
||||
lsmem \- list the ranges of available memory with their online status.
|
||||
.
|
||||
.
|
||||
.SH SYNOPSIS
|
||||
.B lsmem
|
||||
.RB [OPTIONS]
|
||||
.
|
||||
.
|
||||
.SH DESCRIPTION
|
||||
The lsmem command lists the ranges of available memory with their online
|
||||
status. The listed memory blocks correspond to the memory block representation
|
||||
in sysfs. The command also shows the memory block size, the device size, and
|
||||
the amount of memory in online and offline state.
|
||||
.
|
||||
.SS "Column description"
|
||||
.
|
||||
.TP 4
|
||||
Address Range
|
||||
Start and end address of the memory range.
|
||||
.
|
||||
.TP 4
|
||||
Size
|
||||
Size of the memory range in MB (1024 x 1024 bytes).
|
||||
.
|
||||
.TP 4
|
||||
State
|
||||
Indication of the online status of the memory range. State on->off means
|
||||
that the address range is in transition from online to offline.
|
||||
.
|
||||
.TP 4
|
||||
Removable
|
||||
"yes" if the memory range can be set offline, "no" if it cannot be set offline.
|
||||
A dash ("\-") means that the range is already offline.
|
||||
.
|
||||
.TP 4
|
||||
Device
|
||||
Device number or numbers that correspond to the memory range.
|
||||
|
||||
Each device represents a memory unit for the hypervisor in control of the
|
||||
memory. The hypervisor cannot reuse a memory unit unless the corresponding
|
||||
memory range is completely offline. For best memory utilization, each device
|
||||
should either be completely online or completely offline.
|
||||
|
||||
The chmem command with the size parameter automatically chooses the best suited
|
||||
device or devices when setting memory online or offline. The device size depends
|
||||
on the hypervisor and on the amount of total online and offline memory.
|
||||
.
|
||||
.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.BR \-a ", " \-\-all
|
||||
List each individual memory block, instead of combining memory blocks with
|
||||
similar attributes.
|
||||
.
|
||||
.TP
|
||||
.BR \-h ", " \-\-help
|
||||
Print a short help text, then exit.
|
||||
.
|
||||
.TP
|
||||
.BR \-v ", " \-\-version
|
||||
Print the version number, then exit.
|
||||
.
|
||||
.
|
||||
.SH SEE ALSO
|
||||
.BR chmem (8)
|
||||
@@ -2,7 +2,7 @@
|
||||
.\" s390-tools is free software; you can redistribute it and/or modify
|
||||
.\" it under the terms of the MIT license. See LICENSE for details.
|
||||
.\"
|
||||
.TH CHZCRYPT 8 "AUG 2008" "s390-tools"
|
||||
.TH CHZCRYPT 8 "OCT 2017" "s390-tools"
|
||||
.SH NAME
|
||||
chzcrypt \- modify zcrypt configuration
|
||||
.SH SYNOPSIS
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
.\" nroff -man lszcrypt.8
|
||||
.\" to process this source
|
||||
.\"
|
||||
.TH LSZCRYPT 8 "AUG 2008" "s390-tools"
|
||||
.TH LSZCRYPT 8 "OCT 2017" "s390-tools"
|
||||
.SH NAME
|
||||
lszcrypt \- display zcrypt device and configuration information
|
||||
.SH SYNOPSIS
|
||||
@@ -85,6 +85,13 @@ EP11 Secure Key
|
||||
.IP "o"
|
||||
Long RNG
|
||||
.RE
|
||||
|
||||
.RS 8
|
||||
The CCA Secure Key capability may be limited by a hypervisor
|
||||
layer. The remarks 'full function set' or 'restricted function set' may
|
||||
reflect this. For details about these limitations please check the
|
||||
hypervisor documentation.
|
||||
.RE
|
||||
.TP 8
|
||||
.B -d, --domains
|
||||
Shows the usage and control domains of the cryptographic devices.
|
||||
|
||||
@@ -42,11 +42,19 @@ struct lszcrypt_l *lszcrypt_l = &l;
|
||||
/*
|
||||
* Card types
|
||||
*/
|
||||
#define MASK_APSC 0x80000000
|
||||
#define MASK_RSA4K 0x60000000
|
||||
#define MASK_COPRO 0x10000000
|
||||
#define MASK_ACCEL 0x08000000
|
||||
#define MASK_EP11 0x04000000
|
||||
#define MASK_APSC 0x80000000
|
||||
#define MASK_RSA4K 0x60000000
|
||||
#define MASK_COPRO 0x10000000
|
||||
#define MASK_ACCEL 0x08000000
|
||||
#define MASK_EP11 0x04000000
|
||||
|
||||
/*
|
||||
* Classification
|
||||
*/
|
||||
#define MASK_CLASS_FULL 0x00800000
|
||||
#define CLASS_FULL "full function set"
|
||||
#define MASK_CLASS_STATELESS 0x00400000
|
||||
#define CLASS_STATELESS "restricted function set"
|
||||
|
||||
/*
|
||||
* Program configuration
|
||||
@@ -226,7 +234,7 @@ static void show_capability(const char *id_str)
|
||||
{
|
||||
unsigned long func_val;
|
||||
long hwtype, id;
|
||||
char *p, *ap, *dev, card[16];
|
||||
char *p, *ap, *dev, card[16], cbuf[256];
|
||||
|
||||
/* check if ap driver is available */
|
||||
ap = util_path_sysfs("bus/ap");
|
||||
@@ -250,6 +258,11 @@ static void show_capability(const char *id_str)
|
||||
printf("Detailed capability information for %s (hardware type %ld) is not available.\n", card, hwtype);
|
||||
return;
|
||||
}
|
||||
cbuf[0] = '\0';
|
||||
if (func_val & MASK_CLASS_FULL)
|
||||
snprintf(cbuf, sizeof(cbuf), "%s", CLASS_FULL);
|
||||
else if (func_val & MASK_CLASS_STATELESS)
|
||||
snprintf(cbuf, sizeof(cbuf), "%s", CLASS_STATELESS);
|
||||
printf("%s provides capability for:\n", card);
|
||||
switch (hwtype) {
|
||||
case 6:
|
||||
@@ -262,11 +275,15 @@ static void show_capability(const char *id_str)
|
||||
case 7:
|
||||
case 9:
|
||||
printf("%s\n", CAP_RSA4K);
|
||||
printf("%s\n", CAP_CCA);
|
||||
if (cbuf[0])
|
||||
printf("%s (%s)\n", CAP_CCA, cbuf);
|
||||
else
|
||||
printf("%s\n", CAP_CCA);
|
||||
printf("%s", CAP_RNG);
|
||||
break;
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
if (func_val & MASK_ACCEL) {
|
||||
if (func_val & MASK_RSA4K)
|
||||
printf("%s", CAP_RSA4K);
|
||||
@@ -274,12 +291,14 @@ static void show_capability(const char *id_str)
|
||||
printf("%s", CAP_RSA2K);
|
||||
} else if (func_val & MASK_COPRO) {
|
||||
printf("%s\n", CAP_RSA4K);
|
||||
printf("%s\n", CAP_CCA);
|
||||
if (cbuf[0])
|
||||
printf("%s (%s)\n", CAP_CCA, cbuf);
|
||||
else
|
||||
printf("%s\n", CAP_CCA);
|
||||
printf("%s", CAP_RNG);
|
||||
} else if (func_val & MASK_EP11) {
|
||||
printf("%s", CAP_EP11);
|
||||
} else {
|
||||
|
||||
printf("Detailed capability information for %s (hardware type %ld) is not available.", card, hwtype);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -157,10 +157,6 @@ char *misc_asprintf(const char *, ...);
|
||||
int misc_system(err_t, const char *, ...);
|
||||
bool misc_read_dir(const char *, struct util_list *,
|
||||
bool (*)(const char *, void *), void *);
|
||||
bool path_exists(const char *);
|
||||
bool file_exists(const char *);
|
||||
bool file_writable(const char *);
|
||||
bool dir_exists(const char *);
|
||||
bool file_is_devnode(const char *);
|
||||
exit_code_t remove_file(const char *);
|
||||
char *misc_read_text_file(const char *, int, err_t);
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#define PATH_PROC "/proc"
|
||||
|
||||
#define PATH_UDEVADM "udevadm"
|
||||
#define PATH_VMCP "/usr/sbin/vmcp"
|
||||
#define PATH_VMCP TOOLS_BINDIR "/vmcp"
|
||||
#define PATH_IP "ip"
|
||||
|
||||
#define PATH_ROOT "/"
|
||||
|
||||
@@ -620,13 +620,13 @@ Answer all confirmation questions with 'yes'.
|
||||
.
|
||||
.B Persistently configure root device:
|
||||
.RS 4
|
||||
.CL chzdev \-\-by\-path / \-\-persistent
|
||||
.CL chzdev \-\-by\-path / \-\-persistent \-\-enable
|
||||
.RE
|
||||
.PP
|
||||
.
|
||||
.B Disable device that provides networking interface eth0:
|
||||
.RS 4
|
||||
.CL chzdev \-\-by\-interface eth0 \-\-active
|
||||
.CL chzdev \-\-by\-interface eth0 \-\-active \-\-disable
|
||||
.RE
|
||||
.PP
|
||||
.
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_base.h"
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "ccw.h"
|
||||
@@ -1165,15 +1166,10 @@ out:
|
||||
|
||||
static void read_grouped(struct ccw_devinfo *info, const char *path)
|
||||
{
|
||||
char *file_path;
|
||||
|
||||
file_path = misc_asprintf("%s/group_device", path);
|
||||
if (path_exists(file_path))
|
||||
if (util_path_exists("%s/group_device", path))
|
||||
info->grouped = 1;
|
||||
else
|
||||
info->grouped = 0;
|
||||
|
||||
free(file_path);
|
||||
}
|
||||
|
||||
static void read_cutype(struct ccw_devinfo *info, const char *path)
|
||||
@@ -1229,7 +1225,7 @@ static struct ccw_devinfo *ccw_devinfo_read(struct ccw_devid *devid)
|
||||
|
||||
id = ccw_devid_to_str(devid);
|
||||
path = path_get_ccw_device(NULL, id);
|
||||
if (!dir_exists(path))
|
||||
if (!util_path_is_dir(path))
|
||||
goto out;
|
||||
|
||||
info->exists = 1;
|
||||
@@ -1354,7 +1350,7 @@ bool ccw_exists(const char *drv, const char *mod, const char *id)
|
||||
if (!path)
|
||||
return false;
|
||||
|
||||
rc = dir_exists(path);
|
||||
rc = util_path_is_dir(path);
|
||||
free(path);
|
||||
|
||||
return rc;
|
||||
@@ -1428,7 +1424,7 @@ static exit_code_t ccw_st_read_active(struct subtype *st, struct device *dev,
|
||||
state->definable = 0;
|
||||
|
||||
path = path_get_ccw_device(drv, id);
|
||||
if (path_exists(path)) {
|
||||
if (util_path_exists(path)) {
|
||||
state->exists = 1;
|
||||
device_read_active_settings(dev, scope);
|
||||
} else
|
||||
@@ -1641,7 +1637,7 @@ static void ccw_st_add_errors(struct subtype *st, const char *id,
|
||||
if (!path)
|
||||
return;
|
||||
|
||||
if (!path_exists(path)) {
|
||||
if (!util_path_exists(path)) {
|
||||
strlist_add(errors, "CCW device %s does not exist", id);
|
||||
goto out;
|
||||
}
|
||||
@@ -1662,9 +1658,7 @@ static void ccw_st_add_errors(struct subtype *st, const char *id,
|
||||
"paths", id);
|
||||
goto out;
|
||||
}
|
||||
free(apath);
|
||||
apath = misc_asprintf("%s/driver", path);
|
||||
if (!path_exists(apath)) {
|
||||
if (!util_path_exists("%s/driver", path)) {
|
||||
strlist_add(errors, "CCW device %s is not bound to a driver",
|
||||
id);
|
||||
goto out;
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_base.h"
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "ccw.h"
|
||||
@@ -557,7 +558,7 @@ static bool read_full_id(struct ccwgroup_devid *devid_ptr, const char *drv,
|
||||
bool result = false;
|
||||
|
||||
path = path_get_ccwgroup_device(drv, id);
|
||||
if (!dir_exists(path))
|
||||
if (!util_path_is_dir(path))
|
||||
goto out;
|
||||
|
||||
memset(&devid, 0, sizeof(struct ccwgroup_devid));
|
||||
@@ -625,7 +626,7 @@ static void ccwgroup_add_ids(const char *drv, const char *mod,
|
||||
path = path_get_ccwgroup_devices(drv);
|
||||
if (mod)
|
||||
module_try_load_once(mod, path);
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, get_ids_cb, &cb_data);
|
||||
free(path);
|
||||
}
|
||||
@@ -663,7 +664,7 @@ static exit_code_t ccwgroup_st_read_active(struct subtype *st,
|
||||
state->definable = 0;
|
||||
|
||||
path = ccwgroup_get_dev_path_by_devid(drv, devid);
|
||||
if (path_exists(path)) {
|
||||
if (util_path_exists(path)) {
|
||||
state->exists = 1;
|
||||
device_read_active_settings(dev, scope);
|
||||
} else
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
#include "lib/zt_common.h"
|
||||
|
||||
#include "attrib.h"
|
||||
@@ -2502,7 +2503,7 @@ static exit_code_t do_export(struct options *opts)
|
||||
info("Exporting configuration data to standard output\n");
|
||||
} else {
|
||||
info("Exporting configuration data to %s\n", opts->export);
|
||||
if (!path_exists(opts->export)) {
|
||||
if (!util_path_exists(opts->export)) {
|
||||
rc = path_create(opts->export);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "ccw.h"
|
||||
#include "ccwgroup.h"
|
||||
#include "ctc.h"
|
||||
@@ -125,13 +127,13 @@ static struct util_list *read_sorted_ctc_devinfos(void)
|
||||
/* Add CCW devices bound to the CTC CCW device driver. */
|
||||
module_try_load_once(CTC_MOD_NAME, NULL);
|
||||
path = path_get_sys_bus_drv(CCW_BUS_NAME, CTC_CCWDRV_NAME);
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, add_cb, infos);
|
||||
free(path);
|
||||
|
||||
/* Add CCW devices bound to the LCS CCW device driver. */
|
||||
path = path_get_sys_bus_drv(CCW_BUS_NAME, LCS_CCWDRV_NAME);
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, add_cb, infos);
|
||||
free(path);
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "device.h"
|
||||
#include "devtype.h"
|
||||
@@ -480,7 +482,8 @@ void device_read_active_settings(struct device *dev, read_scope_t scope)
|
||||
a = attrib_find(st->dev_attribs, name);
|
||||
s = setting_list_apply_actual(dev->active.settings, a, name,
|
||||
value);
|
||||
if (link || (scope == scope_all && !file_writable(path)))
|
||||
if (link || (scope == scope_all &&
|
||||
!util_path_is_writable(path)))
|
||||
s->readonly = 1;
|
||||
if (link)
|
||||
free(link);
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
#include <sys/sysmacros.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "devnode.h"
|
||||
#include "misc.h"
|
||||
#include "path.h"
|
||||
@@ -230,7 +232,7 @@ static exit_code_t add_block_cb(const char *path, const char *filename,
|
||||
|
||||
/* Add additional nodes. */
|
||||
cb_data->prefix = filename;
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, add_part_cb, cb_data);
|
||||
|
||||
return EXIT_OK;
|
||||
@@ -249,7 +251,7 @@ int devnode_add_block_from_sysfs(struct util_list *list, const char *path)
|
||||
cb_data.prefix = NULL;
|
||||
|
||||
blkpath = misc_asprintf("%s/block", path);
|
||||
if (dir_exists(blkpath))
|
||||
if (util_path_is_dir(blkpath))
|
||||
path_for_each(blkpath, add_block_cb, &cb_data);
|
||||
free(blkpath);
|
||||
|
||||
@@ -283,7 +285,7 @@ int devnode_add_net_from_sysfs(struct util_list *list, const char *path)
|
||||
cb_data.prefix = NULL;
|
||||
|
||||
netpath = misc_asprintf("%s/net", path);
|
||||
if (dir_exists(netpath))
|
||||
if (util_path_is_dir(netpath))
|
||||
path_for_each(netpath, add_net_cb, &cb_data);
|
||||
free(netpath);
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "ccw.h"
|
||||
#include "ccwgroup.h"
|
||||
@@ -162,7 +164,7 @@ static void generic_ccw_st_add_devnodes(struct subtype *st, const char *id,
|
||||
cb_data.devnodes = devnodes;
|
||||
cb_data.id = id;
|
||||
path = path_get_sys_dev_char_devices();
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, add_cb, &cb_data);
|
||||
free(path);
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "ccw.h"
|
||||
#include "ccwgroup.h"
|
||||
#include "ctc.h"
|
||||
@@ -129,13 +131,13 @@ static struct util_list *read_sorted_lcs_devinfos(void)
|
||||
/* Add CCW devices bound to the LCS CCW device driver. */
|
||||
module_try_load_once(LCS_MOD_NAME, NULL);
|
||||
path = path_get_sys_bus_drv(CCW_BUS_NAME, LCS_CCWDRV_NAME);
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, add_cb, infos);
|
||||
free(path);
|
||||
|
||||
/* Add CCW devices bound to the CTC CCW device driver. */
|
||||
path = path_get_sys_bus_drv(CCW_BUS_NAME, CTC_CCWDRV_NAME);
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, add_cb, infos);
|
||||
free(path);
|
||||
|
||||
|
||||
@@ -889,69 +889,6 @@ void ptrlist_move(struct util_list *to, struct util_list *from,
|
||||
util_list_add_tail(to, node);
|
||||
}
|
||||
|
||||
/* Check if a path exists. */
|
||||
bool path_exists(const char *path)
|
||||
{
|
||||
struct stat s;
|
||||
|
||||
debug("Checking if file exists: %s\n", path);
|
||||
if (stat(path, &s) != 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Check if a file exists. */
|
||||
bool file_exists(const char *path)
|
||||
{
|
||||
struct stat s;
|
||||
|
||||
debug("Checking if regular file exists: %s\n", path);
|
||||
if (stat(path, &s) != 0)
|
||||
return false;
|
||||
|
||||
if (!S_ISREG(s.st_mode))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Check if a file is writable. */
|
||||
bool file_writable(const char *path)
|
||||
{
|
||||
struct stat s;
|
||||
|
||||
debug("Checking if regular file is writable: %s\n", path);
|
||||
if (stat(path, &s) != 0)
|
||||
return false;
|
||||
|
||||
if (!S_ISREG(s.st_mode))
|
||||
return false;
|
||||
|
||||
if (!(s.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Check if a directory exists. */
|
||||
bool dir_exists(const char *path)
|
||||
{
|
||||
bool result = false;
|
||||
struct stat s;
|
||||
|
||||
debug("Checking if directory exists: %s\n", path);
|
||||
if (stat(path, &s) != 0)
|
||||
goto out;
|
||||
if (!S_ISDIR(s.st_mode))
|
||||
goto out;
|
||||
result = true;
|
||||
out:
|
||||
debug("Result: %d\n", result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Check if file is a block or character special file. */
|
||||
bool file_is_devnode(const char *path)
|
||||
{
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "misc.h"
|
||||
#include "modprobe.h"
|
||||
@@ -376,7 +378,7 @@ exit_code_t modprobe_read_settings(const char *path, const char *mod,
|
||||
struct modprobe_file *mf;
|
||||
exit_code_t rc;
|
||||
|
||||
if (!file_exists(path)) {
|
||||
if (!util_path_is_reg_file(path)) {
|
||||
*settings = NULL;
|
||||
return EXIT_OK;
|
||||
}
|
||||
@@ -398,7 +400,7 @@ exit_code_t modprobe_write_settings(const char *path, const char *mod,
|
||||
exit_code_t rc;
|
||||
unsigned long lines;
|
||||
|
||||
if (file_exists(path)) {
|
||||
if (util_path_is_reg_file(path)) {
|
||||
rc = modprobe_read(path, &mf);
|
||||
if (rc)
|
||||
return rc;
|
||||
@@ -414,7 +416,7 @@ exit_code_t modprobe_write_settings(const char *path, const char *mod,
|
||||
lines = util_list_len(&mf->lines);
|
||||
if (lines == 0 || (lines == 1 && find_chzdev_comment(mf))) {
|
||||
/* Do not write empty files. */
|
||||
if (file_exists(path))
|
||||
if (util_path_is_reg_file(path))
|
||||
rc = remove_file(path);
|
||||
} else
|
||||
rc = modprobe_write(mf);
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "misc.h"
|
||||
#include "module.h"
|
||||
@@ -34,7 +36,7 @@ bool module_loaded(const char *mod)
|
||||
char *path = path_get_sys_module(mod);
|
||||
bool rc;
|
||||
|
||||
rc = dir_exists(path);
|
||||
rc = util_path_is_dir(path);
|
||||
free(path);
|
||||
|
||||
return rc;
|
||||
@@ -229,7 +231,7 @@ void module_try_load_once(const char *mod, const char *path)
|
||||
} else
|
||||
tried_loading = strlist_new();
|
||||
strlist_add(tried_loading, mod);
|
||||
if (path && path_exists(path))
|
||||
if (path && util_path_exists(path))
|
||||
return;
|
||||
if (module_loaded(mod))
|
||||
return;
|
||||
@@ -275,7 +277,7 @@ bool module_set_params(const char *mod, struct setting_list *settings)
|
||||
return false;
|
||||
}
|
||||
path = path_get_sys_module_param(mod, s->name);
|
||||
result = file_writable(path);
|
||||
result = util_path_is_writable(path);
|
||||
free(path);
|
||||
if (!result) {
|
||||
/* Sysfs file is not writable. */
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "ccw.h"
|
||||
#include "ccwgroup.h"
|
||||
#include "device.h"
|
||||
@@ -277,7 +279,7 @@ static struct util_list *read_sorted_qeth_devinfos(void)
|
||||
/* Get CHPID information for all devices bound to the QETH driver. */
|
||||
infos = ptrlist_new();
|
||||
path = path_get_sys_bus_drv(CCW_BUS_NAME, QETH_CCWDRV_NAME);
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, add_cb, infos);
|
||||
free(path);
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "device.h"
|
||||
#include "devtype.h"
|
||||
#include "misc.h"
|
||||
@@ -35,9 +37,14 @@ exit_code_t root_check(void)
|
||||
/* Get list of devices that provide the root device. */
|
||||
selected = selected_dev_list_new();
|
||||
rc = select_by_path(NULL, selected, config_active, scope_mandatory,
|
||||
NULL, NULL, PATH_ROOT, err_print);
|
||||
if (rc)
|
||||
NULL, NULL, PATH_ROOT, err_ignore);
|
||||
if (rc) {
|
||||
/* Running from an unknown root device is not an error. */
|
||||
verb("Note: Could not determine if root device configuration "
|
||||
"needs to be updated\n");
|
||||
rc = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Determine if any of the devices or device types has been modified. */
|
||||
mod = strlist_new();
|
||||
@@ -69,7 +76,7 @@ exit_code_t root_check(void)
|
||||
"required.\n");
|
||||
|
||||
/* Check if script is available. */
|
||||
if (!file_exists(PATH_ROOT_SCRIPT))
|
||||
if (!util_path_is_reg_file(PATH_ROOT_SCRIPT))
|
||||
goto out;
|
||||
|
||||
/* Ask for confirmation. */
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "misc.h"
|
||||
#include "path.h"
|
||||
#include "scsi.h"
|
||||
@@ -253,7 +255,7 @@ static struct util_list *read_scsi_zfcp_list(void)
|
||||
|
||||
list = ptrlist_new();
|
||||
path = path_get_sys_bus_dev("scsi", NULL);
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, add_ids_cb, list);
|
||||
free(path);
|
||||
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "blkinfo.h"
|
||||
#include "ccw.h"
|
||||
#include "device.h"
|
||||
@@ -622,7 +624,7 @@ exit_code_t select_by_path(struct select_opts *select,
|
||||
struct ptrlist_node *p;
|
||||
exit_code_t rc;
|
||||
|
||||
if (!path_exists(path)) {
|
||||
if (!util_path_exists(path)) {
|
||||
err_t_print(err, "Path not found: %s\n", path);
|
||||
return EXIT_DEVICE_NOT_FOUND;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "ccw.h"
|
||||
#include "device.h"
|
||||
@@ -391,7 +393,7 @@ exit_code_t udev_remove_rule(const char *type, const char *id)
|
||||
exit_code_t rc = EXIT_OK;
|
||||
|
||||
path = path_get_udev_rule(type, id);
|
||||
if (file_exists(path))
|
||||
if (util_path_is_reg_file(path))
|
||||
rc = remove_file(path);
|
||||
free(path);
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "ccw.h"
|
||||
#include "device.h"
|
||||
@@ -33,7 +35,7 @@ bool udev_ccw_exists(const char *type, const char *id)
|
||||
return false;
|
||||
|
||||
path = path_get_udev_rule(type, normid);
|
||||
rc = file_exists(path);
|
||||
rc = util_path_is_reg_file(path);
|
||||
free(path);
|
||||
free(normid);
|
||||
|
||||
@@ -150,7 +152,7 @@ exit_code_t udev_ccw_write_device(struct device *dev)
|
||||
|
||||
path = path_get_udev_rule(type, id);
|
||||
debug("Writing %s udev rule file %s\n", type, path);
|
||||
if (!path_exists(path)) {
|
||||
if (!util_path_exists(path)) {
|
||||
rc = path_create(path);
|
||||
if (rc)
|
||||
goto out;
|
||||
@@ -243,7 +245,7 @@ exit_code_t udev_ccw_write_cio_ignore(const char *id_list)
|
||||
|
||||
if (!*id_list) {
|
||||
/* Empty id_list string - remove file. */
|
||||
if (!file_exists(path)) {
|
||||
if (!util_path_is_reg_file(path)) {
|
||||
/* Already removed. */
|
||||
goto out;
|
||||
}
|
||||
@@ -256,7 +258,7 @@ exit_code_t udev_ccw_write_cio_ignore(const char *id_list)
|
||||
goto out;
|
||||
|
||||
debug("Writing cio-ignore udev rule file %s\n", path);
|
||||
if (!path_exists(path)) {
|
||||
if (!util_path_exists(path)) {
|
||||
rc = path_create(path);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "ccwgroup.h"
|
||||
#include "device.h"
|
||||
@@ -53,7 +55,7 @@ bool udev_ccwgroup_exists(const char *type, const char *id)
|
||||
path = get_rule_path(type, id);
|
||||
if (!path)
|
||||
return false;
|
||||
rc = file_exists(path);
|
||||
rc = util_path_is_reg_file(path);
|
||||
free(path);
|
||||
|
||||
return rc;
|
||||
@@ -215,7 +217,7 @@ exit_code_t udev_ccwgroup_write_device(struct device *dev)
|
||||
list = setting_list_get_sorted(dev->persistent.settings);
|
||||
|
||||
debug("Writing %s udev rule file %s\n", type, path);
|
||||
if (!path_exists(path)) {
|
||||
if (!util_path_exists(path)) {
|
||||
rc = path_create(path);
|
||||
if (rc)
|
||||
goto out;
|
||||
@@ -364,7 +366,7 @@ void udev_ccwgroup_add_device_ids(const char *type, struct util_list *list)
|
||||
cb_data.prefix = misc_asprintf("%s-%s-", UDEV_PREFIX, type);
|
||||
cb_data.ids = list;
|
||||
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, get_ids_cb, &cb_data);
|
||||
|
||||
free(cb_data.prefix);
|
||||
@@ -382,7 +384,7 @@ exit_code_t udev_ccwgroup_remove_rule(const char *type, const char *id)
|
||||
return EXIT_INVALID_ID;
|
||||
|
||||
path = path_get_udev_rule(type, partial_id);
|
||||
if (file_exists(path))
|
||||
if (util_path_is_reg_file(path))
|
||||
rc = remove_file(path);
|
||||
free(path);
|
||||
free(partial_id);
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "device.h"
|
||||
#include "misc.h"
|
||||
@@ -376,7 +378,7 @@ void udev_zfcp_lun_add_device_ids(struct util_list *list)
|
||||
cb_data.list = list;
|
||||
path = path_get_udev_rules();
|
||||
|
||||
if (dir_exists(path))
|
||||
if (util_path_is_dir(path))
|
||||
path_for_each(path, lun_cb, &cb_data);
|
||||
|
||||
free(path);
|
||||
@@ -497,7 +499,7 @@ static exit_code_t write_luns_rule(const char *path, struct util_list *list)
|
||||
return EXIT_INTERNAL_ERROR;
|
||||
hba_id = ccw_devid_to_str(&node->id.fcp_dev);
|
||||
debug("Writing FCP LUN udev rule file %s\n", path);
|
||||
if (!path_exists(path)) {
|
||||
if (!util_path_exists(path)) {
|
||||
rc = path_create(path);
|
||||
if (rc)
|
||||
goto out;
|
||||
@@ -614,7 +616,7 @@ static exit_code_t update_lun_rule(const char *id, struct device_state *state)
|
||||
|
||||
/* Get previous rule data. */
|
||||
luns = zfcp_lun_node_list_new();
|
||||
exists = file_exists(path);
|
||||
exists = util_path_is_reg_file(path);
|
||||
if (exists)
|
||||
udev_read_zfcp_lun_rule(path, luns);
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lib/util_path.h"
|
||||
|
||||
#include "attrib.h"
|
||||
#include "ccw.h"
|
||||
#include "device.h"
|
||||
@@ -430,7 +432,7 @@ static exit_code_t zfcp_lun_st_read_active(struct subtype *st,
|
||||
|
||||
/* Check for FC unit. */
|
||||
fc_path = path_get_zfcp_lun_dev(dev->devid);
|
||||
fc_exists = path_exists(fc_path);
|
||||
fc_exists = util_path_exists(fc_path);
|
||||
free(fc_path);
|
||||
|
||||
/* Check for SCSI device. */
|
||||
@@ -478,7 +480,7 @@ static exit_code_t zfcp_lun_add(struct device *dev)
|
||||
/* Check if LUN already exists. */
|
||||
fcp_dev_id = ccw_devid_to_str(&devid->fcp_dev);
|
||||
lunpath = path_get_zfcp_lun_dev(devid);
|
||||
if (dir_exists(lunpath)) {
|
||||
if (util_path_is_dir(lunpath)) {
|
||||
hctl = scsi_hctl_from_zfcp_lun_devid(devid);
|
||||
if (!hctl)
|
||||
goto check_failed;
|
||||
@@ -486,7 +488,7 @@ static exit_code_t zfcp_lun_add(struct device *dev)
|
||||
}
|
||||
|
||||
portpath = path_get_zfcp_port_dev(devid);
|
||||
if (!dir_exists(portpath)) {
|
||||
if (!util_path_is_dir(portpath)) {
|
||||
delayed_err("Target port not found\n");
|
||||
rc = EXIT_ZFCP_WWPN_NOT_FOUND;
|
||||
goto out;
|
||||
@@ -681,14 +683,14 @@ static exit_code_t zfcp_lun_st_device_undefine(struct subtype *st,
|
||||
|
||||
remove_lun:
|
||||
path = path_get_zfcp_lun_dev(devid);
|
||||
if (!path_exists(path))
|
||||
if (!util_path_exists(path))
|
||||
goto out;
|
||||
free(path);
|
||||
path = NULL;
|
||||
|
||||
/* Remove FCP LUN. */
|
||||
devpath = path_get_zfcp_port_dev(devid);
|
||||
if (!dir_exists(devpath)) {
|
||||
if (!util_path_is_dir(devpath)) {
|
||||
rc = EXIT_ZFCP_WWPN_NOT_FOUND;
|
||||
goto out;
|
||||
}
|
||||
@@ -779,7 +781,7 @@ static bool zfcp_lun_fc_lun_exists(const char *id)
|
||||
if (zfcp_lun_parse_devid(&devid, id, err_ignore) != EXIT_OK)
|
||||
return false;
|
||||
path = path_get_zfcp_lun_dev(&devid);
|
||||
result = path_exists(path);
|
||||
result = util_path_exists(path);
|
||||
free(path);
|
||||
|
||||
return result;
|
||||
@@ -910,7 +912,7 @@ static void add_sg_from_sysfs(struct util_list *list, const char *path)
|
||||
char *sgpath;
|
||||
|
||||
sgpath = misc_asprintf("%s/scsi_generic", path);
|
||||
if (dir_exists(sgpath))
|
||||
if (util_path_is_dir(sgpath))
|
||||
path_for_each(sgpath, add_sg_cb, list);
|
||||
free(sgpath);
|
||||
}
|
||||
|
||||
@@ -2,7 +2,25 @@ include ../common.mak
|
||||
|
||||
CPIOINIT = $(call echocmd," CPIOINI ",/$@)./cpioinit
|
||||
|
||||
all: $(ZFCPDUMP_PART_RD)
|
||||
ifeq (${HAVE_LIBC_STATIC},0)
|
||||
|
||||
all:
|
||||
$(SKIP) HAVE_LIBC_STATIC=0
|
||||
|
||||
install:
|
||||
$(SKIP) HAVE_LIBC_STATIC=0
|
||||
|
||||
else
|
||||
|
||||
check_dep:
|
||||
$(call check_dep, \
|
||||
"zfcpdump", \
|
||||
"stdio.h", \
|
||||
"glibc-static or libc-dev", \
|
||||
"HAVE_LIBC_STATIC=0", \
|
||||
"-static")
|
||||
|
||||
all: check_dep $(ZFCPDUMP_PART_RD)
|
||||
|
||||
cpioinit: cpioinit.c
|
||||
$(HOSTCC) $(HOSTCFLAGS) -o $@ $^
|
||||
@@ -19,7 +37,9 @@ $(ZFCPDUMP_PART_RD): cpioinit zfcpdump_part
|
||||
install: all
|
||||
$(INSTALL) -m 611 $(ZFCPDUMP_PART_RD) $(DESTDIR)$(ZFCPDUMP_DIR)
|
||||
|
||||
endif
|
||||
|
||||
clean:
|
||||
rm -f *.o *.gz *.tmp *~ zfcpdump_part cpioinit $(ZFCPDUMP_PART_RD)
|
||||
|
||||
.PHONY: all clean install
|
||||
.PHONY: all clean install check_dep
|
||||
|
||||
@@ -58,6 +58,7 @@ sub store_mapper_devices
|
||||
my $src_dir = shift();
|
||||
my @entries = grep { ! /^\./ } dir_content($src_dir);
|
||||
|
||||
foreach my $map_dev (@entries) {
|
||||
my $tf = catfile($src_dir, "$map_dev");
|
||||
my $mm = `stat -L -c%t:%T $tf`;
|
||||
chomp($mm);
|
||||
|
||||
@@ -662,7 +662,7 @@ static int init_adapters(struct adapters *all_adapters, struct options *opts)
|
||||
malloc(sizeof(char)*MAX_HOST_PATH_LEN);
|
||||
sprintf(adapter->q_full_path, "%s/queue_full",
|
||||
opts->host_path[i]);
|
||||
if (stat(adapter->path, &buf)) {
|
||||
if (stat(adapter->q_full_path, &buf)) {
|
||||
fprintf(stderr, "%s: Path does not exist: %s - correct kernel version?\n",
|
||||
toolname, adapter->q_full_path);
|
||||
rc++;
|
||||
@@ -806,7 +806,7 @@ static int check_host_param(long *host_nr, char *host_path)
|
||||
}
|
||||
tmp = malloc(strlen(host_path) + strlen("/queue_full") + 1);
|
||||
sprintf(tmp, "%s/queue_full", host_path);
|
||||
if (stat(host_path, &buf)) {
|
||||
if (stat(tmp, &buf)) {
|
||||
fprintf(stderr, "%s: Cannot access %s."
|
||||
" Your installed kernel is probably too old. Please"
|
||||
" check that your kernel matches the level in the"
|
||||
@@ -1009,7 +1009,7 @@ static int parse_params(int argc, char **argv, struct options *opts)
|
||||
|
||||
if (argc <= 1) {
|
||||
print_help();
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* this is too much, but argc/2 is a reliable upper boundary
|
||||
@@ -1296,6 +1296,7 @@ int main(int argc, char **argv)
|
||||
struct timeval first_interval;
|
||||
struct ioerr_wrp *ioerr = NULL;
|
||||
int rc = 0;
|
||||
int parse_params_rc;
|
||||
|
||||
verbose = 0;
|
||||
keep_running = 1;
|
||||
@@ -1304,9 +1305,13 @@ int main(int argc, char **argv)
|
||||
|
||||
init_opts(&opts);
|
||||
|
||||
if (parse_params(argc, argv, &opts)) {
|
||||
parse_params_rc = parse_params(argc, argv, &opts);
|
||||
if (parse_params_rc < 0) {
|
||||
rc = -1;
|
||||
goto out2;
|
||||
} else if (parse_params_rc > 0) {
|
||||
rc = 0;
|
||||
goto out2;
|
||||
}
|
||||
|
||||
if (opts.msg_q_path && setup_msg_q(&opts)) {
|
||||
|
||||
@@ -623,7 +623,7 @@ sub get_dasd_info($)
|
||||
my $type;
|
||||
local *HANDLE;
|
||||
|
||||
open(HANDLE, "$dasdview -x -f $dev 2>/dev/null|") or
|
||||
open(HANDLE, "$dasdview -x $dev 2>/dev/null|") or
|
||||
# dasdview returned with an error
|
||||
return undef;
|
||||
while (<HANDLE>) {
|
||||
|
||||
Reference in New Issue
Block a user