mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-06 17:18:32 +00:00
zfs: merge openzfs/zfs@a86e08941 (master) into main
Notable upstream pull request merges:
#9078: log xattr=sa create/remove/update to ZIL
#11919: Cross-platform xattr user namespace compatibility
#13014: Report dnodes with faulty bonuslen
#13016: FreeBSD: Fix zvol_cdev_open locking
#13019: spl: Don't check FreeBSD rwlocks for double initialization
#13027: Fix clearing set-uid and set-gid bits on a file when
replying a write
#13031: Add enumerated vdev names to 'zpool iostat -v' and
'zpool list -v'
#13074: Enable encrypted raw sending to pools with greater ashift
#13076: Receive checks should allow unencrypted child datasets
#13098: Avoid dirtying the final TXGs when exporting a pool
#13172: Fix ENOSPC when unlinking multiple files from full pool
Obtained from: OpenZFS
OpenZFS commit: a86e089415
This commit is contained in:
commit
c03c5b1c80
|
@ -429,8 +429,8 @@ int streq(const char *, const char *);
|
|||
int findelfsecidx(Elf *, const char *, const char *);
|
||||
size_t elf_ptrsz(Elf *);
|
||||
char *mktmpname(const char *, const char *);
|
||||
void terminate(const char *, ...) __NORETURN;
|
||||
void aborterr(const char *, ...) __NORETURN;
|
||||
void terminate(const char *, ...) __attribute__((noreturn));
|
||||
void aborterr(const char *, ...) __attribute__((noreturn));
|
||||
void set_terminate_cleanup(void (*)(void));
|
||||
void elfterminate(const char *, const char *, ...);
|
||||
void warning(const char *, ...);
|
||||
|
|
|
@ -28,9 +28,7 @@ ASM_SOURCES_AS =
|
|||
KERNEL_C = \
|
||||
spi/kcf_spi.c \
|
||||
api/kcf_ctxops.c \
|
||||
api/kcf_digest.c \
|
||||
api/kcf_cipher.c \
|
||||
api/kcf_miscapi.c \
|
||||
api/kcf_mac.c \
|
||||
algs/aes/aes_impl_aesni.c \
|
||||
algs/aes/aes_impl_generic.c \
|
||||
|
@ -54,7 +52,6 @@ KERNEL_C = \
|
|||
io/aes.c \
|
||||
io/sha2_mod.c \
|
||||
io/skein_mod.c \
|
||||
os/modhash.c \
|
||||
core/kcf_sched.c \
|
||||
core/kcf_prov_lib.c \
|
||||
core/kcf_callprov.c \
|
||||
|
|
|
@ -27,9 +27,7 @@ ASM_SOURCES_AS =
|
|||
KERNEL_C = \
|
||||
spi/kcf_spi.c \
|
||||
api/kcf_ctxops.c \
|
||||
api/kcf_digest.c \
|
||||
api/kcf_cipher.c \
|
||||
api/kcf_miscapi.c \
|
||||
api/kcf_mac.c \
|
||||
algs/aes/aes_impl_aesni.c \
|
||||
algs/aes/aes_impl_generic.c \
|
||||
|
@ -51,7 +49,6 @@ KERNEL_C = \
|
|||
io/aes.c \
|
||||
io/sha2_mod.c \
|
||||
io/skein_mod.c \
|
||||
os/modhash.c \
|
||||
core/kcf_sched.c \
|
||||
core/kcf_prov_lib.c \
|
||||
core/kcf_callprov.c \
|
||||
|
|
|
@ -10,7 +10,9 @@ ZFSTOP= ${SRCTOP}/sys/contrib/openzfs
|
|||
.PATH: ${ZFSTOP}/module/lua
|
||||
# ZSTD_SRCS
|
||||
.PATH: ${ZFSTOP}/module/zstd
|
||||
.PATH: ${ZFSTOP}/module/zstd/lib
|
||||
.PATH: ${ZFSTOP}/module/zstd/lib/common
|
||||
.PATH: ${ZFSTOP}/module/zstd/lib/compress
|
||||
.PATH: ${ZFSTOP}/module/zstd/lib/decompress
|
||||
|
||||
.PATH: ${ZFSTOP}/module/os/linux/zfs
|
||||
|
||||
|
@ -90,9 +92,16 @@ KERNEL_C = \
|
|||
dsl_destroy.c \
|
||||
dsl_userhold.c \
|
||||
edonr_zfs.c \
|
||||
hkdf.c \
|
||||
entropy_common.c \
|
||||
error_private.c \
|
||||
fm.c \
|
||||
fse_compress.c \
|
||||
fse_decompress.c \
|
||||
gzip.c \
|
||||
hist.c \
|
||||
hkdf.c \
|
||||
huf_compress.c \
|
||||
huf_decompress.c \
|
||||
lzjb.c \
|
||||
lz4.c \
|
||||
lz4_zfs.c \
|
||||
|
@ -101,6 +110,7 @@ KERNEL_C = \
|
|||
multilist.c \
|
||||
objlist.c \
|
||||
pathname.c \
|
||||
pool.c \
|
||||
range_tree.c \
|
||||
refcount.c \
|
||||
rrwlock.c \
|
||||
|
@ -147,6 +157,7 @@ KERNEL_C = \
|
|||
vdev_removal.c \
|
||||
vdev_root.c \
|
||||
vdev_trim.c \
|
||||
xxhash.c \
|
||||
zap.c \
|
||||
zap_leaf.c \
|
||||
zap_micro.c \
|
||||
|
@ -174,7 +185,19 @@ KERNEL_C = \
|
|||
zio_inject.c \
|
||||
zle.c \
|
||||
zrlock.c \
|
||||
zstd.c \
|
||||
zstd_common.c \
|
||||
zstd_compress.c \
|
||||
zstd_compress_literals.c \
|
||||
zstd_compress_sequences.c \
|
||||
zstd_compress_superblock.c \
|
||||
zstd_ddict.c \
|
||||
zstd_decompress.c \
|
||||
zstd_decompress_block.c \
|
||||
zstd_double_fast.c \
|
||||
zstd_fast.c \
|
||||
zstd_lazy.c \
|
||||
zstd_ldm.c \
|
||||
zstd_opt.c \
|
||||
zthr.c
|
||||
|
||||
ARCH_C =
|
||||
|
@ -262,8 +285,47 @@ CSTD= c99
|
|||
|
||||
CFLAGS+= -g -DDEBUG=1
|
||||
|
||||
CFLAGS.zfs_zstd.c= -Wno-cast-qual -Wno-pointer-arith
|
||||
CFLAGS.zstd.c+= -fno-tree-vectorize
|
||||
CFLAGS.zstd.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.entropy_common.c= -fno-tree-vectorize
|
||||
CFLAGS.entropy_common.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.error_private.c= -fno-tree-vectorize
|
||||
CFLAGS.error_private.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.fse_compress.c= -fno-tree-vectorize
|
||||
CFLAGS.fse_compress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.fse_decompress.c= -fno-tree-vectorize
|
||||
CFLAGS.fse_decompress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.hist.c= -fno-tree-vectorize
|
||||
CFLAGS.hist.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.huf_compress.c= -fno-tree-vectorize
|
||||
CFLAGS.huf_compress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.huf_decompress.c= -fno-tree-vectorize
|
||||
CFLAGS.huf_decompress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.pool.c= -fno-tree-vectorize
|
||||
CFLAGS.pool.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.xxhash.c= -fno-tree-vectorize
|
||||
CFLAGS.xxhash.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_compress.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_compress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_compress_literals.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_compress_literals.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_compress_sequences.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_compress_sequences.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_compress_superblock.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_compress_superblock.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_double_fast.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_double_fast.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_fast.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_fast.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_lazy.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_lazy.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_ldm.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_ldm.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_opt.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_opt.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_ddict.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_ddict.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_decompress.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_decompress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_decompress_block.c= -fno-tree-vectorize
|
||||
CFLAGS.zstd_decompress_block.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
|
||||
.include <bsd.lib.mk>
|
||||
|
|
|
@ -3,9 +3,20 @@
|
|||
.PATH: ${ZFSSRC}
|
||||
.PATH: ${SYSDIR}/crypto/skein
|
||||
.PATH: ${ZFSOSSRC}/spl
|
||||
.PATH: ${OZFS}/module/zstd/lib
|
||||
.PATH: ${OZFS}/module/zstd/lib/common
|
||||
.PATH: ${OZFS}/module/zstd/lib/compress
|
||||
.PATH: ${OZFS}/module/zstd/lib/decompress
|
||||
ZFSSRC= zfs.c nvlist.c skein.c skein_block.c list.c
|
||||
ZFSSRC+= zstd_shim.c zstd.c
|
||||
ZFSSRC+= zstd_shim.c
|
||||
ZFSSRC+= entropy_common.c error_private.c
|
||||
ZFSSRC+= fse_compress.c fse_decompress.c hist.c
|
||||
ZFSSRC+= huf_compress.c huf_decompress.c pool.c xxhash.c
|
||||
ZFSSRC+= zstd_common.c zstd_compress.c zstd_compress_literals.c
|
||||
ZFSSRC+= zstd_compress_sequences.c zstd_compress_superblock.c
|
||||
ZFSSRC+= zstd_ddict.c zstd_decompress.c zstd_decompress_block.c
|
||||
ZFSSRC+= zstd_double_fast.c zstd_fast.c zstd_lazy.c zstd_ldm.c
|
||||
ZFSSRC+= zstd_opt.c
|
||||
|
||||
CFLAGS+= -DHAS_ZSTD_ZFS
|
||||
SRCS+= ${ZFSSRC}
|
||||
|
||||
|
@ -29,8 +40,50 @@ CFLAGS_EARLY.zstd_shim.c+= ${ZFS_EARLY}
|
|||
CFLAGS.nvlist.c+= -I${ZFSOSINC}/spl
|
||||
CFLAGS.zfs.c+= -I${ZFSOSINC}/spl \
|
||||
-I${SRCTOP}/sys/cddl/contrib/opensolaris/common/lz4
|
||||
CFLAGS.zstd.c+= -U__BMI__
|
||||
CFLAGS.zstd.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.entropy_common.c= -U__BMI__
|
||||
CFLAGS.entropy_common.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.error_private.c= -U__BMI__
|
||||
CFLAGS.error_private.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.fse_compress.c= -U__BMI__
|
||||
CFLAGS.fse_compress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.fse_decompress.c= -U__BMI__
|
||||
CFLAGS.fse_decompress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.hist.c= -U__BMI__
|
||||
CFLAGS.hist.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.huf_compress.c= -U__BMI__
|
||||
CFLAGS.huf_compress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.huf_decompress.c= -U__BMI__
|
||||
CFLAGS.huf_decompress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.pool.c= -U__BMI__
|
||||
CFLAGS.pool.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.xxhash.c= -U__BMI__
|
||||
CFLAGS.xxhash.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_common.c= -U__BMI__
|
||||
CFLAGS.zstd_common.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_compress.c= -U__BMI__
|
||||
CFLAGS.zstd_compress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_compress_literals.c= -U__BMI__
|
||||
CFLAGS.zstd_compress_literals.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_compress_sequences.c= -U__BMI__
|
||||
CFLAGS.zstd_compress_sequences.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_compress_superblock.c= -U__BMI__
|
||||
CFLAGS.zstd_compress_superblock.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_double_fast.c= -U__BMI__
|
||||
CFLAGS.zstd_double_fast.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_fast.c= -U__BMI__
|
||||
CFLAGS.zstd_fast.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_lazy.c= -U__BMI__
|
||||
CFLAGS.zstd_lazy.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_ldm.c= -U__BMI__
|
||||
CFLAGS.zstd_ldm.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_opt.c= -U__BMI__
|
||||
CFLAGS.zstd_opt.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_ddict.c= -U__BMI__
|
||||
CFLAGS.zstd_ddict.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_decompress.c= -U__BMI__
|
||||
CFLAGS.zstd_decompress.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_decompress_block.c= -U__BMI__
|
||||
CFLAGS.zstd_decompress_block.c+= ${NO_WBITWISE_INSTEAD_OF_LOGICAL}
|
||||
CFLAGS.zstd_shim.c+= -DIN_BASE -I${OZFS}/include
|
||||
|
||||
# Do not unroll skein loops, reduce code size
|
||||
|
|
|
@ -111,11 +111,11 @@ extern char *vsprintf(char *, const char *, __va_list)
|
|||
|
||||
/*PRINTFLIKE1*/
|
||||
extern void panic(const char *, ...)
|
||||
__KPRINTFLIKE(1) __NORETURN;
|
||||
__KPRINTFLIKE(1) __attribute__((noreturn));
|
||||
#pragma rarely_called(panic)
|
||||
|
||||
extern void vpanic(const char *, __va_list)
|
||||
__KVPRINTFLIKE(1) __NORETURN;
|
||||
__KVPRINTFLIKE(1) __attribute__((noreturn));
|
||||
#pragma rarely_called(vpanic)
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
|
49
sys/contrib/openzfs/.github/workflows/build-dependencies.txt
vendored
Normal file
49
sys/contrib/openzfs/.github/workflows/build-dependencies.txt
vendored
Normal file
|
@ -0,0 +1,49 @@
|
|||
acl
|
||||
alien
|
||||
attr
|
||||
autoconf
|
||||
bc
|
||||
build-essential
|
||||
curl
|
||||
dbench
|
||||
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
|
||||
libselinux-dev
|
||||
libssl-dev
|
||||
libtool
|
||||
libudev-dev
|
||||
lsscsi
|
||||
mdadm
|
||||
nfs-kernel-server
|
||||
pamtester
|
||||
parted
|
||||
python3
|
||||
python3-cffi
|
||||
python3-dev
|
||||
python3-packaging
|
||||
python3-setuptools
|
||||
rng-tools
|
||||
rsync
|
||||
samba
|
||||
sysstat
|
||||
uuid-dev
|
||||
watchdog
|
||||
wget
|
||||
xfslibs-dev
|
||||
xz-utils
|
||||
zlib1g-dev
|
|
@ -6,7 +6,7 @@ on:
|
|||
|
||||
jobs:
|
||||
checkstyle:
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
|
@ -14,31 +14,37 @@ jobs:
|
|||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install --yes -qq build-essential autoconf libtool gawk alien fakeroot linux-headers-$(uname -r)
|
||||
sudo apt-get install --yes -qq zlib1g-dev uuid-dev libattr1-dev libblkid-dev libselinux-dev libudev-dev libssl-dev python3 python3-dev python3-setuptools python3-cffi
|
||||
# packages for tests
|
||||
sudo apt-get install --yes -qq parted lsscsi ksh attr acl nfs-kernel-server fio
|
||||
sudo apt-get install --yes -qq mandoc cppcheck pax-utils devscripts
|
||||
sudo -E pip --quiet install flake8
|
||||
sudo xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt apt-get install -qq
|
||||
sudo apt-get install -qq mandoc cppcheck pax-utils devscripts
|
||||
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
|
||||
checkbashisms --version
|
||||
cppcheck --version
|
||||
flake8 --version
|
||||
scanelf --version
|
||||
shellcheck --version
|
||||
- name: Prepare
|
||||
run: |
|
||||
sh ./autogen.sh
|
||||
./autogen.sh
|
||||
./configure
|
||||
make -j$(nproc)
|
||||
make -j$(nproc) --no-print-directory --silent
|
||||
- name: Checkstyle
|
||||
run: |
|
||||
make checkstyle
|
||||
make -j$(nproc) --no-print-directory --silent checkstyle
|
||||
- name: Lint
|
||||
run: |
|
||||
make lint
|
||||
make -j$(nproc) --no-print-directory --silent lint
|
||||
- name: CheckABI
|
||||
id: CheckABI
|
||||
run: |
|
||||
sudo docker run -v $(pwd):/source ghcr.io/openzfs/libabigail make checkabi
|
||||
docker run -v $(pwd):/source ghcr.io/openzfs/libabigail make -j$(nproc) --no-print-directory --silent checkabi
|
||||
- name: StoreABI
|
||||
if: failure() && steps.CheckABI.outcome == 'failure'
|
||||
run: |
|
||||
sudo docker run -v $(pwd):/source ghcr.io/openzfs/libabigail make storeabi
|
||||
docker run -v $(pwd):/source ghcr.io/openzfs/libabigail make -j$(nproc) --no-print-directory --silent storeabi
|
||||
- name: Prepare artifacts
|
||||
if: failure() && steps.CheckABI.outcome == 'failure'
|
||||
run: |
|
||||
|
|
20
sys/contrib/openzfs/.github/workflows/scripts/reclaim_disk_space.sh
vendored
Executable file
20
sys/contrib/openzfs/.github/workflows/scripts/reclaim_disk_space.sh
vendored
Executable file
|
@ -0,0 +1,20 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -eu
|
||||
|
||||
# remove 4GiB of images
|
||||
sudo systemd-run docker system prune --force --all --volumes
|
||||
|
||||
# remove unused software
|
||||
sudo systemd-run 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
|
|
@ -15,27 +15,23 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Reclaim disk space
|
||||
run: |
|
||||
${{ github.workspace }}/.github/workflows/scripts/reclaim_disk_space.sh
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install --yes -qq build-essential autoconf libtool gdb lcov \
|
||||
git alien fakeroot wget curl bc fio acl \
|
||||
sysstat mdadm lsscsi parted gdebi attr dbench watchdog ksh \
|
||||
nfs-kernel-server samba rng-tools xz-utils \
|
||||
zlib1g-dev uuid-dev libblkid-dev libselinux-dev \
|
||||
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
||||
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
||||
libpam0g-dev pamtester libcurl4-openssl-dev \
|
||||
python3 python3-dev python3-setuptools python3-cffi python3-packaging
|
||||
xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt sudo apt-get install -qq
|
||||
sudo apt-get clean
|
||||
- name: Autogen.sh
|
||||
run: |
|
||||
sh autogen.sh
|
||||
./autogen.sh
|
||||
- name: Configure
|
||||
run: |
|
||||
./configure --enable-debug --enable-debuginfo
|
||||
./configure --enable-debug --enable-debuginfo --enable-asan --enable-ubsan
|
||||
- name: Make
|
||||
run: |
|
||||
make --no-print-directory -s pkg-utils pkg-kmod
|
||||
make -j$(nproc) --no-print-directory --silent pkg-utils pkg-kmod
|
||||
- name: Install
|
||||
run: |
|
||||
sudo dpkg -i *.deb
|
||||
|
@ -55,21 +51,24 @@ jobs:
|
|||
sudo udevadm control --reload-rules
|
||||
fi
|
||||
fi
|
||||
# Workaround to provide additional free space for testing.
|
||||
# https://github.com/actions/virtual-environments/issues/2840
|
||||
sudo rm -rf /usr/share/dotnet
|
||||
sudo rm -rf /opt/ghc
|
||||
sudo rm -rf "/usr/local/share/boost"
|
||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
||||
- name: Clear the kernel ring buffer
|
||||
run: |
|
||||
sudo dmesg -c >/var/tmp/dmesg-prerun
|
||||
- name: Report disk space
|
||||
run: |
|
||||
df -h /
|
||||
- name: Tests
|
||||
run: |
|
||||
/usr/share/zfs/zfs-tests.sh -vR -s 3G
|
||||
set -o pipefail
|
||||
/usr/share/zfs/zfs-tests.sh -vR -s 3G | scripts/zfs-tests-color.sh
|
||||
shell: bash
|
||||
timeout-minutes: 330
|
||||
- name: Prepare artifacts
|
||||
if: failure()
|
||||
run: |
|
||||
RESULTS_PATH=$(readlink -f /var/tmp/test_results/current)
|
||||
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/*
|
||||
# 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
|
||||
|
@ -77,5 +76,7 @@ jobs:
|
|||
if: failure()
|
||||
with:
|
||||
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
|
||||
|
|
|
@ -6,32 +6,28 @@ on:
|
|||
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
- name: Reclaim disk space
|
||||
run: |
|
||||
${{ github.workspace }}/.github/workflows/scripts/reclaim_disk_space.sh
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install --yes -qq build-essential autoconf libtool gdb lcov \
|
||||
git alien fakeroot wget curl bc fio acl \
|
||||
sysstat mdadm lsscsi parted gdebi attr dbench watchdog ksh \
|
||||
nfs-kernel-server samba rng-tools xz-utils \
|
||||
zlib1g-dev uuid-dev libblkid-dev libselinux-dev \
|
||||
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
||||
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
||||
libpam0g-dev pamtester libcurl4-openssl-dev \
|
||||
python3 python3-dev python3-setuptools python3-cffi python3-packaging
|
||||
xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt sudo apt-get install -qq
|
||||
sudo apt-get clean
|
||||
- name: Autogen.sh
|
||||
run: |
|
||||
sh autogen.sh
|
||||
./autogen.sh
|
||||
- name: Configure
|
||||
run: |
|
||||
./configure --enable-debug --enable-debuginfo
|
||||
./configure --enable-debug --enable-debuginfo --enable-asan --enable-ubsan
|
||||
- name: Make
|
||||
run: |
|
||||
make --no-print-directory -s pkg-utils pkg-kmod
|
||||
make -j$(nproc) --no-print-directory --silent pkg-utils pkg-kmod
|
||||
- name: Install
|
||||
run: |
|
||||
sudo dpkg -i *.deb
|
||||
|
@ -51,27 +47,32 @@ jobs:
|
|||
sudo udevadm control --reload-rules
|
||||
fi
|
||||
fi
|
||||
# Workaround to provide additional free space for testing.
|
||||
# https://github.com/actions/virtual-environments/issues/2840
|
||||
sudo rm -rf /usr/share/dotnet
|
||||
sudo rm -rf /opt/ghc
|
||||
sudo rm -rf "/usr/local/share/boost"
|
||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
||||
- name: Clear the kernel ring buffer
|
||||
run: |
|
||||
sudo dmesg -c >/var/tmp/dmesg-prerun
|
||||
- name: Report disk space
|
||||
run: |
|
||||
df -h /
|
||||
- name: Tests
|
||||
run: |
|
||||
/usr/share/zfs/zfs-tests.sh -vR -s 3G -r sanity
|
||||
set -o pipefail
|
||||
/usr/share/zfs/zfs-tests.sh -vR -s 3G -r sanity | scripts/zfs-tests-color.sh
|
||||
shell: bash
|
||||
timeout-minutes: 330
|
||||
- name: Prepare artifacts
|
||||
if: failure()
|
||||
run: |
|
||||
RESULTS_PATH=$(readlink -f /var/tmp/test_results/current)
|
||||
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/*
|
||||
# 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
|
||||
- uses: actions/upload-artifact@v2
|
||||
if: failure()
|
||||
with:
|
||||
name: Test logs
|
||||
path: /var/tmp/test_results/20*/
|
||||
name: Test logs Ubuntu-${{ matrix.os }}
|
||||
path: |
|
||||
/var/tmp/test_results/*
|
||||
!/var/tmp/test_results/current
|
||||
if-no-files-found: ignore
|
||||
|
|
17
sys/contrib/openzfs/.github/workflows/zloop.yml
vendored
17
sys/contrib/openzfs/.github/workflows/zloop.yml
vendored
|
@ -6,7 +6,7 @@ on:
|
|||
|
||||
jobs:
|
||||
tests:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
env:
|
||||
TEST_DIR: /var/tmp/zloop
|
||||
steps:
|
||||
|
@ -16,22 +16,17 @@ jobs:
|
|||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install --yes -qq build-essential autoconf libtool gdb \
|
||||
git alien fakeroot \
|
||||
zlib1g-dev uuid-dev libblkid-dev libselinux-dev \
|
||||
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
||||
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
||||
libpam0g-dev \
|
||||
python3 python3-dev python3-setuptools python3-cffi python3-packaging
|
||||
xargs --arg-file=${{ github.workspace }}/.github/workflows/build-dependencies.txt sudo apt-get install -qq
|
||||
sudo apt-get clean
|
||||
- name: Autogen.sh
|
||||
run: |
|
||||
sh autogen.sh
|
||||
./autogen.sh
|
||||
- name: Configure
|
||||
run: |
|
||||
./configure --enable-debug --enable-debuginfo
|
||||
./configure --enable-debug --enable-debuginfo --enable-asan --enable-ubsan
|
||||
- name: Make
|
||||
run: |
|
||||
make --no-print-directory -s pkg-utils pkg-kmod
|
||||
make -j$(nproc) --no-print-directory --silent pkg-utils pkg-kmod
|
||||
- name: Install
|
||||
run: |
|
||||
sudo dpkg -i *.deb
|
||||
|
|
|
@ -72,7 +72,7 @@ distclean-local::
|
|||
-o -name 'core' -o -name 'Makefile' -o -name 'Module.symvers' \
|
||||
-o -name '*.order' -o -name '*.markers' -o -name '*.gcda' \
|
||||
-o -name '*.gcno' \) \
|
||||
-type f -print | xargs $(RM)
|
||||
-type f -delete
|
||||
|
||||
all-local:
|
||||
-[ -x ${top_builddir}/scripts/zfs-tests.sh ] && \
|
||||
|
@ -126,6 +126,8 @@ cstyle:
|
|||
! -name 'zfs_config.*' ! -name '*.mod.c' \
|
||||
! -name 'opt_global.h' ! -name '*_if*.h' \
|
||||
! -path './module/zstd/lib/*' \
|
||||
! -path './include/sys/lua/*' \
|
||||
! -path './module/lua/l*.[ch]' \
|
||||
! -path './module/zfs/lz4.c' \
|
||||
$(cstyle_line)
|
||||
|
||||
|
@ -136,41 +138,24 @@ SHELLCHECKSCRIPTS = autogen.sh
|
|||
|
||||
PHONY += checkabi storeabi
|
||||
|
||||
checklibabiversion:
|
||||
libabiversion=`abidw -v | $(SED) 's/[^0-9]//g'`; \
|
||||
if test $$libabiversion -lt "200"; then \
|
||||
/bin/echo -e "\n" \
|
||||
"*** Please use libabigail 2.0.0 version or newer;\n" \
|
||||
"*** otherwise results are not consistent!\n" \
|
||||
"(or see https://github.com/openzfs/libabigail-docker )\n"; \
|
||||
exit 1; \
|
||||
fi;
|
||||
|
||||
checkabi: checklibabiversion lib
|
||||
checkabi: lib
|
||||
$(MAKE) -C lib checkabi
|
||||
|
||||
storeabi: checklibabiversion lib
|
||||
storeabi: lib
|
||||
$(MAKE) -C lib storeabi
|
||||
|
||||
PHONY += mancheck
|
||||
mancheck:
|
||||
${top_srcdir}/scripts/mancheck.sh ${top_srcdir}/man ${top_srcdir}/tests/test-runner/man
|
||||
|
||||
if BUILD_LINUX
|
||||
stat_fmt = -c '%A %n'
|
||||
else
|
||||
stat_fmt = -f '%Sp %N'
|
||||
endif
|
||||
|
||||
PHONY += testscheck
|
||||
testscheck:
|
||||
@find ${top_srcdir}/tests/zfs-tests -type f \
|
||||
@[ $$(find ${top_srcdir}/tests/zfs-tests -type f \
|
||||
\( -name '*.ksh' -not ${filter_executable} \) -o \
|
||||
\( -name '*.kshlib' ${filter_executable} \) -o \
|
||||
\( -name '*.shlib' ${filter_executable} \) -o \
|
||||
\( -name '*.cfg' ${filter_executable} \) | \
|
||||
xargs -r stat ${stat_fmt} | \
|
||||
awk '{c++; print} END {if(c>0) exit 1}'
|
||||
tee /dev/stderr | wc -l) -eq 0 ]
|
||||
|
||||
PHONY += vcscheck
|
||||
vcscheck:
|
||||
|
@ -213,13 +198,13 @@ PHONY += ctags
|
|||
ctags:
|
||||
$(RM) tags
|
||||
find $(top_srcdir) -name '.?*' -prune \
|
||||
-o -type f -name '*.[hcS]' -print | xargs ctags -a
|
||||
-o -type f -name '*.[hcS]' -exec ctags -a {} +
|
||||
|
||||
PHONY += etags
|
||||
etags:
|
||||
$(RM) TAGS
|
||||
find $(top_srcdir) -name '.?*' -prune \
|
||||
-o -type f -name '*.[hcS]' -print | xargs etags -a
|
||||
-o -type f -name '*.[hcS]' -exec etags -a {} +
|
||||
|
||||
PHONY += cscopelist
|
||||
cscopelist:
|
||||
|
|
|
@ -9,7 +9,6 @@ CPPCHECKDIRS += raidz_test zfs_ids_to_path zpool_influxdb
|
|||
|
||||
# TODO: #12084: SHELLCHECKDIRS += vdev_id
|
||||
SHELLCHECKDIRS = fsck_zfs zed zpool zvol_wait
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
||||
if USING_PYTHON
|
||||
SUBDIRS += arcstat arc_summary dbufstat
|
||||
|
|
|
@ -5,4 +5,3 @@ dist_sbin_SCRIPTS = fsck.zfs
|
|||
|
||||
SUBSTFILES += $(dist_sbin_SCRIPTS)
|
||||
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
|
|
@ -246,13 +246,6 @@ main(int argc, char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
(void) fprintf(stdout, gettext("mount.zfs:\n"
|
||||
" dataset: \"%s\"\n mountpoint: \"%s\"\n"
|
||||
" mountflags: 0x%lx\n zfsflags: 0x%lx\n"
|
||||
" mountopts: \"%s\"\n mtabopts: \"%s\"\n"),
|
||||
dataset, mntpoint, mntflags, zfsflags, mntopts, mtabopt);
|
||||
|
||||
if (mntflags & MS_REMOUNT) {
|
||||
nomtab = 1;
|
||||
remount = 1;
|
||||
|
@ -275,7 +268,10 @@ main(int argc, char **argv)
|
|||
return (MOUNT_USAGE);
|
||||
}
|
||||
|
||||
zfs_adjust_mount_options(zhp, mntpoint, mntopts, mtabopt);
|
||||
if (!zfsutil || sloppy ||
|
||||
libzfs_envvar_is_set("ZFS_MOUNT_HELPER")) {
|
||||
zfs_adjust_mount_options(zhp, mntpoint, mntopts, mtabopt);
|
||||
}
|
||||
|
||||
/* treat all snapshots as legacy mount points */
|
||||
if (zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT)
|
||||
|
@ -293,12 +289,11 @@ main(int argc, char **argv)
|
|||
if (zfs_version == 0) {
|
||||
fprintf(stderr, gettext("unable to fetch "
|
||||
"ZFS version for filesystem '%s'\n"), dataset);
|
||||
zfs_close(zhp);
|
||||
libzfs_fini(g_zfs);
|
||||
return (MOUNT_SYSERR);
|
||||
}
|
||||
|
||||
zfs_close(zhp);
|
||||
libzfs_fini(g_zfs);
|
||||
|
||||
/*
|
||||
* Legacy mount points may only be mounted using 'mount', never using
|
||||
* 'zfs mount'. However, since 'zfs mount' actually invokes 'mount'
|
||||
|
@ -316,6 +311,8 @@ main(int argc, char **argv)
|
|||
"Use 'zfs set mountpoint=%s' or 'mount -t zfs %s %s'.\n"
|
||||
"See zfs(8) for more information.\n"),
|
||||
dataset, mntpoint, dataset, mntpoint);
|
||||
zfs_close(zhp);
|
||||
libzfs_fini(g_zfs);
|
||||
return (MOUNT_USAGE);
|
||||
}
|
||||
|
||||
|
@ -326,14 +323,38 @@ main(int argc, char **argv)
|
|||
"Use 'zfs set mountpoint=%s' or 'zfs mount %s'.\n"
|
||||
"See zfs(8) for more information.\n"),
|
||||
dataset, "legacy", dataset);
|
||||
zfs_close(zhp);
|
||||
libzfs_fini(g_zfs);
|
||||
return (MOUNT_USAGE);
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
(void) fprintf(stdout, gettext("mount.zfs:\n"
|
||||
" dataset: \"%s\"\n mountpoint: \"%s\"\n"
|
||||
" mountflags: 0x%lx\n zfsflags: 0x%lx\n"
|
||||
" mountopts: \"%s\"\n mtabopts: \"%s\"\n"),
|
||||
dataset, mntpoint, mntflags, zfsflags, mntopts, mtabopt);
|
||||
|
||||
if (!fake) {
|
||||
error = mount(dataset, mntpoint, MNTTYPE_ZFS,
|
||||
mntflags, mntopts);
|
||||
if (zfsutil && !sloppy &&
|
||||
!libzfs_envvar_is_set("ZFS_MOUNT_HELPER")) {
|
||||
error = zfs_mount_at(zhp, mntopts, mntflags, mntpoint);
|
||||
if (error) {
|
||||
(void) fprintf(stderr, "zfs_mount_at() failed: "
|
||||
"%s", libzfs_error_description(g_zfs));
|
||||
zfs_close(zhp);
|
||||
libzfs_fini(g_zfs);
|
||||
return (MOUNT_SYSERR);
|
||||
}
|
||||
} else {
|
||||
error = mount(dataset, mntpoint, MNTTYPE_ZFS,
|
||||
mntflags, mntopts);
|
||||
}
|
||||
}
|
||||
|
||||
zfs_close(zhp);
|
||||
libzfs_fini(g_zfs);
|
||||
|
||||
if (error) {
|
||||
switch (errno) {
|
||||
case ENOENT:
|
||||
|
@ -369,7 +390,7 @@ main(int argc, char **argv)
|
|||
return (MOUNT_SYSERR);
|
||||
}
|
||||
#endif
|
||||
fallthrough;
|
||||
zfs_fallthrough;
|
||||
default:
|
||||
(void) fprintf(stderr, gettext("filesystem "
|
||||
"'%s' can not be mounted: %s\n"), dataset,
|
||||
|
|
|
@ -71,12 +71,13 @@ static void print_opts(raidz_test_opts_t *opts, boolean_t force)
|
|||
{
|
||||
char *verbose;
|
||||
switch (opts->rto_v) {
|
||||
case 0:
|
||||
case D_ALL:
|
||||
verbose = "no";
|
||||
break;
|
||||
case 1:
|
||||
case D_INFO:
|
||||
verbose = "info";
|
||||
break;
|
||||
case D_DEBUG:
|
||||
default:
|
||||
verbose = "debug";
|
||||
break;
|
||||
|
@ -119,7 +120,7 @@ static void usage(boolean_t requested)
|
|||
"\t[-B benchmark all raidz implementations]\n"
|
||||
"\t[-e use expanded raidz map (default: %s)]\n"
|
||||
"\t[-r expanded raidz map reflow offset (default: %llx)]\n"
|
||||
"\t[-v increase verbosity (default: %zu)]\n"
|
||||
"\t[-v increase verbosity (default: %d)]\n"
|
||||
"\t[-h (print help)]\n"
|
||||
"\t[-T test the test, see if failure would be detected]\n"
|
||||
"\t[-D debug (attach gdb on SIGSEGV)]\n"
|
||||
|
@ -131,7 +132,7 @@ static void usage(boolean_t requested)
|
|||
rto_opts.rto_sweep ? "yes" : "no", /* -S */
|
||||
rto_opts.rto_expand ? "yes" : "no", /* -e */
|
||||
(u_longlong_t)o->rto_expand_offset, /* -r */
|
||||
o->rto_v); /* -d */
|
||||
o->rto_v); /* -v */
|
||||
|
||||
exit(requested ? 0 : 1);
|
||||
}
|
||||
|
@ -839,7 +840,7 @@ static kcondvar_t sem_cv;
|
|||
static int max_free_slots;
|
||||
static int free_slots;
|
||||
|
||||
static void
|
||||
static _Noreturn void
|
||||
sweep_thread(void *arg)
|
||||
{
|
||||
int err = 0;
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include <sys/spa.h>
|
||||
|
||||
static const char *raidz_impl_names[] = {
|
||||
static const char *const raidz_impl_names[] = {
|
||||
"original",
|
||||
"scalar",
|
||||
"sse2",
|
||||
|
@ -42,12 +42,18 @@ static const char *raidz_impl_names[] = {
|
|||
NULL
|
||||
};
|
||||
|
||||
enum raidz_verbosity {
|
||||
D_ALL,
|
||||
D_INFO,
|
||||
D_DEBUG,
|
||||
};
|
||||
|
||||
typedef struct raidz_test_opts {
|
||||
size_t rto_ashift;
|
||||
uint64_t rto_offset;
|
||||
size_t rto_dcols;
|
||||
size_t rto_dsize;
|
||||
size_t rto_v;
|
||||
enum raidz_verbosity rto_v;
|
||||
size_t rto_sweep;
|
||||
size_t rto_sweep_timeout;
|
||||
size_t rto_benchmark;
|
||||
|
@ -68,7 +74,7 @@ static const raidz_test_opts_t rto_opts_defaults = {
|
|||
.rto_offset = 1ULL << 0,
|
||||
.rto_dcols = 8,
|
||||
.rto_dsize = 1<<19,
|
||||
.rto_v = 0,
|
||||
.rto_v = D_ALL,
|
||||
.rto_sweep = 0,
|
||||
.rto_benchmark = 0,
|
||||
.rto_expand = 0,
|
||||
|
@ -86,10 +92,6 @@ static inline size_t ilog2(size_t a)
|
|||
}
|
||||
|
||||
|
||||
#define D_ALL 0
|
||||
#define D_INFO 1
|
||||
#define D_DEBUG 2
|
||||
|
||||
#define LOG(lvl, a...) \
|
||||
{ \
|
||||
if (rto_opts.rto_v >= lvl) \
|
||||
|
|
|
@ -1228,9 +1228,9 @@ dump_bpobj(objset_t *os, uint64_t object, void *data, size_t size)
|
|||
char bytes[32], comp[32], uncomp[32];
|
||||
|
||||
/* make sure the output won't get truncated */
|
||||
CTASSERT(sizeof (bytes) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (comp) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (uncomp) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (bytes) >= NN_NUMBUF_SZ, "bytes truncated");
|
||||
_Static_assert(sizeof (comp) >= NN_NUMBUF_SZ, "comp truncated");
|
||||
_Static_assert(sizeof (uncomp) >= NN_NUMBUF_SZ, "uncomp truncated");
|
||||
|
||||
if (bpop == NULL)
|
||||
return;
|
||||
|
@ -1655,7 +1655,7 @@ dump_metaslab_stats(metaslab_t *msp)
|
|||
int free_pct = range_tree_space(rt) * 100 / msp->ms_size;
|
||||
|
||||
/* max sure nicenum has enough space */
|
||||
CTASSERT(sizeof (maxbuf) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (maxbuf) >= NN_NUMBUF_SZ, "maxbuf truncated");
|
||||
|
||||
zdb_nicenum(metaslab_largest_allocatable(msp), maxbuf, sizeof (maxbuf));
|
||||
|
||||
|
@ -2490,7 +2490,7 @@ dump_dsl_dir(objset_t *os, uint64_t object, void *data, size_t size)
|
|||
char nice[32];
|
||||
|
||||
/* make sure nicenum has enough space */
|
||||
CTASSERT(sizeof (nice) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (nice) >= NN_NUMBUF_SZ, "nice truncated");
|
||||
|
||||
if (dd == NULL)
|
||||
return;
|
||||
|
@ -2548,10 +2548,12 @@ dump_dsl_dataset(objset_t *os, uint64_t object, void *data, size_t size)
|
|||
char blkbuf[BP_SPRINTF_LEN];
|
||||
|
||||
/* make sure nicenum has enough space */
|
||||
CTASSERT(sizeof (used) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (compressed) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (uncompressed) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (unique) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (used) >= NN_NUMBUF_SZ, "used truncated");
|
||||
_Static_assert(sizeof (compressed) >= NN_NUMBUF_SZ,
|
||||
"compressed truncated");
|
||||
_Static_assert(sizeof (uncompressed) >= NN_NUMBUF_SZ,
|
||||
"uncompressed truncated");
|
||||
_Static_assert(sizeof (unique) >= NN_NUMBUF_SZ, "unique truncated");
|
||||
|
||||
if (ds == NULL)
|
||||
return;
|
||||
|
@ -2622,7 +2624,7 @@ dump_bptree(objset_t *os, uint64_t obj, const char *name)
|
|||
dmu_buf_t *db;
|
||||
|
||||
/* make sure nicenum has enough space */
|
||||
CTASSERT(sizeof (bytes) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (bytes) >= NN_NUMBUF_SZ, "bytes truncated");
|
||||
|
||||
if (dump_opt['d'] < 3)
|
||||
return;
|
||||
|
@ -2663,9 +2665,9 @@ dump_full_bpobj(bpobj_t *bpo, const char *name, int indent)
|
|||
uint64_t i;
|
||||
|
||||
/* make sure nicenum has enough space */
|
||||
CTASSERT(sizeof (bytes) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (comp) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (uncomp) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (bytes) >= NN_NUMBUF_SZ, "bytes truncated");
|
||||
_Static_assert(sizeof (comp) >= NN_NUMBUF_SZ, "comp truncated");
|
||||
_Static_assert(sizeof (uncomp) >= NN_NUMBUF_SZ, "uncomp truncated");
|
||||
|
||||
if (dump_opt['d'] < 3)
|
||||
return;
|
||||
|
@ -2941,10 +2943,10 @@ dump_blkptr_list(dsl_deadlist_t *dl, char *name)
|
|||
}
|
||||
|
||||
/* make sure nicenum has enough space */
|
||||
CTASSERT(sizeof (bytes) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (comp) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (uncomp) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (entries) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (bytes) >= NN_NUMBUF_SZ, "bytes truncated");
|
||||
_Static_assert(sizeof (comp) >= NN_NUMBUF_SZ, "comp truncated");
|
||||
_Static_assert(sizeof (uncomp) >= NN_NUMBUF_SZ, "uncomp truncated");
|
||||
_Static_assert(sizeof (entries) >= NN_NUMBUF_SZ, "entries truncated");
|
||||
|
||||
if (dump_opt['d'] < 3)
|
||||
return;
|
||||
|
@ -3428,11 +3430,12 @@ dump_object(objset_t *os, uint64_t object, int verbosity,
|
|||
int error;
|
||||
|
||||
/* make sure nicenum has enough space */
|
||||
CTASSERT(sizeof (iblk) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (dblk) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (lsize) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (asize) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (bonus_size) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (iblk) >= NN_NUMBUF_SZ, "iblk truncated");
|
||||
_Static_assert(sizeof (dblk) >= NN_NUMBUF_SZ, "dblk truncated");
|
||||
_Static_assert(sizeof (lsize) >= NN_NUMBUF_SZ, "lsize truncated");
|
||||
_Static_assert(sizeof (asize) >= NN_NUMBUF_SZ, "asize truncated");
|
||||
_Static_assert(sizeof (bonus_size) >= NN_NUMBUF_SZ,
|
||||
"bonus_size truncated");
|
||||
|
||||
if (*print_header) {
|
||||
(void) printf("\n%10s %3s %5s %5s %5s %6s %5s %6s %s\n",
|
||||
|
@ -3581,7 +3584,8 @@ dump_object(objset_t *os, uint64_t object, int verbosity,
|
|||
for (;;) {
|
||||
char segsize[32];
|
||||
/* make sure nicenum has enough space */
|
||||
CTASSERT(sizeof (segsize) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (segsize) >= NN_NUMBUF_SZ,
|
||||
"segsize truncated");
|
||||
error = dnode_next_offset(dn,
|
||||
0, &start, minlvl, blkfill, 0);
|
||||
if (error)
|
||||
|
@ -3770,7 +3774,7 @@ dump_objset(objset_t *os)
|
|||
uint64_t flags;
|
||||
|
||||
/* make sure nicenum has enough space */
|
||||
CTASSERT(sizeof (numbuf) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (numbuf) >= NN_NUMBUF_SZ, "numbuf truncated");
|
||||
|
||||
dsl_pool_config_enter(dmu_objset_pool(os), FTAG);
|
||||
dmu_objset_fast_stat(os, &dds);
|
||||
|
@ -4651,7 +4655,7 @@ dump_path_impl(objset_t *os, uint64_t obj, char *name, uint64_t *retobj)
|
|||
case DMU_OT_DIRECTORY_CONTENTS:
|
||||
if (s != NULL && *(s + 1) != '\0')
|
||||
return (dump_path_impl(os, child_obj, s + 1, retobj));
|
||||
fallthrough;
|
||||
zfs_fallthrough;
|
||||
case DMU_OT_PLAIN_FILE_CONTENTS:
|
||||
if (retobj != NULL) {
|
||||
*retobj = child_obj;
|
||||
|
@ -5542,7 +5546,7 @@ zdb_blkptr_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
|
|||
(zcb->zcb_totalasize - bytes) / 1024 / kb_per_sec;
|
||||
|
||||
/* make sure nicenum has enough space */
|
||||
CTASSERT(sizeof (buf) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (buf) >= NN_NUMBUF_SZ, "buf truncated");
|
||||
|
||||
zfs_nicebytes(bytes, buf, sizeof (buf));
|
||||
(void) fprintf(stderr,
|
||||
|
@ -6651,12 +6655,18 @@ dump_block_stats(spa_t *spa)
|
|||
const char *typename;
|
||||
|
||||
/* make sure nicenum has enough space */
|
||||
CTASSERT(sizeof (csize) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (lsize) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (psize) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (asize) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (avg) >= NN_NUMBUF_SZ);
|
||||
CTASSERT(sizeof (gang) >= NN_NUMBUF_SZ);
|
||||
_Static_assert(sizeof (csize) >= NN_NUMBUF_SZ,
|
||||
"csize truncated");
|
||||
_Static_assert(sizeof (lsize) >= NN_NUMBUF_SZ,
|
||||
"lsize truncated");
|
||||
_Static_assert(sizeof (psize) >= NN_NUMBUF_SZ,
|
||||
"psize truncated");
|
||||
_Static_assert(sizeof (asize) >= NN_NUMBUF_SZ,
|
||||
"asize truncated");
|
||||
_Static_assert(sizeof (avg) >= NN_NUMBUF_SZ,
|
||||
"avg truncated");
|
||||
_Static_assert(sizeof (gang) >= NN_NUMBUF_SZ,
|
||||
"gang truncated");
|
||||
|
||||
if (t < DMU_OT_NUMTYPES)
|
||||
typename = dmu_ot[t].ot_name;
|
||||
|
@ -8644,7 +8654,7 @@ main(int argc, char **argv)
|
|||
dump_opt[c] += verbose;
|
||||
}
|
||||
|
||||
libspl_assert_ok = (dump_opt['A'] == 1) || (dump_opt['A'] > 2);
|
||||
libspl_set_assert_ok((dump_opt['A'] == 1) || (dump_opt['A'] > 2));
|
||||
zfs_recover = (dump_opt['A'] > 1);
|
||||
|
||||
argc -= optind;
|
||||
|
|
|
@ -265,6 +265,29 @@ zil_prt_rec_setattr(zilog_t *zilog, int txtype, const void *arg)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
zil_prt_rec_setsaxattr(zilog_t *zilog, int txtype, const void *arg)
|
||||
{
|
||||
(void) zilog, (void) txtype;
|
||||
const lr_setsaxattr_t *lr = arg;
|
||||
|
||||
char *name = (char *)(lr + 1);
|
||||
(void) printf("%sfoid %llu\n", tab_prefix,
|
||||
(u_longlong_t)lr->lr_foid);
|
||||
|
||||
(void) printf("%sXAT_NAME %s\n", tab_prefix, name);
|
||||
if (lr->lr_size == 0) {
|
||||
(void) printf("%sXAT_VALUE NULL\n", tab_prefix);
|
||||
} else {
|
||||
(void) printf("%sXAT_VALUE ", tab_prefix);
|
||||
char *val = name + (strlen(name) + 1);
|
||||
for (int i = 0; i < lr->lr_size; i++) {
|
||||
(void) printf("%c", *val);
|
||||
val++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
zil_prt_rec_acl(zilog_t *zilog, int txtype, const void *arg)
|
||||
{
|
||||
|
@ -304,6 +327,8 @@ static zil_rec_info_t zil_rec_info[TX_MAX_TYPE] = {
|
|||
{.zri_print = zil_prt_rec_create, .zri_name = "TX_MKDIR_ATTR "},
|
||||
{.zri_print = zil_prt_rec_create, .zri_name = "TX_MKDIR_ACL_ATTR "},
|
||||
{.zri_print = zil_prt_rec_write, .zri_name = "TX_WRITE2 "},
|
||||
{.zri_print = zil_prt_rec_setsaxattr,
|
||||
.zri_name = "TX_SETSAXATTR "},
|
||||
};
|
||||
|
||||
static int
|
||||
|
|
|
@ -5,7 +5,6 @@ AM_CFLAGS += $(LIBUDEV_CFLAGS) $(LIBUUID_CFLAGS)
|
|||
|
||||
SUBDIRS = zed.d
|
||||
SHELLCHECKDIRS = $(SUBDIRS)
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
||||
sbin_PROGRAMS = zed
|
||||
|
||||
|
|
|
@ -183,14 +183,14 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
|||
nvlist_t *nvroot, *newvd;
|
||||
pendingdev_t *device;
|
||||
uint64_t wholedisk = 0ULL;
|
||||
uint64_t offline = 0ULL;
|
||||
uint64_t offline = 0ULL, faulted = 0ULL;
|
||||
uint64_t guid = 0ULL;
|
||||
char *physpath = NULL, *new_devid = NULL, *enc_sysfs_path = NULL;
|
||||
char rawpath[PATH_MAX], fullpath[PATH_MAX];
|
||||
char devpath[PATH_MAX];
|
||||
int ret;
|
||||
boolean_t is_dm = B_FALSE;
|
||||
boolean_t is_sd = B_FALSE;
|
||||
boolean_t is_mpath_wholedisk = B_FALSE;
|
||||
uint_t c;
|
||||
vdev_stat_t *vs;
|
||||
|
||||
|
@ -211,15 +211,73 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
|||
&enc_sysfs_path);
|
||||
(void) nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_WHOLE_DISK, &wholedisk);
|
||||
(void) nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_OFFLINE, &offline);
|
||||
(void) nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_FAULTED, &faulted);
|
||||
|
||||
(void) nvlist_lookup_uint64(vdev, ZPOOL_CONFIG_GUID, &guid);
|
||||
|
||||
if (offline)
|
||||
return; /* don't intervene if it was taken offline */
|
||||
/*
|
||||
* Special case:
|
||||
*
|
||||
* We've seen times where a disk won't have a ZPOOL_CONFIG_PHYS_PATH
|
||||
* entry in their config. For example, on this force-faulted disk:
|
||||
*
|
||||
* children[0]:
|
||||
* type: 'disk'
|
||||
* id: 0
|
||||
* guid: 14309659774640089719
|
||||
* path: '/dev/disk/by-vdev/L28'
|
||||
* whole_disk: 0
|
||||
* DTL: 654
|
||||
* create_txg: 4
|
||||
* com.delphix:vdev_zap_leaf: 1161
|
||||
* faulted: 1
|
||||
* aux_state: 'external'
|
||||
* children[1]:
|
||||
* type: 'disk'
|
||||
* id: 1
|
||||
* guid: 16002508084177980912
|
||||
* path: '/dev/disk/by-vdev/L29'
|
||||
* devid: 'dm-uuid-mpath-35000c500a61d68a3'
|
||||
* phys_path: 'L29'
|
||||
* vdev_enc_sysfs_path: '/sys/class/enclosure/0:0:1:0/SLOT 30 32'
|
||||
* whole_disk: 0
|
||||
* DTL: 1028
|
||||
* create_txg: 4
|
||||
* com.delphix:vdev_zap_leaf: 131
|
||||
*
|
||||
* If the disk's path is a /dev/disk/by-vdev/ path, then we can infer
|
||||
* the ZPOOL_CONFIG_PHYS_PATH from the by-vdev disk name.
|
||||
*/
|
||||
if (physpath == NULL && path != NULL) {
|
||||
/* If path begins with "/dev/disk/by-vdev/" ... */
|
||||
if (strncmp(path, DEV_BYVDEV_PATH,
|
||||
strlen(DEV_BYVDEV_PATH)) == 0) {
|
||||
/* Set physpath to the char after "/dev/disk/by-vdev" */
|
||||
physpath = &path[strlen(DEV_BYVDEV_PATH)];
|
||||
}
|
||||
}
|
||||
|
||||
is_dm = zfs_dev_is_dm(path);
|
||||
/*
|
||||
* We don't want to autoreplace offlined disks. However, we do want to
|
||||
* replace force-faulted disks (`zpool offline -f`). Force-faulted
|
||||
* disks have both offline=1 and faulted=1 in the nvlist.
|
||||
*/
|
||||
if (offline && !faulted) {
|
||||
zed_log_msg(LOG_INFO, "%s: %s is offline, skip autoreplace",
|
||||
__func__, path);
|
||||
return;
|
||||
}
|
||||
|
||||
is_mpath_wholedisk = is_mpath_whole_disk(path);
|
||||
zed_log_msg(LOG_INFO, "zfs_process_add: pool '%s' vdev '%s', phys '%s'"
|
||||
" wholedisk %d, %s dm (guid %llu)", zpool_get_name(zhp), path,
|
||||
physpath ? physpath : "NULL", wholedisk, is_dm ? "is" : "not",
|
||||
" %s blank disk, %s mpath blank disk, %s labeled, enc sysfs '%s', "
|
||||
"(guid %llu)",
|
||||
zpool_get_name(zhp), path,
|
||||
physpath ? physpath : "NULL",
|
||||
wholedisk ? "is" : "not",
|
||||
is_mpath_wholedisk? "is" : "not",
|
||||
labeled ? "is" : "not",
|
||||
enc_sysfs_path,
|
||||
(long long unsigned int)guid);
|
||||
|
||||
/*
|
||||
|
@ -253,8 +311,9 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
|||
ZFS_ONLINE_CHECKREMOVE | ZFS_ONLINE_UNSPARE, &newstate) == 0 &&
|
||||
(newstate == VDEV_STATE_HEALTHY ||
|
||||
newstate == VDEV_STATE_DEGRADED)) {
|
||||
zed_log_msg(LOG_INFO, " zpool_vdev_online: vdev %s is %s",
|
||||
fullpath, (newstate == VDEV_STATE_HEALTHY) ?
|
||||
zed_log_msg(LOG_INFO,
|
||||
" zpool_vdev_online: vdev '%s' ('%s') is "
|
||||
"%s", fullpath, physpath, (newstate == VDEV_STATE_HEALTHY) ?
|
||||
"HEALTHY" : "DEGRADED");
|
||||
return;
|
||||
}
|
||||
|
@ -271,11 +330,12 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
|||
* vdev online to trigger a FMA fault by posting an ereport.
|
||||
*/
|
||||
if (!zpool_get_prop_int(zhp, ZPOOL_PROP_AUTOREPLACE, NULL) ||
|
||||
!(wholedisk || is_dm) || (physpath == NULL)) {
|
||||
!(wholedisk || is_mpath_wholedisk) || (physpath == NULL)) {
|
||||
(void) zpool_vdev_online(zhp, fullpath, ZFS_ONLINE_FORCEFAULT,
|
||||
&newstate);
|
||||
zed_log_msg(LOG_INFO, "Pool's autoreplace is not enabled or "
|
||||
"not a whole disk for '%s'", fullpath);
|
||||
"not a blank disk for '%s' ('%s')", fullpath,
|
||||
physpath);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -287,7 +347,7 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
|||
(void) snprintf(rawpath, sizeof (rawpath), "%s%s",
|
||||
is_sd ? DEV_BYVDEV_PATH : DEV_BYPATH_PATH, physpath);
|
||||
|
||||
if (realpath(rawpath, devpath) == NULL && !is_dm) {
|
||||
if (realpath(rawpath, devpath) == NULL && !is_mpath_wholedisk) {
|
||||
zed_log_msg(LOG_INFO, " realpath: %s failed (%s)",
|
||||
rawpath, strerror(errno));
|
||||
|
||||
|
@ -303,12 +363,14 @@ zfs_process_add(zpool_handle_t *zhp, nvlist_t *vdev, boolean_t labeled)
|
|||
if ((vs->vs_state != VDEV_STATE_DEGRADED) &&
|
||||
(vs->vs_state != VDEV_STATE_FAULTED) &&
|
||||
(vs->vs_state != VDEV_STATE_CANT_OPEN)) {
|
||||
zed_log_msg(LOG_INFO, " not autoreplacing since disk isn't in "
|
||||
"a bad state (currently %d)", vs->vs_state);
|
||||
return;
|
||||
}
|
||||
|
||||
nvlist_lookup_string(vdev, "new_devid", &new_devid);
|
||||
|
||||
if (is_dm) {
|
||||
if (is_mpath_wholedisk) {
|
||||
/* Don't label device mapper or multipath disks. */
|
||||
} else if (!labeled) {
|
||||
/*
|
||||
|
@ -522,8 +584,11 @@ zfs_iter_vdev(zpool_handle_t *zhp, nvlist_t *nvl, void *data)
|
|||
* the dp->dd_compare value.
|
||||
*/
|
||||
if (nvlist_lookup_string(nvl, dp->dd_prop, &path) != 0 ||
|
||||
strcmp(dp->dd_compare, path) != 0)
|
||||
strcmp(dp->dd_compare, path) != 0) {
|
||||
zed_log_msg(LOG_INFO, " %s: no match (%s != vdev %s)",
|
||||
__func__, dp->dd_compare, path);
|
||||
return;
|
||||
}
|
||||
|
||||
zed_log_msg(LOG_INFO, " zfs_iter_vdev: matched %s on %s",
|
||||
dp->dd_prop, path);
|
||||
|
@ -571,6 +636,8 @@ zfs_iter_pool(zpool_handle_t *zhp, void *data)
|
|||
ZPOOL_CONFIG_VDEV_TREE, &nvl);
|
||||
zfs_iter_vdev(zhp, nvl, data);
|
||||
}
|
||||
} else {
|
||||
zed_log_msg(LOG_INFO, "%s: no config\n", __func__);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -619,6 +686,72 @@ devphys_iter(const char *physical, const char *devid, zfs_process_func_t func,
|
|||
return (data.dd_found);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a device identifier, find any vdevs with a matching by-vdev
|
||||
* path. Normally we shouldn't need this as the comparison would be
|
||||
* made earlier in the devphys_iter(). For example, if we were replacing
|
||||
* /dev/disk/by-vdev/L28, normally devphys_iter() would match the
|
||||
* ZPOOL_CONFIG_PHYS_PATH of "L28" from the old disk config to "L28"
|
||||
* of the new disk config. However, we've seen cases where
|
||||
* ZPOOL_CONFIG_PHYS_PATH was not in the config for the old disk. Here's
|
||||
* an example of a real 2-disk mirror pool where one disk was force
|
||||
* faulted:
|
||||
*
|
||||
* com.delphix:vdev_zap_top: 129
|
||||
* children[0]:
|
||||
* type: 'disk'
|
||||
* id: 0
|
||||
* guid: 14309659774640089719
|
||||
* path: '/dev/disk/by-vdev/L28'
|
||||
* whole_disk: 0
|
||||
* DTL: 654
|
||||
* create_txg: 4
|
||||
* com.delphix:vdev_zap_leaf: 1161
|
||||
* faulted: 1
|
||||
* aux_state: 'external'
|
||||
* children[1]:
|
||||
* type: 'disk'
|
||||
* id: 1
|
||||
* guid: 16002508084177980912
|
||||
* path: '/dev/disk/by-vdev/L29'
|
||||
* devid: 'dm-uuid-mpath-35000c500a61d68a3'
|
||||
* phys_path: 'L29'
|
||||
* vdev_enc_sysfs_path: '/sys/class/enclosure/0:0:1:0/SLOT 30 32'
|
||||
* whole_disk: 0
|
||||
* DTL: 1028
|
||||
* create_txg: 4
|
||||
* com.delphix:vdev_zap_leaf: 131
|
||||
*
|
||||
* So in the case above, the only thing we could compare is the path.
|
||||
*
|
||||
* We can do this because we assume by-vdev paths are authoritative as physical
|
||||
* paths. We could not assume this for normal paths like /dev/sda since the
|
||||
* physical location /dev/sda points to could change over time.
|
||||
*/
|
||||
static boolean_t
|
||||
by_vdev_path_iter(const char *by_vdev_path, const char *devid,
|
||||
zfs_process_func_t func, boolean_t is_slice)
|
||||
{
|
||||
dev_data_t data = { 0 };
|
||||
|
||||
data.dd_compare = by_vdev_path;
|
||||
data.dd_func = func;
|
||||
data.dd_prop = ZPOOL_CONFIG_PATH;
|
||||
data.dd_found = B_FALSE;
|
||||
data.dd_islabeled = is_slice;
|
||||
data.dd_new_devid = devid;
|
||||
|
||||
if (strncmp(by_vdev_path, DEV_BYVDEV_PATH,
|
||||
strlen(DEV_BYVDEV_PATH)) != 0) {
|
||||
/* by_vdev_path doesn't start with "/dev/disk/by-vdev/" */
|
||||
return (B_FALSE);
|
||||
}
|
||||
|
||||
(void) zpool_iter(g_zfshdl, zfs_iter_pool, &data);
|
||||
|
||||
return (data.dd_found);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a device identifier, find any vdevs with a matching devid.
|
||||
* On Linux we can match devid directly which is always a whole disk.
|
||||
|
@ -683,15 +816,17 @@ guid_iter(uint64_t pool_guid, uint64_t vdev_guid, const char *devid,
|
|||
static int
|
||||
zfs_deliver_add(nvlist_t *nvl)
|
||||
{
|
||||
char *devpath = NULL, *devid;
|
||||
char *devpath = NULL, *devid = NULL;
|
||||
uint64_t pool_guid = 0, vdev_guid = 0;
|
||||
boolean_t is_slice;
|
||||
|
||||
/*
|
||||
* Expecting a devid string and an optional physical location and guid
|
||||
*/
|
||||
if (nvlist_lookup_string(nvl, DEV_IDENTIFIER, &devid) != 0)
|
||||
if (nvlist_lookup_string(nvl, DEV_IDENTIFIER, &devid) != 0) {
|
||||
zed_log_msg(LOG_INFO, "%s: no dev identifier\n", __func__);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
(void) nvlist_lookup_string(nvl, DEV_PHYS_PATH, &devpath);
|
||||
(void) nvlist_lookup_uint64(nvl, ZFS_EV_POOL_GUID, &pool_guid);
|
||||
|
@ -707,6 +842,8 @@ zfs_deliver_add(nvlist_t *nvl)
|
|||
* 1. ZPOOL_CONFIG_DEVID (identifies the unique disk)
|
||||
* 2. ZPOOL_CONFIG_PHYS_PATH (identifies disk physical location).
|
||||
* 3. ZPOOL_CONFIG_GUID (identifies unique vdev).
|
||||
* 4. ZPOOL_CONFIG_PATH for /dev/disk/by-vdev devices only (since
|
||||
* by-vdev paths represent physical paths).
|
||||
*/
|
||||
if (devid_iter(devid, zfs_process_add, is_slice))
|
||||
return (0);
|
||||
|
@ -717,6 +854,16 @@ zfs_deliver_add(nvlist_t *nvl)
|
|||
(void) guid_iter(pool_guid, vdev_guid, devid, zfs_process_add,
|
||||
is_slice);
|
||||
|
||||
if (devpath != NULL) {
|
||||
/* Can we match a /dev/disk/by-vdev/ path? */
|
||||
char by_vdev_path[MAXPATHLEN];
|
||||
snprintf(by_vdev_path, sizeof (by_vdev_path),
|
||||
"/dev/disk/by-vdev/%s", devpath);
|
||||
if (by_vdev_path_iter(by_vdev_path, devid, zfs_process_add,
|
||||
is_slice))
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,8 +11,7 @@ dist_zedconf_DATA = \
|
|||
zed.rc
|
||||
|
||||
SHELLCHECKSCRIPTS = zed-functions.sh zed.rc
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
SHELLCHECK_SHELL = dash
|
||||
SHELLCHECK_SHELL = sh
|
||||
|
||||
zedexecdir = $(zfsexecdir)/zed.d
|
||||
|
||||
|
|
|
@ -417,7 +417,7 @@ zed_notify_slack_webhook()
|
|||
|
||||
# Construct the JSON message for posting.
|
||||
#
|
||||
msg_json="$(printf '{"text": "*%s*\n%s"}' "${subject}" "${msg_body}" )"
|
||||
msg_json="$(printf '{"text": "*%s*\\n%s"}' "${subject}" "${msg_body}" )"
|
||||
|
||||
# Send the POST request and check for errors.
|
||||
#
|
||||
|
|
|
@ -215,6 +215,11 @@ zed_udev_monitor(void *arg)
|
|||
if (type != NULL && type[0] != '\0' &&
|
||||
strcmp(type, "disk") == 0 &&
|
||||
part != NULL && part[0] != '\0') {
|
||||
zed_log_msg(LOG_INFO,
|
||||
"%s: skip %s since it has a %s partition already",
|
||||
__func__,
|
||||
udev_device_get_property_value(dev, "DEVNAME"),
|
||||
part);
|
||||
/* skip and wait for partition event */
|
||||
udev_device_unref(dev);
|
||||
continue;
|
||||
|
@ -229,6 +234,11 @@ zed_udev_monitor(void *arg)
|
|||
sectors = udev_device_get_sysattr_value(dev, "size");
|
||||
if (sectors != NULL &&
|
||||
strtoull(sectors, NULL, 10) < MINIMUM_SECTORS) {
|
||||
zed_log_msg(LOG_INFO,
|
||||
"%s: %s sectors %s < %llu (minimum)",
|
||||
__func__,
|
||||
udev_device_get_property_value(dev, "DEVNAME"),
|
||||
sectors, MINIMUM_SECTORS);
|
||||
udev_device_unref(dev);
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -453,23 +453,21 @@ zfs_for_each(int argc, char **argv, int flags, zfs_type_t types,
|
|||
cb.cb_flags |= ZFS_ITER_RECURSE;
|
||||
ret = zfs_iter_root(g_zfs, zfs_callback, &cb);
|
||||
} else {
|
||||
int i;
|
||||
zfs_handle_t *zhp;
|
||||
zfs_type_t argtype;
|
||||
zfs_handle_t *zhp = NULL;
|
||||
zfs_type_t argtype = types;
|
||||
|
||||
/*
|
||||
* If we're recursive, then we always allow filesystems as
|
||||
* arguments. If we also are interested in snapshots or
|
||||
* bookmarks, then we can take volumes as well.
|
||||
*/
|
||||
argtype = types;
|
||||
if (flags & ZFS_ITER_RECURSE) {
|
||||
argtype |= ZFS_TYPE_FILESYSTEM;
|
||||
if (types & (ZFS_TYPE_SNAPSHOT | ZFS_TYPE_BOOKMARK))
|
||||
argtype |= ZFS_TYPE_VOLUME;
|
||||
}
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
for (int i = 0; i < argc; i++) {
|
||||
if (flags & ZFS_ITER_ARGS_CAN_BE_PATHS) {
|
||||
zhp = zfs_path_to_zhandle(g_zfs, argv[i],
|
||||
argtype);
|
||||
|
|
|
@ -575,8 +575,9 @@ usage(boolean_t requested)
|
|||
|
||||
(void) fprintf(fp, gettext("\nSizes are specified in bytes "
|
||||
"with standard units such as K, M, G, etc.\n"));
|
||||
(void) fprintf(fp, gettext("\nUser-defined properties can "
|
||||
"be specified by using a name containing a colon (:).\n"));
|
||||
(void) fprintf(fp, "%s", gettext("\nUser-defined properties "
|
||||
"can be specified by using a name containing a colon "
|
||||
"(:).\n"));
|
||||
(void) fprintf(fp, gettext("\nThe {user|group|project}"
|
||||
"[obj]{used|quota}@ properties must be appended with\n"
|
||||
"a user|group|project specifier of one of these forms:\n"
|
||||
|
@ -727,32 +728,6 @@ finish_progress(char *done)
|
|||
pt_header = NULL;
|
||||
}
|
||||
|
||||
/* This function checks if the passed fd refers to /dev/null or /dev/zero */
|
||||
#ifdef __linux__
|
||||
static boolean_t
|
||||
is_dev_nullzero(int fd)
|
||||
{
|
||||
struct stat st;
|
||||
fstat(fd, &st);
|
||||
return (major(st.st_rdev) == 1 && (minor(st.st_rdev) == 3 /* null */ ||
|
||||
minor(st.st_rdev) == 5 /* zero */));
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
note_dev_error(int err, int fd)
|
||||
{
|
||||
#ifdef __linux__
|
||||
if (err == EINVAL && is_dev_nullzero(fd)) {
|
||||
(void) fprintf(stderr,
|
||||
gettext("Error: Writing directly to /dev/{null,zero} files"
|
||||
" on certain kernels is not currently implemented.\n"
|
||||
"(As a workaround, "
|
||||
"try \"zfs send [...] | cat > /dev/null\")\n"));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
zfs_mount_and_share(libzfs_handle_t *hdl, const char *dataset, zfs_type_t type)
|
||||
{
|
||||
|
@ -4594,16 +4569,11 @@ zfs_do_send(int argc, char **argv)
|
|||
|
||||
err = zfs_send_saved(zhp, &flags, STDOUT_FILENO,
|
||||
resume_token);
|
||||
if (err != 0)
|
||||
note_dev_error(errno, STDOUT_FILENO);
|
||||
zfs_close(zhp);
|
||||
return (err != 0);
|
||||
} else if (resume_token != NULL) {
|
||||
err = zfs_send_resume(g_zfs, &flags, STDOUT_FILENO,
|
||||
resume_token);
|
||||
if (err != 0)
|
||||
note_dev_error(errno, STDOUT_FILENO);
|
||||
return (err);
|
||||
return (zfs_send_resume(g_zfs, &flags, STDOUT_FILENO,
|
||||
resume_token));
|
||||
}
|
||||
|
||||
if (flags.skipmissing && !flags.replicate) {
|
||||
|
@ -4654,8 +4624,6 @@ zfs_do_send(int argc, char **argv)
|
|||
err = zfs_send_one(zhp, fromname, STDOUT_FILENO, &flags,
|
||||
redactbook);
|
||||
zfs_close(zhp);
|
||||
if (err != 0)
|
||||
note_dev_error(errno, STDOUT_FILENO);
|
||||
return (err != 0);
|
||||
}
|
||||
|
||||
|
@ -4732,7 +4700,6 @@ zfs_do_send(int argc, char **argv)
|
|||
nvlist_free(dbgnv);
|
||||
}
|
||||
zfs_close(zhp);
|
||||
note_dev_error(errno, STDOUT_FILENO);
|
||||
|
||||
return (err != 0);
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static __attribute__((noreturn)) void
|
||||
static _Noreturn void
|
||||
usage(void)
|
||||
{
|
||||
(void) fprintf(stderr,
|
||||
|
|
|
@ -57,7 +57,7 @@ static importargs_t g_importargs;
|
|||
static char *g_pool;
|
||||
static boolean_t g_readonly;
|
||||
|
||||
static __attribute__((noreturn)) void
|
||||
static _Noreturn void
|
||||
usage(void)
|
||||
{
|
||||
(void) fprintf(stderr,
|
||||
|
@ -87,7 +87,7 @@ usage(void)
|
|||
}
|
||||
|
||||
|
||||
static __attribute__((noreturn)) __attribute__((format(printf, 3, 4))) void
|
||||
static __attribute__((format(printf, 3, 4))) _Noreturn void
|
||||
fatal(spa_t *spa, void *tag, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
|
|
@ -5,7 +5,6 @@ AM_CFLAGS += $(LIBBLKID_CFLAGS) $(LIBUUID_CFLAGS)
|
|||
|
||||
DEFAULT_INCLUDES += -I$(srcdir)
|
||||
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
||||
sbin_PROGRAMS = zpool
|
||||
|
||||
|
|
|
@ -1760,17 +1760,19 @@ zpool_do_create(int argc, char **argv)
|
|||
"feature@%s", feat->fi_uname);
|
||||
|
||||
if (!nvlist_lookup_string(props, propname, &propval)) {
|
||||
if (strcmp(propval, ZFS_FEATURE_DISABLED) == 0)
|
||||
if (strcmp(propval,
|
||||
ZFS_FEATURE_DISABLED) == 0) {
|
||||
(void) nvlist_remove_all(props,
|
||||
propname);
|
||||
if (strcmp(propval,
|
||||
} else if (strcmp(propval,
|
||||
ZFS_FEATURE_ENABLED) == 0 &&
|
||||
!requested_features[i])
|
||||
!requested_features[i]) {
|
||||
(void) fprintf(stderr, gettext(
|
||||
"Warning: feature \"%s\" enabled "
|
||||
"but is not in specified "
|
||||
"'compatibility' feature set.\n"),
|
||||
feat->fi_uname);
|
||||
}
|
||||
} else if (
|
||||
enable_pool_features &&
|
||||
feat->fi_zfs_mod_supported &&
|
||||
|
@ -3039,9 +3041,8 @@ show_import(nvlist_t *config, boolean_t report_error)
|
|||
ZPOOL_CONFIG_MMP_HOSTID);
|
||||
|
||||
(void) printf(gettext(" action: The pool must be "
|
||||
"exported from %s (hostid=%lx)\n\tbefore it "
|
||||
"can be safely imported.\n"), hostname,
|
||||
(unsigned long) hostid);
|
||||
"exported from %s (hostid=%"PRIx64")\n\tbefore it "
|
||||
"can be safely imported.\n"), hostname, hostid);
|
||||
break;
|
||||
case ZPOOL_STATUS_HOSTID_REQUIRED:
|
||||
(void) printf(gettext(" action: Set a unique system "
|
||||
|
@ -3136,7 +3137,7 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
|
|||
{
|
||||
int ret = 0;
|
||||
zpool_handle_t *zhp;
|
||||
char *name;
|
||||
const char *name;
|
||||
uint64_t version;
|
||||
|
||||
name = fnvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME);
|
||||
|
@ -3157,7 +3158,7 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
|
|||
ZPOOL_CONFIG_MMP_STATE);
|
||||
|
||||
if (mmp_state == MMP_STATE_ACTIVE) {
|
||||
char *hostname = "<unknown>";
|
||||
const char *hostname = "<unknown>";
|
||||
uint64_t hostid = 0;
|
||||
|
||||
if (nvlist_exists(nvinfo, ZPOOL_CONFIG_MMP_HOSTNAME))
|
||||
|
@ -3170,17 +3171,17 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
|
|||
|
||||
(void) fprintf(stderr, gettext("cannot import '%s': "
|
||||
"pool is imported on %s (hostid: "
|
||||
"0x%lx)\nExport the pool on the other system, "
|
||||
"then run 'zpool import'.\n"),
|
||||
name, hostname, (unsigned long) hostid);
|
||||
"0x%"PRIx64")\nExport the pool on the other "
|
||||
"system, then run 'zpool import'.\n"),
|
||||
name, hostname, hostid);
|
||||
} else if (mmp_state == MMP_STATE_NO_HOSTID) {
|
||||
(void) fprintf(stderr, gettext("Cannot import '%s': "
|
||||
"pool has the multihost property on and the\n"
|
||||
"system's hostid is not set. Set a unique hostid "
|
||||
"with the zgenhostid(8) command.\n"), name);
|
||||
} else {
|
||||
char *hostname = "<unknown>";
|
||||
uint64_t timestamp = 0;
|
||||
const char *hostname = "<unknown>";
|
||||
time_t timestamp = 0;
|
||||
uint64_t hostid = 0;
|
||||
|
||||
if (nvlist_exists(config, ZPOOL_CONFIG_HOSTNAME))
|
||||
|
@ -3197,10 +3198,10 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
|
|||
|
||||
(void) fprintf(stderr, gettext("cannot import '%s': "
|
||||
"pool was previously in use from another system.\n"
|
||||
"Last accessed by %s (hostid=%lx) at %s"
|
||||
"Last accessed by %s (hostid=%"PRIx64") at %s"
|
||||
"The pool can be imported, use 'zpool import -f' "
|
||||
"to import the pool.\n"), name, hostname,
|
||||
(unsigned long)hostid, ctime((time_t *)×tamp));
|
||||
hostid, ctime(×tamp));
|
||||
}
|
||||
|
||||
return (1);
|
||||
|
@ -3210,7 +3211,7 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
|
|||
return (1);
|
||||
|
||||
if (newname != NULL)
|
||||
name = (char *)newname;
|
||||
name = newname;
|
||||
|
||||
if ((zhp = zpool_open_canfail(g_zfs, name)) == NULL)
|
||||
return (1);
|
||||
|
@ -3219,11 +3220,9 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
|
|||
* Loading keys is best effort. We don't want to return immediately
|
||||
* if it fails but we do want to give the error to the caller.
|
||||
*/
|
||||
if (flags & ZFS_IMPORT_LOAD_KEYS) {
|
||||
ret = zfs_crypto_attempt_load_keys(g_zfs, name);
|
||||
if (ret != 0)
|
||||
if (flags & ZFS_IMPORT_LOAD_KEYS &&
|
||||
zfs_crypto_attempt_load_keys(g_zfs, name) != 0)
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL &&
|
||||
!(flags & ZFS_IMPORT_ONLY) &&
|
||||
|
@ -3273,7 +3272,7 @@ import_pools(nvlist_t *pools, nvlist_t *props, char *mntopts, int flags,
|
|||
if (first)
|
||||
first = B_FALSE;
|
||||
else if (!do_all)
|
||||
(void) printf("\n");
|
||||
(void) putchar('\n');
|
||||
|
||||
if (do_all) {
|
||||
err |= do_import(config, NULL, mntopts,
|
||||
|
@ -3724,9 +3723,8 @@ zpool_do_import(int argc, char **argv)
|
|||
if (argc == 0 && geteuid() != 0) {
|
||||
(void) fprintf(stderr, gettext("cannot "
|
||||
"discover pools: permission denied\n"));
|
||||
if (searchdirs != NULL)
|
||||
free(searchdirs);
|
||||
|
||||
free(searchdirs);
|
||||
nvlist_free(props);
|
||||
nvlist_free(policy);
|
||||
return (1);
|
||||
|
@ -4690,7 +4688,7 @@ print_iostat_default(vdev_stat_t *vs, iostat_cbdata_t *cb, double scale)
|
|||
format, column_width, cb->cb_scripted);
|
||||
}
|
||||
|
||||
static const char *class_name[] = {
|
||||
static const char *const class_name[] = {
|
||||
VDEV_ALLOC_BIAS_DEDUP,
|
||||
VDEV_ALLOC_BIAS_SPECIAL,
|
||||
VDEV_ALLOC_CLASS_LOGS
|
||||
|
@ -4850,7 +4848,7 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
|||
continue;
|
||||
|
||||
vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
|
||||
cb->cb_vdevs.cb_name_flags);
|
||||
cb->cb_vdevs.cb_name_flags | VDEV_NAME_TYPE_ID);
|
||||
ret += print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
|
||||
newchild[c], cb, depth + 2);
|
||||
free(vname);
|
||||
|
@ -4859,7 +4857,7 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
|||
/*
|
||||
* print all other top-level devices
|
||||
*/
|
||||
for (uint_t n = 0; n < 3; n++) {
|
||||
for (uint_t n = 0; n < ARRAY_SIZE(class_name); n++) {
|
||||
boolean_t printed = B_FALSE;
|
||||
|
||||
for (c = 0; c < children; c++) {
|
||||
|
@ -4894,7 +4892,7 @@ print_vdev_stats(zpool_handle_t *zhp, const char *name, nvlist_t *oldnv,
|
|||
}
|
||||
|
||||
vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
|
||||
cb->cb_vdevs.cb_name_flags);
|
||||
cb->cb_vdevs.cb_name_flags | VDEV_NAME_TYPE_ID);
|
||||
ret += print_vdev_stats(zhp, vname, oldnv ?
|
||||
oldchild[c] : NULL, newchild[c], cb, depth + 2);
|
||||
free(vname);
|
||||
|
@ -5024,7 +5022,7 @@ get_namewidth(zpool_handle_t *zhp, int min_width, int flags, boolean_t verbose)
|
|||
if ((config = zpool_get_config(zhp, NULL)) != NULL) {
|
||||
verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
|
||||
&nvroot) == 0);
|
||||
unsigned int poolname_len = strlen(zpool_get_name(zhp));
|
||||
size_t poolname_len = strlen(zpool_get_name(zhp));
|
||||
if (verbose == B_FALSE) {
|
||||
width = MAX(poolname_len, min_width);
|
||||
} else {
|
||||
|
@ -5963,7 +5961,7 @@ print_header(list_cbdata_t *cb)
|
|||
}
|
||||
|
||||
if (!first)
|
||||
(void) printf(" ");
|
||||
(void) fputs(" ", stdout);
|
||||
else
|
||||
first = B_FALSE;
|
||||
|
||||
|
@ -5981,14 +5979,14 @@ print_header(list_cbdata_t *cb)
|
|||
}
|
||||
|
||||
if (pl->pl_next == NULL && !right_justify)
|
||||
(void) printf("%s", header);
|
||||
(void) fputs(header, stdout);
|
||||
else if (right_justify)
|
||||
(void) printf("%*s", (int)width, header);
|
||||
else
|
||||
(void) printf("%-*s", (int)width, header);
|
||||
}
|
||||
|
||||
(void) printf("\n");
|
||||
(void) fputc('\n', stdout);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -6018,9 +6016,9 @@ print_pool(zpool_handle_t *zhp, list_cbdata_t *cb)
|
|||
|
||||
if (!first) {
|
||||
if (cb->cb_scripted)
|
||||
(void) printf("\t");
|
||||
(void) fputc('\t', stdout);
|
||||
else
|
||||
(void) printf(" ");
|
||||
(void) fputs(" ", stdout);
|
||||
} else {
|
||||
first = B_FALSE;
|
||||
}
|
||||
|
@ -6050,14 +6048,14 @@ print_pool(zpool_handle_t *zhp, list_cbdata_t *cb)
|
|||
* format specifier.
|
||||
*/
|
||||
if (cb->cb_scripted || (pl->pl_next == NULL && !right_justify))
|
||||
(void) printf("%s", propstr);
|
||||
(void) fputs(propstr, stdout);
|
||||
else if (right_justify)
|
||||
(void) printf("%*s", (int)width, propstr);
|
||||
else
|
||||
(void) printf("%-*s", (int)width, propstr);
|
||||
}
|
||||
|
||||
(void) printf("\n");
|
||||
(void) fputc('\n', stdout);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -6130,8 +6128,8 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
|
|||
char *vname;
|
||||
boolean_t scripted = cb->cb_scripted;
|
||||
uint64_t islog = B_FALSE;
|
||||
char *dashes = "%-*s - - - - "
|
||||
"- - - - -\n";
|
||||
const char *dashes = "%-*s - - - - "
|
||||
"- - - - -\n";
|
||||
|
||||
verify(nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
|
||||
(uint64_t **)&vs, &c) == 0);
|
||||
|
@ -6193,7 +6191,7 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
|
|||
}
|
||||
print_one_column(ZPOOL_PROP_HEALTH, 0, state, scripted,
|
||||
B_TRUE, format);
|
||||
(void) printf("\n");
|
||||
(void) fputc('\n', stdout);
|
||||
}
|
||||
|
||||
if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
|
||||
|
@ -6216,13 +6214,13 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
|
|||
continue;
|
||||
|
||||
vname = zpool_vdev_name(g_zfs, zhp, child[c],
|
||||
cb->cb_name_flags);
|
||||
cb->cb_name_flags | VDEV_NAME_TYPE_ID);
|
||||
print_list_stats(zhp, vname, child[c], cb, depth + 2, B_FALSE);
|
||||
free(vname);
|
||||
}
|
||||
|
||||
/* list the classes: 'logs', 'dedup', and 'special' */
|
||||
for (uint_t n = 0; n < 3; n++) {
|
||||
for (uint_t n = 0; n < ARRAY_SIZE(class_name); n++) {
|
||||
boolean_t printed = B_FALSE;
|
||||
|
||||
for (c = 0; c < children; c++) {
|
||||
|
@ -6250,7 +6248,7 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
|
|||
printed = B_TRUE;
|
||||
}
|
||||
vname = zpool_vdev_name(g_zfs, zhp, child[c],
|
||||
cb->cb_name_flags);
|
||||
cb->cb_name_flags | VDEV_NAME_TYPE_ID);
|
||||
print_list_stats(zhp, vname, child[c], cb, depth + 2,
|
||||
B_FALSE);
|
||||
free(vname);
|
||||
|
@ -9214,7 +9212,7 @@ zpool_do_upgrade(int argc, char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
(void) printf(gettext("This system supports ZFS pool feature "
|
||||
(void) printf("%s", gettext("This system supports ZFS pool feature "
|
||||
"flags.\n\n"));
|
||||
if (showversions) {
|
||||
int i;
|
||||
|
|
|
@ -118,7 +118,7 @@ escape_string(const char *s)
|
|||
case '=':
|
||||
case '\\':
|
||||
*d++ = '\\';
|
||||
fallthrough;
|
||||
zfs_fallthrough;
|
||||
default:
|
||||
*d = *c;
|
||||
}
|
||||
|
@ -278,7 +278,7 @@ get_vdev_name(nvlist_t *nvroot, const char *parent_name)
|
|||
vdev_type);
|
||||
} else {
|
||||
(void) snprintf(vdev_name, sizeof (vdev_name),
|
||||
"%s/%s-%llu",
|
||||
"%.220s/%s-%llu",
|
||||
parent_name, vdev_type, (u_longlong_t)vdev_id);
|
||||
}
|
||||
return (vdev_name);
|
||||
|
@ -818,7 +818,7 @@ main(int argc, char *argv[])
|
|||
break;
|
||||
case 't':
|
||||
tagslen = strlen(optarg) + 2;
|
||||
tags = calloc(tagslen, 1);
|
||||
tags = calloc(1, tagslen);
|
||||
if (tags == NULL) {
|
||||
fprintf(stderr,
|
||||
"error: cannot allocate memory "
|
||||
|
|
|
@ -297,6 +297,7 @@ zstream_do_dump(int argc, char *argv[])
|
|||
|
||||
fletcher_4_init();
|
||||
while (read_hdr(drr, &zc)) {
|
||||
uint64_t featureflags = 0;
|
||||
|
||||
/*
|
||||
* If this is the first DMU record being processed, check for
|
||||
|
@ -362,6 +363,9 @@ zstream_do_dump(int argc, char *argv[])
|
|||
BSWAP_64(drrb->drr_fromguid);
|
||||
}
|
||||
|
||||
featureflags =
|
||||
DMU_GET_FEATUREFLAGS(drrb->drr_versioninfo);
|
||||
|
||||
(void) printf("BEGIN record\n");
|
||||
(void) printf("\thdrtype = %lld\n",
|
||||
DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo));
|
||||
|
@ -461,6 +465,15 @@ zstream_do_dump(int argc, char *argv[])
|
|||
BSWAP_64(drro->drr_maxblkid);
|
||||
}
|
||||
|
||||
if (featureflags & DMU_BACKUP_FEATURE_RAW &&
|
||||
drro->drr_bonuslen > drro->drr_raw_bonuslen) {
|
||||
(void) fprintf(stderr,
|
||||
"Warning: Object %llu has bonuslen = "
|
||||
"%u > raw_bonuslen = %u\n\n",
|
||||
(u_longlong_t)drro->drr_object,
|
||||
drro->drr_bonuslen, drro->drr_raw_bonuslen);
|
||||
}
|
||||
|
||||
payload_size = DRR_OBJECT_PAYLOAD_SIZE(drro);
|
||||
|
||||
if (verbose) {
|
||||
|
|
|
@ -558,7 +558,7 @@ enum ztest_object {
|
|||
ZTEST_OBJECTS
|
||||
};
|
||||
|
||||
static void usage(boolean_t) __NORETURN;
|
||||
static _Noreturn void usage(boolean_t);
|
||||
static int ztest_scrub_impl(spa_t *spa);
|
||||
|
||||
/*
|
||||
|
@ -622,7 +622,7 @@ static void sig_handler(int signo)
|
|||
|
||||
char *fatal_msg;
|
||||
|
||||
static __attribute__((noreturn)) __attribute__((format(printf, 2, 3))) void
|
||||
static __attribute__((format(printf, 2, 3))) _Noreturn void
|
||||
fatal(int do_perror, char *message, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
@ -631,6 +631,8 @@ fatal(int do_perror, char *message, ...)
|
|||
|
||||
(void) fflush(stdout);
|
||||
buf = umem_alloc(FATAL_MSG_SZ, UMEM_NOFAIL);
|
||||
if (buf == NULL)
|
||||
goto out;
|
||||
|
||||
va_start(args, message);
|
||||
(void) sprintf(buf, "ztest: ");
|
||||
|
@ -644,6 +646,7 @@ fatal(int do_perror, char *message, ...)
|
|||
(void) fprintf(stderr, "%s\n", buf);
|
||||
fatal_msg = buf; /* to ease debugging */
|
||||
|
||||
out:
|
||||
if (ztest_dump_core)
|
||||
abort();
|
||||
else
|
||||
|
@ -2383,6 +2386,7 @@ zil_replay_func_t *ztest_replay_vector[TX_MAX_TYPE] = {
|
|||
NULL, /* TX_MKDIR_ATTR */
|
||||
NULL, /* TX_MKDIR_ACL_ATTR */
|
||||
NULL, /* TX_WRITE2 */
|
||||
NULL, /* TX_SETSAXATTR */
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -4269,7 +4273,15 @@ ztest_objset_destroy_cb(const char *name, void *arg)
|
|||
* Destroy the dataset.
|
||||
*/
|
||||
if (strchr(name, '@') != NULL) {
|
||||
VERIFY0(dsl_destroy_snapshot(name, B_TRUE));
|
||||
error = dsl_destroy_snapshot(name, B_TRUE);
|
||||
if (error != ECHRNG) {
|
||||
/*
|
||||
* The program was executed, but encountered a runtime
|
||||
* error, such as insufficient slop, or a hold on the
|
||||
* dataset.
|
||||
*/
|
||||
ASSERT0(error);
|
||||
}
|
||||
} else {
|
||||
error = dsl_destroy_head(name);
|
||||
if (error == ENOSPC) {
|
||||
|
@ -6981,7 +6993,7 @@ ztest_resume(spa_t *spa)
|
|||
(void) zio_resume(spa);
|
||||
}
|
||||
|
||||
static void
|
||||
static _Noreturn void
|
||||
ztest_resume_thread(void *arg)
|
||||
{
|
||||
spa_t *spa = arg;
|
||||
|
@ -7007,7 +7019,7 @@ ztest_resume_thread(void *arg)
|
|||
thread_exit();
|
||||
}
|
||||
|
||||
static void
|
||||
static _Noreturn void
|
||||
ztest_deadman_thread(void *arg)
|
||||
{
|
||||
ztest_shared_t *zs = arg;
|
||||
|
@ -7085,7 +7097,7 @@ ztest_execute(int test, ztest_info_t *zi, uint64_t id)
|
|||
(double)functime / NANOSEC, zi->zi_funcname);
|
||||
}
|
||||
|
||||
static void
|
||||
static _Noreturn void
|
||||
ztest_thread(void *arg)
|
||||
{
|
||||
int rand;
|
||||
|
|
|
@ -35,6 +35,21 @@
|
|||
#include <sys/zfs_znode.h>
|
||||
#include <sys/fs/zfs.h>
|
||||
|
||||
#if defined(ZFS_ASAN_ENABLED)
|
||||
/*
|
||||
* zvol_id is invoked by udev with the help of ptrace()
|
||||
* making sanitized binary with leak detection croak
|
||||
* because of tracing mechanisms collision
|
||||
*/
|
||||
extern const char *__asan_default_options(void);
|
||||
|
||||
const char *__asan_default_options(void) {
|
||||
return ("abort_on_error=true:halt_on_error=true:"
|
||||
"allocator_may_return_null=true:disable_coredump=false:"
|
||||
"detect_stack_use_after_return=true:detect_leaks=false");
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
ioctl_get_msg(char *var, int fd)
|
||||
{
|
||||
|
|
|
@ -2,4 +2,3 @@ include $(top_srcdir)/config/Shellcheck.am
|
|||
|
||||
dist_bin_SCRIPTS = zvol_wait
|
||||
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
|
|
@ -12,9 +12,24 @@
|
|||
# a mechanism for suppressing harmless warnings.
|
||||
#
|
||||
|
||||
PHONY += checkabi storeabi
|
||||
PHONY += checkabi storeabi check_libabi_version allow_libabi_only_for_x86_64
|
||||
|
||||
checkabi:
|
||||
check_libabi_version:
|
||||
libabiversion=`abidw -v | $(SED) 's/[^0-9]//g'`; \
|
||||
if test $$libabiversion -lt "200"; then \
|
||||
/bin/echo -e "\n" \
|
||||
"*** Please use libabigail 2.0.0 version or newer;\n" \
|
||||
"*** otherwise results are not consistent!\n" \
|
||||
"(or see https://github.com/openzfs/libabigail-docker )\n"; \
|
||||
exit 1; \
|
||||
fi;
|
||||
|
||||
allow_libabi_only_for_x86_64:
|
||||
echo '*** ABI definitions provided apply only to x86_64 architecture'
|
||||
echo '*** Skipping `checkabi`/`storeabi` target and assuming success.'
|
||||
|
||||
if TARGET_CPU_X86_64
|
||||
checkabi: check_libabi_version
|
||||
for lib in $(lib_LTLIBRARIES) ; do \
|
||||
abidiff --no-unreferenced-symbols \
|
||||
--headers-dir1 ../../include \
|
||||
|
@ -22,7 +37,7 @@ checkabi:
|
|||
$${lib%.la}.abi .libs/$${lib%.la}.so ; \
|
||||
done
|
||||
|
||||
storeabi:
|
||||
storeabi: check_libabi_version
|
||||
cd .libs ; \
|
||||
for lib in $(lib_LTLIBRARIES) ; do \
|
||||
abidw --no-show-locs \
|
||||
|
@ -31,3 +46,7 @@ storeabi:
|
|||
--type-id-style hash \
|
||||
$${lib%.la}.so > ../$${lib%.la}.abi ; \
|
||||
done
|
||||
else
|
||||
checkabi: allow_libabi_only_for_x86_64
|
||||
storeabi: allow_libabi_only_for_x86_64
|
||||
endif
|
||||
|
|
|
@ -23,12 +23,13 @@ endif
|
|||
|
||||
AM_LIBTOOLFLAGS = --silent
|
||||
|
||||
AM_CFLAGS = -std=gnu99 -Wall -Wstrict-prototypes -Wmissing-prototypes
|
||||
AM_CFLAGS = -std=gnu99 -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes -Wno-sign-compare -Wno-missing-field-initializers
|
||||
AM_CFLAGS += -fno-strict-aliasing
|
||||
AM_CFLAGS += $(NO_OMIT_FRAME_POINTER)
|
||||
AM_CFLAGS += $(IMPLICIT_FALLTHROUGH)
|
||||
AM_CFLAGS += $(DEBUG_CFLAGS)
|
||||
AM_CFLAGS += $(ASAN_CFLAGS)
|
||||
AM_CFLAGS += $(UBSAN_CFLAGS)
|
||||
AM_CFLAGS += $(CODE_COVERAGE_CFLAGS) $(NO_FORMAT_ZERO_LENGTH)
|
||||
if BUILD_FREEBSD
|
||||
AM_CFLAGS += -fPIC -Werror -Wno-unknown-pragmas -Wno-enum-conversion
|
||||
|
@ -58,8 +59,17 @@ AM_CPPFLAGS += -D"__xpg_basename(...)=__xpg_basename(__VA_ARGS__) __attribute__(
|
|||
AM_CPPFLAGS += -D"basename(...)=basename(__VA_ARGS__) __attribute__((deprecated(\"basename(3) is underspecified. Use zfs_basename() instead!\")))"
|
||||
AM_CPPFLAGS += -D"dirname(...)=dirname(__VA_ARGS__) __attribute__((deprecated(\"dirname(3) is underspecified. Use zfs_dirnamelen() instead!\")))"
|
||||
|
||||
if ASAN_ENABLED
|
||||
AM_CPPFLAGS += -DZFS_ASAN_ENABLED
|
||||
endif
|
||||
|
||||
if UBSAN_ENABLED
|
||||
AM_CPPFLAGS += -DZFS_UBSAN_ENABLED
|
||||
endif
|
||||
|
||||
AM_LDFLAGS = $(DEBUG_LDFLAGS)
|
||||
AM_LDFLAGS += $(ASAN_LDFLAGS)
|
||||
AM_LDFLAGS += $(UBSAN_LDFLAGS)
|
||||
|
||||
if BUILD_FREEBSD
|
||||
AM_LDFLAGS += -fstack-protector-strong -shared
|
||||
|
|
|
@ -1,7 +1,15 @@
|
|||
.PHONY: shellcheck
|
||||
shellcheck: $(SCRIPTS) $(SHELLCHECKSCRIPTS)
|
||||
|
||||
# ShellCheck exclusions
|
||||
#
|
||||
# ShellCheck can't follow non-constant source. Use a directive to specify location. [SC1090]
|
||||
# Not following: a was not specified as input (see shellcheck -x). [SC1091]
|
||||
# Prefer putting braces around variable references even when not strictly required. [SC2250]
|
||||
# In POSIX sh, 'local' is undefined. [SC2039] # older ShellCheck versions
|
||||
# In POSIX sh, 'local' is undefined. [SC3043] # newer ShellCheck versions
|
||||
if HAVE_SHELLCHECK
|
||||
[ -z "$(SCRIPTS)$(SHELLCHECKSCRIPTS)" ] && exit; shellcheck --format=gcc --exclude=SC1090,SC1091,SC2250 $$([ -n "$(SHELLCHECK_SHELL)" ] && echo "--shell=$(SHELLCHECK_SHELL)") $(SHELLCHECK_OPTS) $(SCRIPTS) $(SHELLCHECKSCRIPTS)
|
||||
[ -z "$(SCRIPTS)$(SHELLCHECKSCRIPTS)" ] && exit; shellcheck --format=gcc --enable=all --exclude=SC1090,SC1091,SC2039,SC2250,SC3043 $$([ -n "$(SHELLCHECK_SHELL)" ] && echo "--shell=$(SHELLCHECK_SHELL)") $(SHELLCHECK_OPTS) $(SCRIPTS) $(SHELLCHECKSCRIPTS)
|
||||
else
|
||||
@[ -z "$(SCRIPTS)$(SHELLCHECKSCRIPTS)" ] && exit; echo "skipping shellcheck of" $(SCRIPTS) $(SHELLCHECKSCRIPTS) "because shellcheck is not installed"
|
||||
endif
|
||||
|
|
|
@ -17,7 +17,9 @@ subst_sed_cmd = \
|
|||
-e 's|@DEFAULT_INIT_NFS_SERVER[@]|$(DEFAULT_INIT_NFS_SERVER)|g' \
|
||||
-e 's|@DEFAULT_INIT_SHELL[@]|$(DEFAULT_INIT_SHELL)|g' \
|
||||
-e 's|@LIBFETCH_DYNAMIC[@]|$(LIBFETCH_DYNAMIC)|g' \
|
||||
-e 's|@LIBFETCH_SONAME[@]|$(LIBFETCH_SONAME)|g'
|
||||
-e 's|@LIBFETCH_SONAME[@]|$(LIBFETCH_SONAME)|g' \
|
||||
-e 's|@ASAN_ENABLED[@]|$(ASAN_ENABLED)|g' \
|
||||
-e 's|@UBSAN_ENABLED[@]|$(UBSAN_ENABLED)|g'
|
||||
|
||||
SUBSTFILES =
|
||||
CLEANFILES = $(SUBSTFILES)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
dnl #
|
||||
dnl # Enabled -fsanitize=address if supported by gcc.
|
||||
dnl # Enabled -fsanitize=address if supported by $CC.
|
||||
dnl #
|
||||
dnl # LDFLAGS needs -fsanitize=address at all times so libraries compiled with
|
||||
dnl # it will be linked successfully. CFLAGS will vary by binary being built.
|
||||
|
@ -46,7 +46,54 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_ASAN], [
|
|||
])
|
||||
|
||||
dnl #
|
||||
dnl # Check if gcc supports -Wframe-larger-than=<size> option.
|
||||
dnl # Enabled -fsanitize=undefined if supported by cc.
|
||||
dnl #
|
||||
dnl # LDFLAGS needs -fsanitize=undefined at all times so libraries compiled with
|
||||
dnl # it will be linked successfully. CFLAGS will vary by binary being built.
|
||||
dnl #
|
||||
dnl # The UBSAN_OPTIONS environment variable can be used to further control
|
||||
dnl # the behavior of binaries and libraries build with -fsanitize=undefined.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_UBSAN], [
|
||||
AC_MSG_CHECKING([whether to build with -fsanitize=undefined support])
|
||||
AC_ARG_ENABLE([ubsan],
|
||||
[AS_HELP_STRING([--enable-ubsan],
|
||||
[Enable -fsanitize=undefined support @<:@default=no@:>@])],
|
||||
[],
|
||||
[enable_ubsan=no])
|
||||
|
||||
AM_CONDITIONAL([UBSAN_ENABLED], [test x$enable_ubsan = xyes])
|
||||
AC_SUBST([UBSAN_ENABLED], [$enable_ubsan])
|
||||
AC_MSG_RESULT($enable_ubsan)
|
||||
|
||||
AS_IF([ test "$enable_ubsan" = "yes" ], [
|
||||
AC_MSG_CHECKING([whether $CC supports -fsanitize=undefined])
|
||||
saved_cflags="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Werror -fsanitize=undefined"
|
||||
AC_LINK_IFELSE([
|
||||
AC_LANG_SOURCE([[ int main() { return 0; } ]])
|
||||
], [
|
||||
UBSAN_CFLAGS="-fsanitize=undefined"
|
||||
UBSAN_LDFLAGS="-fsanitize=undefined"
|
||||
UBSAN_ZFS="_with_ubsan"
|
||||
AC_MSG_RESULT([yes])
|
||||
], [
|
||||
AC_MSG_ERROR([$CC does not support -fsanitize=undefined])
|
||||
])
|
||||
CFLAGS="$saved_cflags"
|
||||
], [
|
||||
UBSAN_CFLAGS=""
|
||||
UBSAN_LDFLAGS=""
|
||||
UBSAN_ZFS="_without_ubsan"
|
||||
])
|
||||
|
||||
AC_SUBST([UBSAN_CFLAGS])
|
||||
AC_SUBST([UBSAN_LDFLAGS])
|
||||
AC_SUBST([UBSAN_ZFS])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # Check if cc supports -Wframe-larger-than=<size> option.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN], [
|
||||
AC_MSG_CHECKING([whether $CC supports -Wframe-larger-than=<size>])
|
||||
|
@ -67,7 +114,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN], [
|
|||
])
|
||||
|
||||
dnl #
|
||||
dnl # Check if gcc supports -Wno-format-truncation option.
|
||||
dnl # Check if cc supports -Wno-format-truncation option.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION], [
|
||||
AC_MSG_CHECKING([whether $CC supports -Wno-format-truncation])
|
||||
|
@ -88,7 +135,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION], [
|
|||
])
|
||||
|
||||
dnl #
|
||||
dnl # Check if gcc supports -Wno-format-truncation option.
|
||||
dnl # Check if cc supports -Wno-format-zero-length option.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH], [
|
||||
AC_MSG_CHECKING([whether $CC supports -Wno-format-zero-length])
|
||||
|
@ -108,61 +155,34 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH], [
|
|||
AC_SUBST([NO_FORMAT_ZERO_LENGTH])
|
||||
])
|
||||
|
||||
|
||||
dnl #
|
||||
dnl # Check if gcc supports -Wno-bool-compare option.
|
||||
dnl # Check if cc supports -Wno-clobbered option.
|
||||
dnl #
|
||||
dnl # We actually invoke gcc with the -Wbool-compare option
|
||||
dnl # We actually invoke it with the -Wclobbered option
|
||||
dnl # and infer the 'no-' version does or doesn't exist based upon
|
||||
dnl # the results. This is required because when checking any of
|
||||
dnl # no- prefixed options gcc always returns success.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_BOOL_COMPARE], [
|
||||
AC_MSG_CHECKING([whether $CC supports -Wno-bool-compare])
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_CLOBBERED], [
|
||||
AC_MSG_CHECKING([whether $CC supports -Wno-clobbered])
|
||||
|
||||
saved_flags="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Werror -Wbool-compare"
|
||||
CFLAGS="$CFLAGS -Werror -Wclobbered"
|
||||
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
|
||||
NO_BOOL_COMPARE=-Wno-bool-compare
|
||||
NO_CLOBBERED=-Wno-clobbered
|
||||
AC_MSG_RESULT([yes])
|
||||
], [
|
||||
NO_BOOL_COMPARE=
|
||||
NO_CLOBBERED=
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
|
||||
CFLAGS="$saved_flags"
|
||||
AC_SUBST([NO_BOOL_COMPARE])
|
||||
AC_SUBST([NO_CLOBBERED])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # Check if gcc supports -Wno-unused-but-set-variable option.
|
||||
dnl #
|
||||
dnl # We actually invoke gcc with the -Wunused-but-set-variable option
|
||||
dnl # and infer the 'no-' version does or doesn't exist based upon
|
||||
dnl # the results. This is required because when checking any of
|
||||
dnl # no- prefixed options gcc always returns success.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_UNUSED_BUT_SET_VARIABLE], [
|
||||
AC_MSG_CHECKING([whether $CC supports -Wno-unused-but-set-variable])
|
||||
|
||||
saved_flags="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Werror -Wunused-but-set-variable"
|
||||
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
|
||||
NO_UNUSED_BUT_SET_VARIABLE=-Wno-unused-but-set-variable
|
||||
AC_MSG_RESULT([yes])
|
||||
], [
|
||||
NO_UNUSED_BUT_SET_VARIABLE=
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
|
||||
CFLAGS="$saved_flags"
|
||||
AC_SUBST([NO_UNUSED_BUT_SET_VARIABLE])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # Check if gcc supports -Wimplicit-fallthrough option.
|
||||
dnl # Check if cc supports -Wimplicit-fallthrough option.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH], [
|
||||
AC_MSG_CHECKING([whether $CC supports -Wimplicit-fallthrough])
|
||||
|
@ -185,7 +205,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH], [
|
|||
])
|
||||
|
||||
dnl #
|
||||
dnl # Check if gcc supports -fno-omit-frame-pointer option.
|
||||
dnl # Check if cc supports -fno-omit-frame-pointer option.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER], [
|
||||
AC_MSG_CHECKING([whether $CC supports -fno-omit-frame-pointer])
|
||||
|
|
26
sys/contrib/openzfs/config/kernel-add-disk.m4
Normal file
26
sys/contrib/openzfs/config/kernel-add-disk.m4
Normal file
|
@ -0,0 +1,26 @@
|
|||
dnl #
|
||||
dnl # 5.16 API change
|
||||
dnl # add_disk grew a must-check return code
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_ADD_DISK], [
|
||||
|
||||
ZFS_LINUX_TEST_SRC([add_disk_ret], [
|
||||
#include <linux/genhd.h>
|
||||
], [
|
||||
struct gendisk *disk = NULL;
|
||||
int err = add_disk(disk);
|
||||
err = err;
|
||||
])
|
||||
|
||||
])
|
||||
AC_DEFUN([ZFS_AC_KERNEL_ADD_DISK], [
|
||||
AC_MSG_CHECKING([whether add_disk() returns int])
|
||||
ZFS_LINUX_TEST_RESULT([add_disk_ret],
|
||||
[
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_ADD_DISK_RET, 1,
|
||||
[add_disk() returns int])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
])
|
|
@ -215,17 +215,17 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_FLUSH], [
|
|||
ZFS_LINUX_TEST_SRC([blk_queue_flush], [
|
||||
#include <linux/blkdev.h>
|
||||
], [
|
||||
struct request_queue *q = NULL;
|
||||
struct request_queue *q __attribute__ ((unused)) = NULL;
|
||||
(void) blk_queue_flush(q, REQ_FLUSH);
|
||||
], [$NO_UNUSED_BUT_SET_VARIABLE], [ZFS_META_LICENSE])
|
||||
], [], [ZFS_META_LICENSE])
|
||||
|
||||
ZFS_LINUX_TEST_SRC([blk_queue_write_cache], [
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/blkdev.h>
|
||||
], [
|
||||
struct request_queue *q = NULL;
|
||||
struct request_queue *q __attribute__ ((unused)) = NULL;
|
||||
blk_queue_write_cache(q, true, true);
|
||||
], [$NO_UNUSED_BUT_SET_VARIABLE], [ZFS_META_LICENSE])
|
||||
], [], [ZFS_META_LICENSE])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_FLUSH], [
|
||||
|
@ -278,9 +278,9 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_MAX_HW_SECTORS], [
|
|||
ZFS_LINUX_TEST_SRC([blk_queue_max_hw_sectors], [
|
||||
#include <linux/blkdev.h>
|
||||
], [
|
||||
struct request_queue *q = NULL;
|
||||
struct request_queue *q __attribute__ ((unused)) = NULL;
|
||||
(void) blk_queue_max_hw_sectors(q, BLK_SAFE_MAX_SECTORS);
|
||||
], [$NO_UNUSED_BUT_SET_VARIABLE])
|
||||
], [])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_MAX_HW_SECTORS], [
|
||||
|
@ -301,9 +301,9 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_MAX_SEGMENTS], [
|
|||
ZFS_LINUX_TEST_SRC([blk_queue_max_segments], [
|
||||
#include <linux/blkdev.h>
|
||||
], [
|
||||
struct request_queue *q = NULL;
|
||||
struct request_queue *q __attribute__ ((unused)) = NULL;
|
||||
(void) blk_queue_max_segments(q, BLK_MAX_SEGMENTS);
|
||||
], [$NO_UNUSED_BUT_SET_VARIABLE])
|
||||
], [])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_MAX_SEGMENTS], [
|
||||
|
|
|
@ -6,13 +6,16 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_CHECK_EVENTS], [
|
|||
#include <linux/blkdev.h>
|
||||
|
||||
unsigned int blk_check_events(struct gendisk *disk,
|
||||
unsigned int clearing) { return (0); }
|
||||
unsigned int clearing) {
|
||||
(void) disk, (void) clearing;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static const struct block_device_operations
|
||||
bops __attribute__ ((unused)) = {
|
||||
.check_events = blk_check_events,
|
||||
};
|
||||
], [], [$NO_UNUSED_BUT_SET_VARIABLE])
|
||||
], [], [])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_CHECK_EVENTS], [
|
||||
|
@ -31,7 +34,10 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID], [
|
|||
ZFS_LINUX_TEST_SRC([block_device_operations_release_void], [
|
||||
#include <linux/blkdev.h>
|
||||
|
||||
void blk_release(struct gendisk *g, fmode_t mode) { return; }
|
||||
void blk_release(struct gendisk *g, fmode_t mode) {
|
||||
(void) g, (void) mode;
|
||||
return;
|
||||
}
|
||||
|
||||
static const struct block_device_operations
|
||||
bops __attribute__ ((unused)) = {
|
||||
|
@ -40,7 +46,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID], [
|
|||
.ioctl = NULL,
|
||||
.compat_ioctl = NULL,
|
||||
};
|
||||
], [], [$NO_UNUSED_BUT_SET_VARIABLE])
|
||||
], [], [])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID], [
|
||||
|
@ -61,6 +67,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK], [
|
|||
#include <linux/blkdev.h>
|
||||
|
||||
int blk_revalidate_disk(struct gendisk *disk) {
|
||||
(void) disk;
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
@ -68,7 +75,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK], [
|
|||
bops __attribute__ ((unused)) = {
|
||||
.revalidate_disk = blk_revalidate_disk,
|
||||
};
|
||||
], [], [$NO_UNUSED_BUT_SET_VARIABLE])
|
||||
], [], [])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK], [
|
||||
|
|
|
@ -3,6 +3,10 @@ dnl # Linux 2.6.38 - 3.x API
|
|||
dnl # The fallocate callback was moved from the inode_operations
|
||||
dnl # structure to the file_operations structure.
|
||||
dnl #
|
||||
dnl #
|
||||
dnl # Linux 3.15+
|
||||
dnl # fallocate learned a new flag, FALLOC_FL_ZERO_RANGE
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_FALLOCATE], [
|
||||
ZFS_LINUX_TEST_SRC([file_fallocate], [
|
||||
#include <linux/fs.h>
|
||||
|
@ -15,12 +19,25 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FALLOCATE], [
|
|||
.fallocate = test_fallocate,
|
||||
};
|
||||
], [])
|
||||
ZFS_LINUX_TEST_SRC([falloc_fl_zero_range], [
|
||||
#include <linux/falloc.h>
|
||||
],[
|
||||
int flags __attribute__ ((unused));
|
||||
flags = FALLOC_FL_ZERO_RANGE;
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_FALLOCATE], [
|
||||
AC_MSG_CHECKING([whether fops->fallocate() exists])
|
||||
ZFS_LINUX_TEST_RESULT([file_fallocate], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_MSG_CHECKING([whether FALLOC_FL_ZERO_RANGE exists])
|
||||
ZFS_LINUX_TEST_RESULT([falloc_fl_zero_range], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_FALLOC_FL_ZERO_RANGE, 1, [FALLOC_FL_ZERO_RANGE is defined])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
],[
|
||||
ZFS_LINUX_TEST_ERROR([file_fallocate])
|
||||
])
|
||||
|
|
|
@ -3,7 +3,13 @@ dnl # Handle differences in kernel FPU code.
|
|||
dnl #
|
||||
dnl # Kernel
|
||||
dnl # 5.16: XCR code put into asm/fpu/xcr.h
|
||||
dnl # HAVE_KERNEL_FPU_XCR_HEADER
|
||||
dnl # HAVE_KERNEL_FPU_XCR_HEADER
|
||||
dnl #
|
||||
dnl # XSTATE_XSAVE and XSTATE_XRESTORE aren't accessible any more
|
||||
dnl # HAVE_KERNEL_FPU_XSAVE_INTERNAL
|
||||
dnl #
|
||||
dnl # 5.11: kernel_fpu_begin() is an inlined function now, so don't check
|
||||
dnl # for it inside the kernel symbols.
|
||||
dnl #
|
||||
dnl # 5.0: Wrappers have been introduced to save/restore the FPU state.
|
||||
dnl # This change was made to the 4.19.38 and 4.14.120 LTS kernels.
|
||||
|
@ -107,6 +113,36 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [
|
|||
struct fxregs_state *fxr __attribute__ ((unused)) = &st->fxsave;
|
||||
struct xregs_state *xr __attribute__ ((unused)) = &st->xsave;
|
||||
])
|
||||
|
||||
ZFS_LINUX_TEST_SRC([fpu_xsave_internal], [
|
||||
#include <linux/sched.h>
|
||||
#if defined(__x86_64) || defined(__x86_64__) || \
|
||||
defined(__i386) || defined(__i386__)
|
||||
#if !defined(__x86)
|
||||
#define __x86
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(__x86)
|
||||
#error Unsupported architecture
|
||||
#endif
|
||||
|
||||
#include <linux/types.h>
|
||||
#ifdef HAVE_KERNEL_FPU_API_HEADER
|
||||
#include <asm/fpu/api.h>
|
||||
#include <asm/fpu/internal.h>
|
||||
#else
|
||||
#include <asm/i387.h>
|
||||
#include <asm/xcr.h>
|
||||
#endif
|
||||
|
||||
],[
|
||||
struct fpu *fpu = ¤t->thread.fpu;
|
||||
union fpregs_state *st = &fpu->fpstate->regs;
|
||||
struct fregs_state *fr __attribute__ ((unused)) = &st->fsave;
|
||||
struct fxregs_state *fxr __attribute__ ((unused)) = &st->fxsave;
|
||||
struct xregs_state *xr __attribute__ ((unused)) = &st->xsave;
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_FPU], [
|
||||
|
@ -114,8 +150,7 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
|
|||
dnl # Legacy kernel
|
||||
dnl #
|
||||
AC_MSG_CHECKING([whether kernel fpu is available])
|
||||
ZFS_LINUX_TEST_RESULT_SYMBOL([kernel_fpu_license],
|
||||
[kernel_fpu_begin], [arch/x86/kernel/fpu/core.c], [
|
||||
ZFS_LINUX_TEST_RESULT([kernel_fpu_license], [
|
||||
AC_MSG_RESULT(kernel_fpu_*)
|
||||
AC_DEFINE(HAVE_KERNEL_FPU, 1,
|
||||
[kernel has kernel_fpu_* functions])
|
||||
|
@ -139,7 +174,13 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
|
|||
AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1,
|
||||
[kernel fpu internal])
|
||||
],[
|
||||
ZFS_LINUX_TEST_RESULT([fpu_xsave_internal], [
|
||||
AC_MSG_RESULT(internal with internal XSAVE)
|
||||
AC_DEFINE(HAVE_KERNEL_FPU_XSAVE_INTERNAL, 1,
|
||||
[kernel fpu and XSAVE internal])
|
||||
],[
|
||||
AC_MSG_RESULT(unavailable)
|
||||
])
|
||||
])
|
||||
])
|
||||
])
|
||||
|
|
|
@ -5,9 +5,9 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_GET_DISK_RO], [
|
|||
ZFS_LINUX_TEST_SRC([get_disk_ro], [
|
||||
#include <linux/blkdev.h>
|
||||
],[
|
||||
struct gendisk *disk = NULL;
|
||||
struct gendisk *disk __attribute__ ((unused)) = NULL;
|
||||
(void) get_disk_ro(disk);
|
||||
], [$NO_UNUSED_BUT_SET_VARIABLE])
|
||||
], [])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_GET_DISK_RO], [
|
||||
|
|
|
@ -64,6 +64,7 @@ dnl #
|
|||
AC_DEFUN([ZFS_AC_KERNEL_SRC_KVMALLOC], [
|
||||
ZFS_LINUX_TEST_SRC([kvmalloc], [
|
||||
#include <linux/mm.h>
|
||||
#include <linux/slab.h>
|
||||
],[
|
||||
void *p __attribute__ ((unused));
|
||||
|
||||
|
|
68
sys/contrib/openzfs/config/kernel-kthread.m4
Normal file
68
sys/contrib/openzfs/config/kernel-kthread.m4
Normal file
|
@ -0,0 +1,68 @@
|
|||
AC_DEFUN([ZFS_AC_KERNEL_KTHREAD_COMPLETE_AND_EXIT], [
|
||||
dnl #
|
||||
dnl # 5.17 API,
|
||||
dnl # cead18552660702a4a46f58e65188fe5f36e9dfe ("exit: Rename complete_and_exit to kthread_complete_and_exit")
|
||||
dnl #
|
||||
dnl # Also moves the definition from include/linux/kernel.h to include/linux/kthread.h
|
||||
dnl #
|
||||
AC_MSG_CHECKING([whether kthread_complete_and_exit() is available])
|
||||
ZFS_LINUX_TEST_RESULT([kthread_complete_and_exit], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(SPL_KTHREAD_COMPLETE_AND_EXIT, kthread_complete_and_exit, [kthread_complete_and_exit() available])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
AC_DEFINE(SPL_KTHREAD_COMPLETE_AND_EXIT, complete_and_exit, [using complete_and_exit() instead])
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_KTHREAD_DEQUEUE_SIGNAL_4ARG], [
|
||||
dnl #
|
||||
dnl # 5.17 API: enum pid_type * as new 4th dequeue_signal() argument,
|
||||
dnl # 5768d8906bc23d512b1a736c1e198aa833a6daa4 ("signal: Requeue signals in the appropriate queue")
|
||||
dnl #
|
||||
dnl # int dequeue_signal(struct task_struct *task, sigset_t *mask, kernel_siginfo_t *info);
|
||||
dnl # int dequeue_signal(struct task_struct *task, sigset_t *mask, kernel_siginfo_t *info, enum pid_type *type);
|
||||
dnl #
|
||||
AC_MSG_CHECKING([whether dequeue_signal() takes 4 arguments])
|
||||
ZFS_LINUX_TEST_RESULT([kthread_dequeue_signal], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_DEQUEUE_SIGNAL_4ARG, 1, [dequeue_signal() takes 4 arguments])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_KTHREAD_COMPLETE_AND_EXIT], [
|
||||
ZFS_LINUX_TEST_SRC([kthread_complete_and_exit], [
|
||||
#include <linux/kthread.h>
|
||||
], [
|
||||
struct completion *completion = NULL;
|
||||
long code = 0;
|
||||
|
||||
kthread_complete_and_exit(completion, code);
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_KTHREAD_DEQUEUE_SIGNAL_4ARG], [
|
||||
ZFS_LINUX_TEST_SRC([kthread_dequeue_signal], [
|
||||
#include <linux/sched/signal.h>
|
||||
], [
|
||||
struct task_struct *task = NULL;
|
||||
sigset_t *mask = NULL;
|
||||
kernel_siginfo_t *info = NULL;
|
||||
enum pid_type *type = NULL;
|
||||
int error __attribute__ ((unused));
|
||||
|
||||
error = dequeue_signal(task, mask, info, type);
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_KTHREAD], [
|
||||
ZFS_AC_KERNEL_KTHREAD_COMPLETE_AND_EXIT
|
||||
ZFS_AC_KERNEL_KTHREAD_DEQUEUE_SIGNAL_4ARG
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_KTHREAD], [
|
||||
ZFS_AC_KERNEL_SRC_KTHREAD_COMPLETE_AND_EXIT
|
||||
ZFS_AC_KERNEL_SRC_KTHREAD_DEQUEUE_SIGNAL_4ARG
|
||||
])
|
|
@ -1,20 +1,22 @@
|
|||
dnl #
|
||||
dnl # 3.10 API change,
|
||||
dnl # PDE is replaced by PDE_DATA
|
||||
dnl # 5.17 API: PDE_DATA() renamed to pde_data(),
|
||||
dnl # 359745d78351c6f5442435f81549f0207ece28aa ("proc: remove PDE_DATA() completely")
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_PDE_DATA], [
|
||||
ZFS_LINUX_TEST_SRC([pde_data], [
|
||||
#include <linux/proc_fs.h>
|
||||
], [
|
||||
PDE_DATA(NULL);
|
||||
pde_data(NULL);
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_PDE_DATA], [
|
||||
AC_MSG_CHECKING([whether PDE_DATA() is available])
|
||||
ZFS_LINUX_TEST_RESULT_SYMBOL([pde_data], [PDE_DATA], [], [
|
||||
AC_MSG_CHECKING([whether pde_data() is lowercase])
|
||||
ZFS_LINUX_TEST_RESULT([pde_data], [
|
||||
AC_MSG_RESULT(yes)
|
||||
],[
|
||||
ZFS_LINUX_TEST_ERROR([PDE_DATA])
|
||||
AC_DEFINE(SPL_PDE_DATA, pde_data, [pde_data() is pde_data()])
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
AC_DEFINE(SPL_PDE_DATA, PDE_DATA, [pde_data() is PDE_DATA()])
|
||||
])
|
||||
])
|
||||
|
|
|
@ -41,6 +41,17 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_IOV_ITER], [
|
|||
error = iov_iter_fault_in_readable(&iter, size);
|
||||
])
|
||||
|
||||
ZFS_LINUX_TEST_SRC([fault_in_iov_iter_readable], [
|
||||
#include <linux/fs.h>
|
||||
#include <linux/uio.h>
|
||||
],[
|
||||
struct iov_iter iter = { 0 };
|
||||
size_t size = 512;
|
||||
int error __attribute__ ((unused));
|
||||
|
||||
error = fault_in_iov_iter_readable(&iter, size);
|
||||
])
|
||||
|
||||
ZFS_LINUX_TEST_SRC([iov_iter_count], [
|
||||
#include <linux/fs.h>
|
||||
#include <linux/uio.h>
|
||||
|
@ -123,8 +134,15 @@ AC_DEFUN([ZFS_AC_KERNEL_VFS_IOV_ITER], [
|
|||
AC_DEFINE(HAVE_IOV_ITER_FAULT_IN_READABLE, 1,
|
||||
[iov_iter_fault_in_readable() is available])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
enable_vfs_iov_iter="no"
|
||||
AC_MSG_CHECKING([whether fault_in_iov_iter_readable() is available])
|
||||
ZFS_LINUX_TEST_RESULT([fault_in_iov_iter_readable], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(HAVE_FAULT_IN_IOV_ITER_READABLE, 1,
|
||||
[fault_in_iov_iter_readable() is available])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
enable_vfs_iov_iter="no"
|
||||
])
|
||||
])
|
||||
|
||||
AC_MSG_CHECKING([whether iov_iter_count() is available])
|
||||
|
|
|
@ -135,6 +135,8 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
|||
ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||
ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG
|
||||
ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT
|
||||
ZFS_AC_KERNEL_SRC_ADD_DISK
|
||||
ZFS_AC_KERNEL_SRC_KTHREAD
|
||||
|
||||
AC_MSG_CHECKING([for available kernel interfaces])
|
||||
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
|
||||
|
@ -243,6 +245,8 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
|||
ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||
ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG
|
||||
ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT
|
||||
ZFS_AC_KERNEL_ADD_DISK
|
||||
ZFS_AC_KERNEL_KTHREAD
|
||||
])
|
||||
|
||||
dnl #
|
||||
|
@ -276,6 +280,35 @@ AC_DEFUN([ZFS_AC_MODULE_SYMVERS], [
|
|||
dnl #
|
||||
dnl # Detect the kernel to be built against
|
||||
dnl #
|
||||
dnl # Most modern Linux distributions have separate locations for bare
|
||||
dnl # source (source) and prebuilt (build) files. Additionally, there are
|
||||
dnl # `source` and `build` symlinks in `/lib/modules/$(KERNEL_VERSION)`
|
||||
dnl # pointing to them. The directory search order is now:
|
||||
dnl #
|
||||
dnl # - `configure` command line values if both `--with-linux` and
|
||||
dnl # `--with-linux-obj` were defined
|
||||
dnl #
|
||||
dnl # - If only `--with-linux` was defined, `--with-linux-obj` is assumed
|
||||
dnl # to have the same value as `--with-linux`
|
||||
dnl #
|
||||
dnl # - If neither `--with-linux` nor `--with-linux-obj` were defined
|
||||
dnl # autodetection is used:
|
||||
dnl #
|
||||
dnl # - `/lib/modules/$(uname -r)/{source,build}` respectively, if exist.
|
||||
dnl #
|
||||
dnl # - If only `/lib/modules/$(uname -r)/build` exists, it is assumed
|
||||
dnl # to be both source and build directory.
|
||||
dnl #
|
||||
dnl # - The first directory in `/lib/modules` with the highest version
|
||||
dnl # number according to `sort -V` which contains both `source` and
|
||||
dnl # `build` symlinks/directories. If module directory contains only
|
||||
dnl # `build` component, it is assumed to be both source and build
|
||||
dnl # directory.
|
||||
dnl #
|
||||
dnl # - Last resort: the first directory matching `/usr/src/kernels/*`
|
||||
dnl # and `/usr/src/linux-*` with the highest version number according
|
||||
dnl # to `sort -V` is assumed to be both source and build directory.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL], [
|
||||
AC_ARG_WITH([linux],
|
||||
AS_HELP_STRING([--with-linux=PATH],
|
||||
|
@ -287,25 +320,52 @@ AC_DEFUN([ZFS_AC_KERNEL], [
|
|||
[Path to kernel build objects]),
|
||||
[kernelbuild="$withval"])
|
||||
|
||||
AC_MSG_CHECKING([kernel source directory])
|
||||
AS_IF([test -z "$kernelsrc"], [
|
||||
AS_IF([test -e "/lib/modules/$(uname -r)/source"], [
|
||||
headersdir="/lib/modules/$(uname -r)/source"
|
||||
sourcelink=$(readlink -f "$headersdir")
|
||||
AC_MSG_CHECKING([kernel source and build directories])
|
||||
AS_IF([test -n "$kernelsrc" && test -z "$kernelbuild"], [
|
||||
kernelbuild="$kernelsrc"
|
||||
], [test -z "$kernelsrc"], [
|
||||
AS_IF([test -e "/lib/modules/$(uname -r)/source" && \
|
||||
test -e "/lib/modules/$(uname -r)/build"], [
|
||||
src="/lib/modules/$(uname -r)/source"
|
||||
build="/lib/modules/$(uname -r)/build"
|
||||
], [test -e "/lib/modules/$(uname -r)/build"], [
|
||||
headersdir="/lib/modules/$(uname -r)/build"
|
||||
sourcelink=$(readlink -f "$headersdir")
|
||||
build="/lib/modules/$(uname -r)/build"
|
||||
src="$build"
|
||||
], [
|
||||
sourcelink=$(ls -1d /usr/src/kernels/* \
|
||||
/usr/src/linux-* \
|
||||
2>/dev/null | grep -v obj | tail -1)
|
||||
src=
|
||||
|
||||
for d in $(ls -1d /lib/modules/* 2>/dev/null | sort -Vr); do
|
||||
if test -e "$d/source" && test -e "$d/build"; then
|
||||
src="$d/source"
|
||||
build="$d/build"
|
||||
break
|
||||
fi
|
||||
|
||||
if test -e "$d/build"; then
|
||||
src="$d/build"
|
||||
build="$d/build"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# the least reliable method
|
||||
if test -z "$src"; then
|
||||
src=$(ls -1d /usr/src/kernels/* /usr/src/linux-* \
|
||||
2>/dev/null | grep -v obj | sort -Vr | head -1)
|
||||
build="$src"
|
||||
fi
|
||||
])
|
||||
|
||||
AS_IF([test -n "$sourcelink" && test -e ${sourcelink}], [
|
||||
kernelsrc=`readlink -f ${sourcelink}`
|
||||
AS_IF([test -n "$src" && test -e "$src"], [
|
||||
kernelsrc=$(readlink -e "$src")
|
||||
], [
|
||||
kernelsrc="[Not found]"
|
||||
])
|
||||
AS_IF([test -n "$build" && test -e "$build"], [
|
||||
kernelbuild=$(readlink -e "$build")
|
||||
], [
|
||||
kernelbuild="[Not found]"
|
||||
])
|
||||
], [
|
||||
AS_IF([test "$kernelsrc" = "NONE"], [
|
||||
kernsrcver=NONE
|
||||
|
@ -313,30 +373,19 @@ AC_DEFUN([ZFS_AC_KERNEL], [
|
|||
withlinux=yes
|
||||
])
|
||||
|
||||
AC_MSG_RESULT([done])
|
||||
AC_MSG_CHECKING([kernel source directory])
|
||||
AC_MSG_RESULT([$kernelsrc])
|
||||
AS_IF([test ! -d "$kernelsrc"], [
|
||||
AC_MSG_CHECKING([kernel build directory])
|
||||
AC_MSG_RESULT([$kernelbuild])
|
||||
AS_IF([test ! -d "$kernelsrc" || test ! -d "$kernelbuild"], [
|
||||
AC_MSG_ERROR([
|
||||
*** Please make sure the kernel devel package for your distribution
|
||||
*** is installed and then try again. If that fails, you can specify the
|
||||
*** location of the kernel source with the '--with-linux=PATH' option.])
|
||||
*** location of the kernel source and build with the '--with-linux=PATH' and
|
||||
*** '--with-linux-obj=PATH' options respectively.])
|
||||
])
|
||||
|
||||
AC_MSG_CHECKING([kernel build directory])
|
||||
AS_IF([test -z "$kernelbuild"], [
|
||||
AS_IF([test x$withlinux != xyes -a -e "/lib/modules/$(uname -r)/build"], [
|
||||
kernelbuild=`readlink -f /lib/modules/$(uname -r)/build`
|
||||
], [test -d ${kernelsrc}-obj/${target_cpu}/${target_cpu}], [
|
||||
kernelbuild=${kernelsrc}-obj/${target_cpu}/${target_cpu}
|
||||
], [test -d ${kernelsrc}-obj/${target_cpu}/default], [
|
||||
kernelbuild=${kernelsrc}-obj/${target_cpu}/default
|
||||
], [test -d `dirname ${kernelsrc}`/build-${target_cpu}], [
|
||||
kernelbuild=`dirname ${kernelsrc}`/build-${target_cpu}
|
||||
], [
|
||||
kernelbuild=${kernelsrc}
|
||||
])
|
||||
])
|
||||
AC_MSG_RESULT([$kernelbuild])
|
||||
|
||||
AC_MSG_CHECKING([kernel source version])
|
||||
utsrelease1=$kernelbuild/include/linux/version.h
|
||||
utsrelease2=$kernelbuild/include/linux/utsrelease.h
|
||||
|
@ -597,9 +646,15 @@ dnl #
|
|||
dnl # Used internally by ZFS_LINUX_TEST_{COMPILE,MODPOST}
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_LINUX_COMPILE], [
|
||||
AC_ARG_VAR([KERNEL_CC], [C compiler for
|
||||
building kernel modules])
|
||||
AC_ARG_VAR([KERNEL_LD], [Linker for
|
||||
building kernel modules])
|
||||
AC_ARG_VAR([KERNEL_LLVM], [Binary option to
|
||||
build kernel modules with LLVM/CLANG toolchain])
|
||||
AC_TRY_COMMAND([
|
||||
KBUILD_MODPOST_NOFINAL="$5" KBUILD_MODPOST_WARN="$6"
|
||||
make modules -k -j$TEST_JOBS -C $LINUX_OBJ $ARCH_UM
|
||||
make modules -k -j$TEST_JOBS ${KERNEL_CC:+CC=$KERNEL_CC} ${KERNEL_LD:+LD=$KERNEL_LD} ${KERNEL_LLVM:+LLVM=$KERNEL_LLVM} -C $LINUX_OBJ $ARCH_UM
|
||||
M=$PWD/$1 >$1/build.log 2>&1])
|
||||
AS_IF([AC_TRY_COMMAND([$2])], [$3], [$4])
|
||||
])
|
||||
|
|
|
@ -24,6 +24,9 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD], [
|
|||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AES
|
||||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_PCLMULQDQ
|
||||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_MOVBE
|
||||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE
|
||||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEOPT
|
||||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
@ -422,3 +425,66 @@ AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_MOVBE], [
|
|||
AC_MSG_RESULT([no])
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE], [
|
||||
AC_MSG_CHECKING([whether host toolchain supports XSAVE])
|
||||
|
||||
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
||||
[
|
||||
void main()
|
||||
{
|
||||
char b[4096] __attribute__ ((aligned (64)));
|
||||
__asm__ __volatile__("xsave %[b]\n" : : [b] "m" (*b) : "memory");
|
||||
}
|
||||
]])], [
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE_XSAVE], 1, [Define if host toolchain supports XSAVE])
|
||||
], [
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEOPT
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEOPT], [
|
||||
AC_MSG_CHECKING([whether host toolchain supports XSAVEOPT])
|
||||
|
||||
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
||||
[
|
||||
void main()
|
||||
{
|
||||
char b[4096] __attribute__ ((aligned (64)));
|
||||
__asm__ __volatile__("xsaveopt %[b]\n" : : [b] "m" (*b) : "memory");
|
||||
}
|
||||
]])], [
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE_XSAVEOPT], 1, [Define if host toolchain supports XSAVEOPT])
|
||||
], [
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES], [
|
||||
AC_MSG_CHECKING([whether host toolchain supports XSAVES])
|
||||
|
||||
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
||||
[
|
||||
void main()
|
||||
{
|
||||
char b[4096] __attribute__ ((aligned (64)));
|
||||
__asm__ __volatile__("xsaves %[b]\n" : : [b] "m" (*b) : "memory");
|
||||
}
|
||||
]])], [
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE_XSAVES], 1, [Define if host toolchain supports XSAVES])
|
||||
], [
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
])
|
||||
|
|
|
@ -209,8 +209,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
|
|||
AX_COUNT_CPUS([])
|
||||
AC_SUBST(CPU_COUNT)
|
||||
|
||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_UNUSED_BUT_SET_VARIABLE
|
||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_BOOL_COMPARE
|
||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_CLOBBERED
|
||||
ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH
|
||||
ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN
|
||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION
|
||||
|
@ -218,6 +217,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
|
|||
ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER
|
||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA
|
||||
ZFS_AC_CONFIG_ALWAYS_CC_ASAN
|
||||
ZFS_AC_CONFIG_ALWAYS_CC_UBSAN
|
||||
ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD
|
||||
ZFS_AC_CONFIG_ALWAYS_SYSTEM
|
||||
ZFS_AC_CONFIG_ALWAYS_ARCH
|
||||
|
@ -323,6 +323,7 @@ AC_DEFUN([ZFS_AC_RPM], [
|
|||
RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(DEBUG_KMEM_ZFS) 1"'
|
||||
RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(DEBUG_KMEM_TRACKING_ZFS) 1"'
|
||||
RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(ASAN_ZFS) 1"'
|
||||
RPM_DEFINE_COMMON=${RPM_DEFINE_COMMON}' --define "$(UBSAN_ZFS) 1"'
|
||||
|
||||
RPM_DEFINE_UTIL=' --define "_initconfdir $(initconfdir)"'
|
||||
|
||||
|
@ -369,6 +370,9 @@ AC_DEFUN([ZFS_AC_RPM], [
|
|||
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernels $(LINUX_VERSION)"'
|
||||
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "ksrc $(LINUX)"'
|
||||
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kobj $(LINUX_OBJ)"'
|
||||
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_cc KERNEL_CC=$(KERNEL_CC)"'
|
||||
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_ld KERNEL_LD=$(KERNEL_LD)"'
|
||||
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernel_llvm KERNEL_LLVM=$(KERNEL_LLVM)"'
|
||||
])
|
||||
|
||||
RPM_DEFINE_DKMS=''
|
||||
|
|
|
@ -147,8 +147,6 @@ AC_CONFIG_FILES([
|
|||
lib/libshare/Makefile
|
||||
lib/libspl/Makefile
|
||||
lib/libspl/include/Makefile
|
||||
lib/libspl/include/ia32/Makefile
|
||||
lib/libspl/include/ia32/sys/Makefile
|
||||
lib/libspl/include/os/Makefile
|
||||
lib/libspl/include/os/freebsd/Makefile
|
||||
lib/libspl/include/os/freebsd/sys/Makefile
|
||||
|
@ -228,12 +226,14 @@ AC_CONFIG_FILES([
|
|||
tests/zfs-tests/cmd/randfree_file/Makefile
|
||||
tests/zfs-tests/cmd/randwritecomp/Makefile
|
||||
tests/zfs-tests/cmd/readmmap/Makefile
|
||||
tests/zfs-tests/cmd/read_dos_attributes/Makefile
|
||||
tests/zfs-tests/cmd/rename_dir/Makefile
|
||||
tests/zfs-tests/cmd/rm_lnkcnt_zero_file/Makefile
|
||||
tests/zfs-tests/cmd/send_doall/Makefile
|
||||
tests/zfs-tests/cmd/stride_dd/Makefile
|
||||
tests/zfs-tests/cmd/threadsappend/Makefile
|
||||
tests/zfs-tests/cmd/user_ns_exec/Makefile
|
||||
tests/zfs-tests/cmd/write_dos_attributes/Makefile
|
||||
tests/zfs-tests/cmd/xattrtest/Makefile
|
||||
tests/zfs-tests/include/Makefile
|
||||
tests/zfs-tests/tests/Makefile
|
||||
|
@ -335,6 +335,7 @@ AC_CONFIG_FILES([
|
|||
tests/zfs-tests/tests/functional/deadman/Makefile
|
||||
tests/zfs-tests/tests/functional/delegate/Makefile
|
||||
tests/zfs-tests/tests/functional/devices/Makefile
|
||||
tests/zfs-tests/tests/functional/dos_attributes/Makefile
|
||||
tests/zfs-tests/tests/functional/events/Makefile
|
||||
tests/zfs-tests/tests/functional/exec/Makefile
|
||||
tests/zfs-tests/tests/functional/fallocate/Makefile
|
||||
|
@ -385,6 +386,7 @@ AC_CONFIG_FILES([
|
|||
tests/zfs-tests/tests/functional/rootpool/Makefile
|
||||
tests/zfs-tests/tests/functional/rsend/Makefile
|
||||
tests/zfs-tests/tests/functional/scrub_mirror/Makefile
|
||||
tests/zfs-tests/tests/functional/simd/Makefile
|
||||
tests/zfs-tests/tests/functional/slog/Makefile
|
||||
tests/zfs-tests/tests/functional/snapshot/Makefile
|
||||
tests/zfs-tests/tests/functional/snapused/Makefile
|
||||
|
|
|
@ -10,4 +10,3 @@ endif
|
|||
DIST_SUBDIRS = bash_completion.d bpftrace dracut initramfs pam_zfs_key pyzfs zcp
|
||||
|
||||
SHELLCHECKDIRS = bash_completion.d bpftrace dracut initramfs
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
|
|
@ -10,4 +10,3 @@ SUBSTFILES += $(noinst_DATA)
|
|||
|
||||
SHELLCHECKSCRIPTS = $(noinst_DATA)
|
||||
SHELLCHECK_SHELL = bash
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
|
|
@ -5,4 +5,3 @@ EXTRA_DIST = \
|
|||
zfs-trace.sh
|
||||
|
||||
SHELLCHECKSCRIPTS = zfs-trace.sh
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
|
|
@ -5,5 +5,4 @@ pkgdracutdir = $(dracutdir)/modules.d/02zfsexpandknowledge
|
|||
pkgdracut_SCRIPTS = \
|
||||
module-setup.sh
|
||||
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
SUBSTFILES += $(pkgdracut_SCRIPTS)
|
||||
|
|
|
@ -57,6 +57,12 @@ array_contains () {
|
|||
}
|
||||
|
||||
check() {
|
||||
# https://github.com/dracutdevs/dracut/pull/1711 provides a zfs_devs
|
||||
# function to detect the physical devices backing zfs pools. If this
|
||||
# function exists in the version of dracut this module is being called
|
||||
# from, then it does not need to run.
|
||||
type zfs_devs >/dev/null 2>&1 && return 1
|
||||
|
||||
local mp
|
||||
local dev
|
||||
local blockdevs
|
||||
|
|
|
@ -19,7 +19,6 @@ pkgdracut_DATA = \
|
|||
zfs-rollback-bootfs.service
|
||||
|
||||
SUBSTFILES += $(pkgdracut_SCRIPTS) $(pkgdracut_DATA)
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
||||
# Provided by /bin/sleep, and, again, every implementation of that supports this
|
||||
CHECKBASHISMS_IGNORE = -e 'sleep only takes one integer' -e 'sleep 0.'
|
||||
|
|
|
@ -1,30 +1,22 @@
|
|||
#!/bin/sh
|
||||
|
||||
. /lib/dracut-zfs-lib.sh
|
||||
|
||||
_do_zpool_export() {
|
||||
ret=0
|
||||
errs=""
|
||||
final="${1}"
|
||||
|
||||
info "ZFS: Exporting ZFS storage pools..."
|
||||
errs=$(export_all -F 2>&1)
|
||||
errs=$(zpool export -aF 2>&1)
|
||||
ret=$?
|
||||
[ -z "${errs}" ] || echo "${errs}" | vwarn
|
||||
if [ "x${ret}" != "x0" ]; then
|
||||
echo "${errs}" | vwarn
|
||||
if [ "${ret}" -ne 0 ]; then
|
||||
info "ZFS: There was a problem exporting pools."
|
||||
fi
|
||||
|
||||
if [ "x${final}" != "x" ]; then
|
||||
if [ -n "$1" ]; then
|
||||
info "ZFS: pool list"
|
||||
zpool list 2>&1 | vinfo
|
||||
fi
|
||||
|
||||
return "${ret}"
|
||||
return "$ret"
|
||||
}
|
||||
|
||||
if command -v zpool >/dev/null; then
|
||||
_do_zpool_export "${1}"
|
||||
else
|
||||
:
|
||||
fi
|
||||
|
|
|
@ -6,8 +6,8 @@ check() {
|
|||
[ "${1}" = "-d" ] && return 0
|
||||
|
||||
# Verify the zfs tool chain
|
||||
for tool in "@sbindir@/zgenhostid" "@sbindir@/zpool" "@sbindir@/zfs" "@mounthelperdir@/mount.zfs" ; do
|
||||
test -x "$tool" || return 1
|
||||
for tool in "zgenhostid" "zpool" "zfs" "mount.zfs"; do
|
||||
command -v "${tool}" >/dev/null || return 1
|
||||
done
|
||||
|
||||
return 0
|
||||
|
@ -19,125 +19,88 @@ depends() {
|
|||
}
|
||||
|
||||
installkernel() {
|
||||
instmods zfs
|
||||
instmods zcommon
|
||||
instmods znvpair
|
||||
instmods zavl
|
||||
instmods zunicode
|
||||
instmods zlua
|
||||
instmods icp
|
||||
instmods spl
|
||||
instmods zlib_deflate
|
||||
instmods zlib_inflate
|
||||
instmods -c zfs
|
||||
}
|
||||
|
||||
install() {
|
||||
inst_rules @udevruledir@/90-zfs.rules
|
||||
inst_rules @udevruledir@/69-vdev.rules
|
||||
inst_rules @udevruledir@/60-zvol.rules
|
||||
dracut_install hostid
|
||||
dracut_install grep
|
||||
dracut_install @sbindir@/zgenhostid
|
||||
dracut_install @sbindir@/zfs
|
||||
dracut_install @sbindir@/zpool
|
||||
# Workaround for https://github.com/openzfs/zfs/issues/4749 by
|
||||
# ensuring libgcc_s.so(.1) is included
|
||||
if ldd @sbindir@/zpool | grep -qF 'libgcc_s.so'; then
|
||||
# Dracut will have already tracked and included it
|
||||
:;
|
||||
elif command -v gcc-config >/dev/null 2>&1; then
|
||||
# On systems with gcc-config (Gentoo, Funtoo, etc.):
|
||||
# Use the current profile to resolve the appropriate path
|
||||
s="$(gcc-config -c)"
|
||||
dracut_install "/usr/lib/gcc/${s%-*}/${s##*-}/libgcc_s.so"*
|
||||
elif [ "$(echo /usr/lib/libgcc_s.so*)" != "/usr/lib/libgcc_s.so*" ]; then
|
||||
# Try a simple path first
|
||||
dracut_install /usr/lib/libgcc_s.so*
|
||||
elif [ "$(echo /lib*/libgcc_s.so*)" != "/lib*/libgcc_s.so*" ]; then
|
||||
# SUSE
|
||||
dracut_install /lib*/libgcc_s.so*
|
||||
else
|
||||
# Fallback: Guess the path and include all matches
|
||||
dracut_install /usr/lib*/gcc/**/libgcc_s.so*
|
||||
inst_rules 90-zfs.rules 69-vdev.rules 60-zvol.rules
|
||||
|
||||
inst_multiple \
|
||||
zgenhostid \
|
||||
zfs \
|
||||
zpool \
|
||||
mount.zfs \
|
||||
hostid \
|
||||
grep \
|
||||
awk \
|
||||
tr \
|
||||
cut \
|
||||
head ||
|
||||
{ dfatal "Failed to install essential binaries"; exit 1; }
|
||||
|
||||
# Adapted from https://github.com/zbm-dev/zfsbootmenu
|
||||
|
||||
if ! ldd "$(command -v zpool)" | grep -qF 'libgcc_s.so'; then
|
||||
# On systems with gcc-config (Gentoo, Funtoo, etc.), use it to find libgcc_s
|
||||
if command -v gcc-config >/dev/null; then
|
||||
inst_simple "/usr/lib/gcc/$(s=$(gcc-config -c); echo "${s%-*}/${s##*-}")/libgcc_s.so.1" ||
|
||||
{ dfatal "Unable to install libgcc_s.so"; exit 1; }
|
||||
# Otherwise, use dracut's library installation function to find the right one
|
||||
elif ! inst_libdir_file "libgcc_s.so*"; then
|
||||
# If all else fails, just try looking for some gcc arch directory
|
||||
inst_simple /usr/lib/gcc/*/*/libgcc_s.so* ||
|
||||
{ dfatal "Unable to install libgcc_s.so"; exit 1; }
|
||||
fi
|
||||
fi
|
||||
# shellcheck disable=SC2050
|
||||
if [ @LIBFETCH_DYNAMIC@ -gt 0 ]; then
|
||||
for d in $libdirs; do
|
||||
[ -e "$d/@LIBFETCH_SONAME@" ] && dracut_install "$d/@LIBFETCH_SONAME@"
|
||||
done
|
||||
fi
|
||||
dracut_install @mounthelperdir@/mount.zfs
|
||||
dracut_install @udevdir@/vdev_id
|
||||
dracut_install awk
|
||||
dracut_install cut
|
||||
dracut_install tr
|
||||
dracut_install head
|
||||
dracut_install @udevdir@/zvol_id
|
||||
|
||||
inst_hook cmdline 95 "${moddir}/parse-zfs.sh"
|
||||
if [ -n "$systemdutildir" ] ; then
|
||||
inst_script "${moddir}/zfs-generator.sh" "$systemdutildir"/system-generators/dracut-zfs-generator
|
||||
if [ -n "${systemdutildir}" ]; then
|
||||
inst_script "${moddir}/zfs-generator.sh" "${systemdutildir}/system-generators/dracut-zfs-generator"
|
||||
fi
|
||||
inst_hook pre-mount 90 "${moddir}/zfs-load-key.sh"
|
||||
inst_hook mount 98 "${moddir}/mount-zfs.sh"
|
||||
inst_hook cleanup 99 "${moddir}/zfs-needshutdown.sh"
|
||||
inst_hook shutdown 20 "${moddir}/export-zfs.sh"
|
||||
|
||||
inst_simple "${moddir}/zfs-lib.sh" "/lib/dracut-zfs-lib.sh"
|
||||
if [ -e @sysconfdir@/zfs/zpool.cache ]; then
|
||||
inst @sysconfdir@/zfs/zpool.cache
|
||||
type mark_hostonly >/dev/null 2>&1 && mark_hostonly @sysconfdir@/zfs/zpool.cache
|
||||
fi
|
||||
inst_script "${moddir}/zfs-lib.sh" "/lib/dracut-zfs-lib.sh"
|
||||
|
||||
if [ -e @sysconfdir@/zfs/vdev_id.conf ]; then
|
||||
inst @sysconfdir@/zfs/vdev_id.conf
|
||||
type mark_hostonly >/dev/null 2>&1 && mark_hostonly @sysconfdir@/zfs/vdev_id.conf
|
||||
fi
|
||||
# -H ensures they are marked host-only
|
||||
# -o ensures there is no error upon absence of these files
|
||||
inst_multiple -o -H \
|
||||
"@sysconfdir@/zfs/zpool.cache" \
|
||||
"@sysconfdir@/zfs/vdev_id.conf"
|
||||
|
||||
# Synchronize initramfs and system hostid
|
||||
if [ -f @sysconfdir@/hostid ]; then
|
||||
inst @sysconfdir@/hostid
|
||||
type mark_hostonly >/dev/null 2>&1 && mark_hostonly @sysconfdir@/hostid
|
||||
elif HOSTID="$(hostid 2>/dev/null)" && [ "${HOSTID}" != "00000000" ]; then
|
||||
zgenhostid -o "${initdir}@sysconfdir@/hostid" "${HOSTID}"
|
||||
type mark_hostonly >/dev/null 2>&1 && mark_hostonly @sysconfdir@/hostid
|
||||
if ! inst_simple -H @sysconfdir@/hostid; then
|
||||
if HOSTID="$(hostid 2>/dev/null)" && [ "${HOSTID}" != "00000000" ]; then
|
||||
zgenhostid -o "${initdir}@sysconfdir@/hostid" "${HOSTID}"
|
||||
mark_hostonly @sysconfdir@/hostid
|
||||
fi
|
||||
fi
|
||||
|
||||
if dracut_module_included "systemd"; then
|
||||
mkdir -p "${initdir}/$systemdsystemunitdir/zfs-import.target.wants"
|
||||
for _service in "zfs-import-scan.service" "zfs-import-cache.service" ; do
|
||||
dracut_install "@systemdunitdir@/$_service"
|
||||
if ! [ -L "${initdir}/$systemdsystemunitdir/zfs-import.target.wants/$_service" ]; then
|
||||
ln -sf "../$_service" "${initdir}/$systemdsystemunitdir/zfs-import.target.wants/$_service"
|
||||
type mark_hostonly >/dev/null 2>&1 && mark_hostonly "@systemdunitdir@/$_service"
|
||||
fi
|
||||
|
||||
inst_simple "${systemdsystemunitdir}/zfs-import.target"
|
||||
systemctl -q --root "${initdir}" add-wants initrd.target zfs-import.target
|
||||
|
||||
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
|
||||
|
||||
for _service in \
|
||||
"zfs-import-scan.service" \
|
||||
"zfs-import-cache.service" \
|
||||
"zfs-load-module.service"; do
|
||||
inst_simple "${systemdsystemunitdir}/${_service}"
|
||||
systemctl -q --root "${initdir}" add-wants zfs-import.target "${_service}"
|
||||
done
|
||||
|
||||
inst "${moddir}"/zfs-env-bootfs.service "${systemdsystemunitdir}"/zfs-env-bootfs.service
|
||||
ln -s ../zfs-env-bootfs.service "${initdir}/${systemdsystemunitdir}/zfs-import.target.wants"/zfs-env-bootfs.service
|
||||
type mark_hostonly >/dev/null 2>&1 && mark_hostonly @systemdunitdir@/zfs-env-bootfs.service
|
||||
|
||||
dracut_install systemd-ask-password
|
||||
dracut_install systemd-tty-ask-password-agent
|
||||
|
||||
mkdir -p "${initdir}/$systemdsystemunitdir/initrd.target.wants"
|
||||
dracut_install @systemdunitdir@/zfs-import.target
|
||||
if ! [ -L "${initdir}/$systemdsystemunitdir/initrd.target.wants"/zfs-import.target ]; then
|
||||
ln -s ../zfs-import.target "${initdir}/$systemdsystemunitdir/initrd.target.wants"/zfs-import.target
|
||||
type mark_hostonly >/dev/null 2>&1 && mark_hostonly @systemdunitdir@/zfs-import.target
|
||||
fi
|
||||
|
||||
for _service in zfs-snapshot-bootfs.service zfs-rollback-bootfs.service ; do
|
||||
inst "${moddir}/$_service" "${systemdsystemunitdir}/$_service"
|
||||
if ! [ -L "${initdir}/$systemdsystemunitdir/initrd.target.wants/$_service" ]; then
|
||||
ln -s "../$_service" "${initdir}/$systemdsystemunitdir/initrd.target.wants/$_service"
|
||||
fi
|
||||
for _service in \
|
||||
"zfs-snapshot-bootfs.service" \
|
||||
"zfs-rollback-bootfs.service"; do
|
||||
inst_simple "${moddir}/${_service}" "${systemdsystemunitdir}/${_service}"
|
||||
systemctl -q --root "${initdir}" add-wants initrd.target "${_service}"
|
||||
done
|
||||
|
||||
# There isn't a pkg-config variable for this,
|
||||
# and dracut doesn't automatically resolve anything this'd be next to
|
||||
local systemdsystemenvironmentgeneratordir
|
||||
systemdsystemenvironmentgeneratordir="$(pkg-config --variable=prefix systemd || echo "/usr")/lib/systemd/system-environment-generators"
|
||||
mkdir -p "${initdir}/${systemdsystemenvironmentgeneratordir}"
|
||||
inst "${moddir}"/import-opts-generator.sh "${systemdsystemenvironmentgeneratordir}"/zfs-import-opts.sh
|
||||
inst_simple "${moddir}/import-opts-generator.sh" "${systemdutildir}/system-environment-generators/zfs-import-opts.sh"
|
||||
fi
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@ if [ "${root}" = "zfs:AUTO" ] ; then
|
|||
zpool import -N -a ${ZPOOL_IMPORT_OPTS}
|
||||
if ! ZFS_DATASET="$(find_bootfs)" ; then
|
||||
warn "ZFS: No bootfs attribute found in importable pools."
|
||||
export_all -F
|
||||
zpool export -aF
|
||||
|
||||
rootok=0
|
||||
return 1
|
||||
|
|
|
@ -122,22 +122,6 @@ for_relevant_root_children() {
|
|||
)
|
||||
}
|
||||
|
||||
# export_all OPTS
|
||||
# exports all imported zfs pools.
|
||||
export_all() {
|
||||
ret=0
|
||||
|
||||
IFS="${NEWLINE}"
|
||||
for pool in $(zpool list -H -o name) ; do
|
||||
if zpool list -H "${pool}" > /dev/null 2>&1; then
|
||||
zpool export "${pool}" "$@" || ret=$?
|
||||
fi
|
||||
done
|
||||
IFS="${OLDIFS}"
|
||||
|
||||
return "${ret}"
|
||||
}
|
||||
|
||||
# ask_for_password
|
||||
#
|
||||
# Wraps around plymouth ask-for-password and adds fallback to tty password ask
|
||||
|
|
|
@ -9,6 +9,6 @@ ConditionKernelCommandLine=bootfs.rollback
|
|||
[Service]
|
||||
# ${BOOTFS} should have been set by zfs-env-bootfs.service
|
||||
Type=oneshot
|
||||
ExecStartPre=/bin/sh -c 'test -n "${BOOTFS}"'
|
||||
ExecStartPre=/bin/test -n ${BOOTFS}
|
||||
ExecStart=/bin/sh -c '. /lib/dracut-lib.sh; SNAPNAME="$(getarg bootfs.rollback)"; exec @sbindir@/zfs rollback -Rf "${BOOTFS}@${SNAPNAME:-%v}"'
|
||||
RemainAfterExit=yes
|
||||
|
|
|
@ -9,6 +9,6 @@ ConditionKernelCommandLine=bootfs.snapshot
|
|||
[Service]
|
||||
# ${BOOTFS} should have been set by zfs-env-bootfs.service
|
||||
Type=oneshot
|
||||
ExecStartPre=/bin/sh -c 'test -n "${BOOTFS}"'
|
||||
ExecStartPre=/bin/test -n ${BOOTFS}
|
||||
ExecStart=-/bin/sh -c '. /lib/dracut-lib.sh; SNAPNAME="$(getarg bootfs.snapshot)"; exec @sbindir@/zfs snapshot "${BOOTFS}@${SNAPNAME:-%v}"'
|
||||
RemainAfterExit=yes
|
||||
|
|
|
@ -3,4 +3,4 @@ include $(top_srcdir)/config/Shellcheck.am
|
|||
SUBDIRS = 02zfsexpandknowledge 90zfs
|
||||
SHELLCHECKDIRS = $(SUBDIRS)
|
||||
|
||||
EXTRA_DIST = README.dracut.markdown
|
||||
EXTRA_DIST = README.md
|
||||
|
|
|
@ -1,225 +0,0 @@
|
|||
How to setup a zfs root filesystem using dracut
|
||||
-----------------------------------------------
|
||||
|
||||
1) Install the zfs-dracut package. This package adds a zfs dracut module
|
||||
to the /usr/share/dracut/modules.d/ directory which allows dracut to
|
||||
create an initramfs which is zfs aware.
|
||||
|
||||
2) Set the bootfs property for the bootable dataset in the pool. Then set
|
||||
the dataset mountpoint property to '/'.
|
||||
|
||||
$ zpool set bootfs=pool/dataset pool
|
||||
$ zfs set mountpoint=/ pool/dataset
|
||||
|
||||
Alternately, legacy mountpoints can be used by setting the 'root=' option
|
||||
on the kernel line of your grub.conf/menu.lst configuration file. Then
|
||||
set the dataset mountpoint property to 'legacy'.
|
||||
|
||||
$ grub.conf/menu.lst: kernel ... root=ZFS=pool/dataset
|
||||
$ zfs set mountpoint=legacy pool/dataset
|
||||
|
||||
3) To set zfs module options put them in /etc/modprobe.d/zfs.conf file.
|
||||
The complete list of zfs module options is available by running the
|
||||
_modinfo zfs_ command. Commonly set options include: zfs_arc_min,
|
||||
zfs_arc_max, zfs_prefetch_disable, and zfs_vdev_max_pending.
|
||||
|
||||
4) Finally, create your new initramfs by running dracut.
|
||||
|
||||
$ dracut --force /path/to/initramfs kernel_version
|
||||
|
||||
Kernel Command Line
|
||||
-------------------
|
||||
|
||||
The initramfs' behavior is influenced by the following kernel command line
|
||||
parameters passed in from the boot loader:
|
||||
|
||||
* `root=...`: If not set, importable pools are searched for a bootfs
|
||||
attribute. If an explicitly set root is desired, you may use
|
||||
`root=ZFS:pool/dataset`
|
||||
|
||||
* `zfs_force=0`: If set to 1, the initramfs will run `zpool import -f` when
|
||||
attempting to import pools if the required pool isn't automatically imported
|
||||
by the zfs module. This can save you a trip to a bootcd if hostid has
|
||||
changed, but is dangerous and can lead to zpool corruption, particularly in
|
||||
cases where storage is on a shared fabric such as iSCSI where multiple hosts
|
||||
can access storage devices concurrently. _Please understand the implications
|
||||
of force-importing a pool before enabling this option!_
|
||||
|
||||
* `spl_hostid`: By default, the hostid used by the SPL module is read from
|
||||
/etc/hostid inside the initramfs. This file is placed there from the host
|
||||
system when the initramfs is built which effectively ties the ramdisk to the
|
||||
host which builds it. If a different hostid is desired, one may be set in
|
||||
this attribute and will override any file present in the ramdisk. The
|
||||
format should be hex exactly as found in the `/etc/hostid` file, IE
|
||||
`spl_hostid=0x00bab10c`.
|
||||
|
||||
Note that changing the hostid between boots will most likely lead to an
|
||||
un-importable pool since the last importing hostid won't match. In order
|
||||
to recover from this, you may use the `zfs_force` option or boot from a
|
||||
different filesystem and `zpool import -f` then `zpool export` the pool
|
||||
before rebooting with the new hostid.
|
||||
|
||||
* `bootfs.snapshot`: If listed, enables the zfs-snapshot-bootfs service on a Dracut system. The zfs-snapshot-bootfs service simply runs `zfs snapshot $BOOTFS@%v` after the pool has been imported but before the bootfs is mounted. `$BOOTFS` is substituted with the value of the bootfs setting on the pool. `%v` is substituted with the version string of the kernel currently being booted (e.g. 5.6.6-200.fc31.x86\_64). Failure to create the snapshot (e.g. because one with the same name already exists) will be logged, but will not otherwise interrupt the boot process.
|
||||
|
||||
It is safe to leave the bootfs.snapshot flag set persistently on your kernel command line so that a new snapshot of your bootfs will be created on every kernel update. If you leave bootfs.snapshot set persistently on your kernel command line, you may find the below script helpful for automatically removing old snapshots of the bootfs along with their associated kernel.
|
||||
|
||||
#!/usr/bin/sh
|
||||
|
||||
if [[ "$1" == "remove" ]] && grep -q "\bbootfs.snapshot\b" /proc/cmdline; then
|
||||
zfs destroy $(findmnt -n -o source /)@$2 &> /dev/null
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
To use the above script place it in a plain text file named /etc/kernel/install.d/99-zfs-cleanup.install and mark it executable with the following command:
|
||||
|
||||
$ chmod +x /etc/kernel/install.d/99-zfs-cleanup.install
|
||||
|
||||
On Red Hat based systems, you can change the value of `installonly_limit` in /etc/dnf/dnf.conf to adjust the number of kernels and their associated snapshots that are kept.
|
||||
|
||||
* `bootfs.snapshot=<snapname>`: Is identical to the bootfs.snapshot parameter explained above except that the value substituted for \<snapname\> will be used when creating the snapshot instead of the version string of the kernel currently being booted.
|
||||
|
||||
* `bootfs.rollback`: If listed, enables the zfs-rollback-bootfs service on a Dracut system. The zfs-rollback-bootfs service simply runs `zfs rollback -Rf $BOOTFS@%v` after the pool has been imported but before the bootfs is mounted. If the rollback operation fails, the boot process will be interrupted with a Dracut rescue shell. __Use this parameter with caution. Intermediate snapshots of the bootfs will be destroyed!__ TIP: Keep your user data (e.g. /home) on separate file systems (it can be in the same pool though).
|
||||
|
||||
* `bootfs.rollback=<snapname>`: Is identical to the bootfs.rollback parameter explained above except that the value substituted for \<snapname\> will be used when rolling back the bootfs instead of the version string of the kernel currently being booted. If you use this form, choose a snapshot that is new enough to contain the needed kernel modules under /lib/modules or use a kernel that has all the needed modules built-in.
|
||||
|
||||
How it Works
|
||||
============
|
||||
|
||||
The Dracut module consists of the following files (less Makefile's):
|
||||
|
||||
* `module-setup.sh`: Script run by the initramfs builder to create the
|
||||
ramdisk. Contains instructions on which files are required by the modules
|
||||
and z* programs. Also triggers inclusion of `/etc/hostid` and the zpool
|
||||
cache. This file is not included in the initramfs.
|
||||
|
||||
* `90-zfs.rules`: udev rules which trigger loading of the ZFS modules at boot.
|
||||
|
||||
* `zfs-lib.sh`: Utility functions used by the other files.
|
||||
|
||||
* `parse-zfs.sh`: Run early in the initramfs boot process to parse kernel
|
||||
command line and determine if ZFS is the active root filesystem.
|
||||
|
||||
* `mount-zfs.sh`: Run later in initramfs boot process after udev has settled
|
||||
to mount the root dataset.
|
||||
|
||||
* `export-zfs.sh`: Run on shutdown after dracut has restored the initramfs
|
||||
and pivoted to it, allowing for a clean unmount and export of the ZFS root.
|
||||
|
||||
`zfs-lib.sh`
|
||||
------------
|
||||
|
||||
This file provides a few handy functions for working with ZFS. Those
|
||||
functions are used by the `mount-zfs.sh` and `export-zfs.sh` files.
|
||||
However, they could be used by any other file as well, as long as the file
|
||||
sources `/lib/dracut-zfs-lib.sh`.
|
||||
|
||||
`module-setup.sh`
|
||||
-----------------
|
||||
|
||||
This file is run by the Dracut script within the live system, not at boot
|
||||
time. It's not included in the final initramfs. Functions in this script
|
||||
describe which files are needed by ZFS at boot time.
|
||||
|
||||
Currently all the various z* and spl modules are included, a dependency is
|
||||
asserted on udev-rules, and the various zfs, zpool, etc. helpers are included.
|
||||
Dracut provides library functions which automatically gather the shared libs
|
||||
necessary to run each of these binaries, so statically built binaries are
|
||||
not required.
|
||||
|
||||
The zpool and zvol udev rules files are copied from where they are
|
||||
installed by the ZFS build. __PACKAGERS TAKE NOTE__: If you move
|
||||
`/etc/udev/rules/60-z*.rules`, you'll need to update this file to match.
|
||||
|
||||
Currently this file also includes `/etc/hostid` and `/etc/zfs/zpool.cache`
|
||||
which means the generated ramdisk is specific to the host system which built
|
||||
it. If a generic initramfs is required, it may be preferable to omit these
|
||||
files and specify the `spl_hostid` from the boot loader instead.
|
||||
|
||||
`parse-zfs.sh`
|
||||
--------------
|
||||
|
||||
Run during the cmdline phase of the initramfs boot process, this script
|
||||
performs some basic sanity checks on kernel command line parameters to
|
||||
determine if booting from ZFS is likely to be what is desired. Dracut
|
||||
requires this script to adjust the `root` variable if required and to set
|
||||
`rootok=1` if a mountable root filesystem is available. Unfortunately this
|
||||
script must run before udev is settled and kernel modules are known to be
|
||||
loaded, so accessing the zpool and zfs commands is unsafe.
|
||||
|
||||
If the root=ZFS... parameter is set on the command line, then it's at least
|
||||
certain that ZFS is what is desired, though this script is unable to
|
||||
determine if ZFS is in fact available. This script will alter the `root`
|
||||
parameter to replace several historical forms of specifying the pool and
|
||||
dataset name with the canonical form of `zfs:pool/dataset`.
|
||||
|
||||
If no root= parameter is set, the best this script can do is guess that
|
||||
ZFS is desired. At present, no other known filesystems will work with no
|
||||
root= parameter, though this might possibly interfere with using the
|
||||
compiled-in default root in the kernel image. It's considered unlikely
|
||||
that would ever be the case when an initramfs is in use, so this script
|
||||
sets `root=zfs:AUTO` and hopes for the best.
|
||||
|
||||
Once the root=... (or lack thereof) parameter is parsed, a dummy symlink
|
||||
is created from `/dev/root` -> `/dev/null` to satisfy parts of the Dracut
|
||||
process which check for presence of a single root device node.
|
||||
|
||||
Finally, an initqueue/finished hook is registered which causes the initqueue
|
||||
phase of Dracut to wait for `/dev/zfs` to become available before attempting
|
||||
to mount anything.
|
||||
|
||||
`mount-zfs.sh`
|
||||
--------------
|
||||
|
||||
This script is run after udev has settled and all tasks in the initqueue
|
||||
have succeeded. This ensures that `/dev/zfs` is available and that the
|
||||
various ZFS modules are successfully loaded. As it is now safe to call
|
||||
zpool and friends, we can proceed to find the bootfs attribute if necessary.
|
||||
|
||||
If the root parameter was explicitly set on the command line, no parsing is
|
||||
necessary. The list of imported pools is checked to see if the desired pool
|
||||
is already imported. If it's not, and attempt is made to import the pool
|
||||
explicitly, though no force is attempted. Finally the specified dataset
|
||||
is mounted on `$NEWROOT`, first using the `-o zfsutil` option to handle
|
||||
non-legacy mounts, then if that fails, without zfsutil to handle legacy
|
||||
mount points.
|
||||
|
||||
If no root parameter was specified, this script attempts to find a pool with
|
||||
its bootfs attribute set. First, already-imported pools are scanned and if
|
||||
an appropriate pool is found, no additional pools are imported. If no pool
|
||||
with bootfs is found, any additional pools in the system are imported with
|
||||
`zpool import -N -a`, and the scan for bootfs is tried again. If no bootfs
|
||||
is found with all pools imported, all pools are re-exported, and boot fails.
|
||||
Assuming a bootfs is found, an attempt is made to mount it to `$NEWROOT`,
|
||||
first with, then without the zfsutil option as above.
|
||||
|
||||
Ordinarily pools are imported _without_ the force option which may cause
|
||||
boot to fail if the hostid has changed or a pool has been physically moved
|
||||
between servers. The `zfs_force` kernel parameter is provided which when
|
||||
set to `1` causes `zpool import` to be run with the `-f` flag. Forcing pool
|
||||
import can lead to serious data corruption and loss of pools, so this option
|
||||
should be used with extreme caution. Note that even with this flag set, if
|
||||
the required zpool was auto-imported by the kernel module, no additional
|
||||
`zpool import` commands are run, so nothing is forced.
|
||||
|
||||
`export-zfs.sh`
|
||||
---------------
|
||||
|
||||
Normally the zpool containing the root dataset cannot be exported on
|
||||
shutdown as it is still in use by the init process. To work around this,
|
||||
Dracut is able to restore the initramfs on shutdown and pivot to it.
|
||||
All remaining process are then running from a ramdisk, allowing for a
|
||||
clean unmount and export of the ZFS root. The theory of operation is
|
||||
described in detail in the [Dracut manual](https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html#_dracut_on_shutdown).
|
||||
|
||||
This script will try to export all remaining zpools after Dracut has
|
||||
pivoted to the initramfs. If an initial regular export is not successful,
|
||||
Dracut will call this script once more with the `final` option,
|
||||
in which case a forceful export is attempted.
|
||||
|
||||
Other Dracut modules include similar shutdown scripts and Dracut
|
||||
invokes these scripts round-robin until they succeed. In particular,
|
||||
the `90dm` module installs a script which tries to close and remove
|
||||
all device mapper targets. Thus, if there are ZVOLs containing
|
||||
dm-crypt volumes or if the zpool itself is backed by a dm-crypt
|
||||
volume, the shutdown scripts will try to untangle this.
|
48
sys/contrib/openzfs/contrib/dracut/README.md
Normal file
48
sys/contrib/openzfs/contrib/dracut/README.md
Normal file
|
@ -0,0 +1,48 @@
|
|||
## Basic setup
|
||||
1. Install `zfs-dracut`
|
||||
2. Set `mountpoint=/` for your root dataset (for compatibility, `legacy` also works, but is not recommended for new installations):
|
||||
```sh
|
||||
zfs set mountpoint=/ pool/dataset
|
||||
```
|
||||
3. Either (a) set `bootfs=` on the pool to the dataset:
|
||||
```sh
|
||||
zpool set bootfs=pool/dataset pool
|
||||
```
|
||||
4. Or (b) append `root=zfs:pool/dataset` to your kernel cmdline.
|
||||
5. Re-generate your initrd and update it in your boot bundle
|
||||
|
||||
Encrypted datasets have keys loaded automatically or prompted for.
|
||||
|
||||
If the root dataset contains children with `mountpoint=`s of `/etc`, `/bin`, `/lib*`, or `/usr`, they're mounted too.
|
||||
|
||||
## cmdline
|
||||
1. `root=` | Root dataset is… | Pools imported |
|
||||
-------------------|----------------------------------------------------------|----------------|
|
||||
*(empty)* | the first `bootfs=` after `zpool import -aN` | all |
|
||||
`zfs:AUTO` | *(as above, but overriding other autoselection methods)* | all |
|
||||
`ZFS=pool/dataset` | `pool/dataset` | `pool` |
|
||||
`zfs:pool/dataset` | *(as above)* | `pool` |
|
||||
|
||||
All `+`es are replaced with spaces (i.e. to boot from `root pool/data set`, pass `root=zfs:root+pool/data+set`).
|
||||
|
||||
The dataset can be at any depth, including being the pool's root dataset (i.e. `root=zfs:pool`).
|
||||
|
||||
`rootfstype=zfs` is mostly equivalent to `root=zfs:AUTO`.
|
||||
|
||||
2. `spl_hostid`: passed to `zgenhostid -f`, useful to override the `/etc/hostid` file baked into the initrd.
|
||||
|
||||
3. `bootfs.snapshot`, `bootfs.snapshot=snapshot-name`: enables `zfs-snapshot-bootfs.service`,
|
||||
which creates a snapshot `$root_dataset@$(uname -r)` (or, in the second form, `$root_dataset@snapshot-name`)
|
||||
after pool import but before the rootfs is mounted.
|
||||
Failure to create the snapshot is noted, but booting continues.
|
||||
|
||||
4. `bootfs.rollback`, `bootfs.rollback=snapshot-name`: enables `zfs-snapshot-bootfs.service`,
|
||||
which `-Rf` rolls back to `$root_dataset@$(uname -r)` (or, in the second form, `$root_dataset@snapshot-name`)
|
||||
after pool import but before the rootfs is mounted.
|
||||
Failure to roll back will fall down to the rescue shell.
|
||||
This has obvious potential for data loss: make sure your persistent data is not below the rootfs and you don't care about any intermediate snapshots.
|
||||
|
||||
5. If both `bootfs.snapshot` and `bootfs.rollback` are set, `bootfs.rollback` is ordered *after* `bootfs.snapshot`.
|
||||
|
||||
6. `zfs_force`, `zfs.force`, `zfsforce`: add `-f` to all `zpool import` invocations.
|
||||
May be useful. Use with caution.
|
|
@ -7,7 +7,5 @@ dist_initrd_SCRIPTS = \
|
|||
|
||||
SUBDIRS = conf.d conf-hooks.d hooks scripts
|
||||
SHELLCHECKDIRS = hooks scripts
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
||||
EXTRA_DIST = \
|
||||
README.initramfs.markdown
|
||||
EXTRA_DIST = README.md
|
||||
|
|
|
@ -7,5 +7,4 @@ hooks_SCRIPTS = \
|
|||
zfs \
|
||||
zfsunlock
|
||||
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
SUBSTFILES += $(hooks_SCRIPTS)
|
||||
|
|
|
@ -9,4 +9,3 @@ SUBDIRS = local-top
|
|||
|
||||
SHELLCHECKDIRS = $(SUBDIRS)
|
||||
SHELLCHECK_SHELL = sh
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
|
|
@ -5,4 +5,3 @@ localtopdir = /usr/share/initramfs-tools/scripts/local-top
|
|||
dist_localtop_SCRIPTS = \
|
||||
zfs
|
||||
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
|
|
@ -47,6 +47,7 @@
|
|||
static void
|
||||
pam_syslog(pam_handle_t *pamh, int loglevel, const char *fmt, ...)
|
||||
{
|
||||
(void) pamh;
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
vsyslog(loglevel, fmt, args);
|
||||
|
|
|
@ -4132,7 +4132,8 @@ def __init__(self, size=128 * 1024 * 1024, readonly=False, filesystems=[]):
|
|||
cachefile = 'none'
|
||||
self._zpool_create = [
|
||||
'zpool', 'create', '-o', 'cachefile=' + cachefile,
|
||||
'-O', 'mountpoint=legacy', self._pool_name, self._pool_file_path]
|
||||
'-O', 'mountpoint=legacy', '-O', 'compression=off',
|
||||
self._pool_name, self._pool_file_path]
|
||||
try:
|
||||
os.ftruncate(fd, size)
|
||||
os.close(fd)
|
||||
|
|
|
@ -2,7 +2,6 @@ include $(top_srcdir)/config/Shellcheck.am
|
|||
|
||||
SUBDIRS = zfs sudoers.d
|
||||
SHELLCHECKDIRS = default $(ZFS_INIT_SYSV) zfs
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
|
||||
if BUILD_LINUX
|
||||
SUBDIRS += default $(ZFS_INIT_SYSTEMD) $(ZFS_INIT_SYSV) $(ZFS_MODULE_LOAD)
|
||||
|
|
|
@ -5,5 +5,4 @@ initconf_SCRIPTS = zfs
|
|||
|
||||
SUBSTFILES += $(initconf_SCRIPTS)
|
||||
|
||||
SHELLCHECK_SHELL = dash
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
SHELLCHECK_SHELL = sh
|
||||
|
|
|
@ -7,5 +7,4 @@ init_SCRIPTS = zfs-import zfs-load-key zfs-mount zfs-share zfs-zed
|
|||
|
||||
SUBSTFILES += $(init_SCRIPTS)
|
||||
|
||||
SHELLCHECK_SHELL = dash
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
SHELLCHECK_SHELL = sh
|
||||
|
|
|
@ -14,6 +14,7 @@ ConditionPathIsDirectory=/sys/module/zfs
|
|||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
EnvironmentFile=-@initconfdir@/zfs
|
||||
ExecStart=@sbindir@/zpool import -c @sysconfdir@/zfs/zpool.cache -aN $ZPOOL_IMPORT_OPTS
|
||||
|
||||
[Install]
|
||||
|
|
|
@ -13,6 +13,7 @@ ConditionPathIsDirectory=/sys/module/zfs
|
|||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
EnvironmentFile=-@initconfdir@/zfs
|
||||
ExecStart=@sbindir@/zpool import -aN -o cachefile=none $ZPOOL_IMPORT_OPTS
|
||||
|
||||
[Install]
|
||||
|
|
|
@ -11,6 +11,7 @@ ConditionPathIsDirectory=/sys/module/zfs
|
|||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
EnvironmentFile=-@initconfdir@/zfs
|
||||
ExecStart=@sbindir@/zfs mount -a
|
||||
|
||||
[Install]
|
||||
|
|
|
@ -7,8 +7,9 @@ ConditionACPower=true
|
|||
ConditionPathIsDirectory=/sys/module/zfs
|
||||
|
||||
[Service]
|
||||
EnvironmentFile=-@initconfdir@/zfs
|
||||
ExecStart=/bin/sh -c '\
|
||||
if @sbindir@/zpool status %i | grep "scrub in progress"; then\
|
||||
if @sbindir@/zpool status %i | grep -q "scrub in progress"; then\
|
||||
exec @sbindir@/zpool wait -t scrub %i;\
|
||||
else exec @sbindir@/zpool scrub -w %i; fi'
|
||||
ExecStop=-/bin/sh -c '@sbindir@/zpool scrub -p %i 2>/dev/null || true'
|
||||
|
|
|
@ -13,6 +13,7 @@ ConditionPathIsDirectory=/sys/module/zfs
|
|||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
EnvironmentFile=-@initconfdir@/zfs
|
||||
ExecStart=@sbindir@/zfs share -a
|
||||
|
||||
[Install]
|
||||
|
|
|
@ -8,6 +8,7 @@ ConditionPathIsDirectory=/sys/module/zfs
|
|||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
EnvironmentFile=-@initconfdir@/zfs
|
||||
ExecStart=@bindir@/zvol_wait
|
||||
|
||||
[Install]
|
||||
|
|
|
@ -4,6 +4,7 @@ Documentation=man:zed(8)
|
|||
ConditionPathIsDirectory=/sys/module/zfs
|
||||
|
||||
[Service]
|
||||
EnvironmentFile=-@initconfdir@/zfs
|
||||
ExecStart=@sbindir@/zed -F
|
||||
Restart=on-abort
|
||||
|
||||
|
|
|
@ -15,5 +15,4 @@ pkgsysconf_SCRIPTS = \
|
|||
|
||||
SUBSTFILES += $(pkgsysconf_SCRIPTS)
|
||||
|
||||
SHELLCHECK_OPTS = --enable=all
|
||||
SHELLCHECK_SHELL = dash
|
||||
SHELLCHECK_SHELL = sh
|
||||
|
|
|
@ -85,14 +85,14 @@ extern void uu_warn(const char *, ...)
|
|||
__attribute__((format(printf, 1, 2)));
|
||||
extern void uu_vwarn(const char *, va_list)
|
||||
__attribute__((format(printf, 1, 0)));
|
||||
extern void uu_die(const char *, ...)
|
||||
__attribute__((format(printf, 1, 2))) __NORETURN;
|
||||
extern void uu_vdie(const char *, va_list)
|
||||
__attribute__((format(printf, 1, 0))) __NORETURN;
|
||||
extern void uu_xdie(int, const char *, ...)
|
||||
__attribute__((format(printf, 2, 3))) __NORETURN;
|
||||
extern void uu_vxdie(int, const char *, va_list)
|
||||
__attribute__((format(printf, 2, 0))) __NORETURN;
|
||||
extern _Noreturn void uu_die(const char *, ...)
|
||||
__attribute__((format(printf, 1, 2)));
|
||||
extern _Noreturn void uu_vdie(const char *, va_list)
|
||||
__attribute__((format(printf, 1, 0)));
|
||||
extern _Noreturn void uu_xdie(int, const char *, ...)
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
extern _Noreturn void uu_vxdie(int, const char *, va_list)
|
||||
__attribute__((format(printf, 2, 0)));
|
||||
|
||||
/*
|
||||
* Exit status functions (not to be used directly)
|
||||
|
|
|
@ -553,8 +553,8 @@ _LIBZFS_H int zfs_crypto_create(libzfs_handle_t *, char *, nvlist_t *,
|
|||
nvlist_t *, boolean_t stdin_available, uint8_t **, uint_t *);
|
||||
_LIBZFS_H int zfs_crypto_clone_check(libzfs_handle_t *, zfs_handle_t *, char *,
|
||||
nvlist_t *);
|
||||
_LIBZFS_H int zfs_crypto_attempt_load_keys(libzfs_handle_t *, char *);
|
||||
_LIBZFS_H int zfs_crypto_load_key(zfs_handle_t *, boolean_t, char *);
|
||||
_LIBZFS_H int zfs_crypto_attempt_load_keys(libzfs_handle_t *, const char *);
|
||||
_LIBZFS_H int zfs_crypto_load_key(zfs_handle_t *, boolean_t, const char *);
|
||||
_LIBZFS_H int zfs_crypto_unload_key(zfs_handle_t *);
|
||||
_LIBZFS_H int zfs_crypto_rewrap(zfs_handle_t *, nvlist_t *, boolean_t);
|
||||
|
||||
|
|
|
@ -86,6 +86,7 @@ enum lzc_send_flags {
|
|||
LZC_SEND_FLAG_SAVED = 1 << 4,
|
||||
};
|
||||
|
||||
_LIBZFS_CORE_H int lzc_send_wrapper(int (*)(int, void *), int, void *);
|
||||
_LIBZFS_CORE_H int lzc_send(const char *, const char *, int,
|
||||
enum lzc_send_flags);
|
||||
_LIBZFS_CORE_H int lzc_send_resume(const char *, const char *, int,
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
#define __always_inline inline
|
||||
#define noinline __noinline
|
||||
#define ____cacheline_aligned __aligned(CACHE_LINE_SIZE)
|
||||
#define fallthrough __attribute__((__fallthrough__))
|
||||
#define zfs_fallthrough __attribute__((__fallthrough__))
|
||||
|
||||
#if !defined(_KERNEL) && !defined(_STANDALONE)
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
|
|
|
@ -82,18 +82,17 @@ typedef struct {
|
|||
volatile int counter;
|
||||
} atomic_t;
|
||||
|
||||
/* BEGIN CSTYLED */
|
||||
#define hlist_for_each(p, head) \
|
||||
for (p = (head)->first; p; p = (p)->next)
|
||||
|
||||
#define hlist_entry(ptr, type, field) container_of(ptr, type, field)
|
||||
|
||||
#define container_of(ptr, type, member) \
|
||||
/* CSTYLED */ \
|
||||
({ \
|
||||
const __typeof(((type *)0)->member) *__p = (ptr); \
|
||||
(type *)((uintptr_t)__p - offsetof(type, member)); \
|
||||
const __typeof(((type *)0)->member) *__p = (ptr); \
|
||||
(type *)((uintptr_t)__p - offsetof(type, member)); \
|
||||
})
|
||||
/* END CSTYLED */
|
||||
|
||||
static inline void
|
||||
hlist_add_head(struct hlist_node *n, struct hlist_head *h)
|
||||
|
|
|
@ -34,12 +34,10 @@
|
|||
#define isalnum(ch) (isalpha(ch) || isdigit(ch))
|
||||
#define iscntrl(C) (uchar(C) <= 0x1f || uchar(C) == 0x7f)
|
||||
#define isgraph(C) ((C) >= 0x21 && (C) <= 0x7E)
|
||||
/* BEGIN CSTYLED */
|
||||
#define ispunct(C) \
|
||||
(((C) >= 0x21 && (C) <= 0x2F) || \
|
||||
((C) >= 0x3A && (C) <= 0x40) || \
|
||||
((C) >= 0x5B && (C) <= 0x60) || \
|
||||
((C) >= 0x7B && (C) <= 0x7E))
|
||||
/* END CSTYLED */
|
||||
#define ispunct(C) \
|
||||
(((C) >= 0x21 && (C) <= 0x2F) || \
|
||||
((C) >= 0x3A && (C) <= 0x40) || \
|
||||
((C) >= 0x5B && (C) <= 0x60) || \
|
||||
((C) >= 0x7B && (C) <= 0x7E))
|
||||
|
||||
#endif
|
||||
|
|
|
@ -64,83 +64,87 @@ void spl_dumpstack(void);
|
|||
#define likely(expr) expect((expr) != 0, 1)
|
||||
#define unlikely(expr) expect((expr) != 0, 0)
|
||||
|
||||
/* BEGIN CSTYLED */
|
||||
#define PANIC(fmt, a...) \
|
||||
spl_panic(__FILE__, __FUNCTION__, __LINE__, fmt, ## a)
|
||||
|
||||
#define VERIFY(cond) \
|
||||
(void) (unlikely(!(cond)) && \
|
||||
#define VERIFY(cond) \
|
||||
(void) (unlikely(!(cond)) && \
|
||||
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
||||
"%s", "VERIFY(" #cond ") failed\n"))
|
||||
|
||||
#define VERIFY3B(LEFT, OP, RIGHT) do { \
|
||||
#define VERIFY3B(LEFT, OP, RIGHT) do { \
|
||||
const boolean_t _verify3_left = (boolean_t)(LEFT); \
|
||||
const boolean_t _verify3_right = (boolean_t)(RIGHT);\
|
||||
const boolean_t _verify3_right = (boolean_t)(RIGHT); \
|
||||
if (unlikely(!(_verify3_left OP _verify3_right))) \
|
||||
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
||||
"VERIFY3(" #LEFT " " #OP " " #RIGHT ") " \
|
||||
"failed (%d " #OP " %d)\n", \
|
||||
(boolean_t) (_verify3_left), \
|
||||
(boolean_t) (_verify3_right)); \
|
||||
"failed (%d " #OP " %d)\n", \
|
||||
(boolean_t)(_verify3_left), \
|
||||
(boolean_t)(_verify3_right)); \
|
||||
} while (0)
|
||||
|
||||
#define VERIFY3S(LEFT, OP, RIGHT) do { \
|
||||
#define VERIFY3S(LEFT, OP, RIGHT) do { \
|
||||
const int64_t _verify3_left = (int64_t)(LEFT); \
|
||||
const int64_t _verify3_right = (int64_t)(RIGHT); \
|
||||
if (unlikely(!(_verify3_left OP _verify3_right))) \
|
||||
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
||||
"VERIFY3(" #LEFT " " #OP " " #RIGHT ") " \
|
||||
"failed (%lld " #OP " %lld)\n", \
|
||||
(long long) (_verify3_left), \
|
||||
(long long) (_verify3_right)); \
|
||||
"failed (%lld " #OP " %lld)\n", \
|
||||
(long long) (_verify3_left), \
|
||||
(long long) (_verify3_right)); \
|
||||
} while (0)
|
||||
|
||||
#define VERIFY3U(LEFT, OP, RIGHT) do { \
|
||||
#define VERIFY3U(LEFT, OP, RIGHT) do { \
|
||||
const uint64_t _verify3_left = (uint64_t)(LEFT); \
|
||||
const uint64_t _verify3_right = (uint64_t)(RIGHT); \
|
||||
if (unlikely(!(_verify3_left OP _verify3_right))) \
|
||||
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
||||
"VERIFY3(" #LEFT " " #OP " " #RIGHT ") " \
|
||||
"failed (%llu " #OP " %llu)\n", \
|
||||
(unsigned long long) (_verify3_left), \
|
||||
(unsigned long long) (_verify3_right)); \
|
||||
"failed (%llu " #OP " %llu)\n", \
|
||||
(unsigned long long) (_verify3_left), \
|
||||
(unsigned long long) (_verify3_right)); \
|
||||
} while (0)
|
||||
|
||||
#define VERIFY3P(LEFT, OP, RIGHT) do { \
|
||||
#define VERIFY3P(LEFT, OP, RIGHT) do { \
|
||||
const uintptr_t _verify3_left = (uintptr_t)(LEFT); \
|
||||
const uintptr_t _verify3_right = (uintptr_t)(RIGHT);\
|
||||
const uintptr_t _verify3_right = (uintptr_t)(RIGHT); \
|
||||
if (unlikely(!(_verify3_left OP _verify3_right))) \
|
||||
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
||||
"VERIFY3(" #LEFT " " #OP " " #RIGHT ") " \
|
||||
"failed (%px " #OP " %px)\n", \
|
||||
(void *) (_verify3_left), \
|
||||
(void *) (_verify3_right)); \
|
||||
"failed (%px " #OP " %px)\n", \
|
||||
(void *) (_verify3_left), \
|
||||
(void *) (_verify3_right)); \
|
||||
} while (0)
|
||||
|
||||
#define VERIFY0(RIGHT) do { \
|
||||
const int64_t _verify3_left = (int64_t)(0); \
|
||||
#define VERIFY0(RIGHT) do { \
|
||||
const int64_t _verify3_left = (int64_t)(0); \
|
||||
const int64_t _verify3_right = (int64_t)(RIGHT); \
|
||||
if (unlikely(!(_verify3_left == _verify3_right))) \
|
||||
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
||||
"VERIFY3(0 == " #RIGHT ") " \
|
||||
"failed (0 == %lld)\n", \
|
||||
(long long) (_verify3_right)); \
|
||||
"VERIFY3(0 == " #RIGHT ") " \
|
||||
"failed (0 == %lld)\n", \
|
||||
(long long) (_verify3_right)); \
|
||||
} while (0)
|
||||
#define CTASSERT_GLOBAL(x) CTASSERT(x)
|
||||
|
||||
/*
|
||||
* Debugging disabled (--disable-debug)
|
||||
*/
|
||||
#ifdef NDEBUG
|
||||
|
||||
#define ASSERT(x) ((void) sizeof (!!(x)))
|
||||
#define ASSERT3B(x,y,z) ((void) sizeof (!!(x)), (void) sizeof (!!(z)))
|
||||
#define ASSERT3S(x,y,z) ((void) sizeof (!!(x)), (void) sizeof (!!(z)))
|
||||
#define ASSERT3U(x,y,z) ((void) sizeof (!!(x)), (void) sizeof (!!(z)))
|
||||
#define ASSERT3P(x,y,z) ((void) sizeof (!!(x)), (void) sizeof (!!(z)))
|
||||
#define ASSERT0(x) ((void) sizeof (!!(x)))
|
||||
#define IMPLY(A, B) ((void) sizeof (!!(A)), (void) sizeof (!!(B)))
|
||||
#define EQUIV(A, B) ((void) sizeof (!!(A)), (void) sizeof (!!(B)))
|
||||
#define ASSERT(x) ((void) sizeof ((uintptr_t)(x)))
|
||||
#define ASSERT3B(x, y, z) \
|
||||
((void) sizeof ((uintptr_t)(x)), (void) sizeof ((uintptr_t)(z)))
|
||||
#define ASSERT3S(x, y, z) \
|
||||
((void) sizeof ((uintptr_t)(x)), (void) sizeof ((uintptr_t)(z)))
|
||||
#define ASSERT3U(x, y, z) \
|
||||
((void) sizeof ((uintptr_t)(x)), (void) sizeof ((uintptr_t)(z)))
|
||||
#define ASSERT3P(x, y, z) \
|
||||
((void) sizeof ((uintptr_t)(x)), (void) sizeof ((uintptr_t)(z)))
|
||||
#define ASSERT0(x) ((void) sizeof ((uintptr_t)(x)))
|
||||
#define IMPLY(A, B) \
|
||||
((void) sizeof ((uintptr_t)(A)), (void) sizeof ((uintptr_t)(B)))
|
||||
#define EQUIV(A, B) \
|
||||
((void) sizeof ((uintptr_t)(A)), (void) sizeof ((uintptr_t)(B)))
|
||||
|
||||
/*
|
||||
* Debugging enabled (--enable-debug)
|
||||
|
@ -161,7 +165,6 @@ void spl_dumpstack(void);
|
|||
((void)(likely(!!(A) == !!(B)) || \
|
||||
spl_panic(__FILE__, __FUNCTION__, __LINE__, \
|
||||
"(" #A ") is equivalent to (" #B ")")))
|
||||
/* END CSTYLED */
|
||||
|
||||
#endif /* NDEBUG */
|
||||
|
||||
|
|
|
@ -43,10 +43,10 @@
|
|||
#define ZMOD_RW CTLFLAG_RWTUN
|
||||
#define ZMOD_RD CTLFLAG_RDTUN
|
||||
|
||||
/* BEGIN CSTYLED */
|
||||
#define ZFS_MODULE_PARAM(scope_prefix, name_prefix, name, type, perm, desc) \
|
||||
SYSCTL_DECL(_vfs_ ## scope_prefix); \
|
||||
SYSCTL_##type(_vfs_ ## scope_prefix, OID_AUTO, name, perm, &name_prefix ## name, 0, desc)
|
||||
SYSCTL_##type(_vfs_ ## scope_prefix, OID_AUTO, name, perm, \
|
||||
&name_prefix ## name, 0, desc)
|
||||
|
||||
#define ZFS_MODULE_PARAM_ARGS SYSCTL_HANDLER_ARGS
|
||||
|
||||
|
@ -54,8 +54,10 @@
|
|||
SYSCTL_DECL(parent); \
|
||||
SYSCTL_PROC(parent, OID_AUTO, name, perm | args, desc)
|
||||
|
||||
#define ZFS_MODULE_PARAM_CALL(scope_prefix, name_prefix, name, func, _, perm, desc) \
|
||||
ZFS_MODULE_PARAM_CALL_IMPL(_vfs_ ## scope_prefix, name, perm, func ## _args(name_prefix ## name), desc)
|
||||
#define ZFS_MODULE_PARAM_CALL( \
|
||||
scope_prefix, name_prefix, name, func, _, perm, desc) \
|
||||
ZFS_MODULE_PARAM_CALL_IMPL(_vfs_ ## scope_prefix, name, perm, \
|
||||
func ## _args(name_prefix ## name), desc)
|
||||
|
||||
#define ZFS_MODULE_VIRTUAL_PARAM_CALL ZFS_MODULE_PARAM_CALL
|
||||
|
||||
|
@ -96,29 +98,28 @@
|
|||
CTLTYPE_STRING, NULL, 0, fletcher_4_param, "A"
|
||||
|
||||
#include <sys/kernel.h>
|
||||
#define module_init(fn) \
|
||||
#define module_init(fn) \
|
||||
static void \
|
||||
wrap_ ## fn(void *dummy __unused) \
|
||||
{ \
|
||||
fn(); \
|
||||
} \
|
||||
{ \
|
||||
fn(); \
|
||||
} \
|
||||
SYSINIT(zfs_ ## fn, SI_SUB_LAST, SI_ORDER_FIRST, wrap_ ## fn, NULL)
|
||||
|
||||
#define module_init_early(fn) \
|
||||
#define module_init_early(fn) \
|
||||
static void \
|
||||
wrap_ ## fn(void *dummy __unused) \
|
||||
{ \
|
||||
fn(); \
|
||||
} \
|
||||
{ \
|
||||
fn(); \
|
||||
} \
|
||||
SYSINIT(zfs_ ## fn, SI_SUB_INT_CONFIG_HOOKS, SI_ORDER_FIRST, wrap_ ## fn, NULL)
|
||||
|
||||
#define module_exit(fn) \
|
||||
#define module_exit(fn) \
|
||||
static void \
|
||||
wrap_ ## fn(void *dummy __unused) \
|
||||
{ \
|
||||
fn(); \
|
||||
} \
|
||||
{ \
|
||||
fn(); \
|
||||
} \
|
||||
SYSUNINIT(zfs_ ## fn, SI_SUB_LAST, SI_ORDER_FIRST, wrap_ ## fn, NULL)
|
||||
/* END CSTYLED */
|
||||
|
||||
#endif /* SPL_MOD_H */
|
||||
|
|
|
@ -48,22 +48,18 @@ typedef enum {
|
|||
typedef struct sx krwlock_t;
|
||||
|
||||
#ifndef OPENSOLARIS_WITNESS
|
||||
#define RW_FLAGS (SX_DUPOK | SX_NOWITNESS)
|
||||
#define RW_FLAGS (SX_DUPOK | SX_NEW | SX_NOWITNESS)
|
||||
#else
|
||||
#define RW_FLAGS (SX_DUPOK)
|
||||
#define RW_FLAGS (SX_DUPOK | SX_NEW)
|
||||
#endif
|
||||
|
||||
#define RW_READ_HELD(x) (rw_read_held((x)))
|
||||
#define RW_WRITE_HELD(x) (rw_write_held((x)))
|
||||
#define RW_LOCK_HELD(x) (rw_lock_held((x)))
|
||||
#define RW_ISWRITER(x) (rw_iswriter(x))
|
||||
/* BEGIN CSTYLED */
|
||||
#define rw_init(lock, desc, type, arg) do { \
|
||||
const char *_name; \
|
||||
ASSERT((type) == 0 || (type) == RW_DEFAULT); \
|
||||
KASSERT(((lock)->lock_object.lo_flags & LO_ALLMASK) != \
|
||||
LO_EXPECTED, ("lock %s already initialized", #lock)); \
|
||||
bzero((lock), sizeof(struct sx)); \
|
||||
for (_name = #lock; *_name != '\0'; _name++) { \
|
||||
if (*_name >= 'a' && *_name <= 'z') \
|
||||
break; \
|
||||
|
@ -87,11 +83,10 @@ typedef struct sx krwlock_t;
|
|||
#define rw_tryupgrade(lock) sx_try_upgrade(lock)
|
||||
#define rw_read_held(lock) \
|
||||
((lock)->sx_lock != SX_LOCK_UNLOCKED && \
|
||||
((lock)->sx_lock & SX_LOCK_SHARED))
|
||||
((lock)->sx_lock & SX_LOCK_SHARED))
|
||||
#define rw_write_held(lock) sx_xlocked(lock)
|
||||
#define rw_lock_held(lock) (rw_read_held(lock) || rw_write_held(lock))
|
||||
#define rw_iswriter(lock) sx_xlocked(lock)
|
||||
#define rw_owner(lock) sx_xholder(lock)
|
||||
|
||||
/* END CSTYLED */
|
||||
#endif /* _OPENSOLARIS_SYS_RWLOCK_H_ */
|
||||
|
|
|
@ -30,8 +30,8 @@
|
|||
#define _OPENSOLARIS_SYS_SDT_H_
|
||||
|
||||
#include_next <sys/sdt.h>
|
||||
/* BEGIN CSTYLED */
|
||||
#ifdef KDTRACE_HOOKS
|
||||
/* CSTYLED */
|
||||
SDT_PROBE_DECLARE(sdt, , , set__error);
|
||||
|
||||
#define SET_ERROR(err) \
|
||||
|
|
|
@ -64,8 +64,8 @@ typedef u_int uint_t;
|
|||
typedef u_char uchar_t;
|
||||
typedef u_short ushort_t;
|
||||
typedef u_long ulong_t;
|
||||
typedef int minor_t;
|
||||
/* END CSTYLED */
|
||||
typedef int minor_t;
|
||||
#ifndef _OFF64_T_DECLARED
|
||||
#define _OFF64_T_DECLARED
|
||||
typedef off_t off64_t;
|
||||
|
|
|
@ -42,8 +42,6 @@
|
|||
#define SUN_CKM_AES_GCM "CKM_AES_GCM"
|
||||
#define SUN_CKM_SHA512_HMAC "CKM_SHA512_HMAC"
|
||||
|
||||
#define CRYPTO_KEY_RAW 1
|
||||
|
||||
#define CRYPTO_BITS2BYTES(n) ((n) == 0 ? 0 : (((n) - 1) >> 3) + 1)
|
||||
#define CRYPTO_BYTES2BITS(n) ((n) << 3)
|
||||
|
||||
|
@ -61,12 +59,11 @@ typedef struct freebsd_crypt_session {
|
|||
typedef void *crypto_mechanism_t;
|
||||
typedef void *crypto_ctx_template_t;
|
||||
/*
|
||||
* Unlike the ICP crypto_key type, this only
|
||||
* Like the ICP crypto_key type, this only
|
||||
* supports <data, length> (the equivalent of
|
||||
* CRYPTO_KEY_RAW).
|
||||
* the former CRYPTO_KEY_RAW).
|
||||
*/
|
||||
typedef struct crypto_key {
|
||||
int ck_format; /* Unused, but minimizes code diff */
|
||||
void *ck_data;
|
||||
size_t ck_length;
|
||||
} crypto_key_t;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue