mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 19:28:53 +03:00
Compare commits
106 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 86783d7d92 | |||
| dbbc2f9688 | |||
| 1322f07ade | |||
| 79f8e629ff | |||
| 5f125e9012 | |||
| d7fb413f0f | |||
| f0aca5f7bb | |||
| 04305bbd18 | |||
| 35d43ba8ea | |||
| 3ad6c1692f | |||
| 9e5a297de6 | |||
| 8a315a30ab | |||
| b01a8cc2c0 | |||
| a727848e05 | |||
| b2ede77bf9 | |||
| c1b9dc735f | |||
| e271cd7a65 | |||
| 7d26967d4e | |||
| 93a99c6daa | |||
| 671b1af1bc | |||
| a836cc6ddd | |||
| 435407eb5c | |||
| 07a2ba541d | |||
| f786232b2a | |||
| 45c4b3e680 | |||
| 092021ba39 | |||
| aef1324d59 | |||
| d1e05c6856 | |||
| 30dcddaec7 | |||
| c094b9a928 | |||
| 4e24df0e81 | |||
| 848c4b2300 | |||
| c6f6958fc0 | |||
| e1b3ab5f51 | |||
| e2a96aa4eb | |||
| 6ec3abcb59 | |||
| e97637d484 | |||
| e2176f12a9 | |||
| c2f0aaeb3c | |||
| b17e472983 | |||
| 133faca275 | |||
| 7c555fee9d | |||
| ecaf3ea3f2 | |||
| 9b17d5a37d | |||
| 75ec145710 | |||
| 33075e465f | |||
| cdbe1d65c4 | |||
| fa28e26e42 | |||
| 9fe3da9364 | |||
| a68dfdb88c | |||
| 4a5950a129 | |||
| c7db374ac6 | |||
| e25f9131d6 | |||
| 4e49d8ed27 | |||
| a969b1b22c | |||
| 18edf7a3ba | |||
| 33003ecc93 | |||
| 07cc8ae46a | |||
| e202d3b867 | |||
| 3d9f37026d | |||
| fc2c0256c5 | |||
| a69765ea5b | |||
| a164143dfd | |||
| c63b47e4da | |||
| 0e30635f9c | |||
| 777c98ee52 | |||
| 164d184ed9 | |||
| 3da577280a | |||
| 433b9a89c4 | |||
| 374f86b5c9 | |||
| 59f1875639 | |||
| aa7258ced0 | |||
| dedd8243fc | |||
| 43d63ab2d4 | |||
| bd9a9a4e1a | |||
| 5219a2691e | |||
| 48f376b0c5 | |||
| 345f8beb58 | |||
| a5c469c5f3 | |||
| 4b3133e671 | |||
| 4f6e0ca117 | |||
| 1d2aea7711 | |||
| 0a4e41d0fa | |||
| 050be02c02 | |||
| 576d34cb11 | |||
| 6281b5c488 | |||
| 231a37c4c0 | |||
| 9d2e5c14b2 | |||
| b644a45bd4 | |||
| fd0893cf1f | |||
| c8d36e2192 | |||
| edaa250bb3 | |||
| 04a6ae0585 | |||
| eb68e3cd56 | |||
| 2098a00318 | |||
| 82e3117095 | |||
| fce0f7aff4 | |||
| df18a44396 | |||
| 41fb4e071c | |||
| 7043742828 | |||
| aa256549d1 | |||
| 083239575a | |||
| 57159a519b | |||
| 8473829d1f | |||
| e45a981f6d | |||
| 5161e5d8a4 |
@@ -0,0 +1,57 @@
|
|||||||
|
acl
|
||||||
|
alien
|
||||||
|
attr
|
||||||
|
autoconf
|
||||||
|
bc
|
||||||
|
build-essential
|
||||||
|
curl
|
||||||
|
dbench
|
||||||
|
debhelper-compat
|
||||||
|
dh-python
|
||||||
|
dkms
|
||||||
|
fakeroot
|
||||||
|
fio
|
||||||
|
gdb
|
||||||
|
gdebi
|
||||||
|
git
|
||||||
|
ksh
|
||||||
|
lcov
|
||||||
|
libacl1-dev
|
||||||
|
libaio-dev
|
||||||
|
libattr1-dev
|
||||||
|
libblkid-dev
|
||||||
|
libcurl4-openssl-dev
|
||||||
|
libdevmapper-dev
|
||||||
|
libelf-dev
|
||||||
|
libffi-dev
|
||||||
|
libmount-dev
|
||||||
|
libpam0g-dev
|
||||||
|
libselinux1-dev
|
||||||
|
libssl-dev
|
||||||
|
libtool
|
||||||
|
libudev-dev
|
||||||
|
linux-headers-generic
|
||||||
|
lsscsi
|
||||||
|
mdadm
|
||||||
|
nfs-kernel-server
|
||||||
|
pamtester
|
||||||
|
parted
|
||||||
|
po-debconf
|
||||||
|
python3
|
||||||
|
python3-all-dev
|
||||||
|
python3-cffi
|
||||||
|
python3-dev
|
||||||
|
python3-packaging
|
||||||
|
python3-pip
|
||||||
|
python3-setuptools
|
||||||
|
python3-sphinx
|
||||||
|
rng-tools-debian
|
||||||
|
rsync
|
||||||
|
samba
|
||||||
|
sysstat
|
||||||
|
uuid-dev
|
||||||
|
watchdog
|
||||||
|
wget
|
||||||
|
xfslibs-dev
|
||||||
|
xz-utils
|
||||||
|
zlib1g-dev
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
pax-utils
|
||||||
|
shellcheck
|
||||||
@@ -6,20 +6,27 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
checkstyle:
|
checkstyle:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
# https://github.com/orgs/community/discussions/47863
|
||||||
sudo apt-get install --yes -qq build-essential autoconf libtool gawk alien fakeroot linux-headers-$(uname -r)
|
sudo apt-mark hold grub-efi-amd64-signed
|
||||||
sudo apt-get install --yes -qq zlib1g-dev uuid-dev libattr1-dev libblkid-dev libselinux-dev libudev-dev libssl-dev python-dev python-setuptools python-cffi python3 python3-dev python3-setuptools python3-cffi
|
sudo apt-get update --fix-missing
|
||||||
# packages for tests
|
sudo apt-get upgrade
|
||||||
sudo apt-get install --yes -qq parted lsscsi ksh attr acl nfs-kernel-server fio
|
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt apt-get install -qq
|
||||||
sudo apt-get install --yes -qq mandoc cppcheck pax-utils devscripts
|
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/checkstyle-dependencies.txt apt-get install -qq
|
||||||
sudo -E pip --quiet install flake8
|
sudo python3 -m pip install --quiet flake8
|
||||||
|
sudo apt-get clean
|
||||||
|
|
||||||
|
# confirm that the tools are installed
|
||||||
|
# the build system doesn't fail when they are not
|
||||||
|
flake8 --version
|
||||||
|
scanelf --version
|
||||||
|
shellcheck --version
|
||||||
- name: Prepare
|
- name: Prepare
|
||||||
run: |
|
run: |
|
||||||
sh ./autogen.sh
|
sh ./autogen.sh
|
||||||
|
|||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# remove 4GiB of images
|
||||||
|
sudo systemd-run docker system prune --force --all --volumes
|
||||||
|
|
||||||
|
# remove unused software
|
||||||
|
sudo systemd-run --wait rm -rf \
|
||||||
|
"$AGENT_TOOLSDIRECTORY" \
|
||||||
|
/opt/* \
|
||||||
|
/usr/local/* \
|
||||||
|
/usr/share/az* \
|
||||||
|
/usr/share/dotnet \
|
||||||
|
/usr/share/gradle* \
|
||||||
|
/usr/share/miniconda \
|
||||||
|
/usr/share/swift \
|
||||||
|
/var/lib/gems \
|
||||||
|
/var/lib/mysql \
|
||||||
|
/var/lib/snapd
|
||||||
|
|
||||||
|
# trim the cleaned space
|
||||||
|
sudo fstrim /
|
||||||
@@ -9,7 +9,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [20.04]
|
os: [20.04, 22.04]
|
||||||
runs-on: ubuntu-${{ matrix.os }}
|
runs-on: ubuntu-${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
@@ -17,17 +17,12 @@ jobs:
|
|||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
# https://github.com/orgs/community/discussions/47863
|
||||||
sudo apt-get install --yes -qq build-essential autoconf libtool gdb lcov \
|
sudo apt-mark hold grub-efi-amd64-signed
|
||||||
git alien fakeroot wget curl bc fio acl \
|
sudo apt-get update --fix-missing
|
||||||
sysstat mdadm lsscsi parted gdebi attr dbench watchdog ksh \
|
sudo apt-get upgrade
|
||||||
nfs-kernel-server samba rng-tools xz-utils \
|
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt apt-get install -qq
|
||||||
zlib1g-dev uuid-dev libblkid-dev libselinux-dev \
|
sudo apt-get clean
|
||||||
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
|
||||||
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
|
||||||
libpam0g-dev pamtester python-dev python-setuptools python-cffi \
|
|
||||||
python3 python3-dev python3-setuptools python3-cffi python3-packaging \
|
|
||||||
libcurl4-openssl-dev
|
|
||||||
- name: Autogen.sh
|
- name: Autogen.sh
|
||||||
run: |
|
run: |
|
||||||
sh autogen.sh
|
sh autogen.sh
|
||||||
@@ -56,12 +51,13 @@ jobs:
|
|||||||
sudo udevadm control --reload-rules
|
sudo udevadm control --reload-rules
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
# Workaround to provide additional free space for testing.
|
- name: Clear the kernel ring buffer
|
||||||
# https://github.com/actions/virtual-environments/issues/2840
|
run: |
|
||||||
sudo rm -rf /usr/share/dotnet
|
sudo dmesg -c >/var/tmp/dmesg-prerun
|
||||||
sudo rm -rf /opt/ghc
|
- name: Reclaim and report disk space
|
||||||
sudo rm -rf "/usr/local/share/boost"
|
run: |
|
||||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
${{ github.workspace }}/.github/workflows/scripts/reclaim_disk_space.sh
|
||||||
|
df -h /
|
||||||
- name: Tests
|
- name: Tests
|
||||||
run: |
|
run: |
|
||||||
/usr/share/zfs/zfs-tests.sh -vR -s 3G
|
/usr/share/zfs/zfs-tests.sh -vR -s 3G
|
||||||
@@ -71,7 +67,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
RESULTS_PATH=$(readlink -f /var/tmp/test_results/current)
|
RESULTS_PATH=$(readlink -f /var/tmp/test_results/current)
|
||||||
sudo dmesg > $RESULTS_PATH/dmesg
|
sudo dmesg > $RESULTS_PATH/dmesg
|
||||||
sudo cp /var/log/syslog $RESULTS_PATH/
|
sudo cp /var/log/syslog /var/tmp/dmesg-prerun $RESULTS_PATH/
|
||||||
sudo chmod +r $RESULTS_PATH/*
|
sudo chmod +r $RESULTS_PATH/*
|
||||||
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
||||||
for f in $(find /var/tmp/test_results -name '*:*'); do mv "$f" "${f//:/__}"; done
|
for f in $(find /var/tmp/test_results -name '*:*'); do mv "$f" "${f//:/__}"; done
|
||||||
@@ -79,5 +75,7 @@ jobs:
|
|||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
name: Test logs Ubuntu-${{ matrix.os }}
|
name: Test logs Ubuntu-${{ matrix.os }}
|
||||||
path: /var/tmp/test_results/20*/
|
path: |
|
||||||
|
/var/tmp/test_results/*
|
||||||
|
!/var/tmp/test_results/current
|
||||||
if-no-files-found: ignore
|
if-no-files-found: ignore
|
||||||
|
|||||||
@@ -6,24 +6,19 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
# https://github.com/orgs/community/discussions/47863
|
||||||
sudo apt-get install --yes -qq build-essential autoconf libtool gdb lcov \
|
sudo apt-mark hold grub-efi-amd64-signed
|
||||||
git alien fakeroot wget curl bc fio acl \
|
sudo apt-get update --fix-missing
|
||||||
sysstat mdadm lsscsi parted gdebi attr dbench watchdog ksh \
|
sudo apt-get upgrade
|
||||||
nfs-kernel-server samba rng-tools xz-utils \
|
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt apt-get install -qq
|
||||||
zlib1g-dev uuid-dev libblkid-dev libselinux-dev \
|
sudo apt-get clean
|
||||||
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
|
||||||
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
|
||||||
libpam0g-dev pamtester python-dev python-setuptools python-cffi \
|
|
||||||
python3 python3-dev python3-setuptools python3-cffi python3-packaging \
|
|
||||||
libcurl4-openssl-dev
|
|
||||||
- name: Autogen.sh
|
- name: Autogen.sh
|
||||||
run: |
|
run: |
|
||||||
sh autogen.sh
|
sh autogen.sh
|
||||||
@@ -52,12 +47,13 @@ jobs:
|
|||||||
sudo udevadm control --reload-rules
|
sudo udevadm control --reload-rules
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
# Workaround to provide additional free space for testing.
|
- name: Clear the kernel ring buffer
|
||||||
# https://github.com/actions/virtual-environments/issues/2840
|
run: |
|
||||||
sudo rm -rf /usr/share/dotnet
|
sudo dmesg -c >/var/tmp/dmesg-prerun
|
||||||
sudo rm -rf /opt/ghc
|
- name: Reclaim and report disk space
|
||||||
sudo rm -rf "/usr/local/share/boost"
|
run: |
|
||||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
${{ github.workspace }}/.github/workflows/scripts/reclaim_disk_space.sh
|
||||||
|
df -h /
|
||||||
- name: Tests
|
- name: Tests
|
||||||
run: |
|
run: |
|
||||||
/usr/share/zfs/zfs-tests.sh -vR -s 3G -r sanity
|
/usr/share/zfs/zfs-tests.sh -vR -s 3G -r sanity
|
||||||
@@ -67,13 +63,15 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
RESULTS_PATH=$(readlink -f /var/tmp/test_results/current)
|
RESULTS_PATH=$(readlink -f /var/tmp/test_results/current)
|
||||||
sudo dmesg > $RESULTS_PATH/dmesg
|
sudo dmesg > $RESULTS_PATH/dmesg
|
||||||
sudo cp /var/log/syslog $RESULTS_PATH/
|
sudo cp /var/log/syslog /var/tmp/dmesg-prerun $RESULTS_PATH/
|
||||||
sudo chmod +r $RESULTS_PATH/*
|
sudo chmod +r $RESULTS_PATH/*
|
||||||
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
||||||
for f in $(find /var/tmp/test_results -name '*:*'); do mv "$f" "${f//:/__}"; done
|
for f in $(find /var/tmp/test_results -name '*:*'); do mv "$f" "${f//:/__}"; done
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v3
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
name: Test logs
|
name: Test logs Ubuntu-${{ matrix.os }}
|
||||||
path: /var/tmp/test_results/20*/
|
path: |
|
||||||
|
/var/tmp/test_results/*
|
||||||
|
!/var/tmp/test_results/current
|
||||||
if-no-files-found: ignore
|
if-no-files-found: ignore
|
||||||
|
|||||||
+10
-12
@@ -6,7 +6,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
TEST_DIR: /var/tmp/zloop
|
TEST_DIR: /var/tmp/zloop
|
||||||
steps:
|
steps:
|
||||||
@@ -15,15 +15,12 @@ jobs:
|
|||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
# https://github.com/orgs/community/discussions/47863
|
||||||
sudo apt-get install --yes -qq build-essential autoconf libtool gdb \
|
sudo apt-mark hold grub-efi-amd64-signed
|
||||||
git alien fakeroot \
|
sudo apt-get update --fix-missing
|
||||||
zlib1g-dev uuid-dev libblkid-dev libselinux-dev \
|
sudo apt-get upgrade
|
||||||
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt apt-get install -qq
|
||||||
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
sudo apt-get clean
|
||||||
libpam0g-dev \
|
|
||||||
python-dev python-setuptools python-cffi python-packaging \
|
|
||||||
python3 python3-dev python3-setuptools python3-cffi python3-packaging
|
|
||||||
- name: Autogen.sh
|
- name: Autogen.sh
|
||||||
run: |
|
run: |
|
||||||
sh autogen.sh
|
sh autogen.sh
|
||||||
@@ -44,8 +41,9 @@ jobs:
|
|||||||
- name: Tests
|
- name: Tests
|
||||||
run: |
|
run: |
|
||||||
sudo mkdir -p $TEST_DIR
|
sudo mkdir -p $TEST_DIR
|
||||||
# run for 20 minutes to have a total runner time of 30 minutes
|
# run for 10 minutes or at most 2 iterations for a maximum runner
|
||||||
sudo /usr/share/zfs/zloop.sh -t 1200 -l -m1 -- -T 120 -P 60
|
# time of 20 minutes.
|
||||||
|
sudo /usr/share/zfs/zloop.sh -t 600 -I 2 -l -m1 -- -T 120 -P 60
|
||||||
- name: Prepare artifacts
|
- name: Prepare artifacts
|
||||||
if: failure()
|
if: failure()
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
Meta: 1
|
Meta: 1
|
||||||
Name: zfs
|
Name: zfs
|
||||||
Branch: 1.0
|
Branch: 1.0
|
||||||
Version: 2.1.9
|
Version: 2.1.12
|
||||||
Release: 1
|
Release: 1
|
||||||
Release-Tags: relext
|
Release-Tags: relext
|
||||||
License: CDDL
|
License: CDDL
|
||||||
Author: OpenZFS
|
Author: OpenZFS
|
||||||
Linux-Maximum: 6.1
|
Linux-Maximum: 6.3
|
||||||
Linux-Minimum: 3.10
|
Linux-Minimum: 3.10
|
||||||
|
|||||||
@@ -1,13 +1,8 @@
|
|||||||
bin_SCRIPTS = arc_summary
|
bin_SCRIPTS = arc_summary
|
||||||
|
|
||||||
CLEANFILES = arc_summary
|
CLEANFILES = arc_summary
|
||||||
EXTRA_DIST = arc_summary2 arc_summary3
|
EXTRA_DIST = arc_summary3
|
||||||
|
|
||||||
if USING_PYTHON_2
|
|
||||||
SCRIPT = arc_summary2
|
|
||||||
else
|
|
||||||
SCRIPT = arc_summary3
|
SCRIPT = arc_summary3
|
||||||
endif
|
|
||||||
|
|
||||||
arc_summary: $(SCRIPT)
|
arc_summary: $(SCRIPT)
|
||||||
cp $< $@
|
cp $< $@
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -191,21 +191,13 @@ elif sys.platform.startswith('linux'):
|
|||||||
# there, so we fall back on modinfo
|
# there, so we fall back on modinfo
|
||||||
command = ["/sbin/modinfo", request, "-0"]
|
command = ["/sbin/modinfo", request, "-0"]
|
||||||
|
|
||||||
# The recommended way to do this is with subprocess.run(). However,
|
|
||||||
# some installed versions of Python are < 3.5, so we offer them
|
|
||||||
# the option of doing it the old way (for now)
|
|
||||||
info = ''
|
info = ''
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
if 'run' in dir(subprocess):
|
info = subprocess.run(command, stdout=subprocess.PIPE,
|
||||||
info = subprocess.run(command, stdout=subprocess.PIPE,
|
check=True, universal_newlines=True)
|
||||||
universal_newlines=True)
|
raw_output = info.stdout.split('\0')
|
||||||
raw_output = info.stdout.split('\0')
|
|
||||||
else:
|
|
||||||
info = subprocess.check_output(command,
|
|
||||||
universal_newlines=True)
|
|
||||||
raw_output = info.split('\0')
|
|
||||||
|
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
print("Error: Descriptions not available",
|
print("Error: Descriptions not available",
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
# @hdr is the array of fields that needs to be printed, so we
|
# @hdr is the array of fields that needs to be printed, so we
|
||||||
# just iterate over this array and print the values using our pretty printer.
|
# just iterate over this array and print the values using our pretty printer.
|
||||||
#
|
#
|
||||||
# This script must remain compatible with Python 2.6+ and Python 3.4+.
|
# This script must remain compatible with Python 3.6+.
|
||||||
#
|
#
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
# Copyright (C) 2013 Lawrence Livermore National Security, LLC.
|
# Copyright (C) 2013 Lawrence Livermore National Security, LLC.
|
||||||
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
|
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
|
||||||
#
|
#
|
||||||
# This script must remain compatible with Python 2.6+ and Python 3.4+.
|
# This script must remain compatible with and Python 3.6+.
|
||||||
#
|
#
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|||||||
+10
-1
@@ -3102,13 +3102,22 @@ dump_znode_sa_xattr(sa_handle_t *hdl)
|
|||||||
(void) printf("\tSA xattrs: %d bytes, %d entries\n\n",
|
(void) printf("\tSA xattrs: %d bytes, %d entries\n\n",
|
||||||
sa_xattr_size, sa_xattr_entries);
|
sa_xattr_size, sa_xattr_entries);
|
||||||
while ((elem = nvlist_next_nvpair(sa_xattr, elem)) != NULL) {
|
while ((elem = nvlist_next_nvpair(sa_xattr, elem)) != NULL) {
|
||||||
|
boolean_t can_print = !dump_opt['P'];
|
||||||
uchar_t *value;
|
uchar_t *value;
|
||||||
uint_t cnt, idx;
|
uint_t cnt, idx;
|
||||||
|
|
||||||
(void) printf("\t\t%s = ", nvpair_name(elem));
|
(void) printf("\t\t%s = ", nvpair_name(elem));
|
||||||
nvpair_value_byte_array(elem, &value, &cnt);
|
nvpair_value_byte_array(elem, &value, &cnt);
|
||||||
|
|
||||||
for (idx = 0; idx < cnt; ++idx) {
|
for (idx = 0; idx < cnt; ++idx) {
|
||||||
if (isprint(value[idx]))
|
if (!isprint(value[idx])) {
|
||||||
|
can_print = B_FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (idx = 0; idx < cnt; ++idx) {
|
||||||
|
if (can_print)
|
||||||
(void) putchar(value[idx]);
|
(void) putchar(value[idx]);
|
||||||
else
|
else
|
||||||
(void) printf("\\%3.3o", value[idx]);
|
(void) printf("\\%3.3o", value[idx]);
|
||||||
|
|||||||
+40
-16
@@ -80,6 +80,7 @@ zfs_agent_iter_vdev(zpool_handle_t *zhp, nvlist_t *nvl, void *arg)
|
|||||||
char *path = NULL;
|
char *path = NULL;
|
||||||
uint_t c, children;
|
uint_t c, children;
|
||||||
nvlist_t **child;
|
nvlist_t **child;
|
||||||
|
uint64_t vdev_guid;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First iterate over any children.
|
* First iterate over any children.
|
||||||
@@ -100,7 +101,7 @@ zfs_agent_iter_vdev(zpool_handle_t *zhp, nvlist_t *nvl, void *arg)
|
|||||||
&child, &children) == 0) {
|
&child, &children) == 0) {
|
||||||
for (c = 0; c < children; c++) {
|
for (c = 0; c < children; c++) {
|
||||||
if (zfs_agent_iter_vdev(zhp, child[c], gsp)) {
|
if (zfs_agent_iter_vdev(zhp, child[c], gsp)) {
|
||||||
gsp->gs_vdev_type = DEVICE_TYPE_L2ARC;
|
gsp->gs_vdev_type = DEVICE_TYPE_SPARE;
|
||||||
return (B_TRUE);
|
return (B_TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,7 +110,7 @@ zfs_agent_iter_vdev(zpool_handle_t *zhp, nvlist_t *nvl, void *arg)
|
|||||||
&child, &children) == 0) {
|
&child, &children) == 0) {
|
||||||
for (c = 0; c < children; c++) {
|
for (c = 0; c < children; c++) {
|
||||||
if (zfs_agent_iter_vdev(zhp, child[c], gsp)) {
|
if (zfs_agent_iter_vdev(zhp, child[c], gsp)) {
|
||||||
gsp->gs_vdev_type = DEVICE_TYPE_SPARE;
|
gsp->gs_vdev_type = DEVICE_TYPE_L2ARC;
|
||||||
return (B_TRUE);
|
return (B_TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,6 +127,21 @@ zfs_agent_iter_vdev(zpool_handle_t *zhp, nvlist_t *nvl, void *arg)
|
|||||||
&gsp->gs_vdev_expandtime);
|
&gsp->gs_vdev_expandtime);
|
||||||
return (B_TRUE);
|
return (B_TRUE);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Otherwise, on a vdev guid match, grab the devid and expansion
|
||||||
|
* time. The devid might be missing on removal since its not part
|
||||||
|
* of blkid cache and L2ARC VDEV does not contain pool guid in its
|
||||||
|
* blkid, so this is a special case for L2ARC VDEV.
|
||||||
|
*/
|
||||||
|
else if (gsp->gs_vdev_guid != 0 && gsp->gs_devid == NULL &&
|
||||||
|
nvlist_lookup_uint64(nvl, ZPOOL_CONFIG_GUID, &vdev_guid) == 0 &&
|
||||||
|
gsp->gs_vdev_guid == vdev_guid) {
|
||||||
|
(void) nvlist_lookup_string(nvl, ZPOOL_CONFIG_DEVID,
|
||||||
|
&gsp->gs_devid);
|
||||||
|
(void) nvlist_lookup_uint64(nvl, ZPOOL_CONFIG_EXPANSION_TIME,
|
||||||
|
&gsp->gs_vdev_expandtime);
|
||||||
|
return (B_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
return (B_FALSE);
|
return (B_FALSE);
|
||||||
}
|
}
|
||||||
@@ -148,13 +164,13 @@ zfs_agent_iter_pool(zpool_handle_t *zhp, void *arg)
|
|||||||
/*
|
/*
|
||||||
* if a match was found then grab the pool guid
|
* if a match was found then grab the pool guid
|
||||||
*/
|
*/
|
||||||
if (gsp->gs_vdev_guid) {
|
if (gsp->gs_vdev_guid && gsp->gs_devid) {
|
||||||
(void) nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
|
(void) nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
|
||||||
&gsp->gs_pool_guid);
|
&gsp->gs_pool_guid);
|
||||||
}
|
}
|
||||||
|
|
||||||
zpool_close(zhp);
|
zpool_close(zhp);
|
||||||
return (gsp->gs_vdev_guid != 0);
|
return (gsp->gs_devid != NULL && gsp->gs_vdev_guid != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -195,11 +211,13 @@ zfs_agent_post_event(const char *class, const char *subclass, nvlist_t *nvl)
|
|||||||
uint64_t pool_guid = 0, vdev_guid = 0;
|
uint64_t pool_guid = 0, vdev_guid = 0;
|
||||||
guid_search_t search = { 0 };
|
guid_search_t search = { 0 };
|
||||||
device_type_t devtype = DEVICE_TYPE_PRIMARY;
|
device_type_t devtype = DEVICE_TYPE_PRIMARY;
|
||||||
|
char *devid = NULL;
|
||||||
|
|
||||||
class = "resource.fs.zfs.removed";
|
class = "resource.fs.zfs.removed";
|
||||||
subclass = "";
|
subclass = "";
|
||||||
|
|
||||||
(void) nvlist_add_string(payload, FM_CLASS, class);
|
(void) nvlist_add_string(payload, FM_CLASS, class);
|
||||||
|
(void) nvlist_lookup_string(nvl, DEV_IDENTIFIER, &devid);
|
||||||
(void) nvlist_lookup_uint64(nvl, ZFS_EV_POOL_GUID, &pool_guid);
|
(void) nvlist_lookup_uint64(nvl, ZFS_EV_POOL_GUID, &pool_guid);
|
||||||
(void) nvlist_lookup_uint64(nvl, ZFS_EV_VDEV_GUID, &vdev_guid);
|
(void) nvlist_lookup_uint64(nvl, ZFS_EV_VDEV_GUID, &vdev_guid);
|
||||||
|
|
||||||
@@ -209,20 +227,24 @@ zfs_agent_post_event(const char *class, const char *subclass, nvlist_t *nvl)
|
|||||||
(void) nvlist_add_int64_array(payload, FM_EREPORT_TIME, tod, 2);
|
(void) nvlist_add_int64_array(payload, FM_EREPORT_TIME, tod, 2);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
* If devid is missing but vdev_guid is available, find devid
|
||||||
|
* and pool_guid from vdev_guid.
|
||||||
* For multipath, spare and l2arc devices ZFS_EV_VDEV_GUID or
|
* For multipath, spare and l2arc devices ZFS_EV_VDEV_GUID or
|
||||||
* ZFS_EV_POOL_GUID may be missing so find them.
|
* ZFS_EV_POOL_GUID may be missing so find them.
|
||||||
*/
|
*/
|
||||||
if (pool_guid == 0 || vdev_guid == 0) {
|
if (devid == NULL || pool_guid == 0 || vdev_guid == 0) {
|
||||||
if ((nvlist_lookup_string(nvl, DEV_IDENTIFIER,
|
if (devid == NULL)
|
||||||
&search.gs_devid) == 0) &&
|
search.gs_vdev_guid = vdev_guid;
|
||||||
(zpool_iter(g_zfs_hdl, zfs_agent_iter_pool, &search)
|
else
|
||||||
== 1)) {
|
search.gs_devid = devid;
|
||||||
if (pool_guid == 0)
|
zpool_iter(g_zfs_hdl, zfs_agent_iter_pool, &search);
|
||||||
pool_guid = search.gs_pool_guid;
|
if (devid == NULL)
|
||||||
if (vdev_guid == 0)
|
devid = search.gs_devid;
|
||||||
vdev_guid = search.gs_vdev_guid;
|
if (pool_guid == 0)
|
||||||
devtype = search.gs_vdev_type;
|
pool_guid = search.gs_pool_guid;
|
||||||
}
|
if (vdev_guid == 0)
|
||||||
|
vdev_guid = search.gs_vdev_guid;
|
||||||
|
devtype = search.gs_vdev_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -235,7 +257,9 @@ zfs_agent_post_event(const char *class, const char *subclass, nvlist_t *nvl)
|
|||||||
search.gs_vdev_expandtime + 10 > tv.tv_sec) {
|
search.gs_vdev_expandtime + 10 > tv.tv_sec) {
|
||||||
zed_log_msg(LOG_INFO, "agent post event: ignoring '%s' "
|
zed_log_msg(LOG_INFO, "agent post event: ignoring '%s' "
|
||||||
"for recently expanded device '%s'", EC_DEV_REMOVE,
|
"for recently expanded device '%s'", EC_DEV_REMOVE,
|
||||||
search.gs_devid);
|
devid);
|
||||||
|
fnvlist_free(payload);
|
||||||
|
free(event);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -185,10 +185,12 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
|||||||
uint64_t wholedisk = 0ULL;
|
uint64_t wholedisk = 0ULL;
|
||||||
uint64_t offline = 0ULL, faulted = 0ULL;
|
uint64_t offline = 0ULL, faulted = 0ULL;
|
||||||
uint64_t guid = 0ULL;
|
uint64_t guid = 0ULL;
|
||||||
|
uint64_t is_spare = 0;
|
||||||
char *physpath = NULL, *new_devid = NULL, *enc_sysfs_path = NULL;
|
char *physpath = NULL, *new_devid = NULL, *enc_sysfs_path = NULL;
|
||||||
char rawpath[PATH_MAX], fullpath[PATH_MAX];
|
char rawpath[PATH_MAX], fullpath[PATH_MAX];
|
||||||
char devpath[PATH_MAX];
|
char devpath[PATH_MAX];
|
||||||
int ret;
|
int ret;
|
||||||
|
int online_flag = ZFS_ONLINE_CHECKREMOVE | ZFS_ONLINE_UNSPARE;
|
||||||
boolean_t is_sd = B_FALSE;
|
boolean_t is_sd = B_FALSE;
|
||||||
boolean_t is_mpath_wholedisk = B_FALSE;
|
boolean_t is_mpath_wholedisk = B_FALSE;
|
||||||
uint_t c;
|
uint_t c;
|
||||||
@@ -214,6 +216,7 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
|||||||
(void) nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_FAULTED, &faulted);
|
(void) nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_FAULTED, &faulted);
|
||||||
|
|
||||||
(void) nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_GUID, &guid);
|
(void) nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_GUID, &guid);
|
||||||
|
(void) nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_IS_SPARE, &is_spare);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Special case:
|
* Special case:
|
||||||
@@ -304,11 +307,13 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_spare)
|
||||||
|
online_flag |= ZFS_ONLINE_SPARE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attempt to online the device.
|
* Attempt to online the device.
|
||||||
*/
|
*/
|
||||||
if (zpool_vdev_online(zhp, fullpath,
|
if (zpool_vdev_online(zhp, fullpath, online_flag, &newstate) == 0 &&
|
||||||
ZFS_ONLINE_CHECKREMOVE | ZFS_ONLINE_UNSPARE, &newstate) == 0 &&
|
|
||||||
(newstate == VDEV_STATE_HEALTHY ||
|
(newstate == VDEV_STATE_HEALTHY ||
|
||||||
newstate == VDEV_STATE_DEGRADED)) {
|
newstate == VDEV_STATE_DEGRADED)) {
|
||||||
zed_log_msg(LOG_INFO,
|
zed_log_msg(LOG_INFO,
|
||||||
@@ -527,6 +532,7 @@ typedef struct dev_data {
|
|||||||
uint64_t dd_vdev_guid;
|
uint64_t dd_vdev_guid;
|
||||||
uint64_t dd_new_vdev_guid;
|
uint64_t dd_new_vdev_guid;
|
||||||
const char *dd_new_devid;
|
const char *dd_new_devid;
|
||||||
|
uint64_t dd_num_spares;
|
||||||
} dev_data_t;
|
} dev_data_t;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -537,6 +543,7 @@ zfs_iter_vdev(zpool_handle_t *zhp, nvlist_t *nvl, void *data)
|
|||||||
uint_t c, children;
|
uint_t c, children;
|
||||||
nvlist_t **child;
|
nvlist_t **child;
|
||||||
uint64_t guid = 0;
|
uint64_t guid = 0;
|
||||||
|
uint64_t isspare = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First iterate over any children.
|
* First iterate over any children.
|
||||||
@@ -562,7 +569,7 @@ zfs_iter_vdev(zpool_handle_t *zhp, nvlist_t *nvl, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* once a vdev was matched and processed there is nothing left to do */
|
/* once a vdev was matched and processed there is nothing left to do */
|
||||||
if (dp->dd_found)
|
if (dp->dd_found && dp->dd_num_spares == 0)
|
||||||
return;
|
return;
|
||||||
(void) nvlist_lookup_uint64(nvl, ZPOOL_CONFIG_GUID, &guid);
|
(void) nvlist_lookup_uint64(nvl, ZPOOL_CONFIG_GUID, &guid);
|
||||||
|
|
||||||
@@ -612,6 +619,10 @@ zfs_iter_vdev(zpool_handle_t *zhp, nvlist_t *nvl, void *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dp->dd_found == B_TRUE && nvlist_lookup_uint64(nvl,
|
||||||
|
ZPOOL_CONFIG_IS_SPARE, &isspare) == 0 && isspare)
|
||||||
|
dp->dd_num_spares++;
|
||||||
|
|
||||||
(dp->dd_func)(zhp, nvl, dp->dd_islabeled);
|
(dp->dd_func)(zhp, nvl, dp->dd_islabeled);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -672,7 +683,9 @@ zfs_iter_pool(zpool_handle_t *zhp, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
zpool_close(zhp);
|
zpool_close(zhp);
|
||||||
return (dp->dd_found); /* cease iteration after a match */
|
|
||||||
|
/* cease iteration after a match */
|
||||||
|
return (dp->dd_found && dp->dd_num_spares == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
+107
-10
@@ -75,6 +75,8 @@ typedef struct find_cbdata {
|
|||||||
uint64_t cb_guid;
|
uint64_t cb_guid;
|
||||||
zpool_handle_t *cb_zhp;
|
zpool_handle_t *cb_zhp;
|
||||||
nvlist_t *cb_vdev;
|
nvlist_t *cb_vdev;
|
||||||
|
uint64_t cb_vdev_guid;
|
||||||
|
uint64_t cb_num_spares;
|
||||||
} find_cbdata_t;
|
} find_cbdata_t;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -140,6 +142,64 @@ find_vdev(libzfs_handle_t *zhdl, nvlist_t *nv, uint64_t search_guid)
|
|||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remove_spares(zpool_handle_t *zhp, void *data)
|
||||||
|
{
|
||||||
|
nvlist_t *config, *nvroot;
|
||||||
|
nvlist_t **spares;
|
||||||
|
uint_t nspares;
|
||||||
|
char *devname;
|
||||||
|
find_cbdata_t *cbp = data;
|
||||||
|
uint64_t spareguid = 0;
|
||||||
|
vdev_stat_t *vs;
|
||||||
|
unsigned int c;
|
||||||
|
|
||||||
|
config = zpool_get_config(zhp, NULL);
|
||||||
|
if (nvlist_lookup_nvlist(config,
|
||||||
|
ZPOOL_CONFIG_VDEV_TREE, &nvroot) != 0) {
|
||||||
|
zpool_close(zhp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
|
||||||
|
&spares, &nspares) != 0) {
|
||||||
|
zpool_close(zhp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < nspares; i++) {
|
||||||
|
if (nvlist_lookup_uint64(spares[i], ZPOOL_CONFIG_GUID,
|
||||||
|
&spareguid) == 0 && spareguid == cbp->cb_vdev_guid) {
|
||||||
|
devname = zpool_vdev_name(NULL, zhp, spares[i],
|
||||||
|
B_FALSE);
|
||||||
|
nvlist_lookup_uint64_array(spares[i],
|
||||||
|
ZPOOL_CONFIG_VDEV_STATS, (uint64_t **)&vs, &c);
|
||||||
|
if (vs->vs_state != VDEV_STATE_REMOVED &&
|
||||||
|
zpool_vdev_remove_wanted(zhp, devname) == 0)
|
||||||
|
cbp->cb_num_spares++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
zpool_close(zhp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Given a vdev guid, find and remove all spares associated with it.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
find_and_remove_spares(libzfs_handle_t *zhdl, uint64_t vdev_guid)
|
||||||
|
{
|
||||||
|
find_cbdata_t cb;
|
||||||
|
|
||||||
|
cb.cb_num_spares = 0;
|
||||||
|
cb.cb_vdev_guid = vdev_guid;
|
||||||
|
zpool_iter(zhdl, remove_spares, &cb);
|
||||||
|
|
||||||
|
return (cb.cb_num_spares);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Given a (pool, vdev) GUID pair, find the matching pool and vdev.
|
* Given a (pool, vdev) GUID pair, find the matching pool and vdev.
|
||||||
*/
|
*/
|
||||||
@@ -315,6 +375,8 @@ zfs_retire_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl,
|
|||||||
libzfs_handle_t *zhdl = zdp->zrd_hdl;
|
libzfs_handle_t *zhdl = zdp->zrd_hdl;
|
||||||
boolean_t fault_device, degrade_device;
|
boolean_t fault_device, degrade_device;
|
||||||
boolean_t is_repair;
|
boolean_t is_repair;
|
||||||
|
boolean_t l2arc = B_FALSE;
|
||||||
|
boolean_t spare = B_FALSE;
|
||||||
char *scheme;
|
char *scheme;
|
||||||
nvlist_t *vdev = NULL;
|
nvlist_t *vdev = NULL;
|
||||||
char *uuid;
|
char *uuid;
|
||||||
@@ -323,6 +385,8 @@ zfs_retire_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl,
|
|||||||
boolean_t is_disk;
|
boolean_t is_disk;
|
||||||
vdev_aux_t aux;
|
vdev_aux_t aux;
|
||||||
uint64_t state = 0;
|
uint64_t state = 0;
|
||||||
|
vdev_stat_t *vs;
|
||||||
|
unsigned int c;
|
||||||
|
|
||||||
fmd_hdl_debug(hdl, "zfs_retire_recv: '%s'", class);
|
fmd_hdl_debug(hdl, "zfs_retire_recv: '%s'", class);
|
||||||
|
|
||||||
@@ -339,10 +403,26 @@ zfs_retire_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl,
|
|||||||
char *devtype;
|
char *devtype;
|
||||||
char *devname;
|
char *devname;
|
||||||
|
|
||||||
|
if (nvlist_lookup_string(nvl, FM_EREPORT_PAYLOAD_ZFS_VDEV_TYPE,
|
||||||
|
&devtype) == 0) {
|
||||||
|
if (strcmp(devtype, VDEV_TYPE_SPARE) == 0)
|
||||||
|
spare = B_TRUE;
|
||||||
|
else if (strcmp(devtype, VDEV_TYPE_L2CACHE) == 0)
|
||||||
|
l2arc = B_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nvlist_lookup_uint64(nvl,
|
||||||
|
FM_EREPORT_PAYLOAD_ZFS_VDEV_GUID, &vdev_guid) != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (spare) {
|
||||||
|
int nspares = find_and_remove_spares(zhdl, vdev_guid);
|
||||||
|
fmd_hdl_debug(hdl, "%d spares removed", nspares);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (nvlist_lookup_uint64(nvl, FM_EREPORT_PAYLOAD_ZFS_POOL_GUID,
|
if (nvlist_lookup_uint64(nvl, FM_EREPORT_PAYLOAD_ZFS_POOL_GUID,
|
||||||
&pool_guid) != 0 ||
|
&pool_guid) != 0)
|
||||||
nvlist_lookup_uint64(nvl, FM_EREPORT_PAYLOAD_ZFS_VDEV_GUID,
|
|
||||||
&vdev_guid) != 0)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((zhp = find_by_guid(zhdl, pool_guid, vdev_guid,
|
if ((zhp = find_by_guid(zhdl, pool_guid, vdev_guid,
|
||||||
@@ -351,13 +431,30 @@ zfs_retire_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl,
|
|||||||
|
|
||||||
devname = zpool_vdev_name(NULL, zhp, vdev, B_FALSE);
|
devname = zpool_vdev_name(NULL, zhp, vdev, B_FALSE);
|
||||||
|
|
||||||
/* Can't replace l2arc with a spare: offline the device */
|
nvlist_lookup_uint64_array(vdev, ZPOOL_CONFIG_VDEV_STATS,
|
||||||
if (nvlist_lookup_string(nvl, FM_EREPORT_PAYLOAD_ZFS_VDEV_TYPE,
|
(uint64_t **)&vs, &c);
|
||||||
&devtype) == 0 && strcmp(devtype, VDEV_TYPE_L2CACHE) == 0) {
|
|
||||||
fmd_hdl_debug(hdl, "zpool_vdev_offline '%s'", devname);
|
/*
|
||||||
zpool_vdev_offline(zhp, devname, B_TRUE);
|
* If state removed is requested for already removed vdev,
|
||||||
} else if (!fmd_prop_get_int32(hdl, "spare_on_remove") ||
|
* its a loopback event from spa_async_remove(). Just
|
||||||
replace_with_spare(hdl, zhp, vdev) == B_FALSE) {
|
* ignore it.
|
||||||
|
*/
|
||||||
|
if (vs->vs_state == VDEV_STATE_REMOVED &&
|
||||||
|
state == VDEV_STATE_REMOVED)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Remove the vdev since device is unplugged */
|
||||||
|
int remove_status = 0;
|
||||||
|
if (l2arc || (strcmp(class, "resource.fs.zfs.removed") == 0)) {
|
||||||
|
remove_status = zpool_vdev_remove_wanted(zhp, devname);
|
||||||
|
fmd_hdl_debug(hdl, "zpool_vdev_remove_wanted '%s'"
|
||||||
|
", err:%d", devname, libzfs_errno(zhdl));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Replace the vdev with a spare if its not a l2arc */
|
||||||
|
if (!l2arc && !remove_status &&
|
||||||
|
(!fmd_prop_get_int32(hdl, "spare_on_remove") ||
|
||||||
|
replace_with_spare(hdl, zhp, vdev) == B_FALSE)) {
|
||||||
/* Could not handle with spare */
|
/* Could not handle with spare */
|
||||||
fmd_hdl_debug(hdl, "no spare for '%s'", devname);
|
fmd_hdl_debug(hdl, "no spare for '%s'", devname);
|
||||||
}
|
}
|
||||||
|
|||||||
+56
-7
@@ -315,14 +315,14 @@ get_usage(zfs_help_t idx)
|
|||||||
case HELP_ROLLBACK:
|
case HELP_ROLLBACK:
|
||||||
return (gettext("\trollback [-rRf] <snapshot>\n"));
|
return (gettext("\trollback [-rRf] <snapshot>\n"));
|
||||||
case HELP_SEND:
|
case HELP_SEND:
|
||||||
return (gettext("\tsend [-DnPpRvLecwhb] [-[i|I] snapshot] "
|
return (gettext("\tsend [-DnPpRVvLecwhb] [-[i|I] snapshot] "
|
||||||
"<snapshot>\n"
|
"<snapshot>\n"
|
||||||
"\tsend [-DnvPLecw] [-i snapshot|bookmark] "
|
"\tsend [-DnVvPLecw] [-i snapshot|bookmark] "
|
||||||
"<filesystem|volume|snapshot>\n"
|
"<filesystem|volume|snapshot>\n"
|
||||||
"\tsend [-DnPpvLec] [-i bookmark|snapshot] "
|
"\tsend [-DnPpVvLec] [-i bookmark|snapshot] "
|
||||||
"--redact <bookmark> <snapshot>\n"
|
"--redact <bookmark> <snapshot>\n"
|
||||||
"\tsend [-nvPe] -t <receive_resume_token>\n"
|
"\tsend [-nVvPe] -t <receive_resume_token>\n"
|
||||||
"\tsend [-Pnv] --saved filesystem\n"));
|
"\tsend [-PnVv] --saved filesystem\n"));
|
||||||
case HELP_SET:
|
case HELP_SET:
|
||||||
return (gettext("\tset <property=value> ... "
|
return (gettext("\tset <property=value> ... "
|
||||||
"<filesystem|volume|snapshot> ...\n"));
|
"<filesystem|volume|snapshot> ...\n"));
|
||||||
@@ -3474,6 +3474,8 @@ print_header(list_cbdata_t *cb)
|
|||||||
boolean_t first = B_TRUE;
|
boolean_t first = B_TRUE;
|
||||||
boolean_t right_justify;
|
boolean_t right_justify;
|
||||||
|
|
||||||
|
color_start(ANSI_BOLD);
|
||||||
|
|
||||||
for (; pl != NULL; pl = pl->pl_next) {
|
for (; pl != NULL; pl = pl->pl_next) {
|
||||||
if (!first) {
|
if (!first) {
|
||||||
(void) printf(" ");
|
(void) printf(" ");
|
||||||
@@ -3500,9 +3502,31 @@ print_header(list_cbdata_t *cb)
|
|||||||
(void) printf("%-*s", (int)pl->pl_width, header);
|
(void) printf("%-*s", (int)pl->pl_width, header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
color_end();
|
||||||
|
|
||||||
(void) printf("\n");
|
(void) printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Decides on the color that the avail value should be printed in.
|
||||||
|
* > 80% used = yellow
|
||||||
|
* > 90% used = red
|
||||||
|
*/
|
||||||
|
static const char *
|
||||||
|
zfs_list_avail_color(zfs_handle_t *zhp)
|
||||||
|
{
|
||||||
|
uint64_t used = zfs_prop_get_int(zhp, ZFS_PROP_USED);
|
||||||
|
uint64_t avail = zfs_prop_get_int(zhp, ZFS_PROP_AVAILABLE);
|
||||||
|
int percentage = (int)((double)avail / MAX(avail + used, 1) * 100);
|
||||||
|
|
||||||
|
if (percentage > 20)
|
||||||
|
return (NULL);
|
||||||
|
else if (percentage > 10)
|
||||||
|
return (ANSI_YELLOW);
|
||||||
|
else
|
||||||
|
return (ANSI_RED);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Given a dataset and a list of fields, print out all the properties according
|
* Given a dataset and a list of fields, print out all the properties according
|
||||||
* to the described layout.
|
* to the described layout.
|
||||||
@@ -3565,6 +3589,22 @@ print_dataset(zfs_handle_t *zhp, list_cbdata_t *cb)
|
|||||||
right_justify = B_FALSE;
|
right_justify = B_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* zfs_list_avail_color() needs ZFS_PROP_AVAILABLE + USED
|
||||||
|
* - so we need another for() search for the USED part
|
||||||
|
* - when no colors wanted, we can skip the whole thing
|
||||||
|
*/
|
||||||
|
if (use_color() && pl->pl_prop == ZFS_PROP_AVAILABLE) {
|
||||||
|
zprop_list_t *pl2 = cb->cb_proplist;
|
||||||
|
for (; pl2 != NULL; pl2 = pl2->pl_next) {
|
||||||
|
if (pl2->pl_prop == ZFS_PROP_USED) {
|
||||||
|
color_start(zfs_list_avail_color(zhp));
|
||||||
|
/* found it, no need for more loops */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If this is being called in scripted mode, or if this is the
|
* If this is being called in scripted mode, or if this is the
|
||||||
* last column and it is left-justified, don't include a width
|
* last column and it is left-justified, don't include a width
|
||||||
@@ -3576,6 +3616,9 @@ print_dataset(zfs_handle_t *zhp, list_cbdata_t *cb)
|
|||||||
(void) printf("%*s", (int)pl->pl_width, propstr);
|
(void) printf("%*s", (int)pl->pl_width, propstr);
|
||||||
else
|
else
|
||||||
(void) printf("%-*s", (int)pl->pl_width, propstr);
|
(void) printf("%-*s", (int)pl->pl_width, propstr);
|
||||||
|
|
||||||
|
if (pl->pl_prop == ZFS_PROP_AVAILABLE)
|
||||||
|
color_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) printf("\n");
|
(void) printf("\n");
|
||||||
@@ -4407,6 +4450,7 @@ zfs_do_send(int argc, char **argv)
|
|||||||
{"props", no_argument, NULL, 'p'},
|
{"props", no_argument, NULL, 'p'},
|
||||||
{"parsable", no_argument, NULL, 'P'},
|
{"parsable", no_argument, NULL, 'P'},
|
||||||
{"dedup", no_argument, NULL, 'D'},
|
{"dedup", no_argument, NULL, 'D'},
|
||||||
|
{"proctitle", no_argument, NULL, 'V'},
|
||||||
{"verbose", no_argument, NULL, 'v'},
|
{"verbose", no_argument, NULL, 'v'},
|
||||||
{"dryrun", no_argument, NULL, 'n'},
|
{"dryrun", no_argument, NULL, 'n'},
|
||||||
{"large-block", no_argument, NULL, 'L'},
|
{"large-block", no_argument, NULL, 'L'},
|
||||||
@@ -4421,7 +4465,7 @@ zfs_do_send(int argc, char **argv)
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* check options */
|
/* check options */
|
||||||
while ((c = getopt_long(argc, argv, ":i:I:RsDpvnPLeht:cwbd:S",
|
while ((c = getopt_long(argc, argv, ":i:I:RsDpVvnPLeht:cwbd:S",
|
||||||
long_options, NULL)) != -1) {
|
long_options, NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'i':
|
case 'i':
|
||||||
@@ -4456,6 +4500,9 @@ zfs_do_send(int argc, char **argv)
|
|||||||
case 'P':
|
case 'P':
|
||||||
flags.parsable = B_TRUE;
|
flags.parsable = B_TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'V':
|
||||||
|
flags.progressastitle = B_TRUE;
|
||||||
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
flags.verbosity++;
|
flags.verbosity++;
|
||||||
flags.progress = B_TRUE;
|
flags.progress = B_TRUE;
|
||||||
@@ -4531,7 +4578,7 @@ zfs_do_send(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags.parsable && flags.verbosity == 0)
|
if ((flags.parsable || flags.progressastitle) && flags.verbosity == 0)
|
||||||
flags.verbosity = 1;
|
flags.verbosity = 1;
|
||||||
|
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
@@ -8693,6 +8740,8 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
libzfs_print_on_error(g_zfs, B_TRUE);
|
libzfs_print_on_error(g_zfs, B_TRUE);
|
||||||
|
|
||||||
|
zfs_setproctitle_init(argc, argv, environ);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Many commands modify input strings for string parsing reasons.
|
* Many commands modify input strings for string parsing reasons.
|
||||||
* We create a copy to protect the original argv.
|
* We create a copy to protect the original argv.
|
||||||
|
|||||||
+97
-17
@@ -392,7 +392,7 @@ get_usage(zpool_help_t idx)
|
|||||||
case HELP_REOPEN:
|
case HELP_REOPEN:
|
||||||
return (gettext("\treopen [-n] <pool>\n"));
|
return (gettext("\treopen [-n] <pool>\n"));
|
||||||
case HELP_INITIALIZE:
|
case HELP_INITIALIZE:
|
||||||
return (gettext("\tinitialize [-c | -s] [-w] <pool> "
|
return (gettext("\tinitialize [-c | -s | -u] [-w] <pool> "
|
||||||
"[<device> ...]\n"));
|
"[<device> ...]\n"));
|
||||||
case HELP_SCRUB:
|
case HELP_SCRUB:
|
||||||
return (gettext("\tscrub [-s | -p] [-w] <pool> ...\n"));
|
return (gettext("\tscrub [-s | -p] [-w] <pool> ...\n"));
|
||||||
@@ -548,12 +548,13 @@ usage(boolean_t requested)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* zpool initialize [-c | -s] [-w] <pool> [<vdev> ...]
|
* zpool initialize [-c | -s | -u] [-w] <pool> [<vdev> ...]
|
||||||
* Initialize all unused blocks in the specified vdevs, or all vdevs in the pool
|
* Initialize all unused blocks in the specified vdevs, or all vdevs in the pool
|
||||||
* if none specified.
|
* if none specified.
|
||||||
*
|
*
|
||||||
* -c Cancel. Ends active initializing.
|
* -c Cancel. Ends active initializing.
|
||||||
* -s Suspend. Initializing can then be restarted with no flags.
|
* -s Suspend. Initializing can then be restarted with no flags.
|
||||||
|
* -u Uninitialize. Clears initialization state.
|
||||||
* -w Wait. Blocks until initializing has completed.
|
* -w Wait. Blocks until initializing has completed.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
@@ -569,12 +570,14 @@ zpool_do_initialize(int argc, char **argv)
|
|||||||
struct option long_options[] = {
|
struct option long_options[] = {
|
||||||
{"cancel", no_argument, NULL, 'c'},
|
{"cancel", no_argument, NULL, 'c'},
|
||||||
{"suspend", no_argument, NULL, 's'},
|
{"suspend", no_argument, NULL, 's'},
|
||||||
|
{"uninit", no_argument, NULL, 'u'},
|
||||||
{"wait", no_argument, NULL, 'w'},
|
{"wait", no_argument, NULL, 'w'},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
pool_initialize_func_t cmd_type = POOL_INITIALIZE_START;
|
pool_initialize_func_t cmd_type = POOL_INITIALIZE_START;
|
||||||
while ((c = getopt_long(argc, argv, "csw", long_options, NULL)) != -1) {
|
while ((c = getopt_long(argc, argv, "csuw", long_options,
|
||||||
|
NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'c':
|
case 'c':
|
||||||
if (cmd_type != POOL_INITIALIZE_START &&
|
if (cmd_type != POOL_INITIALIZE_START &&
|
||||||
@@ -594,6 +597,15 @@ zpool_do_initialize(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
cmd_type = POOL_INITIALIZE_SUSPEND;
|
cmd_type = POOL_INITIALIZE_SUSPEND;
|
||||||
break;
|
break;
|
||||||
|
case 'u':
|
||||||
|
if (cmd_type != POOL_INITIALIZE_START &&
|
||||||
|
cmd_type != POOL_INITIALIZE_UNINIT) {
|
||||||
|
(void) fprintf(stderr, gettext("-u cannot be "
|
||||||
|
"combined with other options\n"));
|
||||||
|
usage(B_FALSE);
|
||||||
|
}
|
||||||
|
cmd_type = POOL_INITIALIZE_UNINIT;
|
||||||
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
wait = B_TRUE;
|
wait = B_TRUE;
|
||||||
break;
|
break;
|
||||||
@@ -620,8 +632,8 @@ zpool_do_initialize(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (wait && (cmd_type != POOL_INITIALIZE_START)) {
|
if (wait && (cmd_type != POOL_INITIALIZE_START)) {
|
||||||
(void) fprintf(stderr, gettext("-w cannot be used with -c or "
|
(void) fprintf(stderr, gettext("-w cannot be used with -c, -s"
|
||||||
"-s\n"));
|
"or -u\n"));
|
||||||
usage(B_FALSE);
|
usage(B_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4205,6 +4217,8 @@ print_iostat_header_impl(iostat_cbdata_t *cb, unsigned int force_column_width,
|
|||||||
unsigned int namewidth;
|
unsigned int namewidth;
|
||||||
const char *title;
|
const char *title;
|
||||||
|
|
||||||
|
color_start(ANSI_BOLD);
|
||||||
|
|
||||||
if (cb->cb_flags & IOS_ANYHISTO_M) {
|
if (cb->cb_flags & IOS_ANYHISTO_M) {
|
||||||
title = histo_to_title[IOS_HISTO_IDX(cb->cb_flags)];
|
title = histo_to_title[IOS_HISTO_IDX(cb->cb_flags)];
|
||||||
} else if (cb->cb_vdev_names_count) {
|
} else if (cb->cb_vdev_names_count) {
|
||||||
@@ -4238,6 +4252,8 @@ print_iostat_header_impl(iostat_cbdata_t *cb, unsigned int force_column_width,
|
|||||||
if (cb->vcdl != NULL)
|
if (cb->vcdl != NULL)
|
||||||
print_cmd_columns(cb->vcdl, 1);
|
print_cmd_columns(cb->vcdl, 1);
|
||||||
|
|
||||||
|
color_end();
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4247,6 +4263,37 @@ print_iostat_header(iostat_cbdata_t *cb)
|
|||||||
print_iostat_header_impl(cb, 0, NULL);
|
print_iostat_header_impl(cb, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prints a size string (i.e. 120M) with the suffix ("M") colored
|
||||||
|
* by order of magnitude. Uses column_size to add padding.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_stat_color(const char *statbuf, unsigned int column_size)
|
||||||
|
{
|
||||||
|
fputs(" ", stdout);
|
||||||
|
size_t len = strlen(statbuf);
|
||||||
|
while (len < column_size) {
|
||||||
|
fputc(' ', stdout);
|
||||||
|
column_size--;
|
||||||
|
}
|
||||||
|
if (*statbuf == '0') {
|
||||||
|
color_start(ANSI_GRAY);
|
||||||
|
fputc('0', stdout);
|
||||||
|
} else {
|
||||||
|
for (; *statbuf; statbuf++) {
|
||||||
|
if (*statbuf == 'K') color_start(ANSI_GREEN);
|
||||||
|
else if (*statbuf == 'M') color_start(ANSI_YELLOW);
|
||||||
|
else if (*statbuf == 'G') color_start(ANSI_RED);
|
||||||
|
else if (*statbuf == 'T') color_start(ANSI_BOLD_BLUE);
|
||||||
|
else if (*statbuf == 'P') color_start(ANSI_MAGENTA);
|
||||||
|
else if (*statbuf == 'E') color_start(ANSI_CYAN);
|
||||||
|
fputc(*statbuf, stdout);
|
||||||
|
if (--column_size <= 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
color_end();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Display a single statistic.
|
* Display a single statistic.
|
||||||
@@ -4262,7 +4309,7 @@ print_one_stat(uint64_t value, enum zfs_nicenum_format format,
|
|||||||
if (scripted)
|
if (scripted)
|
||||||
printf("\t%s", buf);
|
printf("\t%s", buf);
|
||||||
else
|
else
|
||||||
printf(" %*s", column_size, buf);
|
print_stat_color(buf, column_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -6886,6 +6933,17 @@ zpool_do_online(int argc, char **argv)
|
|||||||
return (1);
|
return (1);
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
|
vdev_state_t oldstate;
|
||||||
|
boolean_t avail_spare, l2cache;
|
||||||
|
nvlist_t *tgt = zpool_find_vdev(zhp, argv[i], &avail_spare,
|
||||||
|
&l2cache, NULL);
|
||||||
|
if (tgt == NULL) {
|
||||||
|
ret = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
uint_t vsc;
|
||||||
|
oldstate = ((vdev_stat_t *)fnvlist_lookup_uint64_array(tgt,
|
||||||
|
ZPOOL_CONFIG_VDEV_STATS, &vsc))->vs_state;
|
||||||
if (zpool_vdev_online(zhp, argv[i], flags, &newstate) == 0) {
|
if (zpool_vdev_online(zhp, argv[i], flags, &newstate) == 0) {
|
||||||
if (newstate != VDEV_STATE_HEALTHY) {
|
if (newstate != VDEV_STATE_HEALTHY) {
|
||||||
(void) printf(gettext("warning: device '%s' "
|
(void) printf(gettext("warning: device '%s' "
|
||||||
@@ -6899,6 +6957,17 @@ zpool_do_online(int argc, char **argv)
|
|||||||
(void) printf(gettext("use 'zpool "
|
(void) printf(gettext("use 'zpool "
|
||||||
"replace' to replace devices "
|
"replace' to replace devices "
|
||||||
"that are no longer present\n"));
|
"that are no longer present\n"));
|
||||||
|
if ((flags & ZFS_ONLINE_EXPAND)) {
|
||||||
|
(void) printf(gettext("%s: failed "
|
||||||
|
"to expand usable space on "
|
||||||
|
"unhealthy device '%s'\n"),
|
||||||
|
(oldstate >= VDEV_STATE_DEGRADED ?
|
||||||
|
"error" : "warning"), argv[i]);
|
||||||
|
if (oldstate >= VDEV_STATE_DEGRADED) {
|
||||||
|
ret = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = 1;
|
ret = 1;
|
||||||
@@ -7514,19 +7583,20 @@ print_scan_scrub_resilver_status(pool_scan_stat_t *ps)
|
|||||||
|
|
||||||
zfs_nicebytes(ps->pss_processed, processed_buf, sizeof (processed_buf));
|
zfs_nicebytes(ps->pss_processed, processed_buf, sizeof (processed_buf));
|
||||||
|
|
||||||
assert(ps->pss_func == POOL_SCAN_SCRUB ||
|
int is_resilver = ps->pss_func == POOL_SCAN_RESILVER;
|
||||||
ps->pss_func == POOL_SCAN_RESILVER);
|
int is_scrub = ps->pss_func == POOL_SCAN_SCRUB;
|
||||||
|
assert(is_resilver || is_scrub);
|
||||||
|
|
||||||
/* Scan is finished or canceled. */
|
/* Scan is finished or canceled. */
|
||||||
if (ps->pss_state == DSS_FINISHED) {
|
if (ps->pss_state == DSS_FINISHED) {
|
||||||
secs_to_dhms(end - start, time_buf);
|
secs_to_dhms(end - start, time_buf);
|
||||||
|
|
||||||
if (ps->pss_func == POOL_SCAN_SCRUB) {
|
if (is_scrub) {
|
||||||
(void) printf(gettext("scrub repaired %s "
|
(void) printf(gettext("scrub repaired %s "
|
||||||
"in %s with %llu errors on %s"), processed_buf,
|
"in %s with %llu errors on %s"), processed_buf,
|
||||||
time_buf, (u_longlong_t)ps->pss_errors,
|
time_buf, (u_longlong_t)ps->pss_errors,
|
||||||
ctime(&end));
|
ctime(&end));
|
||||||
} else if (ps->pss_func == POOL_SCAN_RESILVER) {
|
} else if (is_resilver) {
|
||||||
(void) printf(gettext("resilvered %s "
|
(void) printf(gettext("resilvered %s "
|
||||||
"in %s with %llu errors on %s"), processed_buf,
|
"in %s with %llu errors on %s"), processed_buf,
|
||||||
time_buf, (u_longlong_t)ps->pss_errors,
|
time_buf, (u_longlong_t)ps->pss_errors,
|
||||||
@@ -7534,10 +7604,10 @@ print_scan_scrub_resilver_status(pool_scan_stat_t *ps)
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else if (ps->pss_state == DSS_CANCELED) {
|
} else if (ps->pss_state == DSS_CANCELED) {
|
||||||
if (ps->pss_func == POOL_SCAN_SCRUB) {
|
if (is_scrub) {
|
||||||
(void) printf(gettext("scrub canceled on %s"),
|
(void) printf(gettext("scrub canceled on %s"),
|
||||||
ctime(&end));
|
ctime(&end));
|
||||||
} else if (ps->pss_func == POOL_SCAN_RESILVER) {
|
} else if (is_resilver) {
|
||||||
(void) printf(gettext("resilver canceled on %s"),
|
(void) printf(gettext("resilver canceled on %s"),
|
||||||
ctime(&end));
|
ctime(&end));
|
||||||
}
|
}
|
||||||
@@ -7547,7 +7617,7 @@ print_scan_scrub_resilver_status(pool_scan_stat_t *ps)
|
|||||||
assert(ps->pss_state == DSS_SCANNING);
|
assert(ps->pss_state == DSS_SCANNING);
|
||||||
|
|
||||||
/* Scan is in progress. Resilvers can't be paused. */
|
/* Scan is in progress. Resilvers can't be paused. */
|
||||||
if (ps->pss_func == POOL_SCAN_SCRUB) {
|
if (is_scrub) {
|
||||||
if (pause == 0) {
|
if (pause == 0) {
|
||||||
(void) printf(gettext("scrub in progress since %s"),
|
(void) printf(gettext("scrub in progress since %s"),
|
||||||
ctime(&start));
|
ctime(&start));
|
||||||
@@ -7557,7 +7627,7 @@ print_scan_scrub_resilver_status(pool_scan_stat_t *ps)
|
|||||||
(void) printf(gettext("\tscrub started on %s"),
|
(void) printf(gettext("\tscrub started on %s"),
|
||||||
ctime(&start));
|
ctime(&start));
|
||||||
}
|
}
|
||||||
} else if (ps->pss_func == POOL_SCAN_RESILVER) {
|
} else if (is_resilver) {
|
||||||
(void) printf(gettext("resilver in progress since %s"),
|
(void) printf(gettext("resilver in progress since %s"),
|
||||||
ctime(&start));
|
ctime(&start));
|
||||||
}
|
}
|
||||||
@@ -7599,17 +7669,27 @@ print_scan_scrub_resilver_status(pool_scan_stat_t *ps)
|
|||||||
scanned_buf, issued_buf, total_buf);
|
scanned_buf, issued_buf, total_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ps->pss_func == POOL_SCAN_RESILVER) {
|
if (is_resilver) {
|
||||||
(void) printf(gettext("\t%s resilvered, %.2f%% done"),
|
(void) printf(gettext("\t%s resilvered, %.2f%% done"),
|
||||||
processed_buf, 100 * fraction_done);
|
processed_buf, 100 * fraction_done);
|
||||||
} else if (ps->pss_func == POOL_SCAN_SCRUB) {
|
} else if (is_scrub) {
|
||||||
(void) printf(gettext("\t%s repaired, %.2f%% done"),
|
(void) printf(gettext("\t%s repaired, %.2f%% done"),
|
||||||
processed_buf, 100 * fraction_done);
|
processed_buf, 100 * fraction_done);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pause == 0) {
|
if (pause == 0) {
|
||||||
|
/*
|
||||||
|
* Only provide an estimate iff:
|
||||||
|
* 1) the time remaining is valid, and
|
||||||
|
* 2) the issue rate exceeds 10 MB/s, and
|
||||||
|
* 3) it's either:
|
||||||
|
* a) a resilver which has started repairs, or
|
||||||
|
* b) a scrub which has entered the issue phase.
|
||||||
|
*/
|
||||||
if (total_secs_left != UINT64_MAX &&
|
if (total_secs_left != UINT64_MAX &&
|
||||||
issue_rate >= 10 * 1024 * 1024) {
|
issue_rate >= 10 * 1024 * 1024 &&
|
||||||
|
((is_resilver && ps->pss_processed > 0) ||
|
||||||
|
(is_scrub && issued > 0))) {
|
||||||
(void) printf(gettext(", %s to go\n"), time_buf);
|
(void) printf(gettext(", %s to go\n"), time_buf);
|
||||||
} else {
|
} else {
|
||||||
(void) printf(gettext(", no estimated "
|
(void) printf(gettext(", no estimated "
|
||||||
|
|||||||
+1
-1
@@ -1184,7 +1184,7 @@ ztest_kill(ztest_shared_t *zs)
|
|||||||
* See comment above spa_write_cachefile().
|
* See comment above spa_write_cachefile().
|
||||||
*/
|
*/
|
||||||
mutex_enter(&spa_namespace_lock);
|
mutex_enter(&spa_namespace_lock);
|
||||||
spa_write_cachefile(ztest_spa, B_FALSE, B_FALSE);
|
spa_write_cachefile(ztest_spa, B_FALSE, B_FALSE, B_FALSE);
|
||||||
mutex_exit(&spa_namespace_lock);
|
mutex_exit(&spa_namespace_lock);
|
||||||
|
|
||||||
(void) kill(getpid(), SIGKILL);
|
(void) kill(getpid(), SIGKILL);
|
||||||
|
|||||||
@@ -221,3 +221,34 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA], [
|
|||||||
CFLAGS="$saved_flags"
|
CFLAGS="$saved_flags"
|
||||||
AC_SUBST([NO_IPA_SRA])
|
AC_SUBST([NO_IPA_SRA])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Check if kernel cc supports -fno-ipa-sra option.
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_IPA_SRA], [
|
||||||
|
AC_MSG_CHECKING([whether $KERNEL_CC supports -fno-ipa-sra])
|
||||||
|
|
||||||
|
saved_cc="$CC"
|
||||||
|
saved_flags="$CFLAGS"
|
||||||
|
CC="gcc"
|
||||||
|
CFLAGS="$CFLAGS -Werror -fno-ipa-sra"
|
||||||
|
|
||||||
|
AS_IF([ test -n "$KERNEL_CC" ], [
|
||||||
|
CC="$KERNEL_CC"
|
||||||
|
])
|
||||||
|
AS_IF([ test -n "$KERNEL_LLVM" ], [
|
||||||
|
CC="clang"
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
|
||||||
|
KERNEL_NO_IPA_SRA=-fno-ipa-sra
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
], [
|
||||||
|
KERNEL_NO_IPA_SRA=
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
|
|
||||||
|
CC="$saved_cc"
|
||||||
|
CFLAGS="$saved_flags"
|
||||||
|
AC_SUBST([KERNEL_NO_IPA_SRA])
|
||||||
|
])
|
||||||
|
|||||||
+6
-19
@@ -1,7 +1,6 @@
|
|||||||
dnl #
|
dnl #
|
||||||
dnl # The majority of the python scripts are written to be compatible
|
dnl # The majority of the python scripts are written to be compatible
|
||||||
dnl # with Python 2.6 and Python 3.4. Therefore, they may be installed
|
dnl # with Python 3.6. This option is intended to
|
||||||
dnl # and used with either interpreter. This option is intended to
|
|
||||||
dnl # to provide a method to specify the default system version, and
|
dnl # to provide a method to specify the default system version, and
|
||||||
dnl # set the PYTHON environment variable accordingly.
|
dnl # set the PYTHON environment variable accordingly.
|
||||||
dnl #
|
dnl #
|
||||||
@@ -13,9 +12,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_PYTHON], [
|
|||||||
[with_python=check])
|
[with_python=check])
|
||||||
|
|
||||||
AS_CASE([$with_python],
|
AS_CASE([$with_python],
|
||||||
[check], [AC_CHECK_PROGS([PYTHON], [python3 python2], [:])],
|
[check], [AC_CHECK_PROGS([PYTHON], [python3], [:])],
|
||||||
[2*], [PYTHON="python${with_python}"],
|
|
||||||
[*python2*], [PYTHON="${with_python}"],
|
|
||||||
[3*], [PYTHON="python${with_python}"],
|
[3*], [PYTHON="python${with_python}"],
|
||||||
[*python3*], [PYTHON="${with_python}"],
|
[*python3*], [PYTHON="${with_python}"],
|
||||||
[no], [PYTHON=":"],
|
[no], [PYTHON=":"],
|
||||||
@@ -23,8 +20,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_PYTHON], [
|
|||||||
)
|
)
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Minimum supported Python versions for utilities:
|
dnl # Minimum supported Python versions for utilities: Python 3.6
|
||||||
dnl # Python 2.6 or Python 3.4
|
|
||||||
dnl #
|
dnl #
|
||||||
AM_PATH_PYTHON([], [], [:])
|
AM_PATH_PYTHON([], [], [:])
|
||||||
AS_IF([test -z "$PYTHON_VERSION"], [
|
AS_IF([test -z "$PYTHON_VERSION"], [
|
||||||
@@ -33,25 +29,16 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_PYTHON], [
|
|||||||
PYTHON_MINOR=${PYTHON_VERSION#*\.}
|
PYTHON_MINOR=${PYTHON_VERSION#*\.}
|
||||||
|
|
||||||
AS_CASE([$PYTHON_VERSION],
|
AS_CASE([$PYTHON_VERSION],
|
||||||
[2.*], [
|
|
||||||
AS_IF([test $PYTHON_MINOR -lt 6],
|
|
||||||
[AC_MSG_ERROR("Python >= 2.6 is required")])
|
|
||||||
],
|
|
||||||
[3.*], [
|
[3.*], [
|
||||||
AS_IF([test $PYTHON_MINOR -lt 4],
|
AS_IF([test $PYTHON_MINOR -lt 6],
|
||||||
[AC_MSG_ERROR("Python >= 3.4 is required")])
|
[AC_MSG_ERROR("Python >= 3.6 is required")])
|
||||||
],
|
],
|
||||||
[:|2|3], [],
|
[:|2|3], [],
|
||||||
[PYTHON_VERSION=3]
|
[PYTHON_VERSION=3]
|
||||||
)
|
)
|
||||||
|
|
||||||
AM_CONDITIONAL([USING_PYTHON], [test "$PYTHON" != :])
|
AM_CONDITIONAL([USING_PYTHON], [test "$PYTHON" != :])
|
||||||
AM_CONDITIONAL([USING_PYTHON_2], [test "x${PYTHON_VERSION%%\.*}" = x2])
|
AC_SUBST([PYTHON_SHEBANG], [python3])
|
||||||
AM_CONDITIONAL([USING_PYTHON_3], [test "x${PYTHON_VERSION%%\.*}" = x3])
|
|
||||||
|
|
||||||
AM_COND_IF([USING_PYTHON_2],
|
|
||||||
[AC_SUBST([PYTHON_SHEBANG], [python2])],
|
|
||||||
[AC_SUBST([PYTHON_SHEBANG], [python3])])
|
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Request that packages be built for a specific Python version.
|
dnl # Request that packages be built for a specific Python version.
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ AC_DEFUN([ZFS_AC_PYTHON_MODULE], [
|
|||||||
])
|
])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Determines if pyzfs can be built, requires Python 2.7 or later.
|
dnl # Determines if pyzfs can be built, requires Python 3.6 or later.
|
||||||
dnl #
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_PYZFS], [
|
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_PYZFS], [
|
||||||
AC_ARG_ENABLE([pyzfs],
|
AC_ARG_ENABLE([pyzfs],
|
||||||
@@ -72,12 +72,11 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_PYZFS], [
|
|||||||
])
|
])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Require python-devel libraries
|
dnl # Require python3-devel libraries
|
||||||
dnl #
|
dnl #
|
||||||
AS_IF([test "x$enable_pyzfs" = xcheck -o "x$enable_pyzfs" = xyes], [
|
AS_IF([test "x$enable_pyzfs" = xcheck -o "x$enable_pyzfs" = xyes], [
|
||||||
AS_CASE([$PYTHON_VERSION],
|
AS_CASE([$PYTHON_VERSION],
|
||||||
[3.*], [PYTHON_REQUIRED_VERSION=">= '3.4.0'"],
|
[3.*], [PYTHON_REQUIRED_VERSION=">= '3.6.0'"],
|
||||||
[2.*], [PYTHON_REQUIRED_VERSION=">= '2.7.0'"],
|
|
||||||
[AC_MSG_ERROR("Python $PYTHON_VERSION unknown")]
|
[AC_MSG_ERROR("Python $PYTHON_VERSION unknown")]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+28
-6
@@ -236,7 +236,22 @@ dnl #
|
|||||||
dnl # 6.2 API change,
|
dnl # 6.2 API change,
|
||||||
dnl # set_acl() second paramter changed to a struct dentry *
|
dnl # set_acl() second paramter changed to a struct dentry *
|
||||||
dnl #
|
dnl #
|
||||||
|
dnl # 6.3 API change,
|
||||||
|
dnl # set_acl() first parameter changed to struct mnt_idmap *
|
||||||
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_OPERATIONS_SET_ACL], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_OPERATIONS_SET_ACL], [
|
||||||
|
ZFS_LINUX_TEST_SRC([inode_operations_set_acl_mnt_idmap_dentry], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
|
||||||
|
int set_acl_fn(struct mnt_idmap *idmap,
|
||||||
|
struct dentry *dent, struct posix_acl *acl,
|
||||||
|
int type) { return 0; }
|
||||||
|
|
||||||
|
static const struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.set_acl = set_acl_fn,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
ZFS_LINUX_TEST_SRC([inode_operations_set_acl_userns_dentry], [
|
ZFS_LINUX_TEST_SRC([inode_operations_set_acl_userns_dentry], [
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
|
||||||
@@ -281,17 +296,24 @@ AC_DEFUN([ZFS_AC_KERNEL_INODE_OPERATIONS_SET_ACL], [
|
|||||||
AC_DEFINE(HAVE_SET_ACL, 1, [iops->set_acl() exists])
|
AC_DEFINE(HAVE_SET_ACL, 1, [iops->set_acl() exists])
|
||||||
AC_DEFINE(HAVE_SET_ACL_USERNS, 1, [iops->set_acl() takes 4 args])
|
AC_DEFINE(HAVE_SET_ACL_USERNS, 1, [iops->set_acl() takes 4 args])
|
||||||
],[
|
],[
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_set_acl_userns_dentry], [
|
ZFS_LINUX_TEST_RESULT([inode_operations_set_acl_mnt_idmap_dentry], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_SET_ACL, 1, [iops->set_acl() exists])
|
AC_DEFINE(HAVE_SET_ACL, 1, [iops->set_acl() exists])
|
||||||
AC_DEFINE(HAVE_SET_ACL_USERNS_DENTRY_ARG2, 1,
|
AC_DEFINE(HAVE_SET_ACL_IDMAP_DENTRY, 1,
|
||||||
[iops->set_acl() takes 4 args, arg2 is struct dentry *])
|
[iops->set_acl() takes 4 args, arg1 is struct mnt_idmap *])
|
||||||
],[
|
],[
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_set_acl], [
|
ZFS_LINUX_TEST_RESULT([inode_operations_set_acl_userns_dentry], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_SET_ACL, 1, [iops->set_acl() exists, takes 3 args])
|
AC_DEFINE(HAVE_SET_ACL, 1, [iops->set_acl() exists])
|
||||||
|
AC_DEFINE(HAVE_SET_ACL_USERNS_DENTRY_ARG2, 1,
|
||||||
|
[iops->set_acl() takes 4 args, arg2 is struct dentry *])
|
||||||
],[
|
],[
|
||||||
ZFS_LINUX_REQUIRE_API([i_op->set_acl()], [3.14])
|
ZFS_LINUX_TEST_RESULT([inode_operations_set_acl], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_SET_ACL, 1, [iops->set_acl() exists, takes 3 args])
|
||||||
|
],[
|
||||||
|
ZFS_LINUX_REQUIRE_API([i_op->set_acl()], [3.14])
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -103,6 +103,57 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_CHECK_DISK_CHANGE], [
|
|||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # bdev_kobj() is introduced from 5.12
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_KOBJ], [
|
||||||
|
ZFS_LINUX_TEST_SRC([bdev_kobj], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/blkdev.h>
|
||||||
|
#include <linux/kobject.h>
|
||||||
|
], [
|
||||||
|
struct block_device *bdev = NULL;
|
||||||
|
struct kobject *disk_kobj;
|
||||||
|
disk_kobj = bdev_kobj(bdev);
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEV_KOBJ], [
|
||||||
|
AC_MSG_CHECKING([whether bdev_kobj() exists])
|
||||||
|
ZFS_LINUX_TEST_RESULT([bdev_kobj], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_BDEV_KOBJ, 1,
|
||||||
|
[bdev_kobj() exists])
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # part_to_dev() was removed in 5.12
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_PART_TO_DEV], [
|
||||||
|
ZFS_LINUX_TEST_SRC([part_to_dev], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/blkdev.h>
|
||||||
|
], [
|
||||||
|
struct hd_struct *p = NULL;
|
||||||
|
struct device *pdev;
|
||||||
|
pdev = part_to_dev(p);
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_PART_TO_DEV], [
|
||||||
|
AC_MSG_CHECKING([whether part_to_dev() exists])
|
||||||
|
ZFS_LINUX_TEST_RESULT([part_to_dev], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_PART_TO_DEV, 1,
|
||||||
|
[part_to_dev() exists])
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 5.10 API, check_disk_change() is removed, in favor of
|
dnl # 5.10 API, check_disk_change() is removed, in favor of
|
||||||
dnl # bdev_check_media_change(), which doesn't force revalidation
|
dnl # bdev_check_media_change(), which doesn't force revalidation
|
||||||
@@ -405,6 +456,8 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV], [
|
|||||||
ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_WHOLE
|
ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_WHOLE
|
||||||
ZFS_AC_KERNEL_SRC_BLKDEV_BDEVNAME
|
ZFS_AC_KERNEL_SRC_BLKDEV_BDEVNAME
|
||||||
ZFS_AC_KERNEL_SRC_BLKDEV_ISSUE_SECURE_ERASE
|
ZFS_AC_KERNEL_SRC_BLKDEV_ISSUE_SECURE_ERASE
|
||||||
|
ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_KOBJ
|
||||||
|
ZFS_AC_KERNEL_SRC_BLKDEV_PART_TO_DEV
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_BLKDEV], [
|
AC_DEFUN([ZFS_AC_KERNEL_BLKDEV], [
|
||||||
@@ -421,4 +474,6 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV], [
|
|||||||
ZFS_AC_KERNEL_BLKDEV_BDEVNAME
|
ZFS_AC_KERNEL_BLKDEV_BDEVNAME
|
||||||
ZFS_AC_KERNEL_BLKDEV_GET_ERESTARTSYS
|
ZFS_AC_KERNEL_BLKDEV_GET_ERESTARTSYS
|
||||||
ZFS_AC_KERNEL_BLKDEV_ISSUE_SECURE_ERASE
|
ZFS_AC_KERNEL_BLKDEV_ISSUE_SECURE_ERASE
|
||||||
|
ZFS_AC_KERNEL_BLKDEV_BDEV_KOBJ
|
||||||
|
ZFS_AC_KERNEL_BLKDEV_PART_TO_DEV
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
dnl #
|
||||||
|
dnl # cpu_has_feature() may referencing GPL-only cpu_feature_keys on powerpc
|
||||||
|
dnl #
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Checking if cpu_has_feature is exported GPL-only
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE], [
|
||||||
|
ZFS_LINUX_TEST_SRC([cpu_has_feature], [
|
||||||
|
#include <linux/version.h>
|
||||||
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
|
||||||
|
#include <asm/cpu_has_feature.h>
|
||||||
|
#else
|
||||||
|
#include <asm/cputable.h>
|
||||||
|
#endif
|
||||||
|
], [
|
||||||
|
return cpu_has_feature(CPU_FTR_ALTIVEC) ? 0 : 1;
|
||||||
|
], [], [ZFS_META_LICENSE])
|
||||||
|
])
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_CPU_HAS_FEATURE], [
|
||||||
|
AC_MSG_CHECKING([whether cpu_has_feature() is GPL-only])
|
||||||
|
ZFS_LINUX_TEST_RESULT([cpu_has_feature_license], [
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_CPU_HAS_FEATURE_GPL_ONLY, 1,
|
||||||
|
[cpu_has_feature() is GPL-only])
|
||||||
|
])
|
||||||
|
])
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
dnl #
|
||||||
|
dnl # filemap_range_has_page was not available till 4.13
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_FILEMAP], [
|
||||||
|
ZFS_LINUX_TEST_SRC([filemap_range_has_page], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
],[
|
||||||
|
struct address_space *mapping = NULL;
|
||||||
|
loff_t lstart = 0;
|
||||||
|
loff_t lend = 0;
|
||||||
|
bool ret __attribute__ ((unused));
|
||||||
|
|
||||||
|
ret = filemap_range_has_page(mapping, lstart, lend);
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_FILEMAP], [
|
||||||
|
AC_MSG_CHECKING([whether filemap_range_has_page() is available])
|
||||||
|
ZFS_LINUX_TEST_RESULT([filemap_range_has_page], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_FILEMAP_RANGE_HAS_PAGE, 1,
|
||||||
|
[filemap_range_has_page() is available])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
dnl #
|
||||||
|
dnl # Starting from Linux 5.13, flush_dcache_page() becomes an inline
|
||||||
|
dnl # function and may indirectly referencing GPL-only cpu_feature_keys on
|
||||||
|
dnl # powerpc
|
||||||
|
dnl #
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Checking if flush_dcache_page is exported GPL-only
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE], [
|
||||||
|
ZFS_LINUX_TEST_SRC([flush_dcache_page], [
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
|
], [
|
||||||
|
flush_dcache_page(0);
|
||||||
|
], [], [ZFS_META_LICENSE])
|
||||||
|
])
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE], [
|
||||||
|
AC_MSG_CHECKING([whether flush_dcache_page() is GPL-only])
|
||||||
|
ZFS_LINUX_TEST_RESULT([flush_dcache_page_license], [
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_FLUSH_DCACHE_PAGE_GPL_ONLY, 1,
|
||||||
|
[flush_dcache_page() is GPL-only])
|
||||||
|
])
|
||||||
|
])
|
||||||
@@ -4,7 +4,10 @@ dnl #
|
|||||||
dnl # generic_fillattr in linux/fs.h now requires a struct user_namespace*
|
dnl # generic_fillattr in linux/fs.h now requires a struct user_namespace*
|
||||||
dnl # as the first arg, to support idmapped mounts.
|
dnl # as the first arg, to support idmapped mounts.
|
||||||
dnl #
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR_USERNS], [
|
dnl # 6.3 API
|
||||||
|
dnl # generic_fillattr() now takes struct mnt_idmap* as the first argument
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR], [
|
||||||
ZFS_LINUX_TEST_SRC([generic_fillattr_userns], [
|
ZFS_LINUX_TEST_SRC([generic_fillattr_userns], [
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
],[
|
],[
|
||||||
@@ -13,16 +16,32 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR_USERNS], [
|
|||||||
struct kstat *k = NULL;
|
struct kstat *k = NULL;
|
||||||
generic_fillattr(userns, in, k);
|
generic_fillattr(userns, in, k);
|
||||||
])
|
])
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_GENERIC_FILLATTR_USERNS], [
|
ZFS_LINUX_TEST_SRC([generic_fillattr_mnt_idmap], [
|
||||||
AC_MSG_CHECKING([whether generic_fillattr requires struct user_namespace*])
|
#include <linux/fs.h>
|
||||||
ZFS_LINUX_TEST_RESULT([generic_fillattr_userns], [
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
AC_DEFINE(HAVE_GENERIC_FILLATTR_USERNS, 1,
|
|
||||||
[generic_fillattr requires struct user_namespace*])
|
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT([no])
|
struct mnt_idmap *idmap = NULL;
|
||||||
|
struct inode *in = NULL;
|
||||||
|
struct kstat *k = NULL;
|
||||||
|
generic_fillattr(idmap, in, k);
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_GENERIC_FILLATTR], [
|
||||||
|
AC_MSG_CHECKING([whether generic_fillattr requires struct mnt_idmap*])
|
||||||
|
ZFS_LINUX_TEST_RESULT([generic_fillattr_mnt_idmap], [
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE(HAVE_GENERIC_FILLATTR_IDMAP, 1,
|
||||||
|
[generic_fillattr requires struct mnt_idmap*])
|
||||||
|
],[
|
||||||
|
AC_MSG_CHECKING([whether generic_fillattr requires struct user_namespace*])
|
||||||
|
ZFS_LINUX_TEST_RESULT([generic_fillattr_userns], [
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE(HAVE_GENERIC_FILLATTR_USERNS, 1,
|
||||||
|
[generic_fillattr requires struct user_namespace*])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,20 @@ dnl #
|
|||||||
dnl # Check for generic io accounting interface.
|
dnl # Check for generic io accounting interface.
|
||||||
dnl #
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT], [
|
||||||
ZFS_LINUX_TEST_SRC([bdev_io_acct], [
|
ZFS_LINUX_TEST_SRC([bdev_io_acct_63], [
|
||||||
|
#include <linux/blkdev.h>
|
||||||
|
], [
|
||||||
|
struct block_device *bdev = NULL;
|
||||||
|
struct bio *bio = NULL;
|
||||||
|
unsigned long passed_time = 0;
|
||||||
|
unsigned long start_time;
|
||||||
|
|
||||||
|
start_time = bdev_start_io_acct(bdev, bio_op(bio),
|
||||||
|
passed_time);
|
||||||
|
bdev_end_io_acct(bdev, bio_op(bio), bio_sectors(bio), start_time);
|
||||||
|
])
|
||||||
|
|
||||||
|
ZFS_LINUX_TEST_SRC([bdev_io_acct_old], [
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
], [
|
], [
|
||||||
struct block_device *bdev = NULL;
|
struct block_device *bdev = NULL;
|
||||||
@@ -63,74 +76,85 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT], [
|
|||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_GENERIC_IO_ACCT], [
|
AC_DEFUN([ZFS_AC_KERNEL_GENERIC_IO_ACCT], [
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 5.19 API,
|
dnl # Linux 6.3, and then backports thereof, changed
|
||||||
|
dnl # the signatures on bdev_start_io_acct/bdev_end_io_acct
|
||||||
dnl #
|
dnl #
|
||||||
dnl # disk_start_io_acct() and disk_end_io_acct() have been replaced by
|
AC_MSG_CHECKING([whether 6.3+ bdev_*_io_acct() are available])
|
||||||
dnl # bdev_start_io_acct() and bdev_end_io_acct().
|
ZFS_LINUX_TEST_RESULT([bdev_io_acct_63], [
|
||||||
dnl #
|
|
||||||
AC_MSG_CHECKING([whether generic bdev_*_io_acct() are available])
|
|
||||||
ZFS_LINUX_TEST_RESULT([bdev_io_acct], [
|
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_BDEV_IO_ACCT, 1, [bdev_*_io_acct() available])
|
AC_DEFINE(HAVE_BDEV_IO_ACCT_63, 1, [bdev_*_io_acct() available])
|
||||||
], [
|
], [
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 5.12 API,
|
dnl # 5.19 API,
|
||||||
dnl #
|
dnl #
|
||||||
dnl # bio_start_io_acct() and bio_end_io_acct() became GPL-exported
|
dnl # disk_start_io_acct() and disk_end_io_acct() have been replaced by
|
||||||
dnl # so use disk_start_io_acct() and disk_end_io_acct() instead
|
dnl # bdev_start_io_acct() and bdev_end_io_acct().
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_CHECKING([whether generic disk_*_io_acct() are available])
|
AC_MSG_CHECKING([whether pre-6.3 bdev_*_io_acct() are available])
|
||||||
ZFS_LINUX_TEST_RESULT([disk_io_acct], [
|
ZFS_LINUX_TEST_RESULT([bdev_io_acct_old], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_DISK_IO_ACCT, 1, [disk_*_io_acct() available])
|
AC_DEFINE(HAVE_BDEV_IO_ACCT_OLD, 1, [bdev_*_io_acct() available])
|
||||||
], [
|
], [
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 5.7 API,
|
dnl # 5.12 API,
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Added bio_start_io_acct() and bio_end_io_acct() helpers.
|
dnl # bio_start_io_acct() and bio_end_io_acct() became GPL-exported
|
||||||
|
dnl # so use disk_start_io_acct() and disk_end_io_acct() instead
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_CHECKING([whether generic bio_*_io_acct() are available])
|
AC_MSG_CHECKING([whether generic disk_*_io_acct() are available])
|
||||||
ZFS_LINUX_TEST_RESULT([bio_io_acct], [
|
ZFS_LINUX_TEST_RESULT([disk_io_acct], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_BIO_IO_ACCT, 1, [bio_*_io_acct() available])
|
AC_DEFINE(HAVE_DISK_IO_ACCT, 1, [disk_*_io_acct() available])
|
||||||
], [
|
], [
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 4.14 API,
|
dnl # 5.7 API,
|
||||||
dnl #
|
dnl #
|
||||||
dnl # generic_start_io_acct/generic_end_io_acct now require
|
dnl # Added bio_start_io_acct() and bio_end_io_acct() helpers.
|
||||||
dnl # request_queue to be provided. No functional changes,
|
|
||||||
dnl # but preparation for inflight accounting.
|
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_CHECKING([whether generic_*_io_acct wants 4 args])
|
AC_MSG_CHECKING([whether generic bio_*_io_acct() are available])
|
||||||
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_4args],
|
ZFS_LINUX_TEST_RESULT([bio_io_acct], [
|
||||||
[generic_start_io_acct], [block/bio.c], [
|
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GENERIC_IO_ACCT_4ARG, 1,
|
AC_DEFINE(HAVE_BIO_IO_ACCT, 1, [bio_*_io_acct() available])
|
||||||
[generic_*_io_acct() 4 arg available])
|
|
||||||
], [
|
], [
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 3.19 API addition
|
dnl # 4.14 API,
|
||||||
dnl #
|
dnl #
|
||||||
dnl # torvalds/linux@394ffa50 allows us to increment
|
dnl # generic_start_io_acct/generic_end_io_acct now require
|
||||||
dnl # iostat counters without generic_make_request().
|
dnl # request_queue to be provided. No functional changes,
|
||||||
|
dnl # but preparation for inflight accounting.
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_CHECKING(
|
AC_MSG_CHECKING([whether generic_*_io_acct wants 4 args])
|
||||||
[whether generic_*_io_acct wants 3 args])
|
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_4args],
|
||||||
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_3args],
|
|
||||||
[generic_start_io_acct], [block/bio.c], [
|
[generic_start_io_acct], [block/bio.c], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GENERIC_IO_ACCT_3ARG, 1,
|
AC_DEFINE(HAVE_GENERIC_IO_ACCT_4ARG, 1,
|
||||||
[generic_*_io_acct() 3 arg available])
|
[generic_*_io_acct() 4 arg available])
|
||||||
], [
|
], [
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 3.19 API addition
|
||||||
|
dnl #
|
||||||
|
dnl # torvalds/linux@394ffa50 allows us to increment
|
||||||
|
dnl # iostat counters without generic_make_request().
|
||||||
|
dnl #
|
||||||
|
AC_MSG_CHECKING(
|
||||||
|
[whether generic_*_io_acct wants 3 args])
|
||||||
|
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_3args],
|
||||||
|
[generic_start_io_acct], [block/bio.c], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_GENERIC_IO_ACCT_3ARG, 1,
|
||||||
|
[generic_*_io_acct() 3 arg available])
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -1,4 +1,22 @@
|
|||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_CREATE], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_CREATE], [
|
||||||
|
dnl #
|
||||||
|
dnl # 6.3 API change
|
||||||
|
dnl # The first arg is changed to struct mnt_idmap *
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([create_mnt_idmap], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
|
int inode_create(struct mnt_idmap *idmap,
|
||||||
|
struct inode *inode ,struct dentry *dentry,
|
||||||
|
umode_t umode, bool flag) { return 0; }
|
||||||
|
|
||||||
|
static const struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.create = inode_create,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 5.12 API change that added the struct user_namespace* arg
|
dnl # 5.12 API change that added the struct user_namespace* arg
|
||||||
dnl # to the front of this function type's arg list.
|
dnl # to the front of this function type's arg list.
|
||||||
@@ -35,19 +53,28 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_CREATE], [
|
|||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_CREATE], [
|
AC_DEFUN([ZFS_AC_KERNEL_CREATE], [
|
||||||
AC_MSG_CHECKING([whether iops->create() takes struct user_namespace*])
|
AC_MSG_CHECKING([whether iops->create() takes struct mnt_idmap*])
|
||||||
ZFS_LINUX_TEST_RESULT([create_userns], [
|
ZFS_LINUX_TEST_RESULT([create_mnt_idmap], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_IOPS_CREATE_USERNS, 1,
|
AC_DEFINE(HAVE_IOPS_CREATE_IDMAP, 1,
|
||||||
[iops->create() takes struct user_namespace*])
|
[iops->create() takes struct mnt_idmap*])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether iops->create() passes flags])
|
AC_MSG_CHECKING([whether iops->create() takes struct user_namespace*])
|
||||||
ZFS_LINUX_TEST_RESULT([create_flags], [
|
ZFS_LINUX_TEST_RESULT([create_userns], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_IOPS_CREATE_USERNS, 1,
|
||||||
|
[iops->create() takes struct user_namespace*])
|
||||||
],[
|
],[
|
||||||
ZFS_LINUX_TEST_ERROR([iops->create()])
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether iops->create() passes flags])
|
||||||
|
ZFS_LINUX_TEST_RESULT([create_flags], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
],[
|
||||||
|
ZFS_LINUX_TEST_ERROR([iops->create()])
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -1,4 +1,24 @@
|
|||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_GETATTR], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_GETATTR], [
|
||||||
|
dnl #
|
||||||
|
dnl # Linux 6.3 API
|
||||||
|
dnl # The first arg of getattr I/O operations handler type
|
||||||
|
dnl # is changed to struct mnt_idmap*
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([inode_operations_getattr_mnt_idmap], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
|
||||||
|
int test_getattr(
|
||||||
|
struct mnt_idmap *idmap,
|
||||||
|
const struct path *p, struct kstat *k,
|
||||||
|
u32 request_mask, unsigned int query_flags)
|
||||||
|
{ return 0; }
|
||||||
|
|
||||||
|
static const struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.getattr = test_getattr,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Linux 5.12 API
|
dnl # Linux 5.12 API
|
||||||
dnl # The getattr I/O operations handler type was extended to require
|
dnl # The getattr I/O operations handler type was extended to require
|
||||||
@@ -55,37 +75,48 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_GETATTR], [
|
|||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_INODE_GETATTR], [
|
AC_DEFUN([ZFS_AC_KERNEL_INODE_GETATTR], [
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Kernel 5.12 test
|
dnl # Kernel 6.3 test
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_CHECKING([whether iops->getattr() takes user_namespace])
|
AC_MSG_CHECKING([whether iops->getattr() takes mnt_idmap])
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_getattr_userns], [
|
ZFS_LINUX_TEST_RESULT([inode_operations_getattr_mnt_idmap], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_USERNS_IOPS_GETATTR, 1,
|
AC_DEFINE(HAVE_IDMAP_IOPS_GETATTR, 1,
|
||||||
[iops->getattr() takes struct user_namespace*])
|
[iops->getattr() takes struct mnt_idmap*])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Kernel 4.11 test
|
dnl # Kernel 5.12 test
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_CHECKING([whether iops->getattr() takes a path])
|
AC_MSG_CHECKING([whether iops->getattr() takes user_namespace])
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_getattr_path], [
|
ZFS_LINUX_TEST_RESULT([inode_operations_getattr_userns], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_PATH_IOPS_GETATTR, 1,
|
AC_DEFINE(HAVE_USERNS_IOPS_GETATTR, 1,
|
||||||
[iops->getattr() takes a path])
|
[iops->getattr() takes struct user_namespace*])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Kernel < 4.11 test
|
dnl # Kernel 4.11 test
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_CHECKING([whether iops->getattr() takes a vfsmount])
|
AC_MSG_CHECKING([whether iops->getattr() takes a path])
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_getattr_vfsmount], [
|
ZFS_LINUX_TEST_RESULT([inode_operations_getattr_path], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_VFSMOUNT_IOPS_GETATTR, 1,
|
AC_DEFINE(HAVE_PATH_IOPS_GETATTR, 1,
|
||||||
[iops->getattr() takes a vfsmount])
|
[iops->getattr() takes a path])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Kernel < 4.11 test
|
||||||
|
dnl #
|
||||||
|
AC_MSG_CHECKING([whether iops->getattr() takes a vfsmount])
|
||||||
|
ZFS_LINUX_TEST_RESULT([inode_operations_getattr_vfsmount], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_VFSMOUNT_IOPS_GETATTR, 1,
|
||||||
|
[iops->getattr() takes a vfsmount])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -0,0 +1,87 @@
|
|||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_SETATTR], [
|
||||||
|
dnl #
|
||||||
|
dnl # Linux 6.3 API
|
||||||
|
dnl # The first arg of setattr I/O operations handler type
|
||||||
|
dnl # is changed to struct mnt_idmap*
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([inode_operations_setattr_mnt_idmap], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
|
||||||
|
int test_setattr(
|
||||||
|
struct mnt_idmap *idmap,
|
||||||
|
struct dentry *de, struct iattr *ia)
|
||||||
|
{ return 0; }
|
||||||
|
|
||||||
|
static const struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.setattr = test_setattr,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Linux 5.12 API
|
||||||
|
dnl # The setattr I/O operations handler type was extended to require
|
||||||
|
dnl # a struct user_namespace* as its first arg, to support idmapped
|
||||||
|
dnl # mounts.
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([inode_operations_setattr_userns], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
|
||||||
|
int test_setattr(
|
||||||
|
struct user_namespace *userns,
|
||||||
|
struct dentry *de, struct iattr *ia)
|
||||||
|
{ return 0; }
|
||||||
|
|
||||||
|
static const struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.setattr = test_setattr,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
|
|
||||||
|
ZFS_LINUX_TEST_SRC([inode_operations_setattr], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
|
||||||
|
int test_setattr(
|
||||||
|
struct dentry *de, struct iattr *ia)
|
||||||
|
{ return 0; }
|
||||||
|
|
||||||
|
static const struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.setattr = test_setattr,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_INODE_SETATTR], [
|
||||||
|
dnl #
|
||||||
|
dnl # Kernel 6.3 test
|
||||||
|
dnl #
|
||||||
|
AC_MSG_CHECKING([whether iops->setattr() takes mnt_idmap])
|
||||||
|
ZFS_LINUX_TEST_RESULT([inode_operations_setattr_mnt_idmap], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_IDMAP_IOPS_SETATTR, 1,
|
||||||
|
[iops->setattr() takes struct mnt_idmap*])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
dnl #
|
||||||
|
dnl # Kernel 5.12 test
|
||||||
|
dnl #
|
||||||
|
AC_MSG_CHECKING([whether iops->setattr() takes user_namespace])
|
||||||
|
ZFS_LINUX_TEST_RESULT([inode_operations_setattr_userns], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_USERNS_IOPS_SETATTR, 1,
|
||||||
|
[iops->setattr() takes struct user_namespace*])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether iops->setattr() exists])
|
||||||
|
ZFS_LINUX_TEST_RESULT([inode_operations_setattr], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_IOPS_SETATTR, 1,
|
||||||
|
[iops->setattr() exists])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
@@ -16,12 +16,20 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_OWNER_OR_CAPABLE], [
|
|||||||
(void) inode_owner_or_capable(ip);
|
(void) inode_owner_or_capable(ip);
|
||||||
])
|
])
|
||||||
|
|
||||||
ZFS_LINUX_TEST_SRC([inode_owner_or_capable_idmapped], [
|
ZFS_LINUX_TEST_SRC([inode_owner_or_capable_userns], [
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
],[
|
],[
|
||||||
struct inode *ip = NULL;
|
struct inode *ip = NULL;
|
||||||
(void) inode_owner_or_capable(&init_user_ns, ip);
|
(void) inode_owner_or_capable(&init_user_ns, ip);
|
||||||
])
|
])
|
||||||
|
|
||||||
|
ZFS_LINUX_TEST_SRC([inode_owner_or_capable_mnt_idmap], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/mnt_idmapping.h>
|
||||||
|
],[
|
||||||
|
struct inode *ip = NULL;
|
||||||
|
(void) inode_owner_or_capable(&nop_mnt_idmap, ip);
|
||||||
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_INODE_OWNER_OR_CAPABLE], [
|
AC_DEFUN([ZFS_AC_KERNEL_INODE_OWNER_OR_CAPABLE], [
|
||||||
@@ -35,12 +43,21 @@ AC_DEFUN([ZFS_AC_KERNEL_INODE_OWNER_OR_CAPABLE], [
|
|||||||
|
|
||||||
AC_MSG_CHECKING(
|
AC_MSG_CHECKING(
|
||||||
[whether inode_owner_or_capable() takes user_ns])
|
[whether inode_owner_or_capable() takes user_ns])
|
||||||
ZFS_LINUX_TEST_RESULT([inode_owner_or_capable_idmapped], [
|
ZFS_LINUX_TEST_RESULT([inode_owner_or_capable_userns], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_INODE_OWNER_OR_CAPABLE_IDMAPPED, 1,
|
AC_DEFINE(HAVE_INODE_OWNER_OR_CAPABLE_USERNS, 1,
|
||||||
[inode_owner_or_capable() takes user_ns])
|
[inode_owner_or_capable() takes user_ns])
|
||||||
],[
|
],[
|
||||||
ZFS_LINUX_TEST_ERROR([capability])
|
AC_MSG_RESULT(no)
|
||||||
|
AC_MSG_CHECKING(
|
||||||
|
[whether inode_owner_or_capable() takes mnt_idmap])
|
||||||
|
ZFS_LINUX_TEST_RESULT([inode_owner_or_capable_mnt_idmap], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_INODE_OWNER_OR_CAPABLE_IDMAP, 1,
|
||||||
|
[inode_owner_or_capable() takes mnt_idmap])
|
||||||
|
], [
|
||||||
|
ZFS_LINUX_TEST_ERROR([capability])
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
+41
-14
@@ -2,6 +2,22 @@ dnl #
|
|||||||
dnl # Supported mkdir() interfaces checked newest to oldest.
|
dnl # Supported mkdir() interfaces checked newest to oldest.
|
||||||
dnl #
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_MKDIR], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_MKDIR], [
|
||||||
|
dnl #
|
||||||
|
dnl # 6.3 API change
|
||||||
|
dnl # mkdir() takes struct mnt_idmap * as the first arg
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([mkdir_mnt_idmap], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
|
||||||
|
int mkdir(struct mnt_idmap *idmap,
|
||||||
|
struct inode *inode, struct dentry *dentry,
|
||||||
|
umode_t umode) { return 0; }
|
||||||
|
static const struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.mkdir = mkdir,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 5.12 API change
|
dnl # 5.12 API change
|
||||||
dnl # The struct user_namespace arg was added as the first argument to
|
dnl # The struct user_namespace arg was added as the first argument to
|
||||||
@@ -43,25 +59,36 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_MKDIR], [
|
|||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_MKDIR], [
|
AC_DEFUN([ZFS_AC_KERNEL_MKDIR], [
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 5.12 API change
|
dnl # 6.3 API change
|
||||||
dnl # The struct user_namespace arg was added as the first argument to
|
dnl # mkdir() takes struct mnt_idmap * as the first arg
|
||||||
dnl # mkdir() of the iops structure.
|
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_CHECKING([whether iops->mkdir() takes struct user_namespace*])
|
AC_MSG_CHECKING([whether iops->mkdir() takes struct mnt_idmap*])
|
||||||
ZFS_LINUX_TEST_RESULT([mkdir_user_namespace], [
|
ZFS_LINUX_TEST_RESULT([mkdir_mnt_idmap], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_IOPS_MKDIR_USERNS, 1,
|
AC_DEFINE(HAVE_IOPS_MKDIR_IDMAP, 1,
|
||||||
[iops->mkdir() takes struct user_namespace*])
|
[iops->mkdir() takes struct mnt_idmap*])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
dnl #
|
||||||
|
dnl # 5.12 API change
|
||||||
AC_MSG_CHECKING([whether iops->mkdir() takes umode_t])
|
dnl # The struct user_namespace arg was added as the first argument to
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_mkdir], [
|
dnl # mkdir() of the iops structure.
|
||||||
|
dnl #
|
||||||
|
AC_MSG_CHECKING([whether iops->mkdir() takes struct user_namespace*])
|
||||||
|
ZFS_LINUX_TEST_RESULT([mkdir_user_namespace], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_MKDIR_UMODE_T, 1,
|
AC_DEFINE(HAVE_IOPS_MKDIR_USERNS, 1,
|
||||||
[iops->mkdir() takes umode_t])
|
[iops->mkdir() takes struct user_namespace*])
|
||||||
],[
|
],[
|
||||||
ZFS_LINUX_TEST_ERROR([mkdir()])
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether iops->mkdir() takes umode_t])
|
||||||
|
ZFS_LINUX_TEST_RESULT([inode_operations_mkdir], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_MKDIR_UMODE_T, 1,
|
||||||
|
[iops->mkdir() takes umode_t])
|
||||||
|
],[
|
||||||
|
ZFS_LINUX_TEST_ERROR([mkdir()])
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
+30
-4
@@ -1,4 +1,22 @@
|
|||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_MKNOD], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_MKNOD], [
|
||||||
|
dnl #
|
||||||
|
dnl # 6.3 API change
|
||||||
|
dnl # The first arg is now struct mnt_idmap*
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([mknod_mnt_idmap], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
|
int tmp_mknod(struct mnt_idmap *idmap,
|
||||||
|
struct inode *inode ,struct dentry *dentry,
|
||||||
|
umode_t u, dev_t d) { return 0; }
|
||||||
|
|
||||||
|
static const struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.mknod = tmp_mknod,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 5.12 API change that added the struct user_namespace* arg
|
dnl # 5.12 API change that added the struct user_namespace* arg
|
||||||
dnl # to the front of this function type's arg list.
|
dnl # to the front of this function type's arg list.
|
||||||
@@ -19,12 +37,20 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_MKNOD], [
|
|||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_MKNOD], [
|
AC_DEFUN([ZFS_AC_KERNEL_MKNOD], [
|
||||||
AC_MSG_CHECKING([whether iops->mknod() takes struct user_namespace*])
|
AC_MSG_CHECKING([whether iops->mknod() takes struct mnt_idmap*])
|
||||||
ZFS_LINUX_TEST_RESULT([mknod_userns], [
|
ZFS_LINUX_TEST_RESULT([mknod_mnt_idmap], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_IOPS_MKNOD_USERNS, 1,
|
AC_DEFINE(HAVE_IOPS_MKNOD_IDMAP, 1,
|
||||||
[iops->mknod() takes struct user_namespace*])
|
[iops->mknod() takes struct mnt_idmap*])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
AC_MSG_CHECKING([whether iops->mknod() takes struct user_namespace*])
|
||||||
|
ZFS_LINUX_TEST_RESULT([mknod_userns], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_IOPS_MKNOD_USERNS, 1,
|
||||||
|
[iops->mknod() takes struct user_namespace*])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_RECLAIMED], [
|
||||||
|
dnl #
|
||||||
|
dnl # 6.4 API change
|
||||||
|
dnl # The reclaimed_slab of struct reclaim_state
|
||||||
|
dnl # is renamed to reclaimed
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([reclaim_state_reclaimed], [
|
||||||
|
#include <linux/swap.h>
|
||||||
|
static const struct reclaim_state
|
||||||
|
rs __attribute__ ((unused)) = {
|
||||||
|
.reclaimed = 100,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_RECLAIMED], [
|
||||||
|
AC_MSG_CHECKING([whether struct reclaim_state has reclaimed field])
|
||||||
|
ZFS_LINUX_TEST_RESULT([reclaim_state_reclaimed], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_RECLAIM_STATE_RECLAIMED, 1,
|
||||||
|
[struct reclaim_state has reclaimed])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
+32
-8
@@ -33,24 +33,48 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_RENAME], [
|
|||||||
.rename = rename_fn,
|
.rename = rename_fn,
|
||||||
};
|
};
|
||||||
],[])
|
],[])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 6.3 API change - the first arg is now struct mnt_idmap*
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([inode_operations_rename_mnt_idmap], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
int rename_fn(struct mnt_idmap *idmap, struct inode *sip,
|
||||||
|
struct dentry *sdp, struct inode *tip, struct dentry *tdp,
|
||||||
|
unsigned int flags) { return 0; }
|
||||||
|
|
||||||
|
static const struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.rename = rename_fn,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_RENAME], [
|
AC_DEFUN([ZFS_AC_KERNEL_RENAME], [
|
||||||
AC_MSG_CHECKING([whether iops->rename() takes struct user_namespace*])
|
AC_MSG_CHECKING([whether iops->rename() takes struct mnt_idmap*])
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_rename_userns], [
|
ZFS_LINUX_TEST_RESULT([inode_operations_rename_mnt_idmap], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_IOPS_RENAME_USERNS, 1,
|
AC_DEFINE(HAVE_IOPS_RENAME_IDMAP, 1,
|
||||||
[iops->rename() takes struct user_namespace*])
|
[iops->rename() takes struct mnt_idmap*])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether iop->rename() wants flags])
|
AC_MSG_CHECKING([whether iops->rename() takes struct user_namespace*])
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_rename_flags], [
|
ZFS_LINUX_TEST_RESULT([inode_operations_rename_userns], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_RENAME_WANTS_FLAGS, 1,
|
AC_DEFINE(HAVE_IOPS_RENAME_USERNS, 1,
|
||||||
[iops->rename() wants flags])
|
[iops->rename() takes struct user_namespace*])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether iops->rename() wants flags])
|
||||||
|
ZFS_LINUX_TEST_RESULT([inode_operations_rename_flags], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_RENAME_WANTS_FLAGS, 1,
|
||||||
|
[iops->rename() wants flags])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -27,26 +27,48 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_SETATTR_PREPARE], [
|
|||||||
int error __attribute__ ((unused)) =
|
int error __attribute__ ((unused)) =
|
||||||
setattr_prepare(userns, dentry, attr);
|
setattr_prepare(userns, dentry, attr);
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 6.3 API change
|
||||||
|
dnl # The first arg of setattr_prepare() is changed to struct mnt_idmap*
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([setattr_prepare_mnt_idmap], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
], [
|
||||||
|
struct dentry *dentry = NULL;
|
||||||
|
struct iattr *attr = NULL;
|
||||||
|
struct mnt_idmap *idmap = NULL;
|
||||||
|
int error __attribute__ ((unused)) =
|
||||||
|
setattr_prepare(idmap, dentry, attr);
|
||||||
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SETATTR_PREPARE], [
|
AC_DEFUN([ZFS_AC_KERNEL_SETATTR_PREPARE], [
|
||||||
AC_MSG_CHECKING([whether setattr_prepare() is available and accepts struct user_namespace*])
|
AC_MSG_CHECKING([whether setattr_prepare() is available and accepts struct mnt_idmap*])
|
||||||
ZFS_LINUX_TEST_RESULT_SYMBOL([setattr_prepare_userns],
|
ZFS_LINUX_TEST_RESULT_SYMBOL([setattr_prepare_mnt_idmap],
|
||||||
[setattr_prepare], [fs/attr.c], [
|
[setattr_prepare], [fs/attr.c], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_SETATTR_PREPARE_USERNS, 1,
|
AC_DEFINE(HAVE_SETATTR_PREPARE_IDMAP, 1,
|
||||||
[setattr_prepare() accepts user_namespace])
|
[setattr_prepare() accepts mnt_idmap])
|
||||||
], [
|
], [
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_CHECKING([whether setattr_prepare() is available and accepts struct user_namespace*])
|
||||||
|
ZFS_LINUX_TEST_RESULT_SYMBOL([setattr_prepare_userns],
|
||||||
AC_MSG_CHECKING([whether setattr_prepare() is available, doesn't accept user_namespace])
|
[setattr_prepare], [fs/attr.c], [
|
||||||
ZFS_LINUX_TEST_RESULT_SYMBOL([setattr_prepare],
|
|
||||||
[setattr_prepare], [fs/attr.c], [
|
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_SETATTR_PREPARE_NO_USERNS, 1,
|
AC_DEFINE(HAVE_SETATTR_PREPARE_USERNS, 1,
|
||||||
[setattr_prepare() is available, doesn't accept user_namespace])
|
[setattr_prepare() accepts user_namespace])
|
||||||
], [
|
], [
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether setattr_prepare() is available, doesn't accept user_namespace])
|
||||||
|
ZFS_LINUX_TEST_RESULT_SYMBOL([setattr_prepare],
|
||||||
|
[setattr_prepare], [fs/attr.c], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_SETATTR_PREPARE_NO_USERNS, 1,
|
||||||
|
[setattr_prepare() is available, doesn't accept user_namespace])
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -1,4 +1,20 @@
|
|||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_SYMLINK], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_SYMLINK], [
|
||||||
|
dnl #
|
||||||
|
dnl # 6.3 API change that changed the first arg
|
||||||
|
dnl # to struct mnt_idmap*
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([symlink_mnt_idmap], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
int tmp_symlink(struct mnt_idmap *idmap,
|
||||||
|
struct inode *inode ,struct dentry *dentry,
|
||||||
|
const char *path) { return 0; }
|
||||||
|
|
||||||
|
static const struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.symlink = tmp_symlink,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 5.12 API change that added the struct user_namespace* arg
|
dnl # 5.12 API change that added the struct user_namespace* arg
|
||||||
dnl # to the front of this function type's arg list.
|
dnl # to the front of this function type's arg list.
|
||||||
@@ -19,12 +35,19 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_SYMLINK], [
|
|||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SYMLINK], [
|
AC_DEFUN([ZFS_AC_KERNEL_SYMLINK], [
|
||||||
AC_MSG_CHECKING([whether iops->symlink() takes struct user_namespace*])
|
AC_MSG_CHECKING([whether iops->symlink() takes struct mnt_idmap*])
|
||||||
ZFS_LINUX_TEST_RESULT([symlink_userns], [
|
ZFS_LINUX_TEST_RESULT([symlink_mnt_idmap], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_IOPS_SYMLINK_USERNS, 1,
|
AC_DEFINE(HAVE_IOPS_SYMLINK_IDMAP, 1,
|
||||||
[iops->symlink() takes struct user_namespace*])
|
[iops->symlink() takes struct mnt_idmap*])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_CHECKING([whether iops->symlink() takes struct user_namespace*])
|
||||||
|
ZFS_LINUX_TEST_RESULT([symlink_userns], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_IOPS_SYMLINK_USERNS, 1,
|
||||||
|
[iops->symlink() takes struct user_namespace*])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -4,6 +4,19 @@ dnl # Add support for i_op->tmpfile
|
|||||||
dnl #
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_TMPFILE], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_TMPFILE], [
|
||||||
dnl #
|
dnl #
|
||||||
|
dnl # 6.3 API change
|
||||||
|
dnl # The first arg is now struct mnt_idmap *
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([inode_operations_tmpfile_mnt_idmap], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
int tmpfile(struct mnt_idmap *idmap,
|
||||||
|
struct inode *inode, struct file *file,
|
||||||
|
umode_t mode) { return 0; }
|
||||||
|
static struct inode_operations
|
||||||
|
iops __attribute__ ((unused)) = {
|
||||||
|
.tmpfile = tmpfile,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
dnl # 6.1 API change
|
dnl # 6.1 API change
|
||||||
dnl # use struct file instead of struct dentry
|
dnl # use struct file instead of struct dentry
|
||||||
dnl #
|
dnl #
|
||||||
@@ -44,23 +57,29 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_TMPFILE], [
|
|||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_TMPFILE], [
|
AC_DEFUN([ZFS_AC_KERNEL_TMPFILE], [
|
||||||
AC_MSG_CHECKING([whether i_op->tmpfile() exists])
|
AC_MSG_CHECKING([whether i_op->tmpfile() exists])
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_tmpfile], [
|
ZFS_LINUX_TEST_RESULT([inode_operations_tmpfile_mnt_idmap], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_TMPFILE, 1, [i_op->tmpfile() exists])
|
AC_DEFINE(HAVE_TMPFILE, 1, [i_op->tmpfile() exists])
|
||||||
AC_DEFINE(HAVE_TMPFILE_USERNS, 1, [i_op->tmpfile() has userns])
|
AC_DEFINE(HAVE_TMPFILE_IDMAP, 1, [i_op->tmpfile() has mnt_idmap])
|
||||||
],[
|
], [
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_tmpfile_dentry_userns], [
|
ZFS_LINUX_TEST_RESULT([inode_operations_tmpfile], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_TMPFILE, 1, [i_op->tmpfile() exists])
|
AC_DEFINE(HAVE_TMPFILE, 1, [i_op->tmpfile() exists])
|
||||||
AC_DEFINE(HAVE_TMPFILE_USERNS, 1, [i_op->tmpfile() has userns])
|
AC_DEFINE(HAVE_TMPFILE_USERNS, 1, [i_op->tmpfile() has userns])
|
||||||
AC_DEFINE(HAVE_TMPFILE_DENTRY, 1, [i_op->tmpfile() uses old dentry signature])
|
|
||||||
],[
|
],[
|
||||||
ZFS_LINUX_TEST_RESULT([inode_operations_tmpfile_dentry], [
|
ZFS_LINUX_TEST_RESULT([inode_operations_tmpfile_dentry_userns], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_TMPFILE, 1, [i_op->tmpfile() exists])
|
AC_DEFINE(HAVE_TMPFILE, 1, [i_op->tmpfile() exists])
|
||||||
|
AC_DEFINE(HAVE_TMPFILE_USERNS, 1, [i_op->tmpfile() has userns])
|
||||||
AC_DEFINE(HAVE_TMPFILE_DENTRY, 1, [i_op->tmpfile() uses old dentry signature])
|
AC_DEFINE(HAVE_TMPFILE_DENTRY, 1, [i_op->tmpfile() uses old dentry signature])
|
||||||
],[
|
],[
|
||||||
ZFS_LINUX_REQUIRE_API([i_op->tmpfile()], [3.11])
|
ZFS_LINUX_TEST_RESULT([inode_operations_tmpfile_dentry], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_TMPFILE, 1, [i_op->tmpfile() exists])
|
||||||
|
AC_DEFINE(HAVE_TMPFILE_DENTRY, 1, [i_op->tmpfile() uses old dentry signature])
|
||||||
|
],[
|
||||||
|
ZFS_LINUX_REQUIRE_API([i_op->tmpfile()], [3.11])
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_WRITEPAGE_T], [
|
||||||
|
dnl #
|
||||||
|
dnl # 6.3 API change
|
||||||
|
dnl # The writepage_t function type now has its first argument as
|
||||||
|
dnl # struct folio* instead of struct page*
|
||||||
|
dnl #
|
||||||
|
ZFS_LINUX_TEST_SRC([writepage_t_folio], [
|
||||||
|
#include <linux/writeback.h>
|
||||||
|
int putpage(struct folio *folio,
|
||||||
|
struct writeback_control *wbc, void *data)
|
||||||
|
{ return 0; }
|
||||||
|
writepage_t func = putpage;
|
||||||
|
],[])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_WRITEPAGE_T], [
|
||||||
|
AC_MSG_CHECKING([whether int (*writepage_t)() takes struct folio*])
|
||||||
|
ZFS_LINUX_TEST_RESULT([writepage_t_folio], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_WRITEPAGE_T_FOLIO, 1,
|
||||||
|
[int (*writepage_t)() takes struct folio*])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
@@ -179,6 +179,21 @@ dnl #
|
|||||||
dnl # Supported xattr handler set() interfaces checked newest to oldest.
|
dnl # Supported xattr handler set() interfaces checked newest to oldest.
|
||||||
dnl #
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_XATTR_HANDLER_SET], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_XATTR_HANDLER_SET], [
|
||||||
|
ZFS_LINUX_TEST_SRC([xattr_handler_set_mnt_idmap], [
|
||||||
|
#include <linux/xattr.h>
|
||||||
|
|
||||||
|
int set(const struct xattr_handler *handler,
|
||||||
|
struct mnt_idmap *idmap,
|
||||||
|
struct dentry *dentry, struct inode *inode,
|
||||||
|
const char *name, const void *buffer,
|
||||||
|
size_t size, int flags)
|
||||||
|
{ return 0; }
|
||||||
|
static const struct xattr_handler
|
||||||
|
xops __attribute__ ((unused)) = {
|
||||||
|
.set = set,
|
||||||
|
};
|
||||||
|
],[])
|
||||||
|
|
||||||
ZFS_LINUX_TEST_SRC([xattr_handler_set_userns], [
|
ZFS_LINUX_TEST_SRC([xattr_handler_set_userns], [
|
||||||
#include <linux/xattr.h>
|
#include <linux/xattr.h>
|
||||||
|
|
||||||
@@ -240,53 +255,63 @@ AC_DEFUN([ZFS_AC_KERNEL_XATTR_HANDLER_SET], [
|
|||||||
dnl # The xattr_handler->set() callback was changed to 8 arguments, and
|
dnl # The xattr_handler->set() callback was changed to 8 arguments, and
|
||||||
dnl # struct user_namespace* was inserted as arg #2
|
dnl # struct user_namespace* was inserted as arg #2
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_CHECKING([whether xattr_handler->set() wants dentry, inode, and user_namespace])
|
dnl # 6.3 API change,
|
||||||
ZFS_LINUX_TEST_RESULT([xattr_handler_set_userns], [
|
dnl # The xattr_handler->set() callback 2nd arg is now struct mnt_idmap *
|
||||||
|
dnl #
|
||||||
|
AC_MSG_CHECKING([whether xattr_handler->set() wants dentry, inode, and mnt_idmap])
|
||||||
|
ZFS_LINUX_TEST_RESULT([xattr_handler_set_mnt_idmap], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_XATTR_SET_USERNS, 1,
|
AC_DEFINE(HAVE_XATTR_SET_IDMAP, 1,
|
||||||
[xattr_handler->set() takes user_namespace])
|
[xattr_handler->set() takes mnt_idmap])
|
||||||
],[
|
], [
|
||||||
dnl #
|
AC_MSG_CHECKING([whether xattr_handler->set() wants dentry, inode, and user_namespace])
|
||||||
dnl # 4.7 API change,
|
ZFS_LINUX_TEST_RESULT([xattr_handler_set_userns], [
|
||||||
dnl # The xattr_handler->set() callback was changed to take both
|
|
||||||
dnl # dentry and inode.
|
|
||||||
dnl #
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
AC_MSG_CHECKING([whether xattr_handler->set() wants dentry and inode])
|
|
||||||
ZFS_LINUX_TEST_RESULT([xattr_handler_set_dentry_inode], [
|
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_XATTR_SET_DENTRY_INODE, 1,
|
AC_DEFINE(HAVE_XATTR_SET_USERNS, 1,
|
||||||
[xattr_handler->set() wants both dentry and inode])
|
[xattr_handler->set() takes user_namespace])
|
||||||
],[
|
],[
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 4.4 API change,
|
dnl # 4.7 API change,
|
||||||
dnl # The xattr_handler->set() callback was changed to take a
|
dnl # The xattr_handler->set() callback was changed to take both
|
||||||
dnl # xattr_handler, and handler_flags argument was removed and
|
dnl # dentry and inode.
|
||||||
dnl # should be accessed by handler->flags.
|
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(
|
AC_MSG_CHECKING([whether xattr_handler->set() wants dentry and inode])
|
||||||
[whether xattr_handler->set() wants xattr_handler])
|
ZFS_LINUX_TEST_RESULT([xattr_handler_set_dentry_inode], [
|
||||||
ZFS_LINUX_TEST_RESULT([xattr_handler_set_xattr_handler], [
|
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_XATTR_SET_HANDLER, 1,
|
AC_DEFINE(HAVE_XATTR_SET_DENTRY_INODE, 1,
|
||||||
[xattr_handler->set() wants xattr_handler])
|
[xattr_handler->set() wants both dentry and inode])
|
||||||
],[
|
],[
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 2.6.33 API change,
|
dnl # 4.4 API change,
|
||||||
dnl # The xattr_handler->set() callback was changed
|
dnl # The xattr_handler->set() callback was changed to take a
|
||||||
dnl # to take a dentry instead of an inode, and a
|
dnl # xattr_handler, and handler_flags argument was removed and
|
||||||
dnl # handler_flags argument was added.
|
dnl # should be accessed by handler->flags.
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(
|
AC_MSG_CHECKING(
|
||||||
[whether xattr_handler->set() wants dentry])
|
[whether xattr_handler->set() wants xattr_handler])
|
||||||
ZFS_LINUX_TEST_RESULT([xattr_handler_set_dentry], [
|
ZFS_LINUX_TEST_RESULT([xattr_handler_set_xattr_handler], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_XATTR_SET_DENTRY, 1,
|
AC_DEFINE(HAVE_XATTR_SET_HANDLER, 1,
|
||||||
[xattr_handler->set() wants dentry])
|
[xattr_handler->set() wants xattr_handler])
|
||||||
],[
|
],[
|
||||||
ZFS_LINUX_TEST_ERROR([xattr set()])
|
dnl #
|
||||||
|
dnl # 2.6.33 API change,
|
||||||
|
dnl # The xattr_handler->set() callback was changed
|
||||||
|
dnl # to take a dentry instead of an inode, and a
|
||||||
|
dnl # handler_flags argument was added.
|
||||||
|
dnl #
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
AC_MSG_CHECKING(
|
||||||
|
[whether xattr_handler->set() wants dentry])
|
||||||
|
ZFS_LINUX_TEST_RESULT([xattr_handler_set_dentry], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_XATTR_SET_DENTRY, 1,
|
||||||
|
[xattr_handler->set() wants dentry])
|
||||||
|
],[
|
||||||
|
ZFS_LINUX_TEST_ERROR([xattr set()])
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
+22
-2
@@ -69,6 +69,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
|||||||
ZFS_AC_KERNEL_SRC_INODE_OWNER_OR_CAPABLE
|
ZFS_AC_KERNEL_SRC_INODE_OWNER_OR_CAPABLE
|
||||||
ZFS_AC_KERNEL_SRC_XATTR
|
ZFS_AC_KERNEL_SRC_XATTR
|
||||||
ZFS_AC_KERNEL_SRC_ACL
|
ZFS_AC_KERNEL_SRC_ACL
|
||||||
|
ZFS_AC_KERNEL_SRC_INODE_SETATTR
|
||||||
ZFS_AC_KERNEL_SRC_INODE_GETATTR
|
ZFS_AC_KERNEL_SRC_INODE_GETATTR
|
||||||
ZFS_AC_KERNEL_SRC_INODE_SET_FLAGS
|
ZFS_AC_KERNEL_SRC_INODE_SET_FLAGS
|
||||||
ZFS_AC_KERNEL_SRC_INODE_SET_IVERSION
|
ZFS_AC_KERNEL_SRC_INODE_SET_IVERSION
|
||||||
@@ -130,7 +131,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
|||||||
ZFS_AC_KERNEL_SRC_KSTRTOUL
|
ZFS_AC_KERNEL_SRC_KSTRTOUL
|
||||||
ZFS_AC_KERNEL_SRC_PERCPU
|
ZFS_AC_KERNEL_SRC_PERCPU
|
||||||
ZFS_AC_KERNEL_SRC_CPU_HOTPLUG
|
ZFS_AC_KERNEL_SRC_CPU_HOTPLUG
|
||||||
ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR_USERNS
|
ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR
|
||||||
ZFS_AC_KERNEL_SRC_MKNOD
|
ZFS_AC_KERNEL_SRC_MKNOD
|
||||||
ZFS_AC_KERNEL_SRC_SYMLINK
|
ZFS_AC_KERNEL_SRC_SYMLINK
|
||||||
ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS
|
ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS
|
||||||
@@ -144,6 +145,15 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
|||||||
ZFS_AC_KERNEL_SRC_KTHREAD
|
ZFS_AC_KERNEL_SRC_KTHREAD
|
||||||
ZFS_AC_KERNEL_SRC_ZERO_PAGE
|
ZFS_AC_KERNEL_SRC_ZERO_PAGE
|
||||||
ZFS_AC_KERNEL_SRC___COPY_FROM_USER_INATOMIC
|
ZFS_AC_KERNEL_SRC___COPY_FROM_USER_INATOMIC
|
||||||
|
ZFS_AC_KERNEL_SRC_FILEMAP
|
||||||
|
ZFS_AC_KERNEL_SRC_WRITEPAGE_T
|
||||||
|
ZFS_AC_KERNEL_SRC_RECLAIMED
|
||||||
|
case "$host_cpu" in
|
||||||
|
powerpc*)
|
||||||
|
ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
|
||||||
|
ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
AC_MSG_CHECKING([for available kernel interfaces])
|
AC_MSG_CHECKING([for available kernel interfaces])
|
||||||
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
|
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
|
||||||
@@ -186,6 +196,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
|||||||
ZFS_AC_KERNEL_INODE_OWNER_OR_CAPABLE
|
ZFS_AC_KERNEL_INODE_OWNER_OR_CAPABLE
|
||||||
ZFS_AC_KERNEL_XATTR
|
ZFS_AC_KERNEL_XATTR
|
||||||
ZFS_AC_KERNEL_ACL
|
ZFS_AC_KERNEL_ACL
|
||||||
|
ZFS_AC_KERNEL_INODE_SETATTR
|
||||||
ZFS_AC_KERNEL_INODE_GETATTR
|
ZFS_AC_KERNEL_INODE_GETATTR
|
||||||
ZFS_AC_KERNEL_INODE_SET_FLAGS
|
ZFS_AC_KERNEL_INODE_SET_FLAGS
|
||||||
ZFS_AC_KERNEL_INODE_SET_IVERSION
|
ZFS_AC_KERNEL_INODE_SET_IVERSION
|
||||||
@@ -247,7 +258,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
|||||||
ZFS_AC_KERNEL_KSTRTOUL
|
ZFS_AC_KERNEL_KSTRTOUL
|
||||||
ZFS_AC_KERNEL_PERCPU
|
ZFS_AC_KERNEL_PERCPU
|
||||||
ZFS_AC_KERNEL_CPU_HOTPLUG
|
ZFS_AC_KERNEL_CPU_HOTPLUG
|
||||||
ZFS_AC_KERNEL_GENERIC_FILLATTR_USERNS
|
ZFS_AC_KERNEL_GENERIC_FILLATTR
|
||||||
ZFS_AC_KERNEL_MKNOD
|
ZFS_AC_KERNEL_MKNOD
|
||||||
ZFS_AC_KERNEL_SYMLINK
|
ZFS_AC_KERNEL_SYMLINK
|
||||||
ZFS_AC_KERNEL_BIO_MAX_SEGS
|
ZFS_AC_KERNEL_BIO_MAX_SEGS
|
||||||
@@ -261,6 +272,15 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
|||||||
ZFS_AC_KERNEL_KTHREAD
|
ZFS_AC_KERNEL_KTHREAD
|
||||||
ZFS_AC_KERNEL_ZERO_PAGE
|
ZFS_AC_KERNEL_ZERO_PAGE
|
||||||
ZFS_AC_KERNEL___COPY_FROM_USER_INATOMIC
|
ZFS_AC_KERNEL___COPY_FROM_USER_INATOMIC
|
||||||
|
ZFS_AC_KERNEL_FILEMAP
|
||||||
|
ZFS_AC_KERNEL_WRITEPAGE_T
|
||||||
|
ZFS_AC_KERNEL_RECLAIMED
|
||||||
|
case "$host_cpu" in
|
||||||
|
powerpc*)
|
||||||
|
ZFS_AC_KERNEL_CPU_HAS_FEATURE
|
||||||
|
ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE
|
||||||
|
;;
|
||||||
|
esac
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
|
|||||||
+11
-27
@@ -81,7 +81,7 @@ AC_DEFUN([ZFS_AC_DEBUG], [
|
|||||||
AC_DEFUN([ZFS_AC_DEBUGINFO_ENABLE], [
|
AC_DEFUN([ZFS_AC_DEBUGINFO_ENABLE], [
|
||||||
DEBUG_CFLAGS="$DEBUG_CFLAGS -g -fno-inline $NO_IPA_SRA"
|
DEBUG_CFLAGS="$DEBUG_CFLAGS -g -fno-inline $NO_IPA_SRA"
|
||||||
|
|
||||||
KERNEL_DEBUG_CFLAGS="$KERNEL_DEBUG_CFLAGS -fno-inline $NO_IPA_SRA"
|
KERNEL_DEBUG_CFLAGS="$KERNEL_DEBUG_CFLAGS -fno-inline $KERNEL_NO_IPA_SRA"
|
||||||
KERNEL_MAKE="$KERNEL_MAKE CONFIG_DEBUG_INFO=y"
|
KERNEL_MAKE="$KERNEL_MAKE CONFIG_DEBUG_INFO=y"
|
||||||
|
|
||||||
DEBUGINFO_ZFS="_with_debuginfo"
|
DEBUGINFO_ZFS="_with_debuginfo"
|
||||||
@@ -217,6 +217,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
|
|||||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH
|
ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH
|
||||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER
|
ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER
|
||||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA
|
ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA
|
||||||
|
ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_IPA_SRA
|
||||||
ZFS_AC_CONFIG_ALWAYS_CC_ASAN
|
ZFS_AC_CONFIG_ALWAYS_CC_ASAN
|
||||||
ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD
|
ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD
|
||||||
ZFS_AC_CONFIG_ALWAYS_SYSTEM
|
ZFS_AC_CONFIG_ALWAYS_SYSTEM
|
||||||
@@ -518,6 +519,8 @@ AC_DEFUN([ZFS_AC_DEFAULT_PACKAGE], [
|
|||||||
VENDOR=alpine ;
|
VENDOR=alpine ;
|
||||||
elif test -f /bin/freebsd-version ; then
|
elif test -f /bin/freebsd-version ; then
|
||||||
VENDOR=freebsd ;
|
VENDOR=freebsd ;
|
||||||
|
elif test -f /etc/openEuler-release ; then
|
||||||
|
VENDOR=openeuler ;
|
||||||
else
|
else
|
||||||
VENDOR= ;
|
VENDOR= ;
|
||||||
fi],
|
fi],
|
||||||
@@ -542,6 +545,7 @@ AC_DEFUN([ZFS_AC_DEFAULT_PACKAGE], [
|
|||||||
ubuntu) DEFAULT_PACKAGE=deb ;;
|
ubuntu) DEFAULT_PACKAGE=deb ;;
|
||||||
debian) DEFAULT_PACKAGE=deb ;;
|
debian) DEFAULT_PACKAGE=deb ;;
|
||||||
freebsd) DEFAULT_PACKAGE=pkg ;;
|
freebsd) DEFAULT_PACKAGE=pkg ;;
|
||||||
|
openeuler) DEFAULT_PACKAGE=rpm ;;
|
||||||
*) DEFAULT_PACKAGE=rpm ;;
|
*) DEFAULT_PACKAGE=rpm ;;
|
||||||
esac
|
esac
|
||||||
AC_MSG_RESULT([$DEFAULT_PACKAGE])
|
AC_MSG_RESULT([$DEFAULT_PACKAGE])
|
||||||
@@ -555,35 +559,14 @@ AC_DEFUN([ZFS_AC_DEFAULT_PACKAGE], [
|
|||||||
AC_MSG_RESULT([$initdir])
|
AC_MSG_RESULT([$initdir])
|
||||||
AC_SUBST(initdir)
|
AC_SUBST(initdir)
|
||||||
|
|
||||||
AC_MSG_CHECKING([default init script type and shell])
|
AC_MSG_CHECKING([default shell])
|
||||||
case "$VENDOR" in
|
case "$VENDOR" in
|
||||||
toss) DEFAULT_INIT_SCRIPT=redhat ;;
|
gentoo) DEFAULT_INIT_SHELL="/sbin/openrc-run";;
|
||||||
redhat) DEFAULT_INIT_SCRIPT=redhat ;;
|
alpine) DEFAULT_INIT_SHELL="/sbin/openrc-run";;
|
||||||
fedora) DEFAULT_INIT_SCRIPT=fedora ;;
|
*) DEFAULT_INIT_SHELL="/bin/sh" ;;
|
||||||
gentoo) DEFAULT_INIT_SCRIPT=openrc ;;
|
|
||||||
alpine) DEFAULT_INIT_SCRIPT=openrc ;;
|
|
||||||
arch) DEFAULT_INIT_SCRIPT=lsb ;;
|
|
||||||
sles) DEFAULT_INIT_SCRIPT=lsb ;;
|
|
||||||
slackware) DEFAULT_INIT_SCRIPT=lsb ;;
|
|
||||||
lunar) DEFAULT_INIT_SCRIPT=lunar ;;
|
|
||||||
ubuntu) DEFAULT_INIT_SCRIPT=lsb ;;
|
|
||||||
debian) DEFAULT_INIT_SCRIPT=lsb ;;
|
|
||||||
freebsd) DEFAULT_INIT_SCRIPT=freebsd;;
|
|
||||||
*) DEFAULT_INIT_SCRIPT=lsb ;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# On gentoo, it's possible that OpenRC isn't installed. Check if
|
AC_MSG_RESULT([$DEFAULT_INIT_SHELL])
|
||||||
# /sbin/openrc-run exists, and if not, fall back to generic defaults.
|
|
||||||
|
|
||||||
DEFAULT_INIT_SHELL="/bin/sh"
|
|
||||||
AS_IF([test "$DEFAULT_INIT_SCRIPT" = "openrc"], [
|
|
||||||
AS_IF([test -x "/sbin/openrc-run"],
|
|
||||||
[DEFAULT_INIT_SHELL="/sbin/openrc-run"],
|
|
||||||
[DEFAULT_INIT_SCRIPT=lsb])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_MSG_RESULT([$DEFAULT_INIT_SCRIPT:$DEFAULT_INIT_SHELL])
|
|
||||||
AC_SUBST(DEFAULT_INIT_SCRIPT)
|
|
||||||
AC_SUBST(DEFAULT_INIT_SHELL)
|
AC_SUBST(DEFAULT_INIT_SHELL)
|
||||||
|
|
||||||
AC_MSG_CHECKING([default nfs server init script])
|
AC_MSG_CHECKING([default nfs server init script])
|
||||||
@@ -602,6 +585,7 @@ AC_DEFUN([ZFS_AC_DEFAULT_PACKAGE], [
|
|||||||
redhat) initconfdir=/etc/sysconfig ;;
|
redhat) initconfdir=/etc/sysconfig ;;
|
||||||
fedora) initconfdir=/etc/sysconfig ;;
|
fedora) initconfdir=/etc/sysconfig ;;
|
||||||
sles) initconfdir=/etc/sysconfig ;;
|
sles) initconfdir=/etc/sysconfig ;;
|
||||||
|
openeuler) initconfdir=/etc/sysconfig ;;
|
||||||
ubuntu) initconfdir=/etc/default ;;
|
ubuntu) initconfdir=/etc/default ;;
|
||||||
debian) initconfdir=/etc/default ;;
|
debian) initconfdir=/etc/default ;;
|
||||||
freebsd) initconfdir=$sysconfdir/rc.conf.d;;
|
freebsd) initconfdir=$sysconfdir/rc.conf.d;;
|
||||||
|
|||||||
@@ -222,6 +222,7 @@ AC_CONFIG_FILES([
|
|||||||
tests/zfs-tests/cmd/mmap_exec/Makefile
|
tests/zfs-tests/cmd/mmap_exec/Makefile
|
||||||
tests/zfs-tests/cmd/mmap_libaio/Makefile
|
tests/zfs-tests/cmd/mmap_libaio/Makefile
|
||||||
tests/zfs-tests/cmd/mmap_seek/Makefile
|
tests/zfs-tests/cmd/mmap_seek/Makefile
|
||||||
|
tests/zfs-tests/cmd/mmap_sync/Makefile
|
||||||
tests/zfs-tests/cmd/mmapwrite/Makefile
|
tests/zfs-tests/cmd/mmapwrite/Makefile
|
||||||
tests/zfs-tests/cmd/nvlist_to_lua/Makefile
|
tests/zfs-tests/cmd/nvlist_to_lua/Makefile
|
||||||
tests/zfs-tests/cmd/randfree_file/Makefile
|
tests/zfs-tests/cmd/randfree_file/Makefile
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ pkgdracut_SCRIPTS = \
|
|||||||
|
|
||||||
pkgdracut_DATA = \
|
pkgdracut_DATA = \
|
||||||
zfs-env-bootfs.service \
|
zfs-env-bootfs.service \
|
||||||
|
zfs-nonroot-necessities.service \
|
||||||
zfs-snapshot-bootfs.service \
|
zfs-snapshot-bootfs.service \
|
||||||
zfs-rollback-bootfs.service
|
zfs-rollback-bootfs.service
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,9 @@ install() {
|
|||||||
inst_simple "${moddir}/zfs-env-bootfs.service" "${systemdsystemunitdir}/zfs-env-bootfs.service"
|
inst_simple "${moddir}/zfs-env-bootfs.service" "${systemdsystemunitdir}/zfs-env-bootfs.service"
|
||||||
systemctl -q --root "${initdir}" add-wants zfs-import.target zfs-env-bootfs.service
|
systemctl -q --root "${initdir}" add-wants zfs-import.target zfs-env-bootfs.service
|
||||||
|
|
||||||
|
inst_simple "${moddir}/zfs-nonroot-necessities.service" "${systemdsystemunitdir}/zfs-nonroot-necessities.service"
|
||||||
|
systemctl -q --root "${initdir}" add-requires initrd-root-fs.target zfs-nonroot-necessities.service
|
||||||
|
|
||||||
for _service in \
|
for _service in \
|
||||||
"zfs-import-scan.service" \
|
"zfs-import-scan.service" \
|
||||||
"zfs-import-cache.service"; do
|
"zfs-import-cache.service"; do
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=Set BOOTFS environment for dracut
|
Description=Set BOOTFS and BOOTFSFLAGS environment variables for dracut
|
||||||
Documentation=man:zpool(8)
|
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
After=zfs-import-cache.service
|
After=zfs-import-cache.service
|
||||||
After=zfs-import-scan.service
|
After=zfs-import-scan.service
|
||||||
@@ -8,7 +7,17 @@ Before=zfs-import.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
ExecStart=/bin/sh -c "exec systemctl set-environment BOOTFS=$(@sbindir@/zpool list -H -o bootfs | grep -m1 -vFx -)"
|
ExecStart=/bin/sh -c ' \
|
||||||
|
. /lib/dracut-zfs-lib.sh; \
|
||||||
|
decode_root_args || exit 0; \
|
||||||
|
[ "$root" = "zfs:AUTO" ] && root="$(@sbindir@/zpool list -H -o bootfs | grep -m1 -vFx -)"; \
|
||||||
|
rootflags="$(getarg rootflags=)"; \
|
||||||
|
case ",$rootflags," in \
|
||||||
|
*,zfsutil,*) ;; \
|
||||||
|
,,) rootflags=zfsutil ;; \
|
||||||
|
*) rootflags="zfsutil,$rootflags" ;; \
|
||||||
|
esac; \
|
||||||
|
exec systemctl set-environment BOOTFS="$root" BOOTFSFLAGS="$rootflags"'
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=zfs-import.target
|
WantedBy=zfs-import.target
|
||||||
|
|||||||
@@ -14,81 +14,24 @@ GENERATOR_DIR="$1"
|
|||||||
. /lib/dracut-zfs-lib.sh
|
. /lib/dracut-zfs-lib.sh
|
||||||
decode_root_args || exit 0
|
decode_root_args || exit 0
|
||||||
|
|
||||||
[ -z "${rootflags}" ] && rootflags=$(getarg rootflags=)
|
|
||||||
case ",${rootflags}," in
|
|
||||||
*,zfsutil,*) ;;
|
|
||||||
,,) rootflags=zfsutil ;;
|
|
||||||
*) rootflags="zfsutil,${rootflags}" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
[ -n "$debug" ] && echo "zfs-generator: writing extension for sysroot.mount to $GENERATOR_DIR/sysroot.mount.d/zfs-enhancement.conf" >> /dev/kmsg
|
[ -n "$debug" ] && echo "zfs-generator: writing extension for sysroot.mount to $GENERATOR_DIR/sysroot.mount.d/zfs-enhancement.conf" >> /dev/kmsg
|
||||||
|
|
||||||
|
|
||||||
mkdir -p "$GENERATOR_DIR"/sysroot.mount.d "$GENERATOR_DIR"/initrd-root-fs.target.requires "$GENERATOR_DIR"/dracut-pre-mount.service.d
|
mkdir -p "$GENERATOR_DIR"/sysroot.mount.d "$GENERATOR_DIR"/dracut-pre-mount.service.d
|
||||||
|
|
||||||
{
|
{
|
||||||
echo "[Unit]"
|
echo "[Unit]"
|
||||||
echo "Before=initrd-root-fs.target"
|
echo "Before=initrd-root-fs.target"
|
||||||
echo "After=zfs-import.target"
|
echo "After=zfs-import.target"
|
||||||
echo
|
echo
|
||||||
echo "[Mount]"
|
echo "[Mount]"
|
||||||
if [ "${root}" = "zfs:AUTO" ]; then
|
echo "PassEnvironment=BOOTFS BOOTFSFLAGS"
|
||||||
echo "PassEnvironment=BOOTFS"
|
echo 'What=${BOOTFS}'
|
||||||
echo 'What=${BOOTFS}'
|
|
||||||
else
|
|
||||||
echo "What=${root}"
|
|
||||||
fi
|
|
||||||
echo "Type=zfs"
|
echo "Type=zfs"
|
||||||
echo "Options=${rootflags}"
|
echo 'Options=${BOOTFSFLAGS}'
|
||||||
} > "$GENERATOR_DIR"/sysroot.mount.d/zfs-enhancement.conf
|
} > "$GENERATOR_DIR"/sysroot.mount.d/zfs-enhancement.conf
|
||||||
ln -fs ../sysroot.mount "$GENERATOR_DIR"/initrd-root-fs.target.requires/sysroot.mount
|
ln -fs ../sysroot.mount "$GENERATOR_DIR"/initrd-root-fs.target.requires/sysroot.mount
|
||||||
|
|
||||||
|
|
||||||
if [ "${root}" = "zfs:AUTO" ]; then
|
|
||||||
{
|
|
||||||
echo "[Unit]"
|
|
||||||
echo "Before=initrd-root-fs.target"
|
|
||||||
echo "After=sysroot.mount"
|
|
||||||
echo "DefaultDependencies=no"
|
|
||||||
echo
|
|
||||||
echo "[Service]"
|
|
||||||
echo "Type=oneshot"
|
|
||||||
echo "PassEnvironment=BOOTFS"
|
|
||||||
echo "ExecStart=/bin/sh -c '" ' \
|
|
||||||
. /lib/dracut-zfs-lib.sh; \
|
|
||||||
_zfs_nonroot_necessities_cb() { \
|
|
||||||
zfs mount | grep -m1 -q "^$1 " && return 0; \
|
|
||||||
echo "Mounting $1 on /sysroot$2"; \
|
|
||||||
mount -o zfsutil -t zfs "$1" "/sysroot$2"; \
|
|
||||||
}; \
|
|
||||||
for_relevant_root_children "${BOOTFS}" _zfs_nonroot_necessities_cb;' \
|
|
||||||
"'"
|
|
||||||
} > "$GENERATOR_DIR"/zfs-nonroot-necessities.service
|
|
||||||
ln -fs ../zfs-nonroot-necessities.service "$GENERATOR_DIR"/initrd-root-fs.target.requires/zfs-nonroot-necessities.service
|
|
||||||
else
|
|
||||||
# We can solve this statically at generation time, so do!
|
|
||||||
_zfs_generator_cb() {
|
|
||||||
dset="${1}"
|
|
||||||
mpnt="${2}"
|
|
||||||
unit="$(systemd-escape --suffix=mount -p "/sysroot${mpnt}")"
|
|
||||||
|
|
||||||
{
|
|
||||||
echo "[Unit]"
|
|
||||||
echo "Before=initrd-root-fs.target"
|
|
||||||
echo "After=sysroot.mount"
|
|
||||||
echo
|
|
||||||
echo "[Mount]"
|
|
||||||
echo "Where=/sysroot${mpnt}"
|
|
||||||
echo "What=${dset}"
|
|
||||||
echo "Type=zfs"
|
|
||||||
echo "Options=zfsutil"
|
|
||||||
} > "$GENERATOR_DIR/${unit}"
|
|
||||||
ln -fs ../"${unit}" "$GENERATOR_DIR"/initrd-root-fs.target.requires/"${unit}"
|
|
||||||
}
|
|
||||||
|
|
||||||
for_relevant_root_children "${root}" _zfs_generator_cb
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
echo "[Unit]"
|
echo "[Unit]"
|
||||||
echo "After=zfs-import.target"
|
echo "After=zfs-import.target"
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ mount_dataset() {
|
|||||||
|
|
||||||
# for_relevant_root_children DATASET EXEC
|
# for_relevant_root_children DATASET EXEC
|
||||||
# Runs "EXEC dataset mountpoint" for all children of DATASET that are needed for system bringup
|
# Runs "EXEC dataset mountpoint" for all children of DATASET that are needed for system bringup
|
||||||
# Used by zfs-generator.sh and friends, too!
|
# Used by zfs-nonroot-necessities.service and friends, too!
|
||||||
for_relevant_root_children() {
|
for_relevant_root_children() {
|
||||||
dataset="${1}"
|
dataset="${1}"
|
||||||
exec="${2}"
|
exec="${2}"
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
[Unit]
|
||||||
|
Before=initrd-root-fs.target
|
||||||
|
After=sysroot.mount
|
||||||
|
DefaultDependencies=no
|
||||||
|
ConditionEnvironment=BOOTFS
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
PassEnvironment=BOOTFS
|
||||||
|
ExecStart=/bin/sh -c ' \
|
||||||
|
. /lib/dracut-zfs-lib.sh; \
|
||||||
|
_zfs_nonroot_necessities_cb() { \
|
||||||
|
@sbindir@/zfs mount | grep -m1 -q "^$1 " && return 0; \
|
||||||
|
echo "Mounting $1 on /sysroot$2"; \
|
||||||
|
mount -o zfsutil -t zfs "$1" "/sysroot$2"; \
|
||||||
|
}; \
|
||||||
|
for_relevant_root_children "${BOOTFS}" _zfs_nonroot_necessities_cb'
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
RequiredBy=initrd-root-fs.target
|
||||||
@@ -5,8 +5,9 @@ After=zfs-import.target dracut-pre-mount.service zfs-snapshot-bootfs.service
|
|||||||
Before=dracut-mount.service
|
Before=dracut-mount.service
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
ConditionKernelCommandLine=bootfs.rollback
|
ConditionKernelCommandLine=bootfs.rollback
|
||||||
|
ConditionEnvironment=BOOTFS
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
ExecStart=/bin/sh -c '. /lib/dracut-zfs-lib.sh; decode_root_args || exit; [ "$root" = "zfs:AUTO" ] && root="$BOOTFS"; SNAPNAME="$(getarg bootfs.rollback)"; exec @sbindir@/zfs rollback -Rf "$root@${SNAPNAME:-%v}"'
|
ExecStart=/bin/sh -c '. /lib/dracut-lib.sh; SNAPNAME="$(getarg bootfs.rollback)"; exec @sbindir@/zfs rollback -Rf "$BOOTFS@${SNAPNAME:-%v}"'
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
|
|||||||
@@ -5,8 +5,9 @@ After=zfs-import.target dracut-pre-mount.service
|
|||||||
Before=dracut-mount.service
|
Before=dracut-mount.service
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
ConditionKernelCommandLine=bootfs.snapshot
|
ConditionKernelCommandLine=bootfs.snapshot
|
||||||
|
ConditionEnvironment=BOOTFS
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
ExecStart=-/bin/sh -c '. /lib/dracut-zfs-lib.sh; decode_root_args || exit; [ "$root" = "zfs:AUTO" ] && root="$BOOTFS"; SNAPNAME="$(getarg bootfs.snapshot)"; exec @sbindir@/zfs snapshot "$root@${SNAPNAME:-%v}"'
|
ExecStart=-/bin/sh -c '. /lib/dracut-lib.sh; SNAPNAME="$(getarg bootfs.snapshot)"; exec @sbindir@/zfs snapshot "$BOOTFS@${SNAPNAME:-%v}"'
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
|
|||||||
@@ -7,5 +7,6 @@ dist_scripts_SCRIPTS = \
|
|||||||
|
|
||||||
SUBDIRS = local-top
|
SUBDIRS = local-top
|
||||||
|
|
||||||
|
SHELLCHECK_IGNORE = ,SC2295
|
||||||
SHELLCHECKDIRS = $(SUBDIRS)
|
SHELLCHECKDIRS = $(SUBDIRS)
|
||||||
SHELLCHECK_SHELL = sh
|
SHELLCHECK_SHELL = sh
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ import_pool()
|
|||||||
|
|
||||||
# Verify that the pool isn't already imported
|
# Verify that the pool isn't already imported
|
||||||
# Make as sure as we can to not require '-f' to import.
|
# Make as sure as we can to not require '-f' to import.
|
||||||
"${ZPOOL}" get name,guid -o value -H 2>/dev/null | grep -Fxq "$pool" && return 0
|
"${ZPOOL}" get -H -o value name,guid 2>/dev/null | grep -Fxq "$pool" && return 0
|
||||||
|
|
||||||
# For backwards compatibility, make sure that ZPOOL_IMPORT_PATH is set
|
# For backwards compatibility, make sure that ZPOOL_IMPORT_PATH is set
|
||||||
# to something we can use later with the real import(s). We want to
|
# to something we can use later with the real import(s). We want to
|
||||||
@@ -326,7 +326,7 @@ mount_fs()
|
|||||||
|
|
||||||
# Need the _original_ datasets mountpoint!
|
# Need the _original_ datasets mountpoint!
|
||||||
mountpoint=$(get_fs_value "$fs" mountpoint)
|
mountpoint=$(get_fs_value "$fs" mountpoint)
|
||||||
ZFS_CMD="mount.zfs -o zfsutil"
|
ZFS_CMD="mount -o zfsutil -t zfs"
|
||||||
if [ "$mountpoint" = "legacy" ] || [ "$mountpoint" = "none" ]; then
|
if [ "$mountpoint" = "legacy" ] || [ "$mountpoint" = "none" ]; then
|
||||||
# Can't use the mountpoint property. Might be one of our
|
# Can't use the mountpoint property. Might be one of our
|
||||||
# clones. Check the 'org.zol:mountpoint' property set in
|
# clones. Check the 'org.zol:mountpoint' property set in
|
||||||
@@ -341,7 +341,10 @@ mount_fs()
|
|||||||
# isn't the root fs.
|
# isn't the root fs.
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
ZFS_CMD="mount.zfs"
|
# Don't use mount.zfs -o zfsutils for legacy mountpoint
|
||||||
|
if [ "$mountpoint" = "legacy" ]; then
|
||||||
|
ZFS_CMD="mount -t zfs"
|
||||||
|
fi
|
||||||
# Last hail-mary: Hope 'rootmnt' is set!
|
# Last hail-mary: Hope 'rootmnt' is set!
|
||||||
mountpoint=""
|
mountpoint=""
|
||||||
else
|
else
|
||||||
@@ -880,12 +883,12 @@ mountroot()
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# In case the pool was specified as guid, resolve guid to name
|
# In case the pool was specified as guid, resolve guid to name
|
||||||
pool="$("${ZPOOL}" get name,guid -o name,value -H | \
|
pool="$("${ZPOOL}" get -H -o name,value name,guid | \
|
||||||
awk -v pool="${ZFS_RPOOL}" '$2 == pool { print $1 }')"
|
awk -v pool="${ZFS_RPOOL}" '$2 == pool { print $1 }')"
|
||||||
if [ -n "$pool" ]; then
|
if [ -n "$pool" ]; then
|
||||||
# If $ZFS_BOOTFS contains guid, replace the guid portion with $pool
|
# If $ZFS_BOOTFS contains guid, replace the guid portion with $pool
|
||||||
ZFS_BOOTFS=$(echo "$ZFS_BOOTFS" | \
|
ZFS_BOOTFS=$(echo "$ZFS_BOOTFS" | \
|
||||||
sed -e "s/$("${ZPOOL}" get guid -o value "$pool" -H)/$pool/g")
|
sed -e "s/$("${ZPOOL}" get -H -o value guid "$pool")/$pool/g")
|
||||||
ZFS_RPOOL="${pool}"
|
ZFS_RPOOL="${pool}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -911,7 +914,7 @@ mountroot()
|
|||||||
echo " not specified on the kernel command line."
|
echo " not specified on the kernel command line."
|
||||||
echo ""
|
echo ""
|
||||||
echo "Manually mount the root filesystem on $rootmnt and then exit."
|
echo "Manually mount the root filesystem on $rootmnt and then exit."
|
||||||
echo "Hint: Try: mount.zfs -o zfsutil ${ZFS_RPOOL-rpool}/ROOT/system $rootmnt"
|
echo "Hint: Try: mount -o zfsutil -t zfs ${ZFS_RPOOL-rpool}/ROOT/system $rootmnt"
|
||||||
shell
|
shell
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -548,16 +548,11 @@ zfs_key_config_modify_session_counter(pam_handle_t *pamh,
|
|||||||
errno);
|
errno);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
size_t runtime_path_len = strlen(runtime_path);
|
|
||||||
size_t counter_path_len = runtime_path_len + 1 + 10;
|
char *counter_path;
|
||||||
char *counter_path = malloc(counter_path_len + 1);
|
if (asprintf(&counter_path, "%s/%u", runtime_path, config->uid) == -1)
|
||||||
if (!counter_path) {
|
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
|
||||||
counter_path[0] = 0;
|
|
||||||
strcat(counter_path, runtime_path);
|
|
||||||
snprintf(counter_path + runtime_path_len, counter_path_len, "/%d",
|
|
||||||
config->uid);
|
|
||||||
const int fd = open(counter_path,
|
const int fd = open(counter_path,
|
||||||
O_RDWR | O_CLOEXEC | O_CREAT | O_NOFOLLOW,
|
O_RDWR | O_CLOEXEC | O_CREAT | O_NOFOLLOW,
|
||||||
S_IRUSR | S_IWUSR);
|
S_IRUSR | S_IWUSR);
|
||||||
|
|||||||
@@ -29,13 +29,12 @@ setup(
|
|||||||
"Development Status :: 4 - Beta",
|
"Development Status :: 4 - Beta",
|
||||||
"Intended Audience :: Developers",
|
"Intended Audience :: Developers",
|
||||||
"License :: OSI Approved :: Apache Software License",
|
"License :: OSI Approved :: Apache Software License",
|
||||||
"Programming Language :: Python :: 2",
|
|
||||||
"Programming Language :: Python :: 2.7",
|
|
||||||
"Programming Language :: Python :: 3",
|
"Programming Language :: Python :: 3",
|
||||||
"Programming Language :: Python :: 3.4",
|
|
||||||
"Programming Language :: Python :: 3.5",
|
|
||||||
"Programming Language :: Python :: 3.6",
|
"Programming Language :: Python :: 3.6",
|
||||||
"Programming Language :: Python :: 3.7",
|
"Programming Language :: Python :: 3.7",
|
||||||
|
"Programming Language :: Python :: 3.8",
|
||||||
|
"Programming Language :: Python :: 3.9",
|
||||||
|
"Programming Language :: Python :: 3.10",
|
||||||
"Topic :: System :: Filesystems",
|
"Topic :: System :: Filesystems",
|
||||||
"Topic :: Software Development :: Libraries",
|
"Topic :: Software Development :: Libraries",
|
||||||
],
|
],
|
||||||
@@ -53,7 +52,7 @@ setup(
|
|||||||
setup_requires=[
|
setup_requires=[
|
||||||
"cffi",
|
"cffi",
|
||||||
],
|
],
|
||||||
python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,<4',
|
python_requires='>=3.6,<4',
|
||||||
zip_safe=False,
|
zip_safe=False,
|
||||||
test_suite="libzfs_core.test",
|
test_suite="libzfs_core.test",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -307,6 +307,7 @@ extern int zpool_vdev_remove_cancel(zpool_handle_t *);
|
|||||||
extern int zpool_vdev_indirect_size(zpool_handle_t *, const char *, uint64_t *);
|
extern int zpool_vdev_indirect_size(zpool_handle_t *, const char *, uint64_t *);
|
||||||
extern int zpool_vdev_split(zpool_handle_t *, char *, nvlist_t **, nvlist_t *,
|
extern int zpool_vdev_split(zpool_handle_t *, char *, nvlist_t **, nvlist_t *,
|
||||||
splitflags_t);
|
splitflags_t);
|
||||||
|
_LIBZFS_H int zpool_vdev_remove_wanted(zpool_handle_t *, const char *);
|
||||||
|
|
||||||
extern int zpool_vdev_fault(zpool_handle_t *, uint64_t, vdev_aux_t);
|
extern int zpool_vdev_fault(zpool_handle_t *, uint64_t, vdev_aux_t);
|
||||||
extern int zpool_vdev_degrade(zpool_handle_t *, uint64_t, vdev_aux_t);
|
extern int zpool_vdev_degrade(zpool_handle_t *, uint64_t, vdev_aux_t);
|
||||||
@@ -692,6 +693,9 @@ typedef struct sendflags {
|
|||||||
/* show progress (ie. -v) */
|
/* show progress (ie. -v) */
|
||||||
boolean_t progress;
|
boolean_t progress;
|
||||||
|
|
||||||
|
/* show progress as process title (ie. -V) */
|
||||||
|
boolean_t progressastitle;
|
||||||
|
|
||||||
/* large blocks (>128K) are permitted */
|
/* large blocks (>128K) are permitted */
|
||||||
boolean_t largeblock;
|
boolean_t largeblock;
|
||||||
|
|
||||||
|
|||||||
@@ -150,17 +150,33 @@ int zfs_ioctl_fd(int fd, unsigned long request, struct zfs_cmd *zc);
|
|||||||
/*
|
/*
|
||||||
* List of colors to use
|
* List of colors to use
|
||||||
*/
|
*/
|
||||||
|
#define ANSI_BLACK "\033[0;30m"
|
||||||
#define ANSI_RED "\033[0;31m"
|
#define ANSI_RED "\033[0;31m"
|
||||||
#define ANSI_GREEN "\033[0;32m"
|
#define ANSI_GREEN "\033[0;32m"
|
||||||
#define ANSI_YELLOW "\033[0;33m"
|
#define ANSI_YELLOW "\033[0;33m"
|
||||||
#define ANSI_BLUE "\033[0;34m"
|
#define ANSI_BLUE "\033[0;34m"
|
||||||
|
#define ANSI_BOLD_BLUE "\033[1;34m" /* light blue */
|
||||||
|
#define ANSI_MAGENTA "\033[0;35m"
|
||||||
|
#define ANSI_CYAN "\033[0;36m"
|
||||||
|
#define ANSI_GRAY "\033[0;37m"
|
||||||
|
|
||||||
#define ANSI_RESET "\033[0m"
|
#define ANSI_RESET "\033[0m"
|
||||||
#define ANSI_BOLD "\033[1m"
|
#define ANSI_BOLD "\033[1m"
|
||||||
|
|
||||||
|
int use_color(void);
|
||||||
void color_start(const char *color);
|
void color_start(const char *color);
|
||||||
void color_end(void);
|
void color_end(void);
|
||||||
int printf_color(const char *color, char *format, ...);
|
int printf_color(const char *color, char *format, ...);
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
extern char **environ;
|
||||||
|
_LIBZUTIL_H void zfs_setproctitle_init(int argc, char *argv[], char *envp[]);
|
||||||
|
_LIBZUTIL_H void zfs_setproctitle(const char *fmt, ...);
|
||||||
|
#else
|
||||||
|
#define zfs_setproctitle(fmt, ...) setproctitle(fmt, ##__VA_ARGS__)
|
||||||
|
#define zfs_setproctitle_init(x, y, z) ((void)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These functions are used by the ZFS libraries and cmd/zpool code, but are
|
* These functions are used by the ZFS libraries and cmd/zpool code, but are
|
||||||
* not exported in the ABI.
|
* not exported in the ABI.
|
||||||
|
|||||||
@@ -118,7 +118,8 @@ extern minor_t zfsdev_minor_alloc(void);
|
|||||||
#define Z_ISLNK(type) ((type) == VLNK)
|
#define Z_ISLNK(type) ((type) == VLNK)
|
||||||
#define Z_ISDIR(type) ((type) == VDIR)
|
#define Z_ISDIR(type) ((type) == VDIR)
|
||||||
|
|
||||||
#define zn_has_cached_data(zp) vn_has_cached_data(ZTOV(zp))
|
#define zn_has_cached_data(zp, start, end) \
|
||||||
|
vn_has_cached_data(ZTOV(zp))
|
||||||
#define zn_flush_cached_data(zp, sync) vn_flush_cached_data(ZTOV(zp), sync)
|
#define zn_flush_cached_data(zp, sync) vn_flush_cached_data(ZTOV(zp), sync)
|
||||||
#define zn_rlimit_fsize(zp, uio) \
|
#define zn_rlimit_fsize(zp, uio) \
|
||||||
vn_rlimit_fsize(ZTOV(zp), GET_UIO_STRUCT(uio), zfs_uio_td(uio))
|
vn_rlimit_fsize(ZTOV(zp), GET_UIO_STRUCT(uio), zfs_uio_td(uio))
|
||||||
|
|||||||
@@ -256,6 +256,32 @@ bio_set_bi_error(struct bio *bio, int error)
|
|||||||
#define BIO_END_IO(bio, error) bio_endio(bio, error);
|
#define BIO_END_IO(bio, error) bio_endio(bio, error);
|
||||||
#endif /* HAVE_1ARG_BIO_END_IO_T */
|
#endif /* HAVE_1ARG_BIO_END_IO_T */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 5.15 MACRO,
|
||||||
|
* GD_DEAD
|
||||||
|
*
|
||||||
|
* 2.6.36 - 5.14 MACRO,
|
||||||
|
* GENHD_FL_UP
|
||||||
|
*
|
||||||
|
* Check the disk status and return B_TRUE if alive
|
||||||
|
* otherwise B_FALSE
|
||||||
|
*/
|
||||||
|
static inline boolean_t
|
||||||
|
zfs_check_disk_status(struct block_device *bdev)
|
||||||
|
{
|
||||||
|
#if defined(GENHD_FL_UP)
|
||||||
|
return (!!(bdev->bd_disk->flags & GENHD_FL_UP));
|
||||||
|
#elif defined(GD_DEAD)
|
||||||
|
return (!test_bit(GD_DEAD, &bdev->bd_disk->state));
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* This is encountered if neither GENHD_FL_UP nor GD_DEAD is available in
|
||||||
|
* the kernel - likely due to an MACRO change that needs to be chased down.
|
||||||
|
*/
|
||||||
|
#error "Unsupported kernel: no usable disk status check"
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 4.1 API,
|
* 4.1 API,
|
||||||
* 3.10.0 CentOS 7.x API,
|
* 3.10.0 CentOS 7.x API,
|
||||||
@@ -389,7 +415,7 @@ static inline void
|
|||||||
bio_set_flush(struct bio *bio)
|
bio_set_flush(struct bio *bio)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_REQ_PREFLUSH) /* >= 4.10 */
|
#if defined(HAVE_REQ_PREFLUSH) /* >= 4.10 */
|
||||||
bio_set_op_attrs(bio, 0, REQ_PREFLUSH);
|
bio_set_op_attrs(bio, 0, REQ_PREFLUSH | REQ_OP_WRITE);
|
||||||
#elif defined(WRITE_FLUSH_FUA) /* >= 2.6.37 and <= 4.9 */
|
#elif defined(WRITE_FLUSH_FUA) /* >= 2.6.37 and <= 4.9 */
|
||||||
bio_set_op_attrs(bio, 0, WRITE_FLUSH_FUA);
|
bio_set_op_attrs(bio, 0, WRITE_FLUSH_FUA);
|
||||||
#else
|
#else
|
||||||
@@ -555,7 +581,10 @@ blk_generic_start_io_acct(struct request_queue *q __attribute__((unused)),
|
|||||||
struct gendisk *disk __attribute__((unused)),
|
struct gendisk *disk __attribute__((unused)),
|
||||||
int rw __attribute__((unused)), struct bio *bio)
|
int rw __attribute__((unused)), struct bio *bio)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_BDEV_IO_ACCT)
|
#if defined(HAVE_BDEV_IO_ACCT_63)
|
||||||
|
return (bdev_start_io_acct(bio->bi_bdev, bio_op(bio),
|
||||||
|
jiffies));
|
||||||
|
#elif defined(HAVE_BDEV_IO_ACCT_OLD)
|
||||||
return (bdev_start_io_acct(bio->bi_bdev, bio_sectors(bio),
|
return (bdev_start_io_acct(bio->bi_bdev, bio_sectors(bio),
|
||||||
bio_op(bio), jiffies));
|
bio_op(bio), jiffies));
|
||||||
#elif defined(HAVE_DISK_IO_ACCT)
|
#elif defined(HAVE_DISK_IO_ACCT)
|
||||||
@@ -581,7 +610,10 @@ blk_generic_end_io_acct(struct request_queue *q __attribute__((unused)),
|
|||||||
struct gendisk *disk __attribute__((unused)),
|
struct gendisk *disk __attribute__((unused)),
|
||||||
int rw __attribute__((unused)), struct bio *bio, unsigned long start_time)
|
int rw __attribute__((unused)), struct bio *bio, unsigned long start_time)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_BDEV_IO_ACCT)
|
#if defined(HAVE_BDEV_IO_ACCT_63)
|
||||||
|
bdev_end_io_acct(bio->bi_bdev, bio_op(bio), bio_sectors(bio),
|
||||||
|
start_time);
|
||||||
|
#elif defined(HAVE_BDEV_IO_ACCT_OLD)
|
||||||
bdev_end_io_acct(bio->bi_bdev, bio_op(bio), start_time);
|
bdev_end_io_acct(bio->bi_bdev, bio_op(bio), start_time);
|
||||||
#elif defined(HAVE_DISK_IO_ACCT)
|
#elif defined(HAVE_DISK_IO_ACCT)
|
||||||
disk_end_io_acct(disk, bio_op(bio), start_time);
|
disk_end_io_acct(disk, bio_op(bio), start_time);
|
||||||
|
|||||||
@@ -39,6 +39,21 @@
|
|||||||
#define d_alias d_u.d_alias
|
#define d_alias d_u.d_alias
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Starting from Linux 5.13, flush_dcache_page() becomes an inline function
|
||||||
|
* and under some configurations, may indirectly referencing GPL-only
|
||||||
|
* cpu_feature_keys on powerpc. Override this function when it is detected
|
||||||
|
* being GPL-only.
|
||||||
|
*/
|
||||||
|
#if defined __powerpc__ && defined HAVE_FLUSH_DCACHE_PAGE_GPL_ONLY
|
||||||
|
#include <linux/simd_powerpc.h>
|
||||||
|
#define flush_dcache_page(page) do { \
|
||||||
|
if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE) && \
|
||||||
|
test_bit(PG_dcache_clean, &(page)->flags)) \
|
||||||
|
clear_bit(PG_dcache_clean, &(page)->flags); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 2.6.30 API change,
|
* 2.6.30 API change,
|
||||||
* The const keyword was added to the 'struct dentry_operations' in
|
* The const keyword was added to the 'struct dentry_operations' in
|
||||||
|
|||||||
@@ -76,6 +76,17 @@
|
|||||||
#define kfpu_init() 0
|
#define kfpu_init() 0
|
||||||
#define kfpu_fini() ((void) 0)
|
#define kfpu_fini() ((void) 0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Linux 4.7 makes cpu_has_feature to use jump labels on powerpc if
|
||||||
|
* CONFIG_JUMP_LABEL_FEATURE_CHECKS is enabled, in this case however it
|
||||||
|
* references GPL-only symbol cpu_feature_keys. Therefore we overrides this
|
||||||
|
* interface when it is detected being GPL-only.
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_JUMP_LABEL_FEATURE_CHECKS) && \
|
||||||
|
defined(HAVE_CPU_HAS_FEATURE_GPL_ONLY)
|
||||||
|
#define cpu_has_feature(feature) early_cpu_has_feature(feature)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if AltiVec instruction set is available
|
* Check if AltiVec instruction set is available
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -344,7 +344,8 @@ static inline void zfs_gid_write(struct inode *ip, gid_t gid)
|
|||||||
* 4.9 API change
|
* 4.9 API change
|
||||||
*/
|
*/
|
||||||
#if !(defined(HAVE_SETATTR_PREPARE_NO_USERNS) || \
|
#if !(defined(HAVE_SETATTR_PREPARE_NO_USERNS) || \
|
||||||
defined(HAVE_SETATTR_PREPARE_USERNS))
|
defined(HAVE_SETATTR_PREPARE_USERNS) || \
|
||||||
|
defined(HAVE_SETATTR_PREPARE_IDMAP))
|
||||||
static inline int
|
static inline int
|
||||||
setattr_prepare(struct dentry *dentry, struct iattr *ia)
|
setattr_prepare(struct dentry *dentry, struct iattr *ia)
|
||||||
{
|
{
|
||||||
@@ -399,6 +400,15 @@ func(struct user_namespace *user_ns, const struct path *path, \
|
|||||||
return (func##_impl(user_ns, path, stat, request_mask, \
|
return (func##_impl(user_ns, path, stat, request_mask, \
|
||||||
query_flags)); \
|
query_flags)); \
|
||||||
}
|
}
|
||||||
|
#elif defined(HAVE_IDMAP_IOPS_GETATTR)
|
||||||
|
#define ZPL_GETATTR_WRAPPER(func) \
|
||||||
|
static int \
|
||||||
|
func(struct mnt_idmap *user_ns, const struct path *path, \
|
||||||
|
struct kstat *stat, u32 request_mask, unsigned int query_flags) \
|
||||||
|
{ \
|
||||||
|
return (func##_impl(user_ns, path, stat, request_mask, \
|
||||||
|
query_flags)); \
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
#error
|
#error
|
||||||
#endif
|
#endif
|
||||||
@@ -450,8 +460,15 @@ zpl_is_32bit_api(void)
|
|||||||
* 5.12 API change
|
* 5.12 API change
|
||||||
* To support id-mapped mounts, generic_fillattr() was modified to
|
* To support id-mapped mounts, generic_fillattr() was modified to
|
||||||
* accept a new struct user_namespace* as its first arg.
|
* accept a new struct user_namespace* as its first arg.
|
||||||
|
*
|
||||||
|
* 6.3 API change
|
||||||
|
* generic_fillattr() first arg is changed to struct mnt_idmap *
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_GENERIC_FILLATTR_USERNS
|
#ifdef HAVE_GENERIC_FILLATTR_IDMAP
|
||||||
|
#define zpl_generic_fillattr(idmap, ip, sp) \
|
||||||
|
generic_fillattr(idmap, ip, sp)
|
||||||
|
#elif defined(HAVE_GENERIC_FILLATTR_USERNS)
|
||||||
#define zpl_generic_fillattr(user_ns, ip, sp) \
|
#define zpl_generic_fillattr(user_ns, ip, sp) \
|
||||||
generic_fillattr(user_ns, ip, sp)
|
generic_fillattr(user_ns, ip, sp)
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -133,20 +133,35 @@ fn(const struct xattr_handler *handler, struct dentry *dentry, \
|
|||||||
#error "Unsupported kernel"
|
#error "Unsupported kernel"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 6.3 API change,
|
||||||
|
* The xattr_handler->set() callback was changed to take the
|
||||||
|
* struct mnt_idmap* as the first arg, to support idmapped
|
||||||
|
* mounts.
|
||||||
|
*/
|
||||||
|
#if defined(HAVE_XATTR_SET_IDMAP)
|
||||||
|
#define ZPL_XATTR_SET_WRAPPER(fn) \
|
||||||
|
static int \
|
||||||
|
fn(const struct xattr_handler *handler, struct mnt_idmap *user_ns, \
|
||||||
|
struct dentry *dentry, struct inode *inode, const char *name, \
|
||||||
|
const void *buffer, size_t size, int flags) \
|
||||||
|
{ \
|
||||||
|
return (__ ## fn(user_ns, inode, name, buffer, size, flags)); \
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* 5.12 API change,
|
* 5.12 API change,
|
||||||
* The xattr_handler->set() callback was changed to take the
|
* The xattr_handler->set() callback was changed to take the
|
||||||
* struct user_namespace* as the first arg, to support idmapped
|
* struct user_namespace* as the first arg, to support idmapped
|
||||||
* mounts.
|
* mounts.
|
||||||
*/
|
*/
|
||||||
#if defined(HAVE_XATTR_SET_USERNS)
|
#elif defined(HAVE_XATTR_SET_USERNS)
|
||||||
#define ZPL_XATTR_SET_WRAPPER(fn) \
|
#define ZPL_XATTR_SET_WRAPPER(fn) \
|
||||||
static int \
|
static int \
|
||||||
fn(const struct xattr_handler *handler, struct user_namespace *user_ns, \
|
fn(const struct xattr_handler *handler, struct user_namespace *user_ns, \
|
||||||
struct dentry *dentry, struct inode *inode, const char *name, \
|
struct dentry *dentry, struct inode *inode, const char *name, \
|
||||||
const void *buffer, size_t size, int flags) \
|
const void *buffer, size_t size, int flags) \
|
||||||
{ \
|
{ \
|
||||||
return (__ ## fn(inode, name, buffer, size, flags)); \
|
return (__ ## fn(user_ns, inode, name, buffer, size, flags)); \
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* 4.7 API change,
|
* 4.7 API change,
|
||||||
@@ -160,7 +175,7 @@ fn(const struct xattr_handler *handler, struct dentry *dentry, \
|
|||||||
struct inode *inode, const char *name, const void *buffer, \
|
struct inode *inode, const char *name, const void *buffer, \
|
||||||
size_t size, int flags) \
|
size_t size, int flags) \
|
||||||
{ \
|
{ \
|
||||||
return (__ ## fn(inode, name, buffer, size, flags)); \
|
return (__ ## fn(kcred->user_ns, inode, name, buffer, size, flags));\
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* 4.4 API change,
|
* 4.4 API change,
|
||||||
@@ -174,7 +189,8 @@ static int \
|
|||||||
fn(const struct xattr_handler *handler, struct dentry *dentry, \
|
fn(const struct xattr_handler *handler, struct dentry *dentry, \
|
||||||
const char *name, const void *buffer, size_t size, int flags) \
|
const char *name, const void *buffer, size_t size, int flags) \
|
||||||
{ \
|
{ \
|
||||||
return (__ ## fn(dentry->d_inode, name, buffer, size, flags)); \
|
return (__ ## fn(kcred->user_ns, dentry->d_inode, name, \
|
||||||
|
buffer, size, flags)); \
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* 2.6.33 API change,
|
* 2.6.33 API change,
|
||||||
@@ -187,7 +203,8 @@ static int \
|
|||||||
fn(struct dentry *dentry, const char *name, const void *buffer, \
|
fn(struct dentry *dentry, const char *name, const void *buffer, \
|
||||||
size_t size, int flags, int unused_handler_flags) \
|
size_t size, int flags, int unused_handler_flags) \
|
||||||
{ \
|
{ \
|
||||||
return (__ ## fn(dentry->d_inode, name, buffer, size, flags)); \
|
return (__ ## fn(kcred->user_ns, dentry->d_inode, name, buffer, \
|
||||||
|
size, flags)); \
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#error "Unsupported kernel"
|
#error "Unsupported kernel"
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ KERNEL_H = \
|
|||||||
kmem.h \
|
kmem.h \
|
||||||
kstat.h \
|
kstat.h \
|
||||||
list.h \
|
list.h \
|
||||||
|
misc.h \
|
||||||
mod_os.h \
|
mod_os.h \
|
||||||
mutex.h \
|
mutex.h \
|
||||||
param.h \
|
param.h \
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ typedef struct cred cred_t;
|
|||||||
#define SGID_TO_KGID(x) (KGIDT_INIT(x))
|
#define SGID_TO_KGID(x) (KGIDT_INIT(x))
|
||||||
#define KGIDP_TO_SGIDP(x) (&(x)->val)
|
#define KGIDP_TO_SGIDP(x) (&(x)->val)
|
||||||
|
|
||||||
|
extern zidmap_t *zfs_get_init_idmap(void);
|
||||||
|
|
||||||
extern void crhold(cred_t *cr);
|
extern void crhold(cred_t *cr);
|
||||||
extern void crfree(cred_t *cr);
|
extern void crfree(cred_t *cr);
|
||||||
extern uid_t crgetuid(const cred_t *cr);
|
extern uid_t crgetuid(const cred_t *cr);
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* CDDL HEADER START
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the terms of the
|
||||||
|
* Common Development and Distribution License (the "License").
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
*
|
||||||
|
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||||
|
* or https://opensource.org/licenses/CDDL-1.0.
|
||||||
|
* See the License for the specific language governing permissions
|
||||||
|
* and limitations under the License.
|
||||||
|
*
|
||||||
|
* When distributing Covered Code, include this CDDL HEADER in each
|
||||||
|
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||||
|
* If applicable, add the following below this CDDL HEADER, with the
|
||||||
|
* fields enclosed by brackets "[]" replaced with your own identifying
|
||||||
|
* information: Portions Copyright [yyyy] [name of copyright owner]
|
||||||
|
*
|
||||||
|
* CDDL HEADER END
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _OS_LINUX_SPL_MISC_H
|
||||||
|
#define _OS_LINUX_SPL_MISC_H
|
||||||
|
|
||||||
|
#include <linux/kobject.h>
|
||||||
|
|
||||||
|
extern void spl_signal_kobj_evt(struct block_device *bdev);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -54,4 +54,18 @@ typedef ulong_t pgcnt_t;
|
|||||||
typedef int major_t;
|
typedef int major_t;
|
||||||
typedef int minor_t;
|
typedef int minor_t;
|
||||||
|
|
||||||
|
struct user_namespace;
|
||||||
|
#ifdef HAVE_IOPS_CREATE_IDMAP
|
||||||
|
#include <linux/refcount.h>
|
||||||
|
struct mnt_idmap {
|
||||||
|
struct user_namespace *owner;
|
||||||
|
refcount_t count;
|
||||||
|
};
|
||||||
|
typedef struct mnt_idmap zidmap_t;
|
||||||
|
#else
|
||||||
|
typedef struct user_namespace zidmap_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern zidmap_t *zfs_init_idmap;
|
||||||
|
|
||||||
#endif /* _SPL_TYPES_H */
|
#endif /* _SPL_TYPES_H */
|
||||||
|
|||||||
@@ -58,9 +58,10 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
|||||||
__field(uint64_t, z_size)
|
__field(uint64_t, z_size)
|
||||||
__field(uint64_t, z_pflags)
|
__field(uint64_t, z_pflags)
|
||||||
__field(uint32_t, z_sync_cnt)
|
__field(uint32_t, z_sync_cnt)
|
||||||
|
__field(uint32_t, z_sync_writes_cnt)
|
||||||
|
__field(uint32_t, z_async_writes_cnt)
|
||||||
__field(mode_t, z_mode)
|
__field(mode_t, z_mode)
|
||||||
__field(boolean_t, z_is_sa)
|
__field(boolean_t, z_is_sa)
|
||||||
__field(boolean_t, z_is_mapped)
|
|
||||||
__field(boolean_t, z_is_ctldir)
|
__field(boolean_t, z_is_ctldir)
|
||||||
|
|
||||||
__field(uint32_t, i_uid)
|
__field(uint32_t, i_uid)
|
||||||
@@ -90,9 +91,10 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
|||||||
__entry->z_size = zn->z_size;
|
__entry->z_size = zn->z_size;
|
||||||
__entry->z_pflags = zn->z_pflags;
|
__entry->z_pflags = zn->z_pflags;
|
||||||
__entry->z_sync_cnt = zn->z_sync_cnt;
|
__entry->z_sync_cnt = zn->z_sync_cnt;
|
||||||
|
__entry->z_sync_writes_cnt = zn->z_sync_writes_cnt;
|
||||||
|
__entry->z_async_writes_cnt = zn->z_async_writes_cnt;
|
||||||
__entry->z_mode = zn->z_mode;
|
__entry->z_mode = zn->z_mode;
|
||||||
__entry->z_is_sa = zn->z_is_sa;
|
__entry->z_is_sa = zn->z_is_sa;
|
||||||
__entry->z_is_mapped = zn->z_is_mapped;
|
|
||||||
__entry->z_is_ctldir = zn->z_is_ctldir;
|
__entry->z_is_ctldir = zn->z_is_ctldir;
|
||||||
|
|
||||||
__entry->i_uid = KUID_TO_SUID(ZTOI(zn)->i_uid);
|
__entry->i_uid = KUID_TO_SUID(ZTOI(zn)->i_uid);
|
||||||
@@ -114,18 +116,18 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
|||||||
TP_printk("zn { id %llu unlinked %u atime_dirty %u "
|
TP_printk("zn { id %llu unlinked %u atime_dirty %u "
|
||||||
"zn_prefetch %u blksz %u seq %u "
|
"zn_prefetch %u blksz %u seq %u "
|
||||||
"mapcnt %llu size %llu pflags %llu "
|
"mapcnt %llu size %llu pflags %llu "
|
||||||
"sync_cnt %u mode 0x%x is_sa %d "
|
"sync_cnt %u sync_writes_cnt %u async_writes_cnt %u "
|
||||||
"is_mapped %d is_ctldir %d inode { "
|
"mode 0x%x is_sa %d is_ctldir %d "
|
||||||
"uid %u gid %u ino %lu nlink %u size %lli "
|
"inode { uid %u gid %u ino %lu nlink %u size %lli "
|
||||||
"blkbits %u bytes %u mode 0x%x generation %x } } "
|
"blkbits %u bytes %u mode 0x%x generation %x } } "
|
||||||
"ace { type %u flags %u access_mask %u } mask_matched %u",
|
"ace { type %u flags %u access_mask %u } mask_matched %u",
|
||||||
__entry->z_id, __entry->z_unlinked, __entry->z_atime_dirty,
|
__entry->z_id, __entry->z_unlinked, __entry->z_atime_dirty,
|
||||||
__entry->z_zn_prefetch, __entry->z_blksz,
|
__entry->z_zn_prefetch, __entry->z_blksz,
|
||||||
__entry->z_seq, __entry->z_mapcnt, __entry->z_size,
|
__entry->z_seq, __entry->z_mapcnt, __entry->z_size,
|
||||||
__entry->z_pflags, __entry->z_sync_cnt, __entry->z_mode,
|
__entry->z_pflags, __entry->z_sync_cnt,
|
||||||
__entry->z_is_sa, __entry->z_is_mapped,
|
__entry->z_sync_writes_cnt, __entry->z_async_writes_cnt,
|
||||||
__entry->z_is_ctldir, __entry->i_uid,
|
__entry->z_mode, __entry->z_is_sa, __entry->z_is_ctldir,
|
||||||
__entry->i_gid, __entry->i_ino, __entry->i_nlink,
|
__entry->i_uid, __entry->i_gid, __entry->i_ino, __entry->i_nlink,
|
||||||
__entry->i_size, __entry->i_blkbits,
|
__entry->i_size, __entry->i_blkbits,
|
||||||
__entry->i_bytes, __entry->i_mode, __entry->i_generation,
|
__entry->i_bytes, __entry->i_mode, __entry->i_generation,
|
||||||
__entry->z_type, __entry->z_flags, __entry->z_access_mask,
|
__entry->z_type, __entry->z_flags, __entry->z_access_mask,
|
||||||
|
|||||||
@@ -54,8 +54,7 @@ extern int zfs_mkdir(znode_t *dzp, char *dirname, vattr_t *vap,
|
|||||||
extern int zfs_rmdir(znode_t *dzp, char *name, znode_t *cwd,
|
extern int zfs_rmdir(znode_t *dzp, char *name, znode_t *cwd,
|
||||||
cred_t *cr, int flags);
|
cred_t *cr, int flags);
|
||||||
extern int zfs_readdir(struct inode *ip, zpl_dir_context_t *ctx, cred_t *cr);
|
extern int zfs_readdir(struct inode *ip, zpl_dir_context_t *ctx, cred_t *cr);
|
||||||
extern int zfs_getattr_fast(struct user_namespace *, struct inode *ip,
|
extern int zfs_getattr_fast(zidmap_t *, struct inode *ip, struct kstat *sp);
|
||||||
struct kstat *sp);
|
|
||||||
extern int zfs_setattr(znode_t *zp, vattr_t *vap, int flag, cred_t *cr);
|
extern int zfs_setattr(znode_t *zp, vattr_t *vap, int flag, cred_t *cr);
|
||||||
extern int zfs_rename(znode_t *sdzp, char *snm, znode_t *tdzp,
|
extern int zfs_rename(znode_t *sdzp, char *snm, znode_t *tdzp,
|
||||||
char *tnm, cred_t *cr, int flags);
|
char *tnm, cred_t *cr, int flags);
|
||||||
@@ -68,9 +67,9 @@ extern void zfs_inactive(struct inode *ip);
|
|||||||
extern int zfs_space(znode_t *zp, int cmd, flock64_t *bfp, int flag,
|
extern int zfs_space(znode_t *zp, int cmd, flock64_t *bfp, int flag,
|
||||||
offset_t offset, cred_t *cr);
|
offset_t offset, cred_t *cr);
|
||||||
extern int zfs_fid(struct inode *ip, fid_t *fidp);
|
extern int zfs_fid(struct inode *ip, fid_t *fidp);
|
||||||
extern int zfs_getpage(struct inode *ip, struct page *pl[], int nr_pages);
|
extern int zfs_getpage(struct inode *ip, struct page *pp);
|
||||||
extern int zfs_putpage(struct inode *ip, struct page *pp,
|
extern int zfs_putpage(struct inode *ip, struct page *pp,
|
||||||
struct writeback_control *wbc);
|
struct writeback_control *wbc, boolean_t for_sync);
|
||||||
extern int zfs_dirty_inode(struct inode *ip, int flags);
|
extern int zfs_dirty_inode(struct inode *ip, int flags);
|
||||||
extern int zfs_map(struct inode *ip, offset_t off, caddr_t *addrp,
|
extern int zfs_map(struct inode *ip, offset_t off, caddr_t *addrp,
|
||||||
size_t len, unsigned long vm_flags);
|
size_t len, unsigned long vm_flags);
|
||||||
|
|||||||
@@ -47,9 +47,16 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_FILEMAP_RANGE_HAS_PAGE)
|
||||||
#define ZNODE_OS_FIELDS \
|
#define ZNODE_OS_FIELDS \
|
||||||
inode_timespec_t z_btime; /* creation/birth time (cached) */ \
|
inode_timespec_t z_btime; /* creation/birth time (cached) */ \
|
||||||
struct inode z_inode;
|
struct inode z_inode;
|
||||||
|
#else
|
||||||
|
#define ZNODE_OS_FIELDS \
|
||||||
|
inode_timespec_t z_btime; /* creation/birth time (cached) */ \
|
||||||
|
struct inode z_inode; \
|
||||||
|
boolean_t z_is_mapped; /* we are mmap'ed */
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert between znode pointers and inode pointers
|
* Convert between znode pointers and inode pointers
|
||||||
@@ -70,7 +77,14 @@ extern "C" {
|
|||||||
#define Z_ISDEV(type) (S_ISCHR(type) || S_ISBLK(type) || S_ISFIFO(type))
|
#define Z_ISDEV(type) (S_ISCHR(type) || S_ISBLK(type) || S_ISFIFO(type))
|
||||||
#define Z_ISDIR(type) S_ISDIR(type)
|
#define Z_ISDIR(type) S_ISDIR(type)
|
||||||
|
|
||||||
#define zn_has_cached_data(zp) ((zp)->z_is_mapped)
|
#if defined(HAVE_FILEMAP_RANGE_HAS_PAGE)
|
||||||
|
#define zn_has_cached_data(zp, start, end) \
|
||||||
|
filemap_range_has_page(ZTOI(zp)->i_mapping, start, end)
|
||||||
|
#else
|
||||||
|
#define zn_has_cached_data(zp, start, end) \
|
||||||
|
((zp)->z_is_mapped)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define zn_flush_cached_data(zp, sync) write_inode_now(ZTOI(zp), sync)
|
#define zn_flush_cached_data(zp, sync) write_inode_now(ZTOI(zp), sync)
|
||||||
#define zn_rlimit_fsize(zp, uio) (0)
|
#define zn_rlimit_fsize(zp, uio) (0)
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,10 @@ extern int zpl_xattr_security_init(struct inode *ip, struct inode *dip,
|
|||||||
const struct qstr *qstr);
|
const struct qstr *qstr);
|
||||||
#if defined(CONFIG_FS_POSIX_ACL)
|
#if defined(CONFIG_FS_POSIX_ACL)
|
||||||
#if defined(HAVE_SET_ACL)
|
#if defined(HAVE_SET_ACL)
|
||||||
#if defined(HAVE_SET_ACL_USERNS)
|
#if defined(HAVE_SET_ACL_IDMAP_DENTRY)
|
||||||
|
extern int zpl_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
|
||||||
|
struct posix_acl *acl, int type);
|
||||||
|
#elif defined(HAVE_SET_ACL_USERNS)
|
||||||
extern int zpl_set_acl(struct user_namespace *userns, struct inode *ip,
|
extern int zpl_set_acl(struct user_namespace *userns, struct inode *ip,
|
||||||
struct posix_acl *acl, int type);
|
struct posix_acl *acl, int type);
|
||||||
#elif defined(HAVE_SET_ACL_USERNS_DENTRY_ARG2)
|
#elif defined(HAVE_SET_ACL_USERNS_DENTRY_ARG2)
|
||||||
@@ -186,13 +189,15 @@ zpl_dir_emit_dots(struct file *file, zpl_dir_context_t *ctx)
|
|||||||
|
|
||||||
#if defined(HAVE_INODE_OWNER_OR_CAPABLE)
|
#if defined(HAVE_INODE_OWNER_OR_CAPABLE)
|
||||||
#define zpl_inode_owner_or_capable(ns, ip) inode_owner_or_capable(ip)
|
#define zpl_inode_owner_or_capable(ns, ip) inode_owner_or_capable(ip)
|
||||||
#elif defined(HAVE_INODE_OWNER_OR_CAPABLE_IDMAPPED)
|
#elif defined(HAVE_INODE_OWNER_OR_CAPABLE_USERNS)
|
||||||
#define zpl_inode_owner_or_capable(ns, ip) inode_owner_or_capable(ns, ip)
|
#define zpl_inode_owner_or_capable(ns, ip) inode_owner_or_capable(ns, ip)
|
||||||
|
#elif defined(HAVE_INODE_OWNER_OR_CAPABLE_IDMAP)
|
||||||
|
#define zpl_inode_owner_or_capable(idmap, ip) inode_owner_or_capable(idmap, ip)
|
||||||
#else
|
#else
|
||||||
#error "Unsupported kernel"
|
#error "Unsupported kernel"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SETATTR_PREPARE_USERNS
|
#if defined(HAVE_SETATTR_PREPARE_USERNS) || defined(HAVE_SETATTR_PREPARE_IDMAP)
|
||||||
#define zpl_setattr_prepare(ns, dentry, ia) setattr_prepare(ns, dentry, ia)
|
#define zpl_setattr_prepare(ns, dentry, ia) setattr_prepare(ns, dentry, ia)
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#define _SYS_ARC_IMPL_H
|
#define _SYS_ARC_IMPL_H
|
||||||
|
|
||||||
#include <sys/arc.h>
|
#include <sys/arc.h>
|
||||||
|
#include <sys/multilist.h>
|
||||||
#include <sys/zio_crypt.h>
|
#include <sys/zio_crypt.h>
|
||||||
#include <sys/zthr.h>
|
#include <sys/zthr.h>
|
||||||
#include <sys/aggsum.h>
|
#include <sys/aggsum.h>
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ int livelist_bpobj_iterate_from_nofree(bpobj_t *bpo, bpobj_itor_t func,
|
|||||||
void *arg, int64_t start);
|
void *arg, int64_t start);
|
||||||
|
|
||||||
void bpobj_enqueue_subobj(bpobj_t *bpo, uint64_t subobj, dmu_tx_t *tx);
|
void bpobj_enqueue_subobj(bpobj_t *bpo, uint64_t subobj, dmu_tx_t *tx);
|
||||||
|
void bpobj_prefetch_subobj(bpobj_t *bpo, uint64_t subobj);
|
||||||
void bpobj_enqueue(bpobj_t *bpo, const blkptr_t *bp, boolean_t bp_freed,
|
void bpobj_enqueue(bpobj_t *bpo, const blkptr_t *bp, boolean_t bp_freed,
|
||||||
dmu_tx_t *tx);
|
dmu_tx_t *tx);
|
||||||
|
|
||||||
|
|||||||
+8
-7
@@ -65,7 +65,7 @@ extern "C" {
|
|||||||
* them, and increased memory overhead. Increasing these values results in
|
* them, and increased memory overhead. Increasing these values results in
|
||||||
* higher variance in operation time, and reduces memory overhead.
|
* higher variance in operation time, and reduces memory overhead.
|
||||||
*/
|
*/
|
||||||
#define BTREE_CORE_ELEMS 128
|
#define BTREE_CORE_ELEMS 126
|
||||||
#define BTREE_LEAF_SIZE 4096
|
#define BTREE_LEAF_SIZE 4096
|
||||||
|
|
||||||
extern kmem_cache_t *zfs_btree_leaf_cache;
|
extern kmem_cache_t *zfs_btree_leaf_cache;
|
||||||
@@ -95,9 +95,6 @@ typedef struct zfs_btree_leaf {
|
|||||||
uint8_t btl_elems[];
|
uint8_t btl_elems[];
|
||||||
} zfs_btree_leaf_t;
|
} zfs_btree_leaf_t;
|
||||||
|
|
||||||
#define BTREE_LEAF_ESIZE (BTREE_LEAF_SIZE - \
|
|
||||||
offsetof(zfs_btree_leaf_t, btl_elems))
|
|
||||||
|
|
||||||
typedef struct zfs_btree_index {
|
typedef struct zfs_btree_index {
|
||||||
zfs_btree_hdr_t *bti_node;
|
zfs_btree_hdr_t *bti_node;
|
||||||
uint32_t bti_offset;
|
uint32_t bti_offset;
|
||||||
@@ -109,14 +106,15 @@ typedef struct zfs_btree_index {
|
|||||||
} zfs_btree_index_t;
|
} zfs_btree_index_t;
|
||||||
|
|
||||||
typedef struct btree {
|
typedef struct btree {
|
||||||
zfs_btree_hdr_t *bt_root;
|
int (*bt_compar) (const void *, const void *);
|
||||||
int64_t bt_height;
|
|
||||||
size_t bt_elem_size;
|
size_t bt_elem_size;
|
||||||
|
size_t bt_leaf_size;
|
||||||
uint32_t bt_leaf_cap;
|
uint32_t bt_leaf_cap;
|
||||||
|
int32_t bt_height;
|
||||||
uint64_t bt_num_elems;
|
uint64_t bt_num_elems;
|
||||||
uint64_t bt_num_nodes;
|
uint64_t bt_num_nodes;
|
||||||
|
zfs_btree_hdr_t *bt_root;
|
||||||
zfs_btree_leaf_t *bt_bulk; // non-null if bulk loading
|
zfs_btree_leaf_t *bt_bulk; // non-null if bulk loading
|
||||||
int (*bt_compar) (const void *, const void *);
|
|
||||||
} zfs_btree_t;
|
} zfs_btree_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -132,9 +130,12 @@ void zfs_btree_fini(void);
|
|||||||
* compar - function to compare two nodes, it must return exactly: -1, 0, or +1
|
* compar - function to compare two nodes, it must return exactly: -1, 0, or +1
|
||||||
* -1 for <, 0 for ==, and +1 for >
|
* -1 for <, 0 for ==, and +1 for >
|
||||||
* size - the value of sizeof(struct my_type)
|
* size - the value of sizeof(struct my_type)
|
||||||
|
* lsize - custom leaf size
|
||||||
*/
|
*/
|
||||||
void zfs_btree_create(zfs_btree_t *, int (*) (const void *, const void *),
|
void zfs_btree_create(zfs_btree_t *, int (*) (const void *, const void *),
|
||||||
size_t);
|
size_t);
|
||||||
|
void zfs_btree_create_custom(zfs_btree_t *, int (*)(const void *, const void *),
|
||||||
|
size_t, size_t);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find a node with a matching value in the tree. Returns the matching node
|
* Find a node with a matching value in the tree. Returns the matching node
|
||||||
|
|||||||
@@ -778,6 +778,9 @@ dmu_tx_t *dmu_tx_create(objset_t *os);
|
|||||||
void dmu_tx_hold_write(dmu_tx_t *tx, uint64_t object, uint64_t off, int len);
|
void dmu_tx_hold_write(dmu_tx_t *tx, uint64_t object, uint64_t off, int len);
|
||||||
void dmu_tx_hold_write_by_dnode(dmu_tx_t *tx, dnode_t *dn, uint64_t off,
|
void dmu_tx_hold_write_by_dnode(dmu_tx_t *tx, dnode_t *dn, uint64_t off,
|
||||||
int len);
|
int len);
|
||||||
|
void dmu_tx_hold_append(dmu_tx_t *tx, uint64_t object, uint64_t off, int len);
|
||||||
|
void dmu_tx_hold_append_by_dnode(dmu_tx_t *tx, dnode_t *dn, uint64_t off,
|
||||||
|
int len);
|
||||||
void dmu_tx_hold_free(dmu_tx_t *tx, uint64_t object, uint64_t off,
|
void dmu_tx_hold_free(dmu_tx_t *tx, uint64_t object, uint64_t off,
|
||||||
uint64_t len);
|
uint64_t len);
|
||||||
void dmu_tx_hold_free_by_dnode(dmu_tx_t *tx, dnode_t *dn, uint64_t off,
|
void dmu_tx_hold_free_by_dnode(dmu_tx_t *tx, dnode_t *dn, uint64_t off,
|
||||||
|
|||||||
@@ -72,6 +72,10 @@ struct dmu_tx;
|
|||||||
*/
|
*/
|
||||||
#define OBJSET_CRYPT_PORTABLE_FLAGS_MASK (0)
|
#define OBJSET_CRYPT_PORTABLE_FLAGS_MASK (0)
|
||||||
|
|
||||||
|
#if defined(__clang__)
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wgnu-variable-sized-type-not-at-end"
|
||||||
|
#endif
|
||||||
typedef struct objset_phys {
|
typedef struct objset_phys {
|
||||||
dnode_phys_t os_meta_dnode;
|
dnode_phys_t os_meta_dnode;
|
||||||
zil_header_t os_zil_header;
|
zil_header_t os_zil_header;
|
||||||
@@ -88,6 +92,9 @@ typedef struct objset_phys {
|
|||||||
char os_pad1[OBJSET_PHYS_SIZE_V3 - OBJSET_PHYS_SIZE_V2 -
|
char os_pad1[OBJSET_PHYS_SIZE_V3 - OBJSET_PHYS_SIZE_V2 -
|
||||||
sizeof (dnode_phys_t)];
|
sizeof (dnode_phys_t)];
|
||||||
} objset_phys_t;
|
} objset_phys_t;
|
||||||
|
#if defined(__clang__)
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef int (*dmu_objset_upgrade_cb_t)(objset_t *);
|
typedef int (*dmu_objset_upgrade_cb_t)(objset_t *);
|
||||||
|
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ enum dmu_tx_hold_type {
|
|||||||
THT_ZAP,
|
THT_ZAP,
|
||||||
THT_SPACE,
|
THT_SPACE,
|
||||||
THT_SPILL,
|
THT_SPILL,
|
||||||
|
THT_APPEND,
|
||||||
THT_NUMTYPES
|
THT_NUMTYPES
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+43
-2
@@ -36,6 +36,7 @@
|
|||||||
#include <sys/dmu_zfetch.h>
|
#include <sys/dmu_zfetch.h>
|
||||||
#include <sys/zrlock.h>
|
#include <sys/zrlock.h>
|
||||||
#include <sys/multilist.h>
|
#include <sys/multilist.h>
|
||||||
|
#include <sys/wmsum.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -119,7 +120,11 @@ extern "C" {
|
|||||||
#define DN_MAX_LEVELS (DIV_ROUND_UP(DN_MAX_OFFSET_SHIFT - SPA_MINBLOCKSHIFT, \
|
#define DN_MAX_LEVELS (DIV_ROUND_UP(DN_MAX_OFFSET_SHIFT - SPA_MINBLOCKSHIFT, \
|
||||||
DN_MIN_INDBLKSHIFT - SPA_BLKPTRSHIFT) + 1)
|
DN_MIN_INDBLKSHIFT - SPA_BLKPTRSHIFT) + 1)
|
||||||
|
|
||||||
#define DN_BONUS(dnp) ((void*)((dnp)->dn_bonus + \
|
/*
|
||||||
|
* Use the flexible array instead of the fixed length one dn_bonus
|
||||||
|
* to address memcpy/memmove fortify error
|
||||||
|
*/
|
||||||
|
#define DN_BONUS(dnp) ((void*)((dnp)->dn_bonus_flexible + \
|
||||||
(((dnp)->dn_nblkptr - 1) * sizeof (blkptr_t))))
|
(((dnp)->dn_nblkptr - 1) * sizeof (blkptr_t))))
|
||||||
#define DN_MAX_BONUS_LEN(dnp) \
|
#define DN_MAX_BONUS_LEN(dnp) \
|
||||||
((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) ? \
|
((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) ? \
|
||||||
@@ -265,6 +270,10 @@ typedef struct dnode_phys {
|
|||||||
sizeof (blkptr_t)];
|
sizeof (blkptr_t)];
|
||||||
blkptr_t dn_spill;
|
blkptr_t dn_spill;
|
||||||
};
|
};
|
||||||
|
struct {
|
||||||
|
blkptr_t __dn_ignore4;
|
||||||
|
uint8_t dn_bonus_flexible[];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
} dnode_phys_t;
|
} dnode_phys_t;
|
||||||
|
|
||||||
@@ -587,10 +596,42 @@ typedef struct dnode_stats {
|
|||||||
kstat_named_t dnode_move_active;
|
kstat_named_t dnode_move_active;
|
||||||
} dnode_stats_t;
|
} dnode_stats_t;
|
||||||
|
|
||||||
|
typedef struct dnode_sums {
|
||||||
|
wmsum_t dnode_hold_dbuf_hold;
|
||||||
|
wmsum_t dnode_hold_dbuf_read;
|
||||||
|
wmsum_t dnode_hold_alloc_hits;
|
||||||
|
wmsum_t dnode_hold_alloc_misses;
|
||||||
|
wmsum_t dnode_hold_alloc_interior;
|
||||||
|
wmsum_t dnode_hold_alloc_lock_retry;
|
||||||
|
wmsum_t dnode_hold_alloc_lock_misses;
|
||||||
|
wmsum_t dnode_hold_alloc_type_none;
|
||||||
|
wmsum_t dnode_hold_free_hits;
|
||||||
|
wmsum_t dnode_hold_free_misses;
|
||||||
|
wmsum_t dnode_hold_free_lock_misses;
|
||||||
|
wmsum_t dnode_hold_free_lock_retry;
|
||||||
|
wmsum_t dnode_hold_free_refcount;
|
||||||
|
wmsum_t dnode_hold_free_overflow;
|
||||||
|
wmsum_t dnode_free_interior_lock_retry;
|
||||||
|
wmsum_t dnode_allocate;
|
||||||
|
wmsum_t dnode_reallocate;
|
||||||
|
wmsum_t dnode_buf_evict;
|
||||||
|
wmsum_t dnode_alloc_next_chunk;
|
||||||
|
wmsum_t dnode_alloc_race;
|
||||||
|
wmsum_t dnode_alloc_next_block;
|
||||||
|
wmsum_t dnode_move_invalid;
|
||||||
|
wmsum_t dnode_move_recheck1;
|
||||||
|
wmsum_t dnode_move_recheck2;
|
||||||
|
wmsum_t dnode_move_special;
|
||||||
|
wmsum_t dnode_move_handle;
|
||||||
|
wmsum_t dnode_move_rwlock;
|
||||||
|
wmsum_t dnode_move_active;
|
||||||
|
} dnode_sums_t;
|
||||||
|
|
||||||
extern dnode_stats_t dnode_stats;
|
extern dnode_stats_t dnode_stats;
|
||||||
|
extern dnode_sums_t dnode_sums;
|
||||||
|
|
||||||
#define DNODE_STAT_INCR(stat, val) \
|
#define DNODE_STAT_INCR(stat, val) \
|
||||||
atomic_add_64(&dnode_stats.stat.value.ui64, (val));
|
wmsum_add(&dnode_sums.stat, (val))
|
||||||
#define DNODE_STAT_BUMP(stat) \
|
#define DNODE_STAT_BUMP(stat) \
|
||||||
DNODE_STAT_INCR(stat, 1);
|
DNODE_STAT_INCR(stat, 1);
|
||||||
|
|
||||||
|
|||||||
@@ -1173,6 +1173,7 @@ typedef enum pool_initialize_func {
|
|||||||
POOL_INITIALIZE_START,
|
POOL_INITIALIZE_START,
|
||||||
POOL_INITIALIZE_CANCEL,
|
POOL_INITIALIZE_CANCEL,
|
||||||
POOL_INITIALIZE_SUSPEND,
|
POOL_INITIALIZE_SUSPEND,
|
||||||
|
POOL_INITIALIZE_UNINIT,
|
||||||
POOL_INITIALIZE_FUNCS
|
POOL_INITIALIZE_FUNCS
|
||||||
} pool_initialize_func_t;
|
} pool_initialize_func_t;
|
||||||
|
|
||||||
@@ -1518,6 +1519,7 @@ typedef enum {
|
|||||||
#define ZFS_ONLINE_UNSPARE 0x2
|
#define ZFS_ONLINE_UNSPARE 0x2
|
||||||
#define ZFS_ONLINE_FORCEFAULT 0x4
|
#define ZFS_ONLINE_FORCEFAULT 0x4
|
||||||
#define ZFS_ONLINE_EXPAND 0x8
|
#define ZFS_ONLINE_EXPAND 0x8
|
||||||
|
#define ZFS_ONLINE_SPARE 0x10
|
||||||
#define ZFS_OFFLINE_TEMPORARY 0x1
|
#define ZFS_OFFLINE_TEMPORARY 0x1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
+4
-1
@@ -785,6 +785,7 @@ extern int bpobj_enqueue_free_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx);
|
|||||||
#define SPA_ASYNC_L2CACHE_REBUILD 0x800
|
#define SPA_ASYNC_L2CACHE_REBUILD 0x800
|
||||||
#define SPA_ASYNC_L2CACHE_TRIM 0x1000
|
#define SPA_ASYNC_L2CACHE_TRIM 0x1000
|
||||||
#define SPA_ASYNC_REBUILD_DONE 0x2000
|
#define SPA_ASYNC_REBUILD_DONE 0x2000
|
||||||
|
#define SPA_ASYNC_DETACH_SPARE 0x4000
|
||||||
|
|
||||||
/* device manipulation */
|
/* device manipulation */
|
||||||
extern int spa_vdev_add(spa_t *spa, nvlist_t *nvroot);
|
extern int spa_vdev_add(spa_t *spa, nvlist_t *nvroot);
|
||||||
@@ -837,7 +838,7 @@ extern kmutex_t spa_namespace_lock;
|
|||||||
#define SPA_CONFIG_UPDATE_POOL 0
|
#define SPA_CONFIG_UPDATE_POOL 0
|
||||||
#define SPA_CONFIG_UPDATE_VDEVS 1
|
#define SPA_CONFIG_UPDATE_VDEVS 1
|
||||||
|
|
||||||
extern void spa_write_cachefile(spa_t *, boolean_t, boolean_t);
|
extern void spa_write_cachefile(spa_t *, boolean_t, boolean_t, boolean_t);
|
||||||
extern void spa_config_load(void);
|
extern void spa_config_load(void);
|
||||||
extern nvlist_t *spa_all_configs(uint64_t *);
|
extern nvlist_t *spa_all_configs(uint64_t *);
|
||||||
extern void spa_config_set(spa_t *spa, nvlist_t *config);
|
extern void spa_config_set(spa_t *spa, nvlist_t *config);
|
||||||
@@ -971,6 +972,8 @@ extern int spa_import_progress_set_state(uint64_t pool_guid,
|
|||||||
/* Pool configuration locks */
|
/* Pool configuration locks */
|
||||||
extern int spa_config_tryenter(spa_t *spa, int locks, void *tag, krw_t rw);
|
extern int spa_config_tryenter(spa_t *spa, int locks, void *tag, krw_t rw);
|
||||||
extern void spa_config_enter(spa_t *spa, int locks, const void *tag, krw_t rw);
|
extern void spa_config_enter(spa_t *spa, int locks, const void *tag, krw_t rw);
|
||||||
|
extern void spa_config_enter_mmp(spa_t *spa, int locks, const void *tag,
|
||||||
|
krw_t rw);
|
||||||
extern void spa_config_exit(spa_t *spa, int locks, const void *tag);
|
extern void spa_config_exit(spa_t *spa, int locks, const void *tag);
|
||||||
extern int spa_config_held(spa_t *spa, int locks, krw_t rw);
|
extern int spa_config_held(spa_t *spa, int locks, krw_t rw);
|
||||||
|
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ extern int vdev_degrade(spa_t *spa, uint64_t guid, vdev_aux_t aux);
|
|||||||
extern int vdev_online(spa_t *spa, uint64_t guid, uint64_t flags,
|
extern int vdev_online(spa_t *spa, uint64_t guid, uint64_t flags,
|
||||||
vdev_state_t *);
|
vdev_state_t *);
|
||||||
extern int vdev_offline(spa_t *spa, uint64_t guid, uint64_t flags);
|
extern int vdev_offline(spa_t *spa, uint64_t guid, uint64_t flags);
|
||||||
|
extern int vdev_remove_wanted(spa_t *spa, uint64_t guid);
|
||||||
extern void vdev_clear(spa_t *spa, vdev_t *vd);
|
extern void vdev_clear(spa_t *spa, vdev_t *vd);
|
||||||
|
|
||||||
extern boolean_t vdev_is_dead(vdev_t *vd);
|
extern boolean_t vdev_is_dead(vdev_t *vd);
|
||||||
@@ -189,6 +190,8 @@ typedef enum vdev_config_flag {
|
|||||||
VDEV_CONFIG_MISSING = 1 << 4
|
VDEV_CONFIG_MISSING = 1 << 4
|
||||||
} vdev_config_flag_t;
|
} vdev_config_flag_t;
|
||||||
|
|
||||||
|
extern void vdev_post_kobj_evt(vdev_t *vd);
|
||||||
|
extern void vdev_clear_kobj_evt(vdev_t *vd);
|
||||||
extern void vdev_top_config_generate(spa_t *spa, nvlist_t *config);
|
extern void vdev_top_config_generate(spa_t *spa, nvlist_t *config);
|
||||||
extern nvlist_t *vdev_config_generate(spa_t *spa, vdev_t *vd,
|
extern nvlist_t *vdev_config_generate(spa_t *spa, vdev_t *vd,
|
||||||
boolean_t getstats, vdev_config_flag_t flags);
|
boolean_t getstats, vdev_config_flag_t flags);
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ extern uint32_t zfs_vdev_async_write_max_active;
|
|||||||
* Virtual device operations
|
* Virtual device operations
|
||||||
*/
|
*/
|
||||||
typedef int vdev_init_func_t(spa_t *spa, nvlist_t *nv, void **tsd);
|
typedef int vdev_init_func_t(spa_t *spa, nvlist_t *nv, void **tsd);
|
||||||
|
typedef void vdev_kobj_post_evt_func_t(vdev_t *vd);
|
||||||
typedef void vdev_fini_func_t(vdev_t *vd);
|
typedef void vdev_fini_func_t(vdev_t *vd);
|
||||||
typedef int vdev_open_func_t(vdev_t *vd, uint64_t *size, uint64_t *max_size,
|
typedef int vdev_open_func_t(vdev_t *vd, uint64_t *size, uint64_t *max_size,
|
||||||
uint64_t *ashift, uint64_t *pshift);
|
uint64_t *ashift, uint64_t *pshift);
|
||||||
@@ -123,6 +124,7 @@ typedef const struct vdev_ops {
|
|||||||
vdev_config_generate_func_t *vdev_op_config_generate;
|
vdev_config_generate_func_t *vdev_op_config_generate;
|
||||||
vdev_nparity_func_t *vdev_op_nparity;
|
vdev_nparity_func_t *vdev_op_nparity;
|
||||||
vdev_ndisks_func_t *vdev_op_ndisks;
|
vdev_ndisks_func_t *vdev_op_ndisks;
|
||||||
|
vdev_kobj_post_evt_func_t *vdev_op_kobj_evt_post;
|
||||||
char vdev_op_type[16];
|
char vdev_op_type[16];
|
||||||
boolean_t vdev_op_leaf;
|
boolean_t vdev_op_leaf;
|
||||||
} vdev_ops_t;
|
} vdev_ops_t;
|
||||||
@@ -435,6 +437,7 @@ struct vdev {
|
|||||||
boolean_t vdev_isl2cache; /* was a l2cache device */
|
boolean_t vdev_isl2cache; /* was a l2cache device */
|
||||||
boolean_t vdev_copy_uberblocks; /* post expand copy uberblocks */
|
boolean_t vdev_copy_uberblocks; /* post expand copy uberblocks */
|
||||||
boolean_t vdev_resilver_deferred; /* resilver deferred */
|
boolean_t vdev_resilver_deferred; /* resilver deferred */
|
||||||
|
boolean_t vdev_kobj_flag; /* kobj event record */
|
||||||
vdev_queue_t vdev_queue; /* I/O deadline schedule queue */
|
vdev_queue_t vdev_queue; /* I/O deadline schedule queue */
|
||||||
vdev_cache_t vdev_cache; /* physical block cache */
|
vdev_cache_t vdev_cache; /* physical block cache */
|
||||||
spa_aux_vdev_t *vdev_aux; /* for l2cache and spares vdevs */
|
spa_aux_vdev_t *vdev_aux; /* for l2cache and spares vdevs */
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void vdev_initialize(vdev_t *vd);
|
extern void vdev_initialize(vdev_t *vd);
|
||||||
|
extern void vdev_uninitialize(vdev_t *vd);
|
||||||
extern void vdev_initialize_stop(vdev_t *vd,
|
extern void vdev_initialize_stop(vdev_t *vd,
|
||||||
vdev_initializing_state_t tgt_state, list_t *vd_list);
|
vdev_initializing_state_t tgt_state, list_t *vd_list);
|
||||||
extern void vdev_initialize_stop_all(vdev_t *vd,
|
extern void vdev_initialize_stop_all(vdev_t *vd,
|
||||||
|
|||||||
@@ -66,10 +66,9 @@ typedef struct mzap_phys {
|
|||||||
} mzap_phys_t;
|
} mzap_phys_t;
|
||||||
|
|
||||||
typedef struct mzap_ent {
|
typedef struct mzap_ent {
|
||||||
avl_node_t mze_node;
|
uint32_t mze_hash;
|
||||||
int mze_chunkid;
|
uint16_t mze_cd; /* copy from mze_phys->mze_cd */
|
||||||
uint64_t mze_hash;
|
uint16_t mze_chunkid;
|
||||||
uint32_t mze_cd; /* copy from mze_phys->mze_cd */
|
|
||||||
} mzap_ent_t;
|
} mzap_ent_t;
|
||||||
|
|
||||||
#define MZE_PHYS(zap, mze) \
|
#define MZE_PHYS(zap, mze) \
|
||||||
@@ -164,7 +163,7 @@ typedef struct zap {
|
|||||||
int16_t zap_num_entries;
|
int16_t zap_num_entries;
|
||||||
int16_t zap_num_chunks;
|
int16_t zap_num_chunks;
|
||||||
int16_t zap_alloc_next;
|
int16_t zap_alloc_next;
|
||||||
avl_tree_t zap_avl;
|
zfs_btree_t zap_tree;
|
||||||
} zap_micro;
|
} zap_micro;
|
||||||
} zap_u;
|
} zap_u;
|
||||||
} zap_t;
|
} zap_t;
|
||||||
@@ -202,7 +201,7 @@ int zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx,
|
|||||||
krw_t lti, boolean_t fatreader, boolean_t adding, void *tag, zap_t **zapp);
|
krw_t lti, boolean_t fatreader, boolean_t adding, void *tag, zap_t **zapp);
|
||||||
void zap_unlockdir(zap_t *zap, void *tag);
|
void zap_unlockdir(zap_t *zap, void *tag);
|
||||||
void zap_evict_sync(void *dbu);
|
void zap_evict_sync(void *dbu);
|
||||||
zap_name_t *zap_name_alloc(zap_t *zap, const char *key, matchtype_t mt);
|
zap_name_t *zap_name_alloc_str(zap_t *zap, const char *key, matchtype_t mt);
|
||||||
void zap_name_free(zap_name_t *zn);
|
void zap_name_free(zap_name_t *zn);
|
||||||
int zap_hashbits(zap_t *zap);
|
int zap_hashbits(zap_t *zap);
|
||||||
uint32_t zap_maxcd(zap_t *zap);
|
uint32_t zap_maxcd(zap_t *zap);
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ extern "C" {
|
|||||||
#include <sys/kmem.h>
|
#include <sys/kmem.h>
|
||||||
#include <sys/kmem_cache.h>
|
#include <sys/kmem_cache.h>
|
||||||
#include <sys/vmem.h>
|
#include <sys/vmem.h>
|
||||||
|
#include <sys/misc.h>
|
||||||
#include <sys/taskq.h>
|
#include <sys/taskq.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/disp.h>
|
#include <sys/disp.h>
|
||||||
|
|||||||
@@ -188,7 +188,6 @@ typedef struct znode {
|
|||||||
boolean_t z_atime_dirty; /* atime needs to be synced */
|
boolean_t z_atime_dirty; /* atime needs to be synced */
|
||||||
boolean_t z_zn_prefetch; /* Prefetch znodes? */
|
boolean_t z_zn_prefetch; /* Prefetch znodes? */
|
||||||
boolean_t z_is_sa; /* are we native sa? */
|
boolean_t z_is_sa; /* are we native sa? */
|
||||||
boolean_t z_is_mapped; /* are we mmap'ed */
|
|
||||||
boolean_t z_is_ctldir; /* are we .zfs entry */
|
boolean_t z_is_ctldir; /* are we .zfs entry */
|
||||||
boolean_t z_suspended; /* extra ref from a suspend? */
|
boolean_t z_suspended; /* extra ref from a suspend? */
|
||||||
uint_t z_blksz; /* block size in bytes */
|
uint_t z_blksz; /* block size in bytes */
|
||||||
@@ -198,6 +197,8 @@ typedef struct znode {
|
|||||||
uint64_t z_size; /* file size (cached) */
|
uint64_t z_size; /* file size (cached) */
|
||||||
uint64_t z_pflags; /* pflags (cached) */
|
uint64_t z_pflags; /* pflags (cached) */
|
||||||
uint32_t z_sync_cnt; /* synchronous open count */
|
uint32_t z_sync_cnt; /* synchronous open count */
|
||||||
|
uint32_t z_sync_writes_cnt; /* synchronous write count */
|
||||||
|
uint32_t z_async_writes_cnt; /* asynchronous write count */
|
||||||
mode_t z_mode; /* mode (cached) */
|
mode_t z_mode; /* mode (cached) */
|
||||||
kmutex_t z_acl_lock; /* acl data lock */
|
kmutex_t z_acl_lock; /* acl data lock */
|
||||||
zfs_acl_t *z_acl_cached; /* cached acl */
|
zfs_acl_t *z_acl_cached; /* cached acl */
|
||||||
@@ -217,9 +218,9 @@ typedef struct znode {
|
|||||||
|
|
||||||
typedef struct znode_hold {
|
typedef struct znode_hold {
|
||||||
uint64_t zh_obj; /* object id */
|
uint64_t zh_obj; /* object id */
|
||||||
kmutex_t zh_lock; /* lock serializing object access */
|
|
||||||
avl_node_t zh_node; /* avl tree linkage */
|
avl_node_t zh_node; /* avl tree linkage */
|
||||||
zfs_refcount_t zh_refcount; /* active consumer reference count */
|
kmutex_t zh_lock; /* lock serializing object access */
|
||||||
|
int zh_refcount; /* active consumer reference count */
|
||||||
} znode_hold_t;
|
} znode_hold_t;
|
||||||
|
|
||||||
static inline uint64_t
|
static inline uint64_t
|
||||||
|
|||||||
@@ -34,9 +34,8 @@ extern "C" {
|
|||||||
|
|
||||||
typedef struct zrlock {
|
typedef struct zrlock {
|
||||||
kmutex_t zr_mtx;
|
kmutex_t zr_mtx;
|
||||||
volatile int32_t zr_refcount;
|
|
||||||
kcondvar_t zr_cv;
|
kcondvar_t zr_cv;
|
||||||
uint16_t zr_pad;
|
volatile int32_t zr_refcount;
|
||||||
#ifdef ZFS_DEBUG
|
#ifdef ZFS_DEBUG
|
||||||
kthread_t *zr_owner;
|
kthread_t *zr_owner;
|
||||||
const char *zr_caller;
|
const char *zr_caller;
|
||||||
|
|||||||
+27
-8
@@ -99,6 +99,7 @@
|
|||||||
<elf-symbol name='sa_validate_shareopts' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='sa_validate_shareopts' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='snapshot_namecheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='snapshot_namecheck' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='unshare_one' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='unshare_one' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
|
<elf-symbol name='use_color' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zcmd_alloc_dst_nvlist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zcmd_alloc_dst_nvlist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zcmd_expand_dst_nvlist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zcmd_expand_dst_nvlist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zcmd_free_nvlists' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zcmd_free_nvlists' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
@@ -378,6 +379,7 @@
|
|||||||
<elf-symbol name='zpool_vdev_path_to_guid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zpool_vdev_path_to_guid' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zpool_vdev_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zpool_vdev_remove' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zpool_vdev_remove_cancel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zpool_vdev_remove_cancel' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
|
<elf-symbol name='zpool_vdev_remove_wanted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zpool_vdev_split' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zpool_vdev_split' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zpool_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zpool_wait' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zpool_wait_status' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zpool_wait_status' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
@@ -5069,6 +5071,9 @@
|
|||||||
<parameter type-id='9cf59a50'/>
|
<parameter type-id='9cf59a50'/>
|
||||||
<return type-id='48b5725f'/>
|
<return type-id='48b5725f'/>
|
||||||
</function-decl>
|
</function-decl>
|
||||||
|
<function-decl name='use_color' mangled-name='use_color' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='use_color'>
|
||||||
|
<return type-id='95e97e5e'/>
|
||||||
|
</function-decl>
|
||||||
<function-decl name='mkdirp' visibility='default' binding='global' size-in-bits='64'>
|
<function-decl name='mkdirp' visibility='default' binding='global' size-in-bits='64'>
|
||||||
<parameter type-id='80f4b756'/>
|
<parameter type-id='80f4b756'/>
|
||||||
<parameter type-id='d50d396c'/>
|
<parameter type-id='d50d396c'/>
|
||||||
@@ -5405,7 +5410,8 @@
|
|||||||
<enumerator name='POOL_INITIALIZE_START' value='0'/>
|
<enumerator name='POOL_INITIALIZE_START' value='0'/>
|
||||||
<enumerator name='POOL_INITIALIZE_CANCEL' value='1'/>
|
<enumerator name='POOL_INITIALIZE_CANCEL' value='1'/>
|
||||||
<enumerator name='POOL_INITIALIZE_SUSPEND' value='2'/>
|
<enumerator name='POOL_INITIALIZE_SUSPEND' value='2'/>
|
||||||
<enumerator name='POOL_INITIALIZE_FUNCS' value='3'/>
|
<enumerator name='POOL_INITIALIZE_UNINIT' value='3'/>
|
||||||
|
<enumerator name='POOL_INITIALIZE_FUNCS' value='4'/>
|
||||||
</enum-decl>
|
</enum-decl>
|
||||||
<typedef-decl name='pool_initialize_func_t' type-id='5c246ad4' id='7063e1ab'/>
|
<typedef-decl name='pool_initialize_func_t' type-id='5c246ad4' id='7063e1ab'/>
|
||||||
<enum-decl name='pool_trim_func' id='54ed608a'>
|
<enum-decl name='pool_trim_func' id='54ed608a'>
|
||||||
@@ -5858,6 +5864,11 @@
|
|||||||
<parameter type-id='c19b74c3' name='istmp'/>
|
<parameter type-id='c19b74c3' name='istmp'/>
|
||||||
<return type-id='95e97e5e'/>
|
<return type-id='95e97e5e'/>
|
||||||
</function-decl>
|
</function-decl>
|
||||||
|
<function-decl name='zpool_vdev_remove_wanted' mangled-name='zpool_vdev_remove_wanted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_vdev_remove_wanted'>
|
||||||
|
<parameter type-id='4c81de99' name='zhp'/>
|
||||||
|
<parameter type-id='80f4b756' name='path'/>
|
||||||
|
<return type-id='95e97e5e'/>
|
||||||
|
</function-decl>
|
||||||
<function-decl name='zpool_vdev_fault' mangled-name='zpool_vdev_fault' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_vdev_fault'>
|
<function-decl name='zpool_vdev_fault' mangled-name='zpool_vdev_fault' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zpool_vdev_fault'>
|
||||||
<parameter type-id='4c81de99' name='zhp'/>
|
<parameter type-id='4c81de99' name='zhp'/>
|
||||||
<parameter type-id='9c313c2d' name='guid'/>
|
<parameter type-id='9c313c2d' name='guid'/>
|
||||||
@@ -6098,7 +6109,7 @@
|
|||||||
<array-type-def dimensions='1' type-id='b96825af' size-in-bits='64' id='13339fda'>
|
<array-type-def dimensions='1' type-id='b96825af' size-in-bits='64' id='13339fda'>
|
||||||
<subrange length='8' type-id='7359adad' id='56e0c0b1'/>
|
<subrange length='8' type-id='7359adad' id='56e0c0b1'/>
|
||||||
</array-type-def>
|
</array-type-def>
|
||||||
<class-decl name='sendflags' size-in-bits='544' is-struct='yes' visibility='default' id='f6aa15be'>
|
<class-decl name='sendflags' size-in-bits='576' is-struct='yes' visibility='default' id='f6aa15be'>
|
||||||
<data-member access='public' layout-offset-in-bits='0'>
|
<data-member access='public' layout-offset-in-bits='0'>
|
||||||
<var-decl name='verbosity' type-id='95e97e5e' visibility='default'/>
|
<var-decl name='verbosity' type-id='95e97e5e' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
@@ -6130,24 +6141,27 @@
|
|||||||
<var-decl name='progress' type-id='c19b74c3' visibility='default'/>
|
<var-decl name='progress' type-id='c19b74c3' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
<data-member access='public' layout-offset-in-bits='320'>
|
<data-member access='public' layout-offset-in-bits='320'>
|
||||||
<var-decl name='largeblock' type-id='c19b74c3' visibility='default'/>
|
<var-decl name='progressastitle' type-id='c19b74c3' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
<data-member access='public' layout-offset-in-bits='352'>
|
<data-member access='public' layout-offset-in-bits='352'>
|
||||||
<var-decl name='embed_data' type-id='c19b74c3' visibility='default'/>
|
<var-decl name='largeblock' type-id='c19b74c3' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
<data-member access='public' layout-offset-in-bits='384'>
|
<data-member access='public' layout-offset-in-bits='384'>
|
||||||
<var-decl name='compress' type-id='c19b74c3' visibility='default'/>
|
<var-decl name='embed_data' type-id='c19b74c3' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
<data-member access='public' layout-offset-in-bits='416'>
|
<data-member access='public' layout-offset-in-bits='416'>
|
||||||
<var-decl name='raw' type-id='c19b74c3' visibility='default'/>
|
<var-decl name='compress' type-id='c19b74c3' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
<data-member access='public' layout-offset-in-bits='448'>
|
<data-member access='public' layout-offset-in-bits='448'>
|
||||||
<var-decl name='backup' type-id='c19b74c3' visibility='default'/>
|
<var-decl name='raw' type-id='c19b74c3' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
<data-member access='public' layout-offset-in-bits='480'>
|
<data-member access='public' layout-offset-in-bits='480'>
|
||||||
<var-decl name='holds' type-id='c19b74c3' visibility='default'/>
|
<var-decl name='backup' type-id='c19b74c3' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
<data-member access='public' layout-offset-in-bits='512'>
|
<data-member access='public' layout-offset-in-bits='512'>
|
||||||
|
<var-decl name='holds' type-id='c19b74c3' visibility='default'/>
|
||||||
|
</data-member>
|
||||||
|
<data-member access='public' layout-offset-in-bits='544'>
|
||||||
<var-decl name='saved' type-id='c19b74c3' visibility='default'/>
|
<var-decl name='saved' type-id='c19b74c3' visibility='default'/>
|
||||||
</data-member>
|
</data-member>
|
||||||
</class-decl>
|
</class-decl>
|
||||||
@@ -6728,6 +6742,11 @@
|
|||||||
<parameter type-id='95e97e5e'/>
|
<parameter type-id='95e97e5e'/>
|
||||||
<return type-id='48b5725f'/>
|
<return type-id='48b5725f'/>
|
||||||
</function-decl>
|
</function-decl>
|
||||||
|
<function-decl name='zfs_setproctitle' visibility='default' binding='global' size-in-bits='64'>
|
||||||
|
<parameter type-id='80f4b756'/>
|
||||||
|
<parameter is-variadic='yes'/>
|
||||||
|
<return type-id='48b5725f'/>
|
||||||
|
</function-decl>
|
||||||
<function-decl name='avl_insert' visibility='default' binding='global' size-in-bits='64'>
|
<function-decl name='avl_insert' visibility='default' binding='global' size-in-bits='64'>
|
||||||
<parameter type-id='a3681dea'/>
|
<parameter type-id='a3681dea'/>
|
||||||
<parameter type-id='eaa32e2f'/>
|
<parameter type-id='eaa32e2f'/>
|
||||||
|
|||||||
@@ -1017,6 +1017,7 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl,
|
|||||||
nvlist_t *ret;
|
nvlist_t *ret;
|
||||||
int chosen_normal = -1;
|
int chosen_normal = -1;
|
||||||
int chosen_utf = -1;
|
int chosen_utf = -1;
|
||||||
|
int set_maxbs = 0;
|
||||||
|
|
||||||
if (nvlist_alloc(&ret, NV_UNIQUE_NAME, 0) != 0) {
|
if (nvlist_alloc(&ret, NV_UNIQUE_NAME, 0) != 0) {
|
||||||
(void) no_memory(hdl);
|
(void) no_memory(hdl);
|
||||||
@@ -1234,12 +1235,17 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl,
|
|||||||
(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
|
(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
/* save the ZFS_PROP_RECORDSIZE during create op */
|
||||||
|
if (zpool_hdl == NULL && prop == ZFS_PROP_RECORDSIZE) {
|
||||||
|
set_maxbs = intval;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case ZFS_PROP_SPECIAL_SMALL_BLOCKS:
|
case ZFS_PROP_SPECIAL_SMALL_BLOCKS:
|
||||||
{
|
{
|
||||||
int maxbs = SPA_OLD_MAXBLOCKSIZE;
|
int maxbs =
|
||||||
|
set_maxbs == 0 ? SPA_OLD_MAXBLOCKSIZE : set_maxbs;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
if (zpool_hdl != NULL) {
|
if (zpool_hdl != NULL) {
|
||||||
|
|||||||
@@ -56,10 +56,10 @@
|
|||||||
#define ZDIFF_REMOVED '-'
|
#define ZDIFF_REMOVED '-'
|
||||||
#define ZDIFF_RENAMED "R"
|
#define ZDIFF_RENAMED "R"
|
||||||
|
|
||||||
#define ZDIFF_ADDED_COLOR ANSI_GREEN
|
#define ZDIFF_ADDED_COLOR ANSI_GREEN
|
||||||
#define ZDIFF_MODIFIED_COLOR ANSI_YELLOW
|
#define ZDIFF_MODIFIED_COLOR ANSI_YELLOW
|
||||||
#define ZDIFF_REMOVED_COLOR ANSI_RED
|
#define ZDIFF_REMOVED_COLOR ANSI_RED
|
||||||
#define ZDIFF_RENAMED_COLOR ANSI_BLUE
|
#define ZDIFF_RENAMED_COLOR ANSI_BOLD_BLUE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Given a {dsname, object id}, get the object path
|
* Given a {dsname, object id}, get the object path
|
||||||
|
|||||||
@@ -2224,8 +2224,8 @@ xlate_init_err(int err)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Begin, suspend, or cancel the initialization (initializing of all free
|
* Begin, suspend, cancel, or uninit (clear) the initialization (initializing
|
||||||
* blocks) for the given vdevs in the given pool.
|
* of all free blocks) for the given vdevs in the given pool.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
zpool_initialize_impl(zpool_handle_t *zhp, pool_initialize_func_t cmd_type,
|
zpool_initialize_impl(zpool_handle_t *zhp, pool_initialize_func_t cmd_type,
|
||||||
@@ -2251,11 +2251,16 @@ zpool_initialize_impl(zpool_handle_t *zhp, pool_initialize_func_t cmd_type,
|
|||||||
vdev_guids, &errlist);
|
vdev_guids, &errlist);
|
||||||
|
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
if (errlist != NULL) {
|
if (errlist != NULL && nvlist_lookup_nvlist(errlist,
|
||||||
vd_errlist = fnvlist_lookup_nvlist(errlist,
|
ZPOOL_INITIALIZE_VDEVS, &vd_errlist) == 0) {
|
||||||
ZPOOL_INITIALIZE_VDEVS);
|
|
||||||
goto list_errors;
|
goto list_errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (err == EINVAL && cmd_type == POOL_INITIALIZE_UNINIT) {
|
||||||
|
zfs_error_aux(zhp->zpool_hdl, dgettext(TEXT_DOMAIN,
|
||||||
|
"uninitialize is not supported by kernel"));
|
||||||
|
}
|
||||||
|
|
||||||
(void) zpool_standard_error(zhp->zpool_hdl, err,
|
(void) zpool_standard_error(zhp->zpool_hdl, err,
|
||||||
dgettext(TEXT_DOMAIN, "operation failed"));
|
dgettext(TEXT_DOMAIN, "operation failed"));
|
||||||
goto out;
|
goto out;
|
||||||
@@ -3051,7 +3056,7 @@ zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags,
|
|||||||
|
|
||||||
verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
|
verify(nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID, &zc.zc_guid) == 0);
|
||||||
|
|
||||||
if (avail_spare)
|
if (!(flags & ZFS_ONLINE_SPARE) && avail_spare)
|
||||||
return (zfs_error(hdl, EZFS_ISSPARE, msg));
|
return (zfs_error(hdl, EZFS_ISSPARE, msg));
|
||||||
|
|
||||||
if ((flags & ZFS_ONLINE_EXPAND ||
|
if ((flags & ZFS_ONLINE_EXPAND ||
|
||||||
@@ -3158,6 +3163,40 @@ zpool_vdev_offline(zpool_handle_t *zhp, const char *path, boolean_t istmp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove the specified vdev asynchronously from the configuration, so
|
||||||
|
* that it may come ONLINE if reinserted. This is called from zed on
|
||||||
|
* Udev remove event.
|
||||||
|
* Note: We also have a similar function zpool_vdev_remove() that
|
||||||
|
* removes the vdev from the pool.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
zpool_vdev_remove_wanted(zpool_handle_t *zhp, const char *path)
|
||||||
|
{
|
||||||
|
zfs_cmd_t zc = {"\0"};
|
||||||
|
char errbuf[1024];
|
||||||
|
nvlist_t *tgt;
|
||||||
|
boolean_t avail_spare, l2cache;
|
||||||
|
libzfs_handle_t *hdl = zhp->zpool_hdl;
|
||||||
|
|
||||||
|
(void) snprintf(errbuf, sizeof (errbuf),
|
||||||
|
dgettext(TEXT_DOMAIN, "cannot remove %s"), path);
|
||||||
|
|
||||||
|
(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
|
||||||
|
if ((tgt = zpool_find_vdev(zhp, path, &avail_spare, &l2cache,
|
||||||
|
NULL)) == NULL)
|
||||||
|
return (zfs_error(hdl, EZFS_NODEVICE, errbuf));
|
||||||
|
|
||||||
|
zc.zc_guid = fnvlist_lookup_uint64(tgt, ZPOOL_CONFIG_GUID);
|
||||||
|
|
||||||
|
zc.zc_cookie = VDEV_STATE_REMOVED;
|
||||||
|
|
||||||
|
if (zfs_ioctl(hdl, ZFS_IOC_VDEV_SET_STATE, &zc) == 0)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
return (zpool_standard_error(hdl, errno, errbuf));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mark the given vdev faulted.
|
* Mark the given vdev faulted.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -83,6 +83,9 @@ typedef struct progress_arg {
|
|||||||
boolean_t pa_parsable;
|
boolean_t pa_parsable;
|
||||||
boolean_t pa_estimate;
|
boolean_t pa_estimate;
|
||||||
int pa_verbosity;
|
int pa_verbosity;
|
||||||
|
boolean_t pa_astitle;
|
||||||
|
boolean_t pa_progress;
|
||||||
|
uint64_t pa_size;
|
||||||
} progress_arg_t;
|
} progress_arg_t;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -712,6 +715,7 @@ typedef struct send_dump_data {
|
|||||||
boolean_t seenfrom, seento, replicate, doall, fromorigin;
|
boolean_t seenfrom, seento, replicate, doall, fromorigin;
|
||||||
boolean_t dryrun, parsable, progress, embed_data, std_out;
|
boolean_t dryrun, parsable, progress, embed_data, std_out;
|
||||||
boolean_t large_block, compress, raw, holds;
|
boolean_t large_block, compress, raw, holds;
|
||||||
|
boolean_t progressastitle;
|
||||||
int outfd;
|
int outfd;
|
||||||
boolean_t err;
|
boolean_t err;
|
||||||
nvlist_t *fss;
|
nvlist_t *fss;
|
||||||
@@ -904,6 +908,7 @@ send_progress_thread(void *arg)
|
|||||||
zfs_handle_t *zhp = pa->pa_zhp;
|
zfs_handle_t *zhp = pa->pa_zhp;
|
||||||
uint64_t bytes;
|
uint64_t bytes;
|
||||||
uint64_t blocks;
|
uint64_t blocks;
|
||||||
|
uint64_t total = pa->pa_size / 100;
|
||||||
char buf[16];
|
char buf[16];
|
||||||
time_t t;
|
time_t t;
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
@@ -922,7 +927,7 @@ send_progress_thread(void *arg)
|
|||||||
return ((void *)(uintptr_t)err);
|
return ((void *)(uintptr_t)err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firstloop && !pa->pa_parsable) {
|
if (firstloop && !pa->pa_parsable && pa->pa_progress) {
|
||||||
(void) fprintf(stderr,
|
(void) fprintf(stderr,
|
||||||
"TIME %s %sSNAPSHOT %s\n",
|
"TIME %s %sSNAPSHOT %s\n",
|
||||||
pa->pa_estimate ? "BYTES" : " SENT",
|
pa->pa_estimate ? "BYTES" : " SENT",
|
||||||
@@ -934,6 +939,17 @@ send_progress_thread(void *arg)
|
|||||||
(void) time(&t);
|
(void) time(&t);
|
||||||
tm = localtime(&t);
|
tm = localtime(&t);
|
||||||
|
|
||||||
|
if (pa->pa_astitle) {
|
||||||
|
char buf_bytes[16];
|
||||||
|
char buf_size[16];
|
||||||
|
int pct;
|
||||||
|
zfs_nicenum(bytes, buf_bytes, sizeof (buf_bytes));
|
||||||
|
zfs_nicenum(pa->pa_size, buf_size, sizeof (buf_size));
|
||||||
|
pct = (total > 0) ? bytes / total : 100;
|
||||||
|
zfs_setproctitle("sending %s (%d%%: %s/%s)",
|
||||||
|
zhp->zfs_name, MIN(pct, 100), buf_bytes, buf_size);
|
||||||
|
}
|
||||||
|
|
||||||
if (pa->pa_verbosity >= 2 && pa->pa_parsable) {
|
if (pa->pa_verbosity >= 2 && pa->pa_parsable) {
|
||||||
(void) fprintf(stderr,
|
(void) fprintf(stderr,
|
||||||
"%02d:%02d:%02d\t%llu\t%llu\t%s\n",
|
"%02d:%02d:%02d\t%llu\t%llu\t%s\n",
|
||||||
@@ -950,7 +966,7 @@ send_progress_thread(void *arg)
|
|||||||
(void) fprintf(stderr, "%02d:%02d:%02d\t%llu\t%s\n",
|
(void) fprintf(stderr, "%02d:%02d:%02d\t%llu\t%s\n",
|
||||||
tm->tm_hour, tm->tm_min, tm->tm_sec,
|
tm->tm_hour, tm->tm_min, tm->tm_sec,
|
||||||
(u_longlong_t)bytes, zhp->zfs_name);
|
(u_longlong_t)bytes, zhp->zfs_name);
|
||||||
} else {
|
} else if (pa->pa_progress) {
|
||||||
zfs_nicebytes(bytes, buf, sizeof (buf));
|
zfs_nicebytes(bytes, buf, sizeof (buf));
|
||||||
(void) fprintf(stderr, "%02d:%02d:%02d %5s %s\n",
|
(void) fprintf(stderr, "%02d:%02d:%02d %5s %s\n",
|
||||||
tm->tm_hour, tm->tm_min, tm->tm_sec,
|
tm->tm_hour, tm->tm_min, tm->tm_sec,
|
||||||
@@ -1114,12 +1130,15 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
|
|||||||
* If progress reporting is requested, spawn a new thread to
|
* If progress reporting is requested, spawn a new thread to
|
||||||
* poll ZFS_IOC_SEND_PROGRESS at a regular interval.
|
* poll ZFS_IOC_SEND_PROGRESS at a regular interval.
|
||||||
*/
|
*/
|
||||||
if (sdd->progress) {
|
if (sdd->progress || sdd->progressastitle) {
|
||||||
pa.pa_zhp = zhp;
|
pa.pa_zhp = zhp;
|
||||||
pa.pa_fd = sdd->outfd;
|
pa.pa_fd = sdd->outfd;
|
||||||
pa.pa_parsable = sdd->parsable;
|
pa.pa_parsable = sdd->parsable;
|
||||||
pa.pa_estimate = B_FALSE;
|
pa.pa_estimate = B_FALSE;
|
||||||
pa.pa_verbosity = sdd->verbosity;
|
pa.pa_verbosity = sdd->verbosity;
|
||||||
|
pa.pa_size = sdd->size;
|
||||||
|
pa.pa_astitle = sdd->progressastitle;
|
||||||
|
pa.pa_progress = sdd->progress;
|
||||||
|
|
||||||
if ((err = pthread_create(&tid, NULL,
|
if ((err = pthread_create(&tid, NULL,
|
||||||
send_progress_thread, &pa)) != 0) {
|
send_progress_thread, &pa)) != 0) {
|
||||||
@@ -1131,7 +1150,7 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
|
|||||||
err = dump_ioctl(zhp, sdd->prevsnap, sdd->prevsnap_obj,
|
err = dump_ioctl(zhp, sdd->prevsnap, sdd->prevsnap_obj,
|
||||||
fromorigin, sdd->outfd, flags, sdd->debugnv);
|
fromorigin, sdd->outfd, flags, sdd->debugnv);
|
||||||
|
|
||||||
if (sdd->progress) {
|
if (sdd->progress || sdd->progressastitle) {
|
||||||
void *status = NULL;
|
void *status = NULL;
|
||||||
(void) pthread_cancel(tid);
|
(void) pthread_cancel(tid);
|
||||||
(void) pthread_join(tid, &status);
|
(void) pthread_join(tid, &status);
|
||||||
@@ -1462,7 +1481,7 @@ lzc_flags_from_sendflags(const sendflags_t *flags)
|
|||||||
static int
|
static int
|
||||||
estimate_size(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
estimate_size(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
||||||
uint64_t resumeobj, uint64_t resumeoff, uint64_t bytes,
|
uint64_t resumeobj, uint64_t resumeoff, uint64_t bytes,
|
||||||
const char *redactbook, char *errbuf)
|
const char *redactbook, char *errbuf, uint64_t *sizep)
|
||||||
{
|
{
|
||||||
uint64_t size;
|
uint64_t size;
|
||||||
FILE *fout = flags->dryrun ? stdout : stderr;
|
FILE *fout = flags->dryrun ? stdout : stderr;
|
||||||
@@ -1470,7 +1489,7 @@ estimate_size(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
|||||||
int err = 0;
|
int err = 0;
|
||||||
pthread_t ptid;
|
pthread_t ptid;
|
||||||
|
|
||||||
if (flags->progress) {
|
if (flags->progress || flags->progressastitle) {
|
||||||
pa.pa_zhp = zhp;
|
pa.pa_zhp = zhp;
|
||||||
pa.pa_fd = fd;
|
pa.pa_fd = fd;
|
||||||
pa.pa_parsable = flags->parsable;
|
pa.pa_parsable = flags->parsable;
|
||||||
@@ -1489,8 +1508,9 @@ estimate_size(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
|||||||
err = lzc_send_space_resume_redacted(zhp->zfs_name, from,
|
err = lzc_send_space_resume_redacted(zhp->zfs_name, from,
|
||||||
lzc_flags_from_sendflags(flags), resumeobj, resumeoff, bytes,
|
lzc_flags_from_sendflags(flags), resumeobj, resumeoff, bytes,
|
||||||
redactbook, fd, &size);
|
redactbook, fd, &size);
|
||||||
|
*sizep = size;
|
||||||
|
|
||||||
if (flags->progress) {
|
if (flags->progress || flags->progressastitle) {
|
||||||
void *status = NULL;
|
void *status = NULL;
|
||||||
(void) pthread_cancel(ptid);
|
(void) pthread_cancel(ptid);
|
||||||
(void) pthread_join(ptid, &status);
|
(void) pthread_join(ptid, &status);
|
||||||
@@ -1505,6 +1525,9 @@ estimate_size(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!flags->progress && !flags->parsable)
|
||||||
|
return (err);
|
||||||
|
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
zfs_error_aux(zhp->zfs_hdl, "%s", strerror(err));
|
zfs_error_aux(zhp->zfs_hdl, "%s", strerror(err));
|
||||||
return (zfs_error(zhp->zfs_hdl, EZFS_BADBACKUP,
|
return (zfs_error(zhp->zfs_hdl, EZFS_BADBACKUP,
|
||||||
@@ -1638,6 +1661,7 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd,
|
|||||||
uint64_t *redact_snap_guids = NULL;
|
uint64_t *redact_snap_guids = NULL;
|
||||||
int num_redact_snaps = 0;
|
int num_redact_snaps = 0;
|
||||||
char *redact_book = NULL;
|
char *redact_book = NULL;
|
||||||
|
uint64_t size = 0;
|
||||||
|
|
||||||
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
||||||
"cannot resume send"));
|
"cannot resume send"));
|
||||||
@@ -1731,7 +1755,7 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags->verbosity != 0) {
|
if (flags->verbosity != 0 || flags->progressastitle) {
|
||||||
/*
|
/*
|
||||||
* Some of these may have come from the resume token, set them
|
* Some of these may have come from the resume token, set them
|
||||||
* here for size estimate purposes.
|
* here for size estimate purposes.
|
||||||
@@ -1748,7 +1772,7 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd,
|
|||||||
if (lzc_flags & LZC_SEND_FLAG_SAVED)
|
if (lzc_flags & LZC_SEND_FLAG_SAVED)
|
||||||
tmpflags.saved = B_TRUE;
|
tmpflags.saved = B_TRUE;
|
||||||
error = estimate_size(zhp, fromname, outfd, &tmpflags,
|
error = estimate_size(zhp, fromname, outfd, &tmpflags,
|
||||||
resumeobj, resumeoff, bytes, redact_book, errbuf);
|
resumeobj, resumeoff, bytes, redact_book, errbuf, &size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!flags->dryrun) {
|
if (!flags->dryrun) {
|
||||||
@@ -1758,12 +1782,15 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd,
|
|||||||
* If progress reporting is requested, spawn a new thread to
|
* If progress reporting is requested, spawn a new thread to
|
||||||
* poll ZFS_IOC_SEND_PROGRESS at a regular interval.
|
* poll ZFS_IOC_SEND_PROGRESS at a regular interval.
|
||||||
*/
|
*/
|
||||||
if (flags->progress) {
|
if (flags->progress || flags->progressastitle) {
|
||||||
pa.pa_zhp = zhp;
|
pa.pa_zhp = zhp;
|
||||||
pa.pa_fd = outfd;
|
pa.pa_fd = outfd;
|
||||||
pa.pa_parsable = flags->parsable;
|
pa.pa_parsable = flags->parsable;
|
||||||
pa.pa_estimate = B_FALSE;
|
pa.pa_estimate = B_FALSE;
|
||||||
pa.pa_verbosity = flags->verbosity;
|
pa.pa_verbosity = flags->verbosity;
|
||||||
|
pa.pa_size = size;
|
||||||
|
pa.pa_astitle = flags->progressastitle;
|
||||||
|
pa.pa_progress = flags->progress;
|
||||||
|
|
||||||
error = pthread_create(&tid, NULL,
|
error = pthread_create(&tid, NULL,
|
||||||
send_progress_thread, &pa);
|
send_progress_thread, &pa);
|
||||||
@@ -1780,7 +1807,7 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd,
|
|||||||
if (redact_book != NULL)
|
if (redact_book != NULL)
|
||||||
free(redact_book);
|
free(redact_book);
|
||||||
|
|
||||||
if (flags->progress) {
|
if (flags->progress || flags->progress) {
|
||||||
void *status = NULL;
|
void *status = NULL;
|
||||||
(void) pthread_cancel(tid);
|
(void) pthread_cancel(tid);
|
||||||
(void) pthread_join(tid, &status);
|
(void) pthread_join(tid, &status);
|
||||||
@@ -1790,6 +1817,7 @@ zfs_send_resume_impl(libzfs_handle_t *hdl, sendflags_t *flags, int outfd,
|
|||||||
(void) snprintf(errbuf, sizeof (errbuf),
|
(void) snprintf(errbuf, sizeof (errbuf),
|
||||||
dgettext(TEXT_DOMAIN,
|
dgettext(TEXT_DOMAIN,
|
||||||
"progress thread exited nonzero"));
|
"progress thread exited nonzero"));
|
||||||
|
zfs_close(zhp);
|
||||||
return (zfs_standard_error(hdl, error, errbuf));
|
return (zfs_standard_error(hdl, error, errbuf));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2199,6 +2227,7 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap,
|
|||||||
sdd.verbosity = flags->verbosity;
|
sdd.verbosity = flags->verbosity;
|
||||||
sdd.parsable = flags->parsable;
|
sdd.parsable = flags->parsable;
|
||||||
sdd.progress = flags->progress;
|
sdd.progress = flags->progress;
|
||||||
|
sdd.progressastitle = flags->progressastitle;
|
||||||
sdd.dryrun = flags->dryrun;
|
sdd.dryrun = flags->dryrun;
|
||||||
sdd.large_block = flags->largeblock;
|
sdd.large_block = flags->largeblock;
|
||||||
sdd.embed_data = flags->embed_data;
|
sdd.embed_data = flags->embed_data;
|
||||||
@@ -2410,6 +2439,7 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
|||||||
char *name = zhp->zfs_name;
|
char *name = zhp->zfs_name;
|
||||||
pthread_t ptid;
|
pthread_t ptid;
|
||||||
progress_arg_t pa = { 0 };
|
progress_arg_t pa = { 0 };
|
||||||
|
uint64_t size = 0;
|
||||||
|
|
||||||
char errbuf[1024];
|
char errbuf[1024];
|
||||||
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
||||||
@@ -2492,9 +2522,9 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
|||||||
/*
|
/*
|
||||||
* Perform size estimate if verbose was specified.
|
* Perform size estimate if verbose was specified.
|
||||||
*/
|
*/
|
||||||
if (flags->verbosity != 0) {
|
if (flags->verbosity != 0 || flags->progressastitle) {
|
||||||
err = estimate_size(zhp, from, fd, flags, 0, 0, 0, redactbook,
|
err = estimate_size(zhp, from, fd, flags, 0, 0, 0, redactbook,
|
||||||
errbuf);
|
errbuf, &size);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return (err);
|
return (err);
|
||||||
}
|
}
|
||||||
@@ -2506,12 +2536,15 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
|||||||
* If progress reporting is requested, spawn a new thread to poll
|
* If progress reporting is requested, spawn a new thread to poll
|
||||||
* ZFS_IOC_SEND_PROGRESS at a regular interval.
|
* ZFS_IOC_SEND_PROGRESS at a regular interval.
|
||||||
*/
|
*/
|
||||||
if (flags->progress) {
|
if (flags->progress || flags->progressastitle) {
|
||||||
pa.pa_zhp = zhp;
|
pa.pa_zhp = zhp;
|
||||||
pa.pa_fd = fd;
|
pa.pa_fd = fd;
|
||||||
pa.pa_parsable = flags->parsable;
|
pa.pa_parsable = flags->parsable;
|
||||||
pa.pa_estimate = B_FALSE;
|
pa.pa_estimate = B_FALSE;
|
||||||
pa.pa_verbosity = flags->verbosity;
|
pa.pa_verbosity = flags->verbosity;
|
||||||
|
pa.pa_size = size;
|
||||||
|
pa.pa_astitle = flags->progressastitle;
|
||||||
|
pa.pa_progress = flags->progress;
|
||||||
|
|
||||||
err = pthread_create(&ptid, NULL,
|
err = pthread_create(&ptid, NULL,
|
||||||
send_progress_thread, &pa);
|
send_progress_thread, &pa);
|
||||||
@@ -2525,7 +2558,7 @@ zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t *flags,
|
|||||||
err = lzc_send_redacted(name, from, fd,
|
err = lzc_send_redacted(name, from, fd,
|
||||||
lzc_flags_from_sendflags(flags), redactbook);
|
lzc_flags_from_sendflags(flags), redactbook);
|
||||||
|
|
||||||
if (flags->progress) {
|
if (flags->progress || flags->progressastitle) {
|
||||||
void *status = NULL;
|
void *status = NULL;
|
||||||
(void) pthread_cancel(ptid);
|
(void) pthread_cancel(ptid);
|
||||||
(void) pthread_join(ptid, &status);
|
(void) pthread_join(ptid, &status);
|
||||||
|
|||||||
@@ -2027,7 +2027,7 @@ zfs_version_print(void)
|
|||||||
* Return 1 if the user requested ANSI color output, and our terminal supports
|
* Return 1 if the user requested ANSI color output, and our terminal supports
|
||||||
* it. Return 0 for no color.
|
* it. Return 0 for no color.
|
||||||
*/
|
*/
|
||||||
static int
|
int
|
||||||
use_color(void)
|
use_color(void)
|
||||||
{
|
{
|
||||||
static int use_color = -1;
|
static int use_color = -1;
|
||||||
@@ -2073,10 +2073,11 @@ use_color(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* color_start() and color_end() are used for when you want to colorize a block
|
* The functions color_start() and color_end() are used for when you want
|
||||||
* of text. For example:
|
* to colorize a block of text.
|
||||||
*
|
*
|
||||||
* color_start(ANSI_RED_FG)
|
* For example:
|
||||||
|
* color_start(ANSI_RED)
|
||||||
* printf("hello");
|
* printf("hello");
|
||||||
* printf("world");
|
* printf("world");
|
||||||
* color_end();
|
* color_end();
|
||||||
@@ -2084,7 +2085,7 @@ use_color(void)
|
|||||||
void
|
void
|
||||||
color_start(const char *color)
|
color_start(const char *color)
|
||||||
{
|
{
|
||||||
if (use_color()) {
|
if (color && use_color()) {
|
||||||
fputs(color, stdout);
|
fputs(color, stdout);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
@@ -2099,7 +2100,9 @@ color_end(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* printf() with a color. If color is NULL, then do a normal printf. */
|
/*
|
||||||
|
* printf() with a color. If color is NULL, then do a normal printf.
|
||||||
|
*/
|
||||||
int
|
int
|
||||||
printf_color(const char *color, char *format, ...)
|
printf_color(const char *color, char *format, ...)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -272,6 +272,8 @@
|
|||||||
<elf-symbol name='zfs_niceraw' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_niceraw' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zfs_nicetime' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_nicetime' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zfs_resolve_shortname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_resolve_shortname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
|
<elf-symbol name='zfs_setproctitle' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
|
<elf-symbol name='zfs_setproctitle_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zfs_strcmp_pathname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_strcmp_pathname' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zfs_strip_partition' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_strip_partition' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
<elf-symbol name='zfs_strip_path' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
<elf-symbol name='zfs_strip_path' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||||
@@ -1724,7 +1726,8 @@
|
|||||||
<enumerator name='POOL_INITIALIZE_START' value='0'/>
|
<enumerator name='POOL_INITIALIZE_START' value='0'/>
|
||||||
<enumerator name='POOL_INITIALIZE_CANCEL' value='1'/>
|
<enumerator name='POOL_INITIALIZE_CANCEL' value='1'/>
|
||||||
<enumerator name='POOL_INITIALIZE_SUSPEND' value='2'/>
|
<enumerator name='POOL_INITIALIZE_SUSPEND' value='2'/>
|
||||||
<enumerator name='POOL_INITIALIZE_FUNCS' value='3'/>
|
<enumerator name='POOL_INITIALIZE_UNINIT' value='3'/>
|
||||||
|
<enumerator name='POOL_INITIALIZE_FUNCS' value='4'/>
|
||||||
</enum-decl>
|
</enum-decl>
|
||||||
<typedef-decl name='pool_initialize_func_t' type-id='5c246ad4' id='7063e1ab'/>
|
<typedef-decl name='pool_initialize_func_t' type-id='5c246ad4' id='7063e1ab'/>
|
||||||
<enum-decl name='pool_trim_func' id='54ed608a'>
|
<enum-decl name='pool_trim_func' id='54ed608a'>
|
||||||
@@ -3340,6 +3343,30 @@
|
|||||||
<return type-id='95e97e5e'/>
|
<return type-id='95e97e5e'/>
|
||||||
</function-decl>
|
</function-decl>
|
||||||
</abi-instr>
|
</abi-instr>
|
||||||
|
<abi-instr address-size='64' path='os/linux/zutil_setproctitle.c' language='LANG_C99'>
|
||||||
|
<function-decl name='warnx' visibility='default' binding='global' size-in-bits='64'>
|
||||||
|
<parameter type-id='80f4b756'/>
|
||||||
|
<parameter is-variadic='yes'/>
|
||||||
|
<return type-id='48b5725f'/>
|
||||||
|
</function-decl>
|
||||||
|
<function-decl name='setenv' visibility='default' binding='global' size-in-bits='64'>
|
||||||
|
<parameter type-id='80f4b756'/>
|
||||||
|
<parameter type-id='80f4b756'/>
|
||||||
|
<parameter type-id='95e97e5e'/>
|
||||||
|
<return type-id='95e97e5e'/>
|
||||||
|
</function-decl>
|
||||||
|
<function-decl name='zfs_setproctitle_init' mangled-name='zfs_setproctitle_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_setproctitle_init'>
|
||||||
|
<parameter type-id='95e97e5e' name='argc'/>
|
||||||
|
<parameter type-id='9b23c9ad' name='argv'/>
|
||||||
|
<parameter type-id='9b23c9ad' name='envp'/>
|
||||||
|
<return type-id='48b5725f'/>
|
||||||
|
</function-decl>
|
||||||
|
<function-decl name='zfs_setproctitle' mangled-name='zfs_setproctitle' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_setproctitle'>
|
||||||
|
<parameter type-id='80f4b756' name='fmt'/>
|
||||||
|
<parameter is-variadic='yes'/>
|
||||||
|
<return type-id='48b5725f'/>
|
||||||
|
</function-decl>
|
||||||
|
</abi-instr>
|
||||||
<abi-instr address-size='64' path='zutil_device_path.c' language='LANG_C99'>
|
<abi-instr address-size='64' path='zutil_device_path.c' language='LANG_C99'>
|
||||||
<qualified-type-def type-id='26a90f95' restrict='yes' id='266fe297'/>
|
<qualified-type-def type-id='26a90f95' restrict='yes' id='266fe297'/>
|
||||||
<qualified-type-def type-id='80f4b756' const='yes' id='b99c00c9'/>
|
<qualified-type-def type-id='80f4b756' const='yes' id='b99c00c9'/>
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ USER_C = \
|
|||||||
|
|
||||||
if BUILD_LINUX
|
if BUILD_LINUX
|
||||||
USER_C += \
|
USER_C += \
|
||||||
|
os/linux/zutil_setproctitle.c \
|
||||||
os/linux/zutil_device_path_os.c \
|
os/linux/zutil_device_path_os.c \
|
||||||
os/linux/zutil_import_os.c \
|
os/linux/zutil_import_os.c \
|
||||||
os/linux/zutil_compat.c
|
os/linux/zutil_compat.c
|
||||||
|
|||||||
@@ -0,0 +1,299 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2013 Guillem Jover <guillem@hadrons.org>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <err.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <libzutil.h>
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
/* Original value. */
|
||||||
|
const char *arg0;
|
||||||
|
|
||||||
|
/* Title space available. */
|
||||||
|
char *base, *end;
|
||||||
|
|
||||||
|
/* Pointer to original nul character within base. */
|
||||||
|
char *nul;
|
||||||
|
|
||||||
|
boolean_t warned;
|
||||||
|
boolean_t reset;
|
||||||
|
int error;
|
||||||
|
} SPT;
|
||||||
|
|
||||||
|
#define LIBBSD_IS_PATHNAME_SEPARATOR(c) ((c) == '/')
|
||||||
|
#define SPT_MAXTITLE 255
|
||||||
|
|
||||||
|
extern const char *__progname;
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
getprogname(void)
|
||||||
|
{
|
||||||
|
return (__progname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setprogname(const char *progname)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = strlen(progname); i > 0; i--) {
|
||||||
|
if (LIBBSD_IS_PATHNAME_SEPARATOR(progname[i - 1])) {
|
||||||
|
__progname = progname + i;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
__progname = progname;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline size_t
|
||||||
|
spt_min(size_t a, size_t b)
|
||||||
|
{
|
||||||
|
return ((a < b) ? a : b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For discussion on the portability of the various methods, see
|
||||||
|
* https://lists.freebsd.org/pipermail/freebsd-stable/2008-June/043136.html
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
spt_clearenv(void)
|
||||||
|
{
|
||||||
|
char **tmp;
|
||||||
|
|
||||||
|
tmp = malloc(sizeof (*tmp));
|
||||||
|
if (tmp == NULL)
|
||||||
|
return (errno);
|
||||||
|
|
||||||
|
tmp[0] = NULL;
|
||||||
|
environ = tmp;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
spt_copyenv(int envc, char *envp[])
|
||||||
|
{
|
||||||
|
char **envcopy;
|
||||||
|
char *eq;
|
||||||
|
int envsize;
|
||||||
|
int i, error;
|
||||||
|
|
||||||
|
if (environ != envp)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make a copy of the old environ array of pointers, in case
|
||||||
|
* clearenv() or setenv() is implemented to free the internal
|
||||||
|
* environ array, because we will need to access the old environ
|
||||||
|
* contents to make the new copy.
|
||||||
|
*/
|
||||||
|
envsize = (envc + 1) * sizeof (char *);
|
||||||
|
envcopy = malloc(envsize);
|
||||||
|
if (envcopy == NULL)
|
||||||
|
return (errno);
|
||||||
|
memcpy(envcopy, envp, envsize);
|
||||||
|
|
||||||
|
error = spt_clearenv();
|
||||||
|
if (error) {
|
||||||
|
environ = envp;
|
||||||
|
free(envcopy);
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; envcopy[i]; i++) {
|
||||||
|
eq = strchr(envcopy[i], '=');
|
||||||
|
if (eq == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
*eq = '\0';
|
||||||
|
if (setenv(envcopy[i], eq + 1, 1) < 0)
|
||||||
|
error = errno;
|
||||||
|
*eq = '=';
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
environ = envp;
|
||||||
|
free(envcopy);
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dispose of the shallow copy, now that we've finished transfering
|
||||||
|
* the old environment.
|
||||||
|
*/
|
||||||
|
free(envcopy);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
spt_copyargs(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; i < argc || (i >= argc && argv[i]); i++) {
|
||||||
|
if (argv[i] == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tmp = strdup(argv[i]);
|
||||||
|
if (tmp == NULL)
|
||||||
|
return (errno);
|
||||||
|
|
||||||
|
argv[i] = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
zfs_setproctitle_init(int argc, char *argv[], char *envp[])
|
||||||
|
{
|
||||||
|
char *base, *end, *nul, *tmp;
|
||||||
|
int i, envc, error;
|
||||||
|
|
||||||
|
/* Try to make sure we got called with main() arguments. */
|
||||||
|
if (argc < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
base = argv[0];
|
||||||
|
if (base == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
nul = base + strlen(base);
|
||||||
|
end = nul + 1;
|
||||||
|
|
||||||
|
for (i = 0; i < argc || (i >= argc && argv[i]); i++) {
|
||||||
|
if (argv[i] == NULL || argv[i] != end)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
end = argv[i] + strlen(argv[i]) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; envp[i]; i++) {
|
||||||
|
if (envp[i] != end)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
end = envp[i] + strlen(envp[i]) + 1;
|
||||||
|
}
|
||||||
|
envc = i;
|
||||||
|
|
||||||
|
SPT.arg0 = strdup(argv[0]);
|
||||||
|
if (SPT.arg0 == NULL) {
|
||||||
|
SPT.error = errno;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = strdup(getprogname());
|
||||||
|
if (tmp == NULL) {
|
||||||
|
SPT.error = errno;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setprogname(tmp);
|
||||||
|
|
||||||
|
error = spt_copyenv(envc, envp);
|
||||||
|
if (error) {
|
||||||
|
SPT.error = error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = spt_copyargs(argc, argv);
|
||||||
|
if (error) {
|
||||||
|
SPT.error = error;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPT.nul = nul;
|
||||||
|
SPT.base = base;
|
||||||
|
SPT.end = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
zfs_setproctitle(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
/* Use buffer in case argv[0] is passed. */
|
||||||
|
char buf[SPT_MAXTITLE + 1];
|
||||||
|
va_list ap;
|
||||||
|
char *nul;
|
||||||
|
int len;
|
||||||
|
if (SPT.base == NULL) {
|
||||||
|
if (!SPT.warned) {
|
||||||
|
warnx("setproctitle not initialized, please"
|
||||||
|
"call zfs_setproctitle_init()");
|
||||||
|
SPT.warned = B_TRUE;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fmt) {
|
||||||
|
if (fmt[0] == '-') {
|
||||||
|
/* Skip program name prefix. */
|
||||||
|
fmt++;
|
||||||
|
len = 0;
|
||||||
|
} else {
|
||||||
|
/* Print program name heading for grep. */
|
||||||
|
snprintf(buf, sizeof (buf), "%s: ", getprogname());
|
||||||
|
len = strlen(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
len += vsnprintf(buf + len, sizeof (buf) - len, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
} else {
|
||||||
|
len = snprintf(buf, sizeof (buf), "%s", SPT.arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len <= 0) {
|
||||||
|
SPT.error = errno;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SPT.reset) {
|
||||||
|
memset(SPT.base, 0, SPT.end - SPT.base);
|
||||||
|
SPT.reset = B_TRUE;
|
||||||
|
} else {
|
||||||
|
memset(SPT.base, 0, spt_min(sizeof (buf), SPT.end - SPT.base));
|
||||||
|
}
|
||||||
|
|
||||||
|
len = spt_min(len, spt_min(sizeof (buf), SPT.end - SPT.base) - 1);
|
||||||
|
memcpy(SPT.base, buf, len);
|
||||||
|
nul = SPT.base + len;
|
||||||
|
|
||||||
|
if (nul < SPT.nul) {
|
||||||
|
*SPT.nul = '.';
|
||||||
|
} else if (nul == SPT.nul && nul + 1 < SPT.end) {
|
||||||
|
*SPT.nul = ' ';
|
||||||
|
*++nul = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
+23
-3
@@ -15,7 +15,7 @@
|
|||||||
.\" own identifying information:
|
.\" own identifying information:
|
||||||
.\" Portions Copyright [yyyy] [name of copyright owner]
|
.\" Portions Copyright [yyyy] [name of copyright owner]
|
||||||
.\"
|
.\"
|
||||||
.Dd June 1, 2021
|
.Dd January 10, 2023
|
||||||
.Dt ZFS 4
|
.Dt ZFS 4
|
||||||
.Os
|
.Os
|
||||||
.
|
.
|
||||||
@@ -233,6 +233,12 @@ relative to the pool.
|
|||||||
Make some blocks above a certain size be gang blocks.
|
Make some blocks above a certain size be gang blocks.
|
||||||
This option is used by the test suite to facilitate testing.
|
This option is used by the test suite to facilitate testing.
|
||||||
.
|
.
|
||||||
|
.It Sy zfs_default_bs Ns = Ns Sy 9 Po 512 B Pc Pq int
|
||||||
|
Default dnode block size as a power of 2.
|
||||||
|
.
|
||||||
|
.It Sy zfs_default_ibs Ns = Ns Sy 17 Po 128 KiB Pc Pq int
|
||||||
|
Default dnode indirect block size as a power of 2.
|
||||||
|
.
|
||||||
.It Sy zfs_history_output_max Ns = Ns Sy 1048576 Ns B Ns B Po 1MB Pc Pq int
|
.It Sy zfs_history_output_max Ns = Ns Sy 1048576 Ns B Ns B Po 1MB Pc Pq int
|
||||||
When attempting to log an output nvlist of an ioctl in the on-disk history,
|
When attempting to log an output nvlist of an ioctl in the on-disk history,
|
||||||
the output will not be stored if it is larger than this size (in bytes).
|
the output will not be stored if it is larger than this size (in bytes).
|
||||||
@@ -1706,7 +1712,7 @@ completes in order to verify the checksums of all blocks which have been
|
|||||||
resilvered.
|
resilvered.
|
||||||
This is enabled by default and strongly recommended.
|
This is enabled by default and strongly recommended.
|
||||||
.
|
.
|
||||||
.It Sy zfs_rebuild_vdev_limit Ns = Ns Sy 33554432 Ns B Po 32MB Pc Pq ulong
|
.It Sy zfs_rebuild_vdev_limit Ns = Ns Sy 67108864 Ns B Po 64 MiB Pc Pq ulong
|
||||||
Maximum amount of I/O that can be concurrently issued for a sequential
|
Maximum amount of I/O that can be concurrently issued for a sequential
|
||||||
resilver per leaf device, given in bytes.
|
resilver per leaf device, given in bytes.
|
||||||
.
|
.
|
||||||
@@ -1825,6 +1831,13 @@ When we cross this limit from above it is because we are issuing verification I/
|
|||||||
In this case (unless the metadata scan is done) we stop issuing verification I/O
|
In this case (unless the metadata scan is done) we stop issuing verification I/O
|
||||||
and start scanning metadata again until we get to the hard limit.
|
and start scanning metadata again until we get to the hard limit.
|
||||||
.
|
.
|
||||||
|
.It Sy zfs_scan_report_txgs Ns = Ns Sy 0 Ns | Ns 1 Pq uint
|
||||||
|
When reporting resilver throughput and estimated completion time use the
|
||||||
|
performance observed over roughly the last
|
||||||
|
.Sy zfs_scan_report_txgs
|
||||||
|
TXGs.
|
||||||
|
When set to zero performance is calculated over the time between checkpoints.
|
||||||
|
.
|
||||||
.It Sy zfs_scan_strict_mem_lim Ns = Ns Sy 0 Ns | Ns 1 Pq int
|
.It Sy zfs_scan_strict_mem_lim Ns = Ns Sy 0 Ns | Ns 1 Pq int
|
||||||
Enforce tight memory limits on pool scans when a sequential scan is in progress.
|
Enforce tight memory limits on pool scans when a sequential scan is in progress.
|
||||||
When disabled, the memory limit may be exceeded by fast disks.
|
When disabled, the memory limit may be exceeded by fast disks.
|
||||||
@@ -1833,7 +1846,7 @@ When disabled, the memory limit may be exceeded by fast disks.
|
|||||||
Freezes a scrub/resilver in progress without actually pausing it.
|
Freezes a scrub/resilver in progress without actually pausing it.
|
||||||
Intended for testing/debugging.
|
Intended for testing/debugging.
|
||||||
.
|
.
|
||||||
.It Sy zfs_scan_vdev_limit Ns = Ns Sy 4194304 Ns B Po 4MB Pc Pq int
|
.It Sy zfs_scan_vdev_limit Ns = Ns Sy 16777216 Ns B Po 16 MiB Pc Pq int
|
||||||
Maximum amount of data that can be concurrently issued at once for scrubs and
|
Maximum amount of data that can be concurrently issued at once for scrubs and
|
||||||
resilvers per leaf device, given in bytes.
|
resilvers per leaf device, given in bytes.
|
||||||
.
|
.
|
||||||
@@ -2126,6 +2139,13 @@ On very fragmented pools, lowering this
|
|||||||
.Pq typically to Sy 36kB
|
.Pq typically to Sy 36kB
|
||||||
can improve performance.
|
can improve performance.
|
||||||
.
|
.
|
||||||
|
.It Sy zil_min_commit_timeout Ns = Ns Sy 5000 Pq u64
|
||||||
|
This sets the minimum delay in nanoseconds ZIL care to delay block commit,
|
||||||
|
waiting for more records.
|
||||||
|
If ZIL writes are too fast, kernel may not be able sleep for so short interval,
|
||||||
|
increasing log latency above allowed by
|
||||||
|
.Sy zfs_commit_timeout_pct .
|
||||||
|
.
|
||||||
.It Sy zil_nocacheflush Ns = Ns Sy 0 Ns | Ns 1 Pq int
|
.It Sy zil_nocacheflush Ns = Ns Sy 0 Ns | Ns 1 Pq int
|
||||||
Disable the cache flush commands that are normally sent to disk by
|
Disable the cache flush commands that are normally sent to disk by
|
||||||
the ZIL after an LWB write has completed.
|
the ZIL after an LWB write has completed.
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user