mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-26 12:12:13 +03:00
Compare commits
150 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ef83e07db5 | |||
| 145af480d3 | |||
| b3b6491ce9 | |||
| b3427b18b1 | |||
| 0e2bb1a3ee | |||
| 037434e4fc | |||
| 190516f0c5 | |||
| e2fddf07bd | |||
| 4cb88d7fdc | |||
| ddcdccbcc4 | |||
| f2eaa97840 | |||
| 7bd292e59b | |||
| 5c80a25653 | |||
| 1d70698174 | |||
| b55ed8df92 | |||
| bcddb18bae | |||
| 6c6153e5b8 | |||
| 336c6d5f54 | |||
| 4b3fbf3c16 | |||
| 02309af096 | |||
| 94a4b7ec3d | |||
| ccbe9efd6b | |||
| 882bc4ad61 | |||
| f4c2b21823 | |||
| d24bdf4ee4 | |||
| 11bd8cd002 | |||
| a38e7bc922 | |||
| d4e8dcf07e | |||
| f03cf651ec | |||
| bc99c809d5 | |||
| 5c19af07d4 | |||
| 2681f8a5b8 | |||
| c7fcf00917 | |||
| 52aae04c6a | |||
| 77ae804f9e | |||
| 3b52ccd7d7 | |||
| bb271d67e8 | |||
| a61915e086 | |||
| 765be36006 | |||
| 0cb2d8a60b | |||
| 745a7f78da | |||
| d6b7903032 | |||
| cd0e238049 | |||
| 3e27b589cf | |||
| 9221ff1888 | |||
| 72a82f312f | |||
| 5753e7a7c5 | |||
| 7f4f461bcf | |||
| f601ee1e43 | |||
| 5987838a3f | |||
| 8285e1b09d | |||
| c454e46336 | |||
| 306cccca27 | |||
| 4730c3f249 | |||
| 4fea6a6737 | |||
| fc3230a781 | |||
| ed064ed596 | |||
| 74bba85423 | |||
| f22ebf8fa6 | |||
| 1fb5566a25 | |||
| be01ee8629 | |||
| efbed102f0 | |||
| 19a4bf445f | |||
| f9baf968b8 | |||
| 9cbc2ed20f | |||
| 9b185de6fa | |||
| 4d4f0d1a05 | |||
| 687de107b7 | |||
| 2e3b3e3a2e | |||
| a35125e3d5 | |||
| fe8b0a33d4 | |||
| d4794c8204 | |||
| 29e05d5345 | |||
| f471a0a0a7 | |||
| d76917b2ec | |||
| 487bb77623 | |||
| f31b45176c | |||
| 4613504809 | |||
| 44bb2fcf38 | |||
| e56dffe4b5 | |||
| e257bd481b | |||
| 1009e60992 | |||
| 4f6599416a | |||
| f42c126029 | |||
| 2ce06d93a8 | |||
| 8ef01afbfc | |||
| 70b7b1975d | |||
| c31c1146b6 | |||
| b3e0853951 | |||
| 0da15f9194 | |||
| 5303fc4c95 | |||
| 4aceda0497 | |||
| ddb5a7a182 | |||
| af1630c883 | |||
| 1828b68a0b | |||
| f4def7ec6c | |||
| c9c9d634aa | |||
| 36a91d6cef | |||
| 1259dc6e6a | |||
| 6575defc52 | |||
| 5d8c081193 | |||
| 14bf91a043 | |||
| 1833de8103 | |||
| a1a52a356b | |||
| 9ec630ff2c | |||
| 4b2bac5fe9 | |||
| 786abf5321 | |||
| 913ae45218 | |||
| af88d47f1e | |||
| 24221589dd | |||
| def73c0735 | |||
| effe984148 | |||
| 19337332cc | |||
| b96737b83e | |||
| 4b7bfcf8a0 | |||
| 07165ce540 | |||
| 6ed7d77b44 | |||
| 64e88992b6 | |||
| ad15fb430a | |||
| 57f6a050e6 | |||
| b3b293c9fc | |||
| bef7c02c81 | |||
| ea61e07413 | |||
| 9519fe1ff8 | |||
| 0c40ff56f2 | |||
| 806c3777e7 | |||
| ac9b1aa1bf | |||
| e20186f5d5 | |||
| 16da688f25 | |||
| e9ee57f682 | |||
| d346361515 | |||
| 12d27e7134 | |||
| a1a29bf8fc | |||
| ea0dda5999 | |||
| d7e640cf95 | |||
| 664d487a5d | |||
| 5bf81fea2f | |||
| 1fca958615 | |||
| 22b0891dbb | |||
| 0e537a0195 | |||
| db9e1c907a | |||
| d11b03ed81 | |||
| 586b5d366e | |||
| 27d9c6ae2b | |||
| b7ecb4ff0d | |||
| af9aa4a216 | |||
| 55ab3773d7 | |||
| 143476ce8d | |||
| d8a97a7be2 | |||
| 8cd9f20a34 |
@@ -6,7 +6,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
checkstyle:
|
checkstyle:
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ jobs:
|
|||||||
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
||||||
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
||||||
libpam0g-dev pamtester python-dev python-setuptools python-cffi \
|
libpam0g-dev pamtester python-dev python-setuptools python-cffi \
|
||||||
python3 python3-dev python3-setuptools python3-cffi
|
python3 python3-dev python3-setuptools python3-cffi python3-packaging \
|
||||||
|
libcurl4-openssl-dev
|
||||||
- name: Autogen.sh
|
- name: Autogen.sh
|
||||||
run: |
|
run: |
|
||||||
sh autogen.sh
|
sh autogen.sh
|
||||||
@@ -44,6 +45,17 @@ jobs:
|
|||||||
sudo sed -i.bak 's/updates/extra updates/' /etc/depmod.d/ubuntu.conf
|
sudo sed -i.bak 's/updates/extra updates/' /etc/depmod.d/ubuntu.conf
|
||||||
sudo depmod
|
sudo depmod
|
||||||
sudo modprobe zfs
|
sudo modprobe zfs
|
||||||
|
# Workaround for cloud-init bug
|
||||||
|
# see https://github.com/openzfs/zfs/issues/12644
|
||||||
|
FILE=/lib/udev/rules.d/10-cloud-init-hook-hotplug.rules
|
||||||
|
if [ -r "${FILE}" ]; then
|
||||||
|
HASH=$(md5sum "${FILE}" | awk '{ print $1 }')
|
||||||
|
if [ "${HASH}" = "121ff0ef1936cd2ef65aec0458a35772" ]; then
|
||||||
|
# Just shove a zd* exclusion right above the hotplug hook...
|
||||||
|
sudo sed -i -e s/'LABEL="cloudinit_hook"'/'KERNEL=="zd*", GOTO="cloudinit_end"\n&'/ "${FILE}"
|
||||||
|
sudo udevadm control --reload-rules
|
||||||
|
fi
|
||||||
|
fi
|
||||||
# Workaround to provide additional free space for testing.
|
# Workaround to provide additional free space for testing.
|
||||||
# https://github.com/actions/virtual-environments/issues/2840
|
# https://github.com/actions/virtual-environments/issues/2840
|
||||||
sudo rm -rf /usr/share/dotnet
|
sudo rm -rf /usr/share/dotnet
|
||||||
@@ -52,7 +64,8 @@ jobs:
|
|||||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
||||||
- name: Tests
|
- name: Tests
|
||||||
run: |
|
run: |
|
||||||
/usr/share/zfs/zfs-tests.sh -v -s 3G
|
/usr/share/zfs/zfs-tests.sh -vR -s 3G
|
||||||
|
timeout-minutes: 330
|
||||||
- name: Prepare artifacts
|
- name: Prepare artifacts
|
||||||
if: failure()
|
if: failure()
|
||||||
run: |
|
run: |
|
||||||
@@ -61,7 +74,7 @@ jobs:
|
|||||||
sudo cp /var/log/syslog $RESULTS_PATH/
|
sudo cp /var/log/syslog $RESULTS_PATH/
|
||||||
sudo chmod +r $RESULTS_PATH/*
|
sudo chmod +r $RESULTS_PATH/*
|
||||||
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
||||||
for f in $(find $RESULTS_PATH -name '*:*'); do mv "$f" "${f//:/__}"; done
|
for f in $(find /var/tmp/test_results -name '*:*'); do mv "$f" "${f//:/__}"; done
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v2
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ jobs:
|
|||||||
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
||||||
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
||||||
libpam0g-dev pamtester python-dev python-setuptools python-cffi \
|
libpam0g-dev pamtester python-dev python-setuptools python-cffi \
|
||||||
python3 python3-dev python3-setuptools python3-cffi
|
python3 python3-dev python3-setuptools python3-cffi python3-packaging \
|
||||||
|
libcurl4-openssl-dev
|
||||||
- name: Autogen.sh
|
- name: Autogen.sh
|
||||||
run: |
|
run: |
|
||||||
sh autogen.sh
|
sh autogen.sh
|
||||||
@@ -40,6 +41,17 @@ jobs:
|
|||||||
sudo sed -i.bak 's/updates/extra updates/' /etc/depmod.d/ubuntu.conf
|
sudo sed -i.bak 's/updates/extra updates/' /etc/depmod.d/ubuntu.conf
|
||||||
sudo depmod
|
sudo depmod
|
||||||
sudo modprobe zfs
|
sudo modprobe zfs
|
||||||
|
# Workaround for cloud-init bug
|
||||||
|
# see https://github.com/openzfs/zfs/issues/12644
|
||||||
|
FILE=/lib/udev/rules.d/10-cloud-init-hook-hotplug.rules
|
||||||
|
if [ -r "${FILE}" ]; then
|
||||||
|
HASH=$(md5sum "${FILE}" | awk '{ print $1 }')
|
||||||
|
if [ "${HASH}" = "121ff0ef1936cd2ef65aec0458a35772" ]; then
|
||||||
|
# Just shove a zd* exclusion right above the hotplug hook...
|
||||||
|
sudo sed -i -e s/'LABEL="cloudinit_hook"'/'KERNEL=="zd*", GOTO="cloudinit_end"\n&'/ "${FILE}"
|
||||||
|
sudo udevadm control --reload-rules
|
||||||
|
fi
|
||||||
|
fi
|
||||||
# Workaround to provide additional free space for testing.
|
# Workaround to provide additional free space for testing.
|
||||||
# https://github.com/actions/virtual-environments/issues/2840
|
# https://github.com/actions/virtual-environments/issues/2840
|
||||||
sudo rm -rf /usr/share/dotnet
|
sudo rm -rf /usr/share/dotnet
|
||||||
@@ -48,7 +60,8 @@ jobs:
|
|||||||
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
|
||||||
- name: Tests
|
- name: Tests
|
||||||
run: |
|
run: |
|
||||||
/usr/share/zfs/zfs-tests.sh -v -s 3G -r sanity
|
/usr/share/zfs/zfs-tests.sh -vR -s 3G -r sanity
|
||||||
|
timeout-minutes: 330
|
||||||
- name: Prepare artifacts
|
- name: Prepare artifacts
|
||||||
if: failure()
|
if: failure()
|
||||||
run: |
|
run: |
|
||||||
@@ -57,7 +70,7 @@ jobs:
|
|||||||
sudo cp /var/log/syslog $RESULTS_PATH/
|
sudo cp /var/log/syslog $RESULTS_PATH/
|
||||||
sudo chmod +r $RESULTS_PATH/*
|
sudo chmod +r $RESULTS_PATH/*
|
||||||
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
# Replace ':' in dir names, actions/upload-artifact doesn't support it
|
||||||
for f in $(find $RESULTS_PATH -name '*:*'); do mv "$f" "${f//:/__}"; done
|
for f in $(find /var/tmp/test_results -name '*:*'); do mv "$f" "${f//:/__}"; done
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v2
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ jobs:
|
|||||||
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
|
||||||
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
libssl-dev libffi-dev libaio-dev libelf-dev libmount-dev \
|
||||||
libpam0g-dev \
|
libpam0g-dev \
|
||||||
python-dev python-setuptools python-cffi \
|
python-dev python-setuptools python-cffi python-packaging \
|
||||||
python3 python3-dev python3-setuptools python3-cffi
|
python3 python3-dev python3-setuptools python3-cffi python3-packaging
|
||||||
- name: Autogen.sh
|
- name: Autogen.sh
|
||||||
run: |
|
run: |
|
||||||
sh autogen.sh
|
sh autogen.sh
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
Meta: 1
|
Meta: 1
|
||||||
Name: zfs
|
Name: zfs
|
||||||
Branch: 1.0
|
Branch: 1.0
|
||||||
Version: 2.1.1
|
Version: 2.1.3
|
||||||
Release: 1
|
Release: 1
|
||||||
Release-Tags: relext
|
Release-Tags: relext
|
||||||
License: CDDL
|
License: CDDL
|
||||||
Author: OpenZFS
|
Author: OpenZFS
|
||||||
Linux-Maximum: 5.14
|
Linux-Maximum: 5.16
|
||||||
Linux-Minimum: 3.10
|
Linux-Minimum: 3.10
|
||||||
|
|||||||
+4
-3
@@ -132,10 +132,11 @@ PHONY += checkabi storeabi
|
|||||||
|
|
||||||
checklibabiversion:
|
checklibabiversion:
|
||||||
libabiversion=`abidw -v | $(SED) 's/[^0-9]//g'`; \
|
libabiversion=`abidw -v | $(SED) 's/[^0-9]//g'`; \
|
||||||
if test $$libabiversion -lt "180"; then \
|
if test $$libabiversion -lt "200"; then \
|
||||||
/bin/echo -e "\n" \
|
/bin/echo -e "\n" \
|
||||||
"*** Please use libabigail 1.8.0 version or newer;\n" \
|
"*** Please use libabigail 2.0.0 version or newer;\n" \
|
||||||
"*** otherwise results are not consistent!\n"; \
|
"*** otherwise results are not consistent!\n" \
|
||||||
|
"(or see https://github.com/openzfs/libabigail-docker )\n"; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ This repository contains the code for running OpenZFS on Linux and FreeBSD.
|
|||||||
* [Documentation](https://openzfs.github.io/openzfs-docs/) - for using and developing this repo
|
* [Documentation](https://openzfs.github.io/openzfs-docs/) - for using and developing this repo
|
||||||
* [ZoL Site](https://zfsonlinux.org) - Linux release info & links
|
* [ZoL Site](https://zfsonlinux.org) - Linux release info & links
|
||||||
* [Mailing lists](https://openzfs.github.io/openzfs-docs/Project%20and%20Community/Mailing%20Lists.html)
|
* [Mailing lists](https://openzfs.github.io/openzfs-docs/Project%20and%20Community/Mailing%20Lists.html)
|
||||||
* [OpenZFS site](http://open-zfs.org/) - for conference videos and info on other platforms (illumos, OSX, Windows, etc)
|
* [OpenZFS site](https://openzfs.org/) - for conference videos and info on other platforms (illumos, OSX, Windows, etc)
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
|
|||||||
+35
-14
@@ -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) {
|
if (mntflags & MS_REMOUNT) {
|
||||||
nomtab = 1;
|
nomtab = 1;
|
||||||
remount = 1;
|
remount = 1;
|
||||||
@@ -275,7 +268,10 @@ main(int argc, char **argv)
|
|||||||
return (MOUNT_USAGE);
|
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 */
|
/* treat all snapshots as legacy mount points */
|
||||||
if (zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT)
|
if (zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT)
|
||||||
@@ -293,12 +289,11 @@ main(int argc, char **argv)
|
|||||||
if (zfs_version == 0) {
|
if (zfs_version == 0) {
|
||||||
fprintf(stderr, gettext("unable to fetch "
|
fprintf(stderr, gettext("unable to fetch "
|
||||||
"ZFS version for filesystem '%s'\n"), dataset);
|
"ZFS version for filesystem '%s'\n"), dataset);
|
||||||
|
zfs_close(zhp);
|
||||||
|
libzfs_fini(g_zfs);
|
||||||
return (MOUNT_SYSERR);
|
return (MOUNT_SYSERR);
|
||||||
}
|
}
|
||||||
|
|
||||||
zfs_close(zhp);
|
|
||||||
libzfs_fini(g_zfs);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Legacy mount points may only be mounted using 'mount', never using
|
* Legacy mount points may only be mounted using 'mount', never using
|
||||||
* 'zfs mount'. However, since 'zfs mount' actually invokes 'mount'
|
* '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"
|
"Use 'zfs set mountpoint=%s' or 'mount -t zfs %s %s'.\n"
|
||||||
"See zfs(8) for more information.\n"),
|
"See zfs(8) for more information.\n"),
|
||||||
dataset, mntpoint, dataset, mntpoint);
|
dataset, mntpoint, dataset, mntpoint);
|
||||||
|
zfs_close(zhp);
|
||||||
|
libzfs_fini(g_zfs);
|
||||||
return (MOUNT_USAGE);
|
return (MOUNT_USAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,14 +323,38 @@ main(int argc, char **argv)
|
|||||||
"Use 'zfs set mountpoint=%s' or 'zfs mount %s'.\n"
|
"Use 'zfs set mountpoint=%s' or 'zfs mount %s'.\n"
|
||||||
"See zfs(8) for more information.\n"),
|
"See zfs(8) for more information.\n"),
|
||||||
dataset, "legacy", dataset);
|
dataset, "legacy", dataset);
|
||||||
|
zfs_close(zhp);
|
||||||
|
libzfs_fini(g_zfs);
|
||||||
return (MOUNT_USAGE);
|
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) {
|
if (!fake) {
|
||||||
error = mount(dataset, mntpoint, MNTTYPE_ZFS,
|
if (zfsutil && !sloppy &&
|
||||||
mntflags, mntopts);
|
!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) {
|
if (error) {
|
||||||
switch (errno) {
|
switch (errno) {
|
||||||
case ENOENT:
|
case ENOENT:
|
||||||
@@ -368,7 +389,7 @@ main(int argc, char **argv)
|
|||||||
"mount the filesystem again.\n"), dataset);
|
"mount the filesystem again.\n"), dataset);
|
||||||
return (MOUNT_SYSERR);
|
return (MOUNT_SYSERR);
|
||||||
}
|
}
|
||||||
/* fallthru */
|
fallthrough;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
(void) fprintf(stderr, gettext("filesystem "
|
(void) fprintf(stderr, gettext("filesystem "
|
||||||
|
|||||||
+10
-7
@@ -375,7 +375,7 @@ sas_handler() {
|
|||||||
i=$((i + 1))
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
PHY=$(ls -d "$port_dir"/phy* 2>/dev/null | head -1 | awk -F: '{print $NF}')
|
PHY=$(ls -vd "$port_dir"/phy* 2>/dev/null | head -1 | awk -F: '{print $NF}')
|
||||||
if [ -z "$PHY" ] ; then
|
if [ -z "$PHY" ] ; then
|
||||||
PHY=0
|
PHY=0
|
||||||
fi
|
fi
|
||||||
@@ -596,7 +596,9 @@ enclosure_handler () {
|
|||||||
# DEVPATH=/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0/host0/subsystem/devices/0:0:0:0/scsi_generic/sg0
|
# DEVPATH=/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0/host0/subsystem/devices/0:0:0:0/scsi_generic/sg0
|
||||||
|
|
||||||
# Get the enclosure ID ("0:0:0:0")
|
# Get the enclosure ID ("0:0:0:0")
|
||||||
ENC=$(basename $(readlink -m "/sys/$DEVPATH/../.."))
|
ENC="${DEVPATH%/*}"
|
||||||
|
ENC="${ENC%/*}"
|
||||||
|
ENC="${ENC##*/}"
|
||||||
if [ ! -d "/sys/class/enclosure/$ENC" ] ; then
|
if [ ! -d "/sys/class/enclosure/$ENC" ] ; then
|
||||||
# Not an enclosure, bail out
|
# Not an enclosure, bail out
|
||||||
return
|
return
|
||||||
@@ -616,14 +618,15 @@ enclosure_handler () {
|
|||||||
|
|
||||||
# The PCI directory is two directories up from the port directory
|
# The PCI directory is two directories up from the port directory
|
||||||
# /sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0
|
# /sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0
|
||||||
PCI_ID_LONG=$(basename $(readlink -m "/sys/$PORT_DIR/../.."))
|
PCI_ID_LONG="$(readlink -m "/sys/$PORT_DIR/../..")"
|
||||||
|
PCI_ID_LONG="${PCI_ID_LONG##*/}"
|
||||||
|
|
||||||
# Strip down the PCI address from 0000:05:00.0 to 05:00.0
|
# Strip down the PCI address from 0000:05:00.0 to 05:00.0
|
||||||
PCI_ID=$(echo "$PCI_ID_LONG" | sed -r 's/^[0-9]+://g')
|
PCI_ID="${PCI_ID_LONG#[0-9]*:}"
|
||||||
|
|
||||||
# Name our device according to vdev_id.conf (like "L0" or "U1").
|
# Name our device according to vdev_id.conf (like "L0" or "U1").
|
||||||
NAME=$(awk '/channel/{if ($1 == "channel" && $2 == "$PCI_ID" && \
|
NAME=$(awk "/channel/{if (\$1 == \"channel\" && \$2 == \"$PCI_ID\" && \
|
||||||
$3 == "$PORT_ID") {print ${4}int(count[$4])}; count[$4]++}' $CONFIG)
|
\$3 == \"$PORT_ID\") {print \$4\$3}}" $CONFIG)
|
||||||
|
|
||||||
echo "${NAME}"
|
echo "${NAME}"
|
||||||
}
|
}
|
||||||
@@ -674,7 +677,7 @@ alias_handler () {
|
|||||||
link=$(echo "$link" | sed 's/p[0-9][0-9]*$//')
|
link=$(echo "$link" | sed 's/p[0-9][0-9]*$//')
|
||||||
fi
|
fi
|
||||||
# Check both the fully qualified and the base name of link.
|
# Check both the fully qualified and the base name of link.
|
||||||
for l in $link $(basename "$link") ; do
|
for l in $link ${link##*/} ; do
|
||||||
if [ ! -z "$l" ]; then
|
if [ ! -z "$l" ]; then
|
||||||
alias=$(awk -v var="$l" '($1 == "alias") && \
|
alias=$(awk -v var="$l" '($1 == "alias") && \
|
||||||
($3 == var) \
|
($3 == var) \
|
||||||
|
|||||||
+2
-2
@@ -4096,7 +4096,7 @@ cksum_record_compare(const void *x1, const void *x2)
|
|||||||
const cksum_record_t *l = (cksum_record_t *)x1;
|
const cksum_record_t *l = (cksum_record_t *)x1;
|
||||||
const cksum_record_t *r = (cksum_record_t *)x2;
|
const cksum_record_t *r = (cksum_record_t *)x2;
|
||||||
int arraysize = ARRAY_SIZE(l->cksum.zc_word);
|
int arraysize = ARRAY_SIZE(l->cksum.zc_word);
|
||||||
int difference;
|
int difference = 0;
|
||||||
|
|
||||||
for (int i = 0; i < arraysize; i++) {
|
for (int i = 0; i < arraysize; i++) {
|
||||||
difference = TREE_CMP(l->cksum.zc_word[i], r->cksum.zc_word[i]);
|
difference = TREE_CMP(l->cksum.zc_word[i], r->cksum.zc_word[i]);
|
||||||
@@ -4573,7 +4573,7 @@ dump_path_impl(objset_t *os, uint64_t obj, char *name, uint64_t *retobj)
|
|||||||
case DMU_OT_DIRECTORY_CONTENTS:
|
case DMU_OT_DIRECTORY_CONTENTS:
|
||||||
if (s != NULL && *(s + 1) != '\0')
|
if (s != NULL && *(s + 1) != '\0')
|
||||||
return (dump_path_impl(os, child_obj, s + 1, retobj));
|
return (dump_path_impl(os, child_obj, s + 1, retobj));
|
||||||
/*FALLTHROUGH*/
|
fallthrough;
|
||||||
case DMU_OT_PLAIN_FILE_CONTENTS:
|
case DMU_OT_PLAIN_FILE_CONTENTS:
|
||||||
if (retobj != NULL) {
|
if (retobj != NULL) {
|
||||||
*retobj = child_obj;
|
*retobj = child_obj;
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
#include <sys/fm/fs/zfs.h>
|
#include <sys/fm/fs/zfs.h>
|
||||||
#include <libzfs.h>
|
#include <libzfs.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
|
||||||
#include "zfs_agents.h"
|
#include "zfs_agents.h"
|
||||||
#include "fmd_api.h"
|
#include "fmd_api.h"
|
||||||
|
|||||||
+1
-1
@@ -291,7 +291,7 @@ idle:
|
|||||||
rv = zed_event_service(&zcp);
|
rv = zed_event_service(&zcp);
|
||||||
|
|
||||||
/* ENODEV: When kernel module is unloaded (osx) */
|
/* ENODEV: When kernel module is unloaded (osx) */
|
||||||
if (rv == ENODEV)
|
if (rv != 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ if [ "${ZED_SYSLOG_DISPLAY_GUIDS}" = "1" ]; then
|
|||||||
[ -n "${ZEVENT_VDEV_GUID}" ] && msg="${msg} vdev_guid=${ZEVENT_VDEV_GUID}"
|
[ -n "${ZEVENT_VDEV_GUID}" ] && msg="${msg} vdev_guid=${ZEVENT_VDEV_GUID}"
|
||||||
else
|
else
|
||||||
[ -n "${ZEVENT_POOL}" ] && msg="${msg} pool='${ZEVENT_POOL}'"
|
[ -n "${ZEVENT_POOL}" ] && msg="${msg} pool='${ZEVENT_POOL}'"
|
||||||
[ -n "${ZEVENT_VDEV_PATH}" ] && msg="${msg} vdev=$(basename "${ZEVENT_VDEV_PATH}")"
|
[ -n "${ZEVENT_VDEV_PATH}" ] && msg="${msg} vdev=${ZEVENT_VDEV_PATH##*/}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# log pool state if state is anything other than 'ACTIVE'
|
# log pool state if state is anything other than 'ACTIVE'
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
# Rate-limit the notification based in part on the filename.
|
# Rate-limit the notification based in part on the filename.
|
||||||
#
|
#
|
||||||
rate_limit_tag="${ZEVENT_POOL};${ZEVENT_SUBCLASS};$(basename -- "$0")"
|
rate_limit_tag="${ZEVENT_POOL};${ZEVENT_SUBCLASS};${0##*/}"
|
||||||
rate_limit_interval="${ZED_NOTIFY_INTERVAL_SECS}"
|
rate_limit_interval="${ZED_NOTIFY_INTERVAL_SECS}"
|
||||||
zed_rate_limit "${rate_limit_tag}" "${rate_limit_interval}" || exit 3
|
zed_rate_limit "${rate_limit_tag}" "${rate_limit_interval}" || exit 3
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,8 @@
|
|||||||
[ -f "${ZED_ZEDLET_DIR}/zed.rc" ] && . "${ZED_ZEDLET_DIR}/zed.rc"
|
[ -f "${ZED_ZEDLET_DIR}/zed.rc" ] && . "${ZED_ZEDLET_DIR}/zed.rc"
|
||||||
. "${ZED_ZEDLET_DIR}/zed-functions.sh"
|
. "${ZED_ZEDLET_DIR}/zed-functions.sh"
|
||||||
|
|
||||||
if [ ! -d /sys/class/enclosure ] ; then
|
if [ ! -d /sys/class/enclosure ] && [ ! -d /sys/bus/pci/slots ] ; then
|
||||||
|
# No JBOD enclosure or NVMe slots
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -92,6 +93,29 @@ check_and_set_led()
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Fault LEDs for JBODs and NVMe drives are handled a little differently.
|
||||||
|
#
|
||||||
|
# On JBODs the fault LED is called 'fault' and on a path like this:
|
||||||
|
#
|
||||||
|
# /sys/class/enclosure/0:0:1:0/SLOT 10/fault
|
||||||
|
#
|
||||||
|
# On NVMe it's called 'attention' and on a path like this:
|
||||||
|
#
|
||||||
|
# /sys/bus/pci/slot/0/attention
|
||||||
|
#
|
||||||
|
# This function returns the full path to the fault LED file for a given
|
||||||
|
# enclosure/slot directory.
|
||||||
|
#
|
||||||
|
path_to_led()
|
||||||
|
{
|
||||||
|
dir=$1
|
||||||
|
if [ -f "$dir/fault" ] ; then
|
||||||
|
echo "$dir/fault"
|
||||||
|
elif [ -f "$dir/attention" ] ; then
|
||||||
|
echo "$dir/attention"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
state_to_val()
|
state_to_val()
|
||||||
{
|
{
|
||||||
state="$1"
|
state="$1"
|
||||||
@@ -105,6 +129,38 @@ state_to_val()
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Given a nvme name like 'nvme0n1', pass back its slot directory
|
||||||
|
# like "/sys/bus/pci/slots/0"
|
||||||
|
#
|
||||||
|
nvme_dev_to_slot()
|
||||||
|
{
|
||||||
|
dev="$1"
|
||||||
|
|
||||||
|
# Get the address "0000:01:00.0"
|
||||||
|
address=$(cat "/sys/class/block/$dev/device/address")
|
||||||
|
|
||||||
|
# For each /sys/bus/pci/slots subdir that is an actual number
|
||||||
|
# (rather than weird directories like "1-3/").
|
||||||
|
# shellcheck disable=SC2010
|
||||||
|
for i in $(ls /sys/bus/pci/slots/ | grep -E "^[0-9]+$") ; do
|
||||||
|
this_address=$(cat "/sys/bus/pci/slots/$i/address")
|
||||||
|
|
||||||
|
# The format of address is a little different between
|
||||||
|
# /sys/class/block/$dev/device/address and
|
||||||
|
# /sys/bus/pci/slots/
|
||||||
|
#
|
||||||
|
# address= "0000:01:00.0"
|
||||||
|
# this_address = "0000:01:00"
|
||||||
|
#
|
||||||
|
if echo "$address" | grep -Eq ^"$this_address" ; then
|
||||||
|
echo "/sys/bus/pci/slots/$i"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# process_pool (pool)
|
# process_pool (pool)
|
||||||
#
|
#
|
||||||
# Iterate through a pool and set the vdevs' enclosure slot LEDs to
|
# Iterate through a pool and set the vdevs' enclosure slot LEDs to
|
||||||
@@ -134,6 +190,11 @@ process_pool()
|
|||||||
# Get dev name (like 'sda')
|
# Get dev name (like 'sda')
|
||||||
dev=$(basename "$(echo "$therest" | awk '{print $(NF-1)}')")
|
dev=$(basename "$(echo "$therest" | awk '{print $(NF-1)}')")
|
||||||
vdev_enc_sysfs_path=$(realpath "/sys/class/block/$dev/device/enclosure_device"*)
|
vdev_enc_sysfs_path=$(realpath "/sys/class/block/$dev/device/enclosure_device"*)
|
||||||
|
if [ ! -d "$vdev_enc_sysfs_path" ] ; then
|
||||||
|
# This is not a JBOD disk, but it could be a PCI NVMe drive
|
||||||
|
vdev_enc_sysfs_path=$(nvme_dev_to_slot "$dev")
|
||||||
|
fi
|
||||||
|
|
||||||
current_val=$(echo "$therest" | awk '{print $NF}')
|
current_val=$(echo "$therest" | awk '{print $NF}')
|
||||||
|
|
||||||
if [ "$current_val" != "0" ] ; then
|
if [ "$current_val" != "0" ] ; then
|
||||||
@@ -145,9 +206,10 @@ process_pool()
|
|||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -e "$vdev_enc_sysfs_path/fault" ] ; then
|
led_path=$(path_to_led "$vdev_enc_sysfs_path")
|
||||||
|
if [ ! -e "$led_path" ] ; then
|
||||||
rc=3
|
rc=3
|
||||||
zed_log_msg "vdev $vdev '$file/fault' doesn't exist"
|
zed_log_msg "vdev $vdev '$led_path' doesn't exist"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -158,7 +220,7 @@ process_pool()
|
|||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! check_and_set_led "$vdev_enc_sysfs_path/fault" "$val"; then
|
if ! check_and_set_led "$led_path" "$val"; then
|
||||||
rc=3
|
rc=3
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -169,7 +231,8 @@ if [ -n "$ZEVENT_VDEV_ENC_SYSFS_PATH" ] && [ -n "$ZEVENT_VDEV_STATE_STR" ] ; the
|
|||||||
# Got a statechange for an individual vdev
|
# Got a statechange for an individual vdev
|
||||||
val=$(state_to_val "$ZEVENT_VDEV_STATE_STR")
|
val=$(state_to_val "$ZEVENT_VDEV_STATE_STR")
|
||||||
vdev=$(basename "$ZEVENT_VDEV_PATH")
|
vdev=$(basename "$ZEVENT_VDEV_PATH")
|
||||||
check_and_set_led "$ZEVENT_VDEV_ENC_SYSFS_PATH/fault" "$val"
|
ledpath=$(path_to_led "$ZEVENT_VDEV_ENC_SYSFS_PATH")
|
||||||
|
check_and_set_led "$ledpath" "$val"
|
||||||
else
|
else
|
||||||
# Process the entire pool
|
# Process the entire pool
|
||||||
poolname=$(zed_guid_to_pool "$ZEVENT_POOL_GUID")
|
poolname=$(zed_guid_to_pool "$ZEVENT_POOL_GUID")
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
# Send notification in response to a fault induced statechange
|
# Send notification in response to a fault induced statechange
|
||||||
#
|
#
|
||||||
# ZEVENT_SUBCLASS: 'statechange'
|
# ZEVENT_SUBCLASS: 'statechange'
|
||||||
# ZEVENT_VDEV_STATE_STR: 'DEGRADED', 'FAULTED' or 'REMOVED'
|
# ZEVENT_VDEV_STATE_STR: 'DEGRADED', 'FAULTED', 'REMOVED', or 'UNAVAIL'
|
||||||
#
|
#
|
||||||
# Exit codes:
|
# Exit codes:
|
||||||
# 0: notification sent
|
# 0: notification sent
|
||||||
@@ -31,7 +31,8 @@
|
|||||||
|
|
||||||
if [ "${ZEVENT_VDEV_STATE_STR}" != "FAULTED" ] \
|
if [ "${ZEVENT_VDEV_STATE_STR}" != "FAULTED" ] \
|
||||||
&& [ "${ZEVENT_VDEV_STATE_STR}" != "DEGRADED" ] \
|
&& [ "${ZEVENT_VDEV_STATE_STR}" != "DEGRADED" ] \
|
||||||
&& [ "${ZEVENT_VDEV_STATE_STR}" != "REMOVED" ]; then
|
&& [ "${ZEVENT_VDEV_STATE_STR}" != "REMOVED" ] \
|
||||||
|
&& [ "${ZEVENT_VDEV_STATE_STR}" != "UNAVAIL" ]; then
|
||||||
exit 3
|
exit 3
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ zed_log_msg()
|
|||||||
zed_log_err()
|
zed_log_err()
|
||||||
{
|
{
|
||||||
logger -p "${ZED_SYSLOG_PRIORITY}" -t "${ZED_SYSLOG_TAG}" -- "error:" \
|
logger -p "${ZED_SYSLOG_PRIORITY}" -t "${ZED_SYSLOG_TAG}" -- "error:" \
|
||||||
"$(basename -- "$0"):""${ZEVENT_EID:+" eid=${ZEVENT_EID}:"}" "$@"
|
"${0##*/}:""${ZEVENT_EID:+" eid=${ZEVENT_EID}:"}" "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -202,6 +202,10 @@ zed_notify()
|
|||||||
[ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
|
[ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
|
||||||
[ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1))
|
[ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1))
|
||||||
|
|
||||||
|
zed_notify_pushover "${subject}" "${pathname}"; rv=$?
|
||||||
|
[ "${rv}" -eq 0 ] && num_success=$((num_success + 1))
|
||||||
|
[ "${rv}" -eq 1 ] && num_failure=$((num_failure + 1))
|
||||||
|
|
||||||
[ "${num_success}" -gt 0 ] && return 0
|
[ "${num_success}" -gt 0 ] && return 0
|
||||||
[ "${num_failure}" -gt 0 ] && return 1
|
[ "${num_failure}" -gt 0 ] && return 1
|
||||||
return 2
|
return 2
|
||||||
@@ -254,7 +258,7 @@ zed_notify_email()
|
|||||||
[ -n "${subject}" ] || return 1
|
[ -n "${subject}" ] || return 1
|
||||||
if [ ! -r "${pathname}" ]; then
|
if [ ! -r "${pathname}" ]; then
|
||||||
zed_log_err \
|
zed_log_err \
|
||||||
"$(basename "${ZED_EMAIL_PROG}") cannot read \"${pathname}\""
|
"${ZED_EMAIL_PROG##*/} cannot read \"${pathname}\""
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -266,7 +270,7 @@ zed_notify_email()
|
|||||||
eval ${ZED_EMAIL_PROG} ${ZED_EMAIL_OPTS} < "${pathname}" >/dev/null 2>&1
|
eval ${ZED_EMAIL_PROG} ${ZED_EMAIL_OPTS} < "${pathname}" >/dev/null 2>&1
|
||||||
rv=$?
|
rv=$?
|
||||||
if [ "${rv}" -ne 0 ]; then
|
if [ "${rv}" -ne 0 ]; then
|
||||||
zed_log_err "$(basename "${ZED_EMAIL_PROG}") exit=${rv}"
|
zed_log_err "${ZED_EMAIL_PROG##*/} exit=${rv}"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
@@ -413,7 +417,7 @@ zed_notify_slack_webhook()
|
|||||||
|
|
||||||
# Construct the JSON message for posting.
|
# 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.
|
# Send the POST request and check for errors.
|
||||||
#
|
#
|
||||||
@@ -433,6 +437,84 @@ zed_notify_slack_webhook()
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# zed_notify_pushover (subject, pathname)
|
||||||
|
#
|
||||||
|
# Send a notification via Pushover <https://pushover.net/>.
|
||||||
|
# The access token (ZED_PUSHOVER_TOKEN) identifies this client to the
|
||||||
|
# Pushover server. The user token (ZED_PUSHOVER_USER) defines the user or
|
||||||
|
# group to which the notification will be sent.
|
||||||
|
#
|
||||||
|
# Requires curl and sed executables to be installed in the standard PATH.
|
||||||
|
#
|
||||||
|
# References
|
||||||
|
# https://pushover.net/api
|
||||||
|
#
|
||||||
|
# Arguments
|
||||||
|
# subject: notification subject
|
||||||
|
# pathname: pathname containing the notification message (OPTIONAL)
|
||||||
|
#
|
||||||
|
# Globals
|
||||||
|
# ZED_PUSHOVER_TOKEN
|
||||||
|
# ZED_PUSHOVER_USER
|
||||||
|
#
|
||||||
|
# Return
|
||||||
|
# 0: notification sent
|
||||||
|
# 1: notification failed
|
||||||
|
# 2: not configured
|
||||||
|
#
|
||||||
|
zed_notify_pushover()
|
||||||
|
{
|
||||||
|
local subject="$1"
|
||||||
|
local pathname="${2:-"/dev/null"}"
|
||||||
|
local msg_body
|
||||||
|
local msg_out
|
||||||
|
local msg_err
|
||||||
|
local url="https://api.pushover.net/1/messages.json"
|
||||||
|
|
||||||
|
[ -n "${ZED_PUSHOVER_TOKEN}" ] && [ -n "${ZED_PUSHOVER_USER}" ] || return 2
|
||||||
|
|
||||||
|
if [ ! -r "${pathname}" ]; then
|
||||||
|
zed_log_err "pushover cannot read \"${pathname}\""
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
zed_check_cmd "curl" "sed" || return 1
|
||||||
|
|
||||||
|
# Read the message body in.
|
||||||
|
#
|
||||||
|
msg_body="$(cat "${pathname}")"
|
||||||
|
|
||||||
|
if [ -z "${msg_body}" ]
|
||||||
|
then
|
||||||
|
msg_body=$subject
|
||||||
|
subject=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Send the POST request and check for errors.
|
||||||
|
#
|
||||||
|
msg_out="$( \
|
||||||
|
curl \
|
||||||
|
--form-string "token=${ZED_PUSHOVER_TOKEN}" \
|
||||||
|
--form-string "user=${ZED_PUSHOVER_USER}" \
|
||||||
|
--form-string "message=${msg_body}" \
|
||||||
|
--form-string "title=${subject}" \
|
||||||
|
"${url}" \
|
||||||
|
2>/dev/null \
|
||||||
|
)"; rv=$?
|
||||||
|
if [ "${rv}" -ne 0 ]; then
|
||||||
|
zed_log_err "curl exit=${rv}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
msg_err="$(echo "${msg_out}" \
|
||||||
|
| sed -n -e 's/.*"errors" *:.*\[\(.*\)\].*/\1/p')"
|
||||||
|
if [ -n "${msg_err}" ]; then
|
||||||
|
zed_log_err "pushover \"${msg_err}"\"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# zed_rate_limit (tag, [interval])
|
# zed_rate_limit (tag, [interval])
|
||||||
#
|
#
|
||||||
# Check whether an event of a given type [tag] has already occurred within the
|
# Check whether an event of a given type [tag] has already occurred within the
|
||||||
|
|||||||
+21
-4
@@ -13,9 +13,9 @@
|
|||||||
# Email address of the zpool administrator for receipt of notifications;
|
# Email address of the zpool administrator for receipt of notifications;
|
||||||
# multiple addresses can be specified if they are delimited by whitespace.
|
# multiple addresses can be specified if they are delimited by whitespace.
|
||||||
# Email will only be sent if ZED_EMAIL_ADDR is defined.
|
# Email will only be sent if ZED_EMAIL_ADDR is defined.
|
||||||
# Disabled by default; uncomment to enable.
|
# Enabled by default; comment to disable.
|
||||||
#
|
#
|
||||||
#ZED_EMAIL_ADDR="root"
|
ZED_EMAIL_ADDR="root"
|
||||||
|
|
||||||
##
|
##
|
||||||
# Name or path of executable responsible for sending notifications via email;
|
# Name or path of executable responsible for sending notifications via email;
|
||||||
@@ -82,6 +82,23 @@
|
|||||||
#
|
#
|
||||||
#ZED_SLACK_WEBHOOK_URL=""
|
#ZED_SLACK_WEBHOOK_URL=""
|
||||||
|
|
||||||
|
##
|
||||||
|
# Pushover token.
|
||||||
|
# This defines the application from which the notification will be sent.
|
||||||
|
# <https://pushover.net/api#registration>
|
||||||
|
# Disabled by default; uncomment to enable.
|
||||||
|
# ZED_PUSHOVER_USER, below, must also be configured.
|
||||||
|
#
|
||||||
|
#ZED_PUSHOVER_TOKEN=""
|
||||||
|
|
||||||
|
##
|
||||||
|
# Pushover user key.
|
||||||
|
# This defines which user or group will receive Pushover notifications.
|
||||||
|
# <https://pushover.net/api#identifiers>
|
||||||
|
# Disabled by default; uncomment to enable.
|
||||||
|
# ZED_PUSHOVER_TOKEN, above, must also be configured.
|
||||||
|
#ZED_PUSHOVER_USER=""
|
||||||
|
|
||||||
##
|
##
|
||||||
# Default directory for zed state files.
|
# Default directory for zed state files.
|
||||||
#
|
#
|
||||||
@@ -89,8 +106,8 @@
|
|||||||
|
|
||||||
##
|
##
|
||||||
# Turn on/off enclosure LEDs when drives get DEGRADED/FAULTED. This works for
|
# Turn on/off enclosure LEDs when drives get DEGRADED/FAULTED. This works for
|
||||||
# device mapper and multipath devices as well. Your enclosure must be
|
# device mapper and multipath devices as well. This works with JBOD enclosures
|
||||||
# supported by the Linux SES driver for this to work.
|
# and NVMe PCI drives (assuming they're supported by Linux in sysfs).
|
||||||
#
|
#
|
||||||
ZED_USE_ENCLOSURE_LEDS=1
|
ZED_USE_ENCLOSURE_LEDS=1
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|||||||
@@ -26,6 +26,8 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include "zed_exec.h"
|
#include "zed_exec.h"
|
||||||
#include "zed_log.h"
|
#include "zed_log.h"
|
||||||
#include "zed_strings.h"
|
#include "zed_strings.h"
|
||||||
|
|||||||
@@ -7475,6 +7475,7 @@ unshare_unmount(int op, int argc, char **argv)
|
|||||||
if (zfs_prop_get_int(zhp, ZFS_PROP_CANMOUNT) ==
|
if (zfs_prop_get_int(zhp, ZFS_PROP_CANMOUNT) ==
|
||||||
ZFS_CANMOUNT_NOAUTO)
|
ZFS_CANMOUNT_NOAUTO)
|
||||||
continue;
|
continue;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ zpool_LDADD = \
|
|||||||
$(abs_top_builddir)/lib/libzfs/libzfs.la \
|
$(abs_top_builddir)/lib/libzfs/libzfs.la \
|
||||||
$(abs_top_builddir)/lib/libzfs_core/libzfs_core.la \
|
$(abs_top_builddir)/lib/libzfs_core/libzfs_core.la \
|
||||||
$(abs_top_builddir)/lib/libnvpair/libnvpair.la \
|
$(abs_top_builddir)/lib/libnvpair/libnvpair.la \
|
||||||
$(abs_top_builddir)/lib/libuutil/libuutil.la
|
$(abs_top_builddir)/lib/libuutil/libuutil.la \
|
||||||
|
$(abs_top_builddir)/lib/libzutil/libzutil.la
|
||||||
|
|
||||||
zpool_LDADD += $(LTLIBINTL)
|
zpool_LDADD += $(LTLIBINTL)
|
||||||
|
|
||||||
|
|||||||
@@ -16,14 +16,12 @@ if [ -L "$dev" ] ; then
|
|||||||
dev=$(readlink "$dev")
|
dev=$(readlink "$dev")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dev=$(basename "$dev")
|
dev="${dev##*/}"
|
||||||
val=""
|
val=""
|
||||||
if [ -d "/sys/class/block/$dev/slaves" ] ; then
|
if [ -d "/sys/class/block/$dev/slaves" ] ; then
|
||||||
# ls -C: output in columns, no newlines
|
# ls -C: output in columns, no newlines, two spaces (change to one)
|
||||||
val=$(ls -C "/sys/class/block/$dev/slaves")
|
# shellcheck disable=SC2012
|
||||||
|
val=$(ls -C "/sys/class/block/$dev/slaves" | tr -s '[:space:]' ' ')
|
||||||
# ls -C will print two spaces between files; change to one space.
|
|
||||||
val=$(echo "$val" | sed -r 's/[[:blank:]]+/ /g')
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "dm-deps=$val"
|
echo "dm-deps=$val"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ iostat: Show iostat values since boot (summary page).
|
|||||||
iostat-1s: Do a single 1-second iostat sample and show values.
|
iostat-1s: Do a single 1-second iostat sample and show values.
|
||||||
iostat-10s: Do a single 10-second iostat sample and show values."
|
iostat-10s: Do a single 10-second iostat sample and show values."
|
||||||
|
|
||||||
script=$(basename "$0")
|
script="${0##*/}"
|
||||||
if [ "$1" = "-h" ] ; then
|
if [ "$1" = "-h" ] ; then
|
||||||
echo "$helpstr" | grep "$script:" | tr -s '\t' | cut -f 2-
|
echo "$helpstr" | grep "$script:" | tr -s '\t' | cut -f 2-
|
||||||
exit
|
exit
|
||||||
@@ -42,7 +42,7 @@ else
|
|||||||
${brief:+"-y"} \
|
${brief:+"-y"} \
|
||||||
${interval:+"$interval"} \
|
${interval:+"$interval"} \
|
||||||
${interval:+"1"} \
|
${interval:+"1"} \
|
||||||
"$VDEV_UPATH" | awk NF | tail -n 2)
|
"$VDEV_UPATH" | grep -v '^$' | tail -n 2)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ fi
|
|||||||
cols=$(echo "$out" | head -n 1)
|
cols=$(echo "$out" | head -n 1)
|
||||||
|
|
||||||
# Get the values and tab separate them to make them cut-able.
|
# Get the values and tab separate them to make them cut-able.
|
||||||
vals=$(echo "$out" | tail -n 1 | sed -r 's/[[:blank:]]+/\t/g')
|
vals=$(echo "$out" | tail -n 1 | tr -s '[:space:]' '\t')
|
||||||
|
|
||||||
i=0
|
i=0
|
||||||
for col in $cols ; do
|
for col in $cols ; do
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ size: Show the disk capacity.
|
|||||||
vendor: Show the disk vendor.
|
vendor: Show the disk vendor.
|
||||||
lsblk: Show the disk size, vendor, and model number."
|
lsblk: Show the disk size, vendor, and model number."
|
||||||
|
|
||||||
script=$(basename "$0")
|
script="${0##*/}"
|
||||||
|
|
||||||
if [ "$1" = "-h" ] ; then
|
if [ "$1" = "-h" ] ; then
|
||||||
echo "$helpstr" | grep "$script:" | tr -s '\t' | cut -f 2-
|
echo "$helpstr" | grep "$script:" | tr -s '\t' | cut -f 2-
|
||||||
|
|||||||
@@ -9,15 +9,12 @@ if [ "$1" = "-h" ] ; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -b "$VDEV_UPATH" ]; then
|
if [ -b "$VDEV_UPATH" ]; then
|
||||||
device=$(basename "$VDEV_UPATH")
|
device="${VDEV_UPATH##*/}"
|
||||||
val=$(cat "/sys/block/$device/queue/rotational" 2>/dev/null)
|
read -r val 2>/dev/null < "/sys/block/$device/queue/rotational"
|
||||||
if [ "$val" = "0" ]; then
|
case "$val" in
|
||||||
MEDIA="ssd"
|
0) MEDIA="ssd" ;;
|
||||||
fi
|
1) MEDIA="hdd" ;;
|
||||||
|
esac
|
||||||
if [ "$val" = "1" ]; then
|
|
||||||
MEDIA="hdd"
|
|
||||||
fi
|
|
||||||
|
|
||||||
vpd_pg83="/sys/block/$device/device/vpd_pg83"
|
vpd_pg83="/sys/block/$device/device/vpd_pg83"
|
||||||
if [ -f "$vpd_pg83" ]; then
|
if [ -f "$vpd_pg83" ]; then
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ fault_led: Show value of the disk enclosure slot fault LED.
|
|||||||
locate_led: Show value of the disk enclosure slot locate LED.
|
locate_led: Show value of the disk enclosure slot locate LED.
|
||||||
ses: Show disk's enc, enc device, slot, and fault/locate LED values."
|
ses: Show disk's enc, enc device, slot, and fault/locate LED values."
|
||||||
|
|
||||||
script=$(basename "$0")
|
script="${0##*/}"
|
||||||
if [ "$1" = "-h" ] ; then
|
if [ "$1" = "-h" ] ; then
|
||||||
echo "$helpstr" | grep "$script:" | tr -s '\t' | cut -f 2-
|
echo "$helpstr" | grep "$script:" | tr -s '\t' | cut -f 2-
|
||||||
exit
|
exit
|
||||||
@@ -41,7 +41,13 @@ for i in $scripts ; do
|
|||||||
val=$(ls "$VDEV_ENC_SYSFS_PATH/../device/scsi_generic" 2>/dev/null)
|
val=$(ls "$VDEV_ENC_SYSFS_PATH/../device/scsi_generic" 2>/dev/null)
|
||||||
;;
|
;;
|
||||||
fault_led)
|
fault_led)
|
||||||
val=$(cat "$VDEV_ENC_SYSFS_PATH/fault" 2>/dev/null)
|
# JBODs fault LED is called 'fault', NVMe fault LED is called
|
||||||
|
# 'attention'.
|
||||||
|
if [ -f "$VDEV_ENC_SYSFS_PATH/fault" ] ; then
|
||||||
|
val=$(cat "$VDEV_ENC_SYSFS_PATH/fault" 2>/dev/null)
|
||||||
|
elif [ -f "$VDEV_ENC_SYSFS_PATH/attention" ] ; then
|
||||||
|
val=$(cat "$VDEV_ENC_SYSFS_PATH/attention" 2>/dev/null)
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
locate_led)
|
locate_led)
|
||||||
val=$(cat "$VDEV_ENC_SYSFS_PATH/locate" 2>/dev/null)
|
val=$(cat "$VDEV_ENC_SYSFS_PATH/locate" 2>/dev/null)
|
||||||
|
|||||||
+3
-47
@@ -264,51 +264,6 @@ for_each_pool(int argc, char **argv, boolean_t unavail,
|
|||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
for_each_vdev_cb(zpool_handle_t *zhp, nvlist_t *nv, pool_vdev_iter_f func,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
nvlist_t **child;
|
|
||||||
uint_t c, children;
|
|
||||||
int ret = 0;
|
|
||||||
int i;
|
|
||||||
char *type;
|
|
||||||
|
|
||||||
const char *list[] = {
|
|
||||||
ZPOOL_CONFIG_SPARES,
|
|
||||||
ZPOOL_CONFIG_L2CACHE,
|
|
||||||
ZPOOL_CONFIG_CHILDREN
|
|
||||||
};
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(list); i++) {
|
|
||||||
if (nvlist_lookup_nvlist_array(nv, list[i], &child,
|
|
||||||
&children) == 0) {
|
|
||||||
for (c = 0; c < children; c++) {
|
|
||||||
uint64_t ishole = 0;
|
|
||||||
|
|
||||||
(void) nvlist_lookup_uint64(child[c],
|
|
||||||
ZPOOL_CONFIG_IS_HOLE, &ishole);
|
|
||||||
|
|
||||||
if (ishole)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ret |= for_each_vdev_cb(zhp, child[c], func,
|
|
||||||
data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) != 0)
|
|
||||||
return (ret);
|
|
||||||
|
|
||||||
/* Don't run our function on root vdevs */
|
|
||||||
if (strcmp(type, VDEV_TYPE_ROOT) != 0) {
|
|
||||||
ret |= func(zhp, nv, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the equivalent of for_each_pool() for vdevs. It iterates thorough
|
* This is the equivalent of for_each_pool() for vdevs. It iterates thorough
|
||||||
* all vdevs in the pool, ignoring root vdevs and holes, calling func() on
|
* all vdevs in the pool, ignoring root vdevs and holes, calling func() on
|
||||||
@@ -327,7 +282,7 @@ for_each_vdev(zpool_handle_t *zhp, pool_vdev_iter_f func, void *data)
|
|||||||
verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
|
verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
|
||||||
&nvroot) == 0);
|
&nvroot) == 0);
|
||||||
}
|
}
|
||||||
return (for_each_vdev_cb(zhp, nvroot, func, data));
|
return (for_each_vdev_cb((void *) zhp, nvroot, func, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -603,7 +558,7 @@ vdev_run_cmd_thread(void *cb_cmd_data)
|
|||||||
|
|
||||||
/* For each vdev in the pool run a command */
|
/* For each vdev in the pool run a command */
|
||||||
static int
|
static int
|
||||||
for_each_vdev_run_cb(zpool_handle_t *zhp, nvlist_t *nv, void *cb_vcdl)
|
for_each_vdev_run_cb(void *zhp_data, nvlist_t *nv, void *cb_vcdl)
|
||||||
{
|
{
|
||||||
vdev_cmd_data_list_t *vcdl = cb_vcdl;
|
vdev_cmd_data_list_t *vcdl = cb_vcdl;
|
||||||
vdev_cmd_data_t *data;
|
vdev_cmd_data_t *data;
|
||||||
@@ -611,6 +566,7 @@ for_each_vdev_run_cb(zpool_handle_t *zhp, nvlist_t *nv, void *cb_vcdl)
|
|||||||
char *vname = NULL;
|
char *vname = NULL;
|
||||||
char *vdev_enc_sysfs_path = NULL;
|
char *vdev_enc_sysfs_path = NULL;
|
||||||
int i, match = 0;
|
int i, match = 0;
|
||||||
|
zpool_handle_t *zhp = zhp_data;
|
||||||
|
|
||||||
if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) != 0)
|
if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) != 0)
|
||||||
return (1);
|
return (1);
|
||||||
|
|||||||
@@ -4825,7 +4825,7 @@ children:
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
|
vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
|
||||||
cb->cb_name_flags);
|
cb->cb_name_flags | VDEV_NAME_TYPE_ID);
|
||||||
ret += print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
|
ret += print_vdev_stats(zhp, vname, oldnv ? oldchild[c] : NULL,
|
||||||
newchild[c], cb, depth + 2);
|
newchild[c], cb, depth + 2);
|
||||||
free(vname);
|
free(vname);
|
||||||
@@ -4868,7 +4868,7 @@ children:
|
|||||||
}
|
}
|
||||||
|
|
||||||
vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
|
vname = zpool_vdev_name(g_zfs, zhp, newchild[c],
|
||||||
cb->cb_name_flags);
|
cb->cb_name_flags | VDEV_NAME_TYPE_ID);
|
||||||
ret += print_vdev_stats(zhp, vname, oldnv ?
|
ret += print_vdev_stats(zhp, vname, oldnv ?
|
||||||
oldchild[c] : NULL, newchild[c], cb, depth + 2);
|
oldchild[c] : NULL, newchild[c], cb, depth + 2);
|
||||||
free(vname);
|
free(vname);
|
||||||
@@ -5165,11 +5165,12 @@ get_stat_flags(zpool_list_t *list)
|
|||||||
* Return 1 if cb_data->cb_vdev_names[0] is this vdev's name, 0 otherwise.
|
* Return 1 if cb_data->cb_vdev_names[0] is this vdev's name, 0 otherwise.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
is_vdev_cb(zpool_handle_t *zhp, nvlist_t *nv, void *cb_data)
|
is_vdev_cb(void *zhp_data, nvlist_t *nv, void *cb_data)
|
||||||
{
|
{
|
||||||
iostat_cbdata_t *cb = cb_data;
|
iostat_cbdata_t *cb = cb_data;
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
zpool_handle_t *zhp = zhp_data;
|
||||||
|
|
||||||
name = zpool_vdev_name(g_zfs, zhp, nv, cb->cb_name_flags);
|
name = zpool_vdev_name(g_zfs, zhp, nv, cb->cb_name_flags);
|
||||||
|
|
||||||
@@ -6181,7 +6182,7 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
vname = zpool_vdev_name(g_zfs, zhp, child[c],
|
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);
|
print_list_stats(zhp, vname, child[c], cb, depth + 2, B_FALSE);
|
||||||
free(vname);
|
free(vname);
|
||||||
}
|
}
|
||||||
@@ -6215,7 +6216,7 @@ print_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,
|
|||||||
printed = B_TRUE;
|
printed = B_TRUE;
|
||||||
}
|
}
|
||||||
vname = zpool_vdev_name(g_zfs, zhp, child[c],
|
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,
|
print_list_stats(zhp, vname, child[c], cb, depth + 2,
|
||||||
B_FALSE);
|
B_FALSE);
|
||||||
free(vname);
|
free(vname);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include <libnvpair.h>
|
#include <libnvpair.h>
|
||||||
#include <libzfs.h>
|
#include <libzfs.h>
|
||||||
|
#include <libzutil.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -67,7 +68,6 @@ int for_each_pool(int, char **, boolean_t unavail, zprop_list_t **,
|
|||||||
boolean_t, zpool_iter_f, void *);
|
boolean_t, zpool_iter_f, void *);
|
||||||
|
|
||||||
/* Vdev list functions */
|
/* Vdev list functions */
|
||||||
typedef int (*pool_vdev_iter_f)(zpool_handle_t *, nvlist_t *, void *);
|
|
||||||
int for_each_vdev(zpool_handle_t *zhp, pool_vdev_iter_f func, void *data);
|
int for_each_vdev(zpool_handle_t *zhp, pool_vdev_iter_f func, void *data);
|
||||||
|
|
||||||
typedef struct zpool_list zpool_list_t;
|
typedef struct zpool_list zpool_list_t;
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ escape_string(char *s)
|
|||||||
case '=':
|
case '=':
|
||||||
case '\\':
|
case '\\':
|
||||||
*d++ = '\\';
|
*d++ = '\\';
|
||||||
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
*d = *c;
|
*d = *c;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -297,6 +297,7 @@ zstream_do_dump(int argc, char *argv[])
|
|||||||
|
|
||||||
fletcher_4_init();
|
fletcher_4_init();
|
||||||
while (read_hdr(drr, &zc)) {
|
while (read_hdr(drr, &zc)) {
|
||||||
|
uint64_t featureflags = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If this is the first DMU record being processed, check for
|
* 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);
|
BSWAP_64(drrb->drr_fromguid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
featureflags =
|
||||||
|
DMU_GET_FEATUREFLAGS(drrb->drr_versioninfo);
|
||||||
|
|
||||||
(void) printf("BEGIN record\n");
|
(void) printf("BEGIN record\n");
|
||||||
(void) printf("\thdrtype = %lld\n",
|
(void) printf("\thdrtype = %lld\n",
|
||||||
DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo));
|
DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo));
|
||||||
@@ -461,6 +465,15 @@ zstream_do_dump(int argc, char *argv[])
|
|||||||
BSWAP_64(drro->drr_maxblkid);
|
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);
|
payload_size = DRR_OBJECT_PAYLOAD_SIZE(drro);
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
|
|||||||
+1
-1
@@ -26,6 +26,7 @@ AM_LIBTOOLFLAGS = --silent
|
|||||||
AM_CFLAGS = -std=gnu99 -Wall -Wstrict-prototypes -Wmissing-prototypes
|
AM_CFLAGS = -std=gnu99 -Wall -Wstrict-prototypes -Wmissing-prototypes
|
||||||
AM_CFLAGS += -fno-strict-aliasing
|
AM_CFLAGS += -fno-strict-aliasing
|
||||||
AM_CFLAGS += $(NO_OMIT_FRAME_POINTER)
|
AM_CFLAGS += $(NO_OMIT_FRAME_POINTER)
|
||||||
|
AM_CFLAGS += $(IMPLICIT_FALLTHROUGH)
|
||||||
AM_CFLAGS += $(DEBUG_CFLAGS)
|
AM_CFLAGS += $(DEBUG_CFLAGS)
|
||||||
AM_CFLAGS += $(ASAN_CFLAGS)
|
AM_CFLAGS += $(ASAN_CFLAGS)
|
||||||
AM_CFLAGS += $(CODE_COVERAGE_CFLAGS) $(NO_FORMAT_ZERO_LENGTH)
|
AM_CFLAGS += $(CODE_COVERAGE_CFLAGS) $(NO_FORMAT_ZERO_LENGTH)
|
||||||
@@ -39,7 +40,6 @@ AM_CPPFLAGS = -D_GNU_SOURCE
|
|||||||
AM_CPPFLAGS += -D_REENTRANT
|
AM_CPPFLAGS += -D_REENTRANT
|
||||||
AM_CPPFLAGS += -D_FILE_OFFSET_BITS=64
|
AM_CPPFLAGS += -D_FILE_OFFSET_BITS=64
|
||||||
AM_CPPFLAGS += -D_LARGEFILE64_SOURCE
|
AM_CPPFLAGS += -D_LARGEFILE64_SOURCE
|
||||||
AM_CPPFLAGS += -DHAVE_LARGE_STACKS=1
|
|
||||||
AM_CPPFLAGS += -DLIBEXECDIR=\"$(libexecdir)\"
|
AM_CPPFLAGS += -DLIBEXECDIR=\"$(libexecdir)\"
|
||||||
AM_CPPFLAGS += -DRUNSTATEDIR=\"$(runstatedir)\"
|
AM_CPPFLAGS += -DRUNSTATEDIR=\"$(runstatedir)\"
|
||||||
AM_CPPFLAGS += -DSBINDIR=\"$(sbindir)\"
|
AM_CPPFLAGS += -DSBINDIR=\"$(sbindir)\"
|
||||||
|
|||||||
@@ -15,7 +15,9 @@ subst_sed_cmd = \
|
|||||||
-e 's|@PYTHON[@]|$(PYTHON)|g' \
|
-e 's|@PYTHON[@]|$(PYTHON)|g' \
|
||||||
-e 's|@PYTHON_SHEBANG[@]|$(PYTHON_SHEBANG)|g' \
|
-e 's|@PYTHON_SHEBANG[@]|$(PYTHON_SHEBANG)|g' \
|
||||||
-e 's|@DEFAULT_INIT_NFS_SERVER[@]|$(DEFAULT_INIT_NFS_SERVER)|g' \
|
-e 's|@DEFAULT_INIT_NFS_SERVER[@]|$(DEFAULT_INIT_NFS_SERVER)|g' \
|
||||||
-e 's|@DEFAULT_INIT_SHELL[@]|$(DEFAULT_INIT_SHELL)|g'
|
-e 's|@DEFAULT_INIT_SHELL[@]|$(DEFAULT_INIT_SHELL)|g' \
|
||||||
|
-e 's|@LIBFETCH_DYNAMIC[@]|$(LIBFETCH_DYNAMIC)|g' \
|
||||||
|
-e 's|@LIBFETCH_SONAME[@]|$(LIBFETCH_SONAME)|g'
|
||||||
|
|
||||||
SUBSTFILES =
|
SUBSTFILES =
|
||||||
CLEANFILES = $(SUBSTFILES)
|
CLEANFILES = $(SUBSTFILES)
|
||||||
|
|||||||
@@ -161,6 +161,29 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_UNUSED_BUT_SET_VARIABLE], [
|
|||||||
AC_SUBST([NO_UNUSED_BUT_SET_VARIABLE])
|
AC_SUBST([NO_UNUSED_BUT_SET_VARIABLE])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Check if gcc supports -Wimplicit-fallthrough option.
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH], [
|
||||||
|
AC_MSG_CHECKING([whether $CC supports -Wimplicit-fallthrough])
|
||||||
|
|
||||||
|
saved_flags="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS -Werror -Wimplicit-fallthrough"
|
||||||
|
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
|
||||||
|
IMPLICIT_FALLTHROUGH=-Wimplicit-fallthrough
|
||||||
|
AC_DEFINE([HAVE_IMPLICIT_FALLTHROUGH], 1,
|
||||||
|
[Define if compiler supports -Wimplicit-fallthrough])
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
], [
|
||||||
|
IMPLICIT_FALLTHROUGH=
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
|
|
||||||
|
CFLAGS="$saved_flags"
|
||||||
|
AC_SUBST([IMPLICIT_FALLTHROUGH])
|
||||||
|
])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Check if gcc supports -fno-omit-frame-pointer option.
|
dnl # Check if gcc supports -fno-omit-frame-pointer option.
|
||||||
dnl #
|
dnl #
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_PYTHON], [
|
|||||||
dnl #
|
dnl #
|
||||||
AM_PATH_PYTHON([], [], [:])
|
AM_PATH_PYTHON([], [], [:])
|
||||||
AS_IF([test -z "$PYTHON_VERSION"], [
|
AS_IF([test -z "$PYTHON_VERSION"], [
|
||||||
PYTHON_VERSION=$(basename $PYTHON | tr -cd 0-9.)
|
PYTHON_VERSION=$(echo ${PYTHON##*/} | tr -cd 0-9.)
|
||||||
])
|
])
|
||||||
PYTHON_MINOR=${PYTHON_VERSION#*\.}
|
PYTHON_MINOR=${PYTHON_VERSION#*\.}
|
||||||
|
|
||||||
|
|||||||
+16
-1
@@ -6,7 +6,7 @@ dnl # https://www.gnu.org/software/autoconf-archive/ax_python_module.html
|
|||||||
dnl # Required by ZFS_AC_CONFIG_ALWAYS_PYZFS.
|
dnl # Required by ZFS_AC_CONFIG_ALWAYS_PYZFS.
|
||||||
dnl #
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_PYTHON_MODULE], [
|
AC_DEFUN([ZFS_AC_PYTHON_MODULE], [
|
||||||
PYTHON_NAME=$(basename $PYTHON)
|
PYTHON_NAME=${PYTHON##*/}
|
||||||
AC_MSG_CHECKING([for $PYTHON_NAME module: $1])
|
AC_MSG_CHECKING([for $PYTHON_NAME module: $1])
|
||||||
AS_IF([$PYTHON -c "import $1" 2>/dev/null], [
|
AS_IF([$PYTHON -c "import $1" 2>/dev/null], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
@@ -46,6 +46,21 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_PYZFS], [
|
|||||||
])
|
])
|
||||||
AC_SUBST(DEFINE_PYZFS)
|
AC_SUBST(DEFINE_PYZFS)
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Python "packaging" (or, failing that, "distlib") module is required to build and install pyzfs
|
||||||
|
dnl #
|
||||||
|
AS_IF([test "x$enable_pyzfs" = xcheck -o "x$enable_pyzfs" = xyes], [
|
||||||
|
ZFS_AC_PYTHON_MODULE([packaging], [], [
|
||||||
|
ZFS_AC_PYTHON_MODULE([distlib], [], [
|
||||||
|
AS_IF([test "x$enable_pyzfs" = xyes], [
|
||||||
|
AC_MSG_ERROR("Python $PYTHON_VERSION packaging and distlib modules are not installed")
|
||||||
|
], [test "x$enable_pyzfs" != xno], [
|
||||||
|
enable_pyzfs=no
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Require python-devel libraries
|
dnl # Require python-devel libraries
|
||||||
dnl #
|
dnl #
|
||||||
|
|||||||
@@ -97,9 +97,18 @@ AC_DEFUN([AX_PYTHON_DEVEL],[
|
|||||||
# Check for a version of Python >= 2.1.0
|
# Check for a version of Python >= 2.1.0
|
||||||
#
|
#
|
||||||
AC_MSG_CHECKING([for a version of Python >= '2.1.0'])
|
AC_MSG_CHECKING([for a version of Python >= '2.1.0'])
|
||||||
ac_supports_python_ver=`$PYTHON -c "import sys; \
|
ac_supports_python_ver=`cat<<EOD | $PYTHON -
|
||||||
ver = sys.version.split ()[[0]]; \
|
from __future__ import print_function;
|
||||||
print (ver >= '2.1.0')"`
|
import sys;
|
||||||
|
try:
|
||||||
|
from packaging import version;
|
||||||
|
except ImportError:
|
||||||
|
from distlib import version;
|
||||||
|
ver = sys.version.split ()[[0]];
|
||||||
|
(tst_cmp, tst_ver) = ">= '2.1.0'".split ();
|
||||||
|
tst_ver = tst_ver.strip ("'");
|
||||||
|
eval ("print (version.LegacyVersion (ver)"+ tst_cmp +"version.LegacyVersion (tst_ver))")
|
||||||
|
EOD`
|
||||||
if test "$ac_supports_python_ver" != "True"; then
|
if test "$ac_supports_python_ver" != "True"; then
|
||||||
if test -z "$PYTHON_NOVERSIONCHECK"; then
|
if test -z "$PYTHON_NOVERSIONCHECK"; then
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
@@ -126,9 +135,21 @@ to something else than an empty string.
|
|||||||
#
|
#
|
||||||
if test -n "$1"; then
|
if test -n "$1"; then
|
||||||
AC_MSG_CHECKING([for a version of Python $1])
|
AC_MSG_CHECKING([for a version of Python $1])
|
||||||
ac_supports_python_ver=`$PYTHON -c "import sys; \
|
# Why the strip ()? Because if we don't, version.parse
|
||||||
ver = sys.version.split ()[[0]]; \
|
# will, for example, report 3.10.0 >= '3.11.0'
|
||||||
print (ver $1)"`
|
ac_supports_python_ver=`cat<<EOD | $PYTHON -
|
||||||
|
|
||||||
|
from __future__ import print_function;
|
||||||
|
import sys;
|
||||||
|
try:
|
||||||
|
from packaging import version;
|
||||||
|
except ImportError:
|
||||||
|
from distlib import version;
|
||||||
|
ver = sys.version.split ()[[0]];
|
||||||
|
(tst_cmp, tst_ver) = "$1".split ();
|
||||||
|
tst_ver = tst_ver.strip ("'");
|
||||||
|
eval ("print (version.LegacyVersion (ver)"+ tst_cmp +"version.LegacyVersion (tst_ver))")
|
||||||
|
EOD`
|
||||||
if test "$ac_supports_python_ver" = "True"; then
|
if test "$ac_supports_python_ver" = "True"; then
|
||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -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)
|
||||||
|
])
|
||||||
|
])
|
||||||
+85
-2
@@ -191,6 +191,24 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_SET_DEV], [
|
|||||||
], [], [ZFS_META_LICENSE])
|
], [], [ZFS_META_LICENSE])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Linux 5.16 API
|
||||||
|
dnl #
|
||||||
|
dnl # bio_set_dev is no longer a helper macro and is now an inline function,
|
||||||
|
dnl # meaning that the function it calls internally can no longer be overridden
|
||||||
|
dnl # by our code
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_SET_DEV_MACRO], [
|
||||||
|
ZFS_LINUX_TEST_SRC([bio_set_dev_macro], [
|
||||||
|
#include <linux/bio.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
],[
|
||||||
|
#ifndef bio_set_dev
|
||||||
|
#error Not a macro
|
||||||
|
#endif
|
||||||
|
], [], [ZFS_META_LICENSE])
|
||||||
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
|
AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
|
||||||
AC_MSG_CHECKING([whether bio_set_dev() is available])
|
AC_MSG_CHECKING([whether bio_set_dev() is available])
|
||||||
ZFS_LINUX_TEST_RESULT([bio_set_dev], [
|
ZFS_LINUX_TEST_RESULT([bio_set_dev], [
|
||||||
@@ -205,6 +223,15 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
|
|||||||
AC_DEFINE(HAVE_BIO_SET_DEV_GPL_ONLY, 1,
|
AC_DEFINE(HAVE_BIO_SET_DEV_GPL_ONLY, 1,
|
||||||
[bio_set_dev() GPL-only])
|
[bio_set_dev() GPL-only])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether bio_set_dev() is a macro])
|
||||||
|
ZFS_LINUX_TEST_RESULT([bio_set_dev_macro], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_BIO_SET_DEV_MACRO, 1,
|
||||||
|
[bio_set_dev() is a macro])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
])
|
])
|
||||||
@@ -294,9 +321,8 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO_SUBMIT_BIO], [
|
|||||||
ZFS_LINUX_TEST_SRC([submit_bio], [
|
ZFS_LINUX_TEST_SRC([submit_bio], [
|
||||||
#include <linux/bio.h>
|
#include <linux/bio.h>
|
||||||
],[
|
],[
|
||||||
blk_qc_t blk_qc;
|
|
||||||
struct bio *bio = NULL;
|
struct bio *bio = NULL;
|
||||||
blk_qc = submit_bio(bio);
|
(void) submit_bio(bio);
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -396,6 +422,58 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_BDEV_DISK], [
|
|||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Linux 5.16 API
|
||||||
|
dnl #
|
||||||
|
dnl # The Linux 5.16 API for submit_bio changed the return type to be
|
||||||
|
dnl # void instead of int
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_BDEV_SUBMIT_BIO_RETURNS_VOID], [
|
||||||
|
ZFS_LINUX_TEST_SRC([bio_bdev_submit_bio_void], [
|
||||||
|
#include <linux/blkdev.h>
|
||||||
|
],[
|
||||||
|
struct block_device_operations *bdev = NULL;
|
||||||
|
__attribute__((unused)) void(*f)(struct bio *) = bdev->submit_bio;
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_BDEV_SUBMIT_BIO_RETURNS_VOID], [
|
||||||
|
AC_MSG_CHECKING(
|
||||||
|
[whether block_device_operations->submit_bio() returns void])
|
||||||
|
ZFS_LINUX_TEST_RESULT([bio_bdev_submit_bio_void], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_BDEV_SUBMIT_BIO_RETURNS_VOID, 1,
|
||||||
|
[block_device_operations->submit_bio() returns void])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Linux 5.16 API
|
||||||
|
dnl #
|
||||||
|
dnl # The Linux 5.16 API moved struct blkcg_gq into linux/blk-cgroup.h, which
|
||||||
|
dnl # has been around since 2015. This test looks for the presence of that
|
||||||
|
dnl # header, so that it can be conditionally included where it exists, but
|
||||||
|
dnl # still be backward compatible with kernels that pre-date its introduction.
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_CGROUP_HEADER], [
|
||||||
|
ZFS_LINUX_TEST_SRC([blk_cgroup_header], [
|
||||||
|
#include <linux/blk-cgroup.h>
|
||||||
|
], [])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_BLK_CGROUP_HEADER], [
|
||||||
|
AC_MSG_CHECKING([for existence of linux/blk-cgroup.h])
|
||||||
|
ZFS_LINUX_TEST_RESULT([blk_cgroup_header],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_LINUX_BLK_CGROUP_HEADER, 1,
|
||||||
|
[linux/blk-cgroup.h exists])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO], [
|
||||||
ZFS_AC_KERNEL_SRC_REQ
|
ZFS_AC_KERNEL_SRC_REQ
|
||||||
ZFS_AC_KERNEL_SRC_BIO_OPS
|
ZFS_AC_KERNEL_SRC_BIO_OPS
|
||||||
@@ -407,6 +485,9 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BIO], [
|
|||||||
ZFS_AC_KERNEL_SRC_BIO_CURRENT_BIO_LIST
|
ZFS_AC_KERNEL_SRC_BIO_CURRENT_BIO_LIST
|
||||||
ZFS_AC_KERNEL_SRC_BLKG_TRYGET
|
ZFS_AC_KERNEL_SRC_BLKG_TRYGET
|
||||||
ZFS_AC_KERNEL_SRC_BIO_BDEV_DISK
|
ZFS_AC_KERNEL_SRC_BIO_BDEV_DISK
|
||||||
|
ZFS_AC_KERNEL_SRC_BDEV_SUBMIT_BIO_RETURNS_VOID
|
||||||
|
ZFS_AC_KERNEL_SRC_BIO_SET_DEV_MACRO
|
||||||
|
ZFS_AC_KERNEL_SRC_BLK_CGROUP_HEADER
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_BIO], [
|
AC_DEFUN([ZFS_AC_KERNEL_BIO], [
|
||||||
@@ -429,4 +510,6 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO], [
|
|||||||
ZFS_AC_KERNEL_BIO_CURRENT_BIO_LIST
|
ZFS_AC_KERNEL_BIO_CURRENT_BIO_LIST
|
||||||
ZFS_AC_KERNEL_BLKG_TRYGET
|
ZFS_AC_KERNEL_BLKG_TRYGET
|
||||||
ZFS_AC_KERNEL_BIO_BDEV_DISK
|
ZFS_AC_KERNEL_BIO_BDEV_DISK
|
||||||
|
ZFS_AC_KERNEL_BDEV_SUBMIT_BIO_RETURNS_VOID
|
||||||
|
ZFS_AC_KERNEL_BLK_CGROUP_HEADER
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -294,6 +294,27 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEV_WHOLE], [
|
|||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 5.13 API change
|
||||||
|
dnl # blkdev_get_by_path() no longer handles ERESTARTSYS
|
||||||
|
dnl #
|
||||||
|
dnl # Unfortunately we're forced to rely solely on the kernel version
|
||||||
|
dnl # number in order to determine the expected behavior. This was an
|
||||||
|
dnl # internal change to blkdev_get_by_dev(), see commit a8ed1a0607.
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_GET_ERESTARTSYS], [
|
||||||
|
AC_MSG_CHECKING([whether blkdev_get_by_path() handles ERESTARTSYS])
|
||||||
|
AS_VERSION_COMPARE([$LINUX_VERSION], [5.13.0], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_BLKDEV_GET_ERESTARTSYS, 1,
|
||||||
|
[blkdev_get_by_path() handles ERESTARTSYS])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV], [
|
||||||
ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH
|
ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH
|
||||||
ZFS_AC_KERNEL_SRC_BLKDEV_PUT
|
ZFS_AC_KERNEL_SRC_BLKDEV_PUT
|
||||||
@@ -318,4 +339,5 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV], [
|
|||||||
ZFS_AC_KERNEL_BLKDEV_CHECK_DISK_CHANGE
|
ZFS_AC_KERNEL_BLKDEV_CHECK_DISK_CHANGE
|
||||||
ZFS_AC_KERNEL_BLKDEV_BDEV_CHECK_MEDIA_CHANGE
|
ZFS_AC_KERNEL_BLKDEV_BDEV_CHECK_MEDIA_CHANGE
|
||||||
ZFS_AC_KERNEL_BLKDEV_BDEV_WHOLE
|
ZFS_AC_KERNEL_BLKDEV_BDEV_WHOLE
|
||||||
|
ZFS_AC_KERNEL_BLKDEV_GET_ERESTARTSYS
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ AC_DEFUN([ZFS_AC_KERNEL_CONFIG_DEFINED], [
|
|||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
ZFS_AC_KERNEL_SRC_CONFIG_THREAD_SIZE
|
|
||||||
ZFS_AC_KERNEL_SRC_CONFIG_DEBUG_LOCK_ALLOC
|
ZFS_AC_KERNEL_SRC_CONFIG_DEBUG_LOCK_ALLOC
|
||||||
ZFS_AC_KERNEL_SRC_CONFIG_TRIM_UNUSED_KSYMS
|
ZFS_AC_KERNEL_SRC_CONFIG_TRIM_UNUSED_KSYMS
|
||||||
ZFS_AC_KERNEL_SRC_CONFIG_ZLIB_INFLATE
|
ZFS_AC_KERNEL_SRC_CONFIG_ZLIB_INFLATE
|
||||||
@@ -29,42 +28,12 @@ AC_DEFUN([ZFS_AC_KERNEL_CONFIG_DEFINED], [
|
|||||||
ZFS_LINUX_TEST_COMPILE_ALL([config])
|
ZFS_LINUX_TEST_COMPILE_ALL([config])
|
||||||
AC_MSG_RESULT([done])
|
AC_MSG_RESULT([done])
|
||||||
|
|
||||||
ZFS_AC_KERNEL_CONFIG_THREAD_SIZE
|
|
||||||
ZFS_AC_KERNEL_CONFIG_DEBUG_LOCK_ALLOC
|
ZFS_AC_KERNEL_CONFIG_DEBUG_LOCK_ALLOC
|
||||||
ZFS_AC_KERNEL_CONFIG_TRIM_UNUSED_KSYMS
|
ZFS_AC_KERNEL_CONFIG_TRIM_UNUSED_KSYMS
|
||||||
ZFS_AC_KERNEL_CONFIG_ZLIB_INFLATE
|
ZFS_AC_KERNEL_CONFIG_ZLIB_INFLATE
|
||||||
ZFS_AC_KERNEL_CONFIG_ZLIB_DEFLATE
|
ZFS_AC_KERNEL_CONFIG_ZLIB_DEFLATE
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl #
|
|
||||||
dnl # Check configured THREAD_SIZE
|
|
||||||
dnl #
|
|
||||||
dnl # The stack size will vary by architecture, but as of Linux 3.15 on x86_64
|
|
||||||
dnl # the default thread stack size was increased to 16K from 8K. Therefore,
|
|
||||||
dnl # on newer kernels and some architectures stack usage optimizations can be
|
|
||||||
dnl # conditionally applied to improve performance without negatively impacting
|
|
||||||
dnl # stability.
|
|
||||||
dnl #
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_CONFIG_THREAD_SIZE], [
|
|
||||||
ZFS_LINUX_TEST_SRC([config_thread_size], [
|
|
||||||
#include <linux/module.h>
|
|
||||||
],[
|
|
||||||
#if (THREAD_SIZE < 16384)
|
|
||||||
#error "THREAD_SIZE is less than 16K"
|
|
||||||
#endif
|
|
||||||
])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_CONFIG_THREAD_SIZE], [
|
|
||||||
AC_MSG_CHECKING([whether kernel was built with 16K or larger stacks])
|
|
||||||
ZFS_LINUX_TEST_RESULT([config_thread_size], [
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
AC_DEFINE(HAVE_LARGE_STACKS, 1, [kernel has large stacks])
|
|
||||||
],[
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Check CONFIG_DEBUG_LOCK_ALLOC
|
dnl # Check CONFIG_DEBUG_LOCK_ALLOC
|
||||||
dnl #
|
dnl #
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ dnl # Linux 2.6.38 - 3.x API
|
|||||||
dnl # The fallocate callback was moved from the inode_operations
|
dnl # The fallocate callback was moved from the inode_operations
|
||||||
dnl # structure to the file_operations structure.
|
dnl # structure to the file_operations structure.
|
||||||
dnl #
|
dnl #
|
||||||
|
dnl #
|
||||||
|
dnl # Linux 3.15+
|
||||||
|
dnl # fallocate learned a new flag, FALLOC_FL_ZERO_RANGE
|
||||||
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_FALLOCATE], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_FALLOCATE], [
|
||||||
ZFS_LINUX_TEST_SRC([file_fallocate], [
|
ZFS_LINUX_TEST_SRC([file_fallocate], [
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
@@ -15,12 +19,25 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FALLOCATE], [
|
|||||||
.fallocate = test_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_DEFUN([ZFS_AC_KERNEL_FALLOCATE], [
|
||||||
AC_MSG_CHECKING([whether fops->fallocate() exists])
|
AC_MSG_CHECKING([whether fops->fallocate() exists])
|
||||||
ZFS_LINUX_TEST_RESULT([file_fallocate], [
|
ZFS_LINUX_TEST_RESULT([file_fallocate], [
|
||||||
AC_MSG_RESULT(yes)
|
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])
|
ZFS_LINUX_TEST_ERROR([file_fallocate])
|
||||||
])
|
])
|
||||||
|
|||||||
+58
-2
@@ -2,6 +2,15 @@ dnl #
|
|||||||
dnl # Handle differences in kernel FPU code.
|
dnl # Handle differences in kernel FPU code.
|
||||||
dnl #
|
dnl #
|
||||||
dnl # Kernel
|
dnl # Kernel
|
||||||
|
dnl # 5.16: XCR code put into asm/fpu/xcr.h
|
||||||
|
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 # 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.
|
dnl # This change was made to the 4.19.38 and 4.14.120 LTS kernels.
|
||||||
dnl # HAVE_KERNEL_FPU_INTERNAL
|
dnl # HAVE_KERNEL_FPU_INTERNAL
|
||||||
@@ -25,6 +34,18 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU_HEADER], [
|
|||||||
AC_DEFINE(HAVE_KERNEL_FPU_API_HEADER, 1,
|
AC_DEFINE(HAVE_KERNEL_FPU_API_HEADER, 1,
|
||||||
[kernel has asm/fpu/api.h])
|
[kernel has asm/fpu/api.h])
|
||||||
AC_MSG_RESULT(asm/fpu/api.h)
|
AC_MSG_RESULT(asm/fpu/api.h)
|
||||||
|
AC_MSG_CHECKING([whether fpu/xcr header is available])
|
||||||
|
ZFS_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <asm/fpu/xcr.h>
|
||||||
|
],[
|
||||||
|
],[
|
||||||
|
AC_DEFINE(HAVE_KERNEL_FPU_XCR_HEADER, 1,
|
||||||
|
[kernel has asm/fpu/xcr.h])
|
||||||
|
AC_MSG_RESULT(asm/fpu/xcr.h)
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no asm/fpu/xcr.h)
|
||||||
|
])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(i387.h & xcr.h)
|
AC_MSG_RESULT(i387.h & xcr.h)
|
||||||
])
|
])
|
||||||
@@ -92,6 +113,36 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [
|
|||||||
struct fxregs_state *fxr __attribute__ ((unused)) = &st->fxsave;
|
struct fxregs_state *fxr __attribute__ ((unused)) = &st->fxsave;
|
||||||
struct xregs_state *xr __attribute__ ((unused)) = &st->xsave;
|
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], [
|
AC_DEFUN([ZFS_AC_KERNEL_FPU], [
|
||||||
@@ -99,8 +150,7 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
|
|||||||
dnl # Legacy kernel
|
dnl # Legacy kernel
|
||||||
dnl #
|
dnl #
|
||||||
AC_MSG_CHECKING([whether kernel fpu is available])
|
AC_MSG_CHECKING([whether kernel fpu is available])
|
||||||
ZFS_LINUX_TEST_RESULT_SYMBOL([kernel_fpu_license],
|
ZFS_LINUX_TEST_RESULT([kernel_fpu_license], [
|
||||||
[kernel_fpu_begin], [arch/x86/kernel/fpu/core.c], [
|
|
||||||
AC_MSG_RESULT(kernel_fpu_*)
|
AC_MSG_RESULT(kernel_fpu_*)
|
||||||
AC_DEFINE(HAVE_KERNEL_FPU, 1,
|
AC_DEFINE(HAVE_KERNEL_FPU, 1,
|
||||||
[kernel has kernel_fpu_* functions])
|
[kernel has kernel_fpu_* functions])
|
||||||
@@ -124,7 +174,13 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
|
|||||||
AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1,
|
AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1,
|
||||||
[kernel fpu internal])
|
[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)
|
AC_MSG_RESULT(unavailable)
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ dnl #
|
|||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_KVMALLOC], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_KVMALLOC], [
|
||||||
ZFS_LINUX_TEST_SRC([kvmalloc], [
|
ZFS_LINUX_TEST_SRC([kvmalloc], [
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
],[
|
],[
|
||||||
void *p __attribute__ ((unused));
|
void *p __attribute__ ((unused));
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
])
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
dnl #
|
||||||
|
dnl # Linux 5.16 no longer allows directly calling wait_on_page_bit, and
|
||||||
|
dnl # instead requires you to call folio-specific functions. In this case,
|
||||||
|
dnl # wait_on_page_bit(pg, PG_writeback) becomes
|
||||||
|
dnl # folio_wait_bit(pg, PG_writeback)
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT], [
|
||||||
|
ZFS_LINUX_TEST_SRC([pagemap_has_folio_wait_bit], [
|
||||||
|
#include <linux/pagemap.h>
|
||||||
|
],[
|
||||||
|
static struct folio *f = NULL;
|
||||||
|
|
||||||
|
folio_wait_bit(f, PG_writeback);
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT], [
|
||||||
|
AC_MSG_CHECKING([folio_wait_bit() exists])
|
||||||
|
ZFS_LINUX_TEST_RESULT([pagemap_has_folio_wait_bit], [
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE(HAVE_PAGEMAP_FOLIO_WAIT_BIT, 1,
|
||||||
|
[folio_wait_bit() exists])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
|
])
|
||||||
@@ -1,20 +1,22 @@
|
|||||||
dnl #
|
dnl #
|
||||||
dnl # 3.10 API change,
|
dnl # 5.17 API: PDE_DATA() renamed to pde_data(),
|
||||||
dnl # PDE is replaced by PDE_DATA
|
dnl # 359745d78351c6f5442435f81549f0207ece28aa ("proc: remove PDE_DATA() completely")
|
||||||
dnl #
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_PDE_DATA], [
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_PDE_DATA], [
|
||||||
ZFS_LINUX_TEST_SRC([pde_data], [
|
ZFS_LINUX_TEST_SRC([pde_data], [
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
], [
|
], [
|
||||||
PDE_DATA(NULL);
|
pde_data(NULL);
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_PDE_DATA], [
|
AC_DEFUN([ZFS_AC_KERNEL_PDE_DATA], [
|
||||||
AC_MSG_CHECKING([whether PDE_DATA() is available])
|
AC_MSG_CHECKING([whether pde_data() is lowercase])
|
||||||
ZFS_LINUX_TEST_RESULT_SYMBOL([pde_data], [PDE_DATA], [], [
|
ZFS_LINUX_TEST_RESULT([pde_data], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
],[
|
AC_DEFINE(SPL_PDE_DATA, pde_data, [pde_data() is pde_data()])
|
||||||
ZFS_LINUX_TEST_ERROR([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);
|
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], [
|
ZFS_LINUX_TEST_SRC([iov_iter_count], [
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/uio.h>
|
#include <linux/uio.h>
|
||||||
@@ -74,6 +85,14 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_IOV_ITER], [
|
|||||||
|
|
||||||
bytes = copy_from_iter((void *)&buf, size, &iter);
|
bytes = copy_from_iter((void *)&buf, size, &iter);
|
||||||
])
|
])
|
||||||
|
|
||||||
|
ZFS_LINUX_TEST_SRC([iov_iter_type], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/uio.h>
|
||||||
|
],[
|
||||||
|
struct iov_iter iter = { 0 };
|
||||||
|
__attribute__((unused)) enum iter_type i = iov_iter_type(&iter);
|
||||||
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_VFS_IOV_ITER], [
|
AC_DEFUN([ZFS_AC_KERNEL_VFS_IOV_ITER], [
|
||||||
@@ -115,8 +134,15 @@ AC_DEFUN([ZFS_AC_KERNEL_VFS_IOV_ITER], [
|
|||||||
AC_DEFINE(HAVE_IOV_ITER_FAULT_IN_READABLE, 1,
|
AC_DEFINE(HAVE_IOV_ITER_FAULT_IN_READABLE, 1,
|
||||||
[iov_iter_fault_in_readable() is available])
|
[iov_iter_fault_in_readable() is available])
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_CHECKING([whether fault_in_iov_iter_readable() is available])
|
||||||
enable_vfs_iov_iter="no"
|
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])
|
AC_MSG_CHECKING([whether iov_iter_count() is available])
|
||||||
@@ -149,6 +175,20 @@ AC_DEFUN([ZFS_AC_KERNEL_VFS_IOV_ITER], [
|
|||||||
enable_vfs_iov_iter="no"
|
enable_vfs_iov_iter="no"
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # This checks for iov_iter_type() in linux/uio.h. It is not
|
||||||
|
dnl # required, however, and the module will compiled without it
|
||||||
|
dnl # using direct access of the member attribute
|
||||||
|
dnl #
|
||||||
|
AC_MSG_CHECKING([whether iov_iter_type() is available])
|
||||||
|
ZFS_LINUX_TEST_RESULT([iov_iter_type], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_IOV_ITER_TYPE, 1,
|
||||||
|
[iov_iter_type() is available])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
dnl # As of the 4.9 kernel support is provided for iovecs, kvecs,
|
dnl # As of the 4.9 kernel support is provided for iovecs, kvecs,
|
||||||
dnl # bvecs and pipes in the iov_iter structure. As long as the
|
dnl # bvecs and pipes in the iov_iter structure. As long as the
|
||||||
|
|||||||
+88
-31
@@ -134,6 +134,9 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
|||||||
ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE
|
ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE
|
||||||
ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||||
ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG
|
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])
|
AC_MSG_CHECKING([for available kernel interfaces])
|
||||||
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
|
ZFS_LINUX_TEST_COMPILE_ALL([kabi])
|
||||||
@@ -241,6 +244,9 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
|||||||
ZFS_AC_KERNEL_SET_SPECIAL_STATE
|
ZFS_AC_KERNEL_SET_SPECIAL_STATE
|
||||||
ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||||
ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG
|
ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG
|
||||||
|
ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT
|
||||||
|
ZFS_AC_KERNEL_ADD_DISK
|
||||||
|
ZFS_AC_KERNEL_KTHREAD
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl #
|
dnl #
|
||||||
@@ -274,6 +280,35 @@ AC_DEFUN([ZFS_AC_MODULE_SYMVERS], [
|
|||||||
dnl #
|
dnl #
|
||||||
dnl # Detect the kernel to be built against
|
dnl # Detect the kernel to be built against
|
||||||
dnl #
|
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_DEFUN([ZFS_AC_KERNEL], [
|
||||||
AC_ARG_WITH([linux],
|
AC_ARG_WITH([linux],
|
||||||
AS_HELP_STRING([--with-linux=PATH],
|
AS_HELP_STRING([--with-linux=PATH],
|
||||||
@@ -285,25 +320,52 @@ AC_DEFUN([ZFS_AC_KERNEL], [
|
|||||||
[Path to kernel build objects]),
|
[Path to kernel build objects]),
|
||||||
[kernelbuild="$withval"])
|
[kernelbuild="$withval"])
|
||||||
|
|
||||||
AC_MSG_CHECKING([kernel source directory])
|
AC_MSG_CHECKING([kernel source and build directories])
|
||||||
AS_IF([test -z "$kernelsrc"], [
|
AS_IF([test -n "$kernelsrc" && test -z "$kernelbuild"], [
|
||||||
AS_IF([test -e "/lib/modules/$(uname -r)/source"], [
|
kernelbuild="$kernelsrc"
|
||||||
headersdir="/lib/modules/$(uname -r)/source"
|
], [test -z "$kernelsrc"], [
|
||||||
sourcelink=$(readlink -f "$headersdir")
|
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"], [
|
], [test -e "/lib/modules/$(uname -r)/build"], [
|
||||||
headersdir="/lib/modules/$(uname -r)/build"
|
build="/lib/modules/$(uname -r)/build"
|
||||||
sourcelink=$(readlink -f "$headersdir")
|
src="$build"
|
||||||
], [
|
], [
|
||||||
sourcelink=$(ls -1d /usr/src/kernels/* \
|
src=
|
||||||
/usr/src/linux-* \
|
|
||||||
2>/dev/null | grep -v obj | tail -1)
|
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}], [
|
AS_IF([test -n "$src" && test -e "$src"], [
|
||||||
kernelsrc=`readlink -f ${sourcelink}`
|
kernelsrc=$(readlink -e "$src")
|
||||||
], [
|
], [
|
||||||
kernelsrc="[Not found]"
|
kernelsrc="[Not found]"
|
||||||
])
|
])
|
||||||
|
AS_IF([test -n "$build" && test -e "$build"], [
|
||||||
|
kernelbuild=$(readlink -e "$build")
|
||||||
|
], [
|
||||||
|
kernelbuild="[Not found]"
|
||||||
|
])
|
||||||
], [
|
], [
|
||||||
AS_IF([test "$kernelsrc" = "NONE"], [
|
AS_IF([test "$kernelsrc" = "NONE"], [
|
||||||
kernsrcver=NONE
|
kernsrcver=NONE
|
||||||
@@ -311,30 +373,19 @@ AC_DEFUN([ZFS_AC_KERNEL], [
|
|||||||
withlinux=yes
|
withlinux=yes
|
||||||
])
|
])
|
||||||
|
|
||||||
|
AC_MSG_RESULT([done])
|
||||||
|
AC_MSG_CHECKING([kernel source directory])
|
||||||
AC_MSG_RESULT([$kernelsrc])
|
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([
|
AC_MSG_ERROR([
|
||||||
*** Please make sure the kernel devel package for your distribution
|
*** Please make sure the kernel devel package for your distribution
|
||||||
*** is installed and then try again. If that fails, you can specify the
|
*** 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])
|
AC_MSG_CHECKING([kernel source version])
|
||||||
utsrelease1=$kernelbuild/include/linux/version.h
|
utsrelease1=$kernelbuild/include/linux/version.h
|
||||||
utsrelease2=$kernelbuild/include/linux/utsrelease.h
|
utsrelease2=$kernelbuild/include/linux/utsrelease.h
|
||||||
@@ -595,9 +646,15 @@ dnl #
|
|||||||
dnl # Used internally by ZFS_LINUX_TEST_{COMPILE,MODPOST}
|
dnl # Used internally by ZFS_LINUX_TEST_{COMPILE,MODPOST}
|
||||||
dnl #
|
dnl #
|
||||||
AC_DEFUN([ZFS_LINUX_COMPILE], [
|
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([
|
AC_TRY_COMMAND([
|
||||||
KBUILD_MODPOST_NOFINAL="$5" KBUILD_MODPOST_WARN="$6"
|
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])
|
M=$PWD/$1 >$1/build.log 2>&1])
|
||||||
AS_IF([AC_TRY_COMMAND([$2])], [$3], [$4])
|
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_AES
|
||||||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_PCLMULQDQ
|
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_PCLMULQDQ
|
||||||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_MOVBE
|
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
|
esac
|
||||||
])
|
])
|
||||||
@@ -422,3 +425,66 @@ AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_MOVBE], [
|
|||||||
AC_MSG_RESULT([no])
|
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])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
dnl #
|
||||||
|
dnl # Check for a libfetch - either fetch(3) or libcurl.
|
||||||
|
dnl #
|
||||||
|
dnl # There are two configuration dimensions:
|
||||||
|
dnl # * fetch(3) vs libcurl
|
||||||
|
dnl # * static vs dynamic
|
||||||
|
dnl #
|
||||||
|
dnl # fetch(3) is only dynamic.
|
||||||
|
dnl # We use sover 6, which first appeared in FreeBSD 8.0-RELEASE.
|
||||||
|
dnl #
|
||||||
|
dnl # libcurl development packages include curl-config(1) – we want:
|
||||||
|
dnl # * HTTPS support
|
||||||
|
dnl # * version at least 7.16 (October 2006), for sover 4
|
||||||
|
dnl # * to decide if it's static or not
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_CONFIG_USER_LIBFETCH], [
|
||||||
|
AC_MSG_CHECKING([for libfetch])
|
||||||
|
LIBFETCH_LIBS=
|
||||||
|
LIBFETCH_IS_FETCH=0
|
||||||
|
LIBFETCH_IS_LIBCURL=0
|
||||||
|
LIBFETCH_DYNAMIC=0
|
||||||
|
LIBFETCH_SONAME=
|
||||||
|
have_libfetch=
|
||||||
|
|
||||||
|
saved_libs="$LIBS"
|
||||||
|
LIBS="$LIBS -lfetch"
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fetch.h>
|
||||||
|
]], [fetchGetURL("", "");])], [
|
||||||
|
have_libfetch=1
|
||||||
|
LIBFETCH_IS_FETCH=1
|
||||||
|
LIBFETCH_DYNAMIC=1
|
||||||
|
LIBFETCH_SONAME="libfetch.so.6"
|
||||||
|
LIBFETCH_LIBS="-ldl"
|
||||||
|
AC_MSG_RESULT([fetch(3)])
|
||||||
|
], [])
|
||||||
|
LIBS="$saved_libs"
|
||||||
|
|
||||||
|
if test -z "$have_libfetch"; then
|
||||||
|
if curl-config --protocols 2>/dev/null | grep -q HTTPS &&
|
||||||
|
test "$(printf "%u" "0x$(curl-config --vernum)")" -ge "$(printf "%u" "0x071000")"; then
|
||||||
|
have_libfetch=1
|
||||||
|
LIBFETCH_IS_LIBCURL=1
|
||||||
|
if test "$(curl-config --built-shared)" = "yes"; then
|
||||||
|
LIBFETCH_DYNAMIC=1
|
||||||
|
LIBFETCH_SONAME="libcurl.so.4"
|
||||||
|
LIBFETCH_LIBS="-ldl"
|
||||||
|
AC_MSG_RESULT([libcurl])
|
||||||
|
else
|
||||||
|
LIBFETCH_LIBS="$(curl-config --libs)"
|
||||||
|
AC_MSG_RESULT([libcurl (static)])
|
||||||
|
fi
|
||||||
|
|
||||||
|
CCFLAGS="$CCFLAGS $(curl-config --cflags)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$have_libfetch"; then
|
||||||
|
AC_MSG_RESULT([none])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST([LIBFETCH_LIBS])
|
||||||
|
AC_SUBST([LIBFETCH_DYNAMIC])
|
||||||
|
AC_SUBST([LIBFETCH_SONAME])
|
||||||
|
AC_DEFINE_UNQUOTED([LIBFETCH_IS_FETCH], [$LIBFETCH_IS_FETCH], [libfetch is fetch(3)])
|
||||||
|
AC_DEFINE_UNQUOTED([LIBFETCH_IS_LIBCURL], [$LIBFETCH_IS_LIBCURL], [libfetch is libcurl])
|
||||||
|
AC_DEFINE_UNQUOTED([LIBFETCH_DYNAMIC], [$LIBFETCH_DYNAMIC], [whether the chosen libfetch is to be loaded at run-time])
|
||||||
|
AC_DEFINE_UNQUOTED([LIBFETCH_SONAME], ["$LIBFETCH_SONAME"], [soname of chosen libfetch])
|
||||||
|
])
|
||||||
@@ -22,6 +22,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [
|
|||||||
ZFS_AC_CONFIG_USER_LIBCRYPTO
|
ZFS_AC_CONFIG_USER_LIBCRYPTO
|
||||||
ZFS_AC_CONFIG_USER_LIBAIO
|
ZFS_AC_CONFIG_USER_LIBAIO
|
||||||
ZFS_AC_CONFIG_USER_LIBATOMIC
|
ZFS_AC_CONFIG_USER_LIBATOMIC
|
||||||
|
ZFS_AC_CONFIG_USER_LIBFETCH
|
||||||
ZFS_AC_CONFIG_USER_CLOCK_GETTIME
|
ZFS_AC_CONFIG_USER_CLOCK_GETTIME
|
||||||
ZFS_AC_CONFIG_USER_PAM
|
ZFS_AC_CONFIG_USER_PAM
|
||||||
ZFS_AC_CONFIG_USER_RUNSTATEDIR
|
ZFS_AC_CONFIG_USER_RUNSTATEDIR
|
||||||
|
|||||||
@@ -211,6 +211,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
|
|||||||
|
|
||||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_UNUSED_BUT_SET_VARIABLE
|
ZFS_AC_CONFIG_ALWAYS_CC_NO_UNUSED_BUT_SET_VARIABLE
|
||||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_BOOL_COMPARE
|
ZFS_AC_CONFIG_ALWAYS_CC_NO_BOOL_COMPARE
|
||||||
|
ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH
|
||||||
ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN
|
ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN
|
||||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION
|
ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION
|
||||||
ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH
|
ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH
|
||||||
@@ -367,6 +368,9 @@ AC_DEFUN([ZFS_AC_RPM], [
|
|||||||
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kernels $(LINUX_VERSION)"'
|
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 "ksrc $(LINUX)"'
|
||||||
RPM_DEFINE_KMOD=${RPM_DEFINE_KMOD}' --define "kobj $(LINUX_OBJ)"'
|
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=''
|
RPM_DEFINE_DKMS=''
|
||||||
|
|||||||
+2
-2
@@ -73,14 +73,14 @@ AC_DEFUN([ZFS_AC_META], [
|
|||||||
if test ! -f ".nogitrelease" && git rev-parse --git-dir > /dev/null 2>&1; then
|
if test ! -f ".nogitrelease" && git rev-parse --git-dir > /dev/null 2>&1; then
|
||||||
_match="${ZFS_META_NAME}-${ZFS_META_VERSION}"
|
_match="${ZFS_META_NAME}-${ZFS_META_VERSION}"
|
||||||
_alias=$(git describe --match=${_match} 2>/dev/null)
|
_alias=$(git describe --match=${_match} 2>/dev/null)
|
||||||
_release=$(echo ${_alias}|cut -f3- -d'-'|sed 's/-/_/g')
|
_release=$(echo ${_alias}|sed "s/${ZFS_META_NAME}//"|cut -f3- -d'-'|tr - _)
|
||||||
if test -n "${_release}"; then
|
if test -n "${_release}"; then
|
||||||
ZFS_META_RELEASE=${_release}
|
ZFS_META_RELEASE=${_release}
|
||||||
_zfs_ac_meta_type="git describe"
|
_zfs_ac_meta_type="git describe"
|
||||||
else
|
else
|
||||||
_match="${ZFS_META_NAME}-${ZFS_META_VERSION}-${ZFS_META_RELEASE}"
|
_match="${ZFS_META_NAME}-${ZFS_META_VERSION}-${ZFS_META_RELEASE}"
|
||||||
_alias=$(git describe --match=${_match} 2>/dev/null)
|
_alias=$(git describe --match=${_match} 2>/dev/null)
|
||||||
_release=$(echo ${_alias}|cut -f3- -d'-'|sed 's/-/_/g')
|
_release=$(echo ${_alias}|sed 's/${ZFS_META_NAME}//'|cut -f3- -d'-'|tr - _)
|
||||||
if test -n "${_release}"; then
|
if test -n "${_release}"; then
|
||||||
ZFS_META_RELEASE=${_release}
|
ZFS_META_RELEASE=${_release}
|
||||||
_zfs_ac_meta_type="git describe"
|
_zfs_ac_meta_type="git describe"
|
||||||
|
|||||||
@@ -221,6 +221,7 @@ AC_CONFIG_FILES([
|
|||||||
tests/zfs-tests/cmd/mktree/Makefile
|
tests/zfs-tests/cmd/mktree/Makefile
|
||||||
tests/zfs-tests/cmd/mmap_exec/Makefile
|
tests/zfs-tests/cmd/mmap_exec/Makefile
|
||||||
tests/zfs-tests/cmd/mmap_libaio/Makefile
|
tests/zfs-tests/cmd/mmap_libaio/Makefile
|
||||||
|
tests/zfs-tests/cmd/mmap_seek/Makefile
|
||||||
tests/zfs-tests/cmd/mmapwrite/Makefile
|
tests/zfs-tests/cmd/mmapwrite/Makefile
|
||||||
tests/zfs-tests/cmd/nvlist_to_lua/Makefile
|
tests/zfs-tests/cmd/nvlist_to_lua/Makefile
|
||||||
tests/zfs-tests/cmd/randfree_file/Makefile
|
tests/zfs-tests/cmd/randfree_file/Makefile
|
||||||
@@ -382,6 +383,7 @@ AC_CONFIG_FILES([
|
|||||||
tests/zfs-tests/tests/functional/rootpool/Makefile
|
tests/zfs-tests/tests/functional/rootpool/Makefile
|
||||||
tests/zfs-tests/tests/functional/rsend/Makefile
|
tests/zfs-tests/tests/functional/rsend/Makefile
|
||||||
tests/zfs-tests/tests/functional/scrub_mirror/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/slog/Makefile
|
||||||
tests/zfs-tests/tests/functional/snapshot/Makefile
|
tests/zfs-tests/tests/functional/snapshot/Makefile
|
||||||
tests/zfs-tests/tests/functional/snapused/Makefile
|
tests/zfs-tests/tests/functional/snapused/Makefile
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
ZVER=$(cut -f 1 -d '-' /sys/module/zfs/version)
|
read -r ZVER < /sys/module/zfs/version
|
||||||
|
ZVER="${ZVER%%-*}"
|
||||||
KVER=$(uname -r)
|
KVER=$(uname -r)
|
||||||
|
|
||||||
exec bpftrace \
|
exec bpftrace \
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
get_devtype() {
|
get_devtype() {
|
||||||
local typ
|
local typ
|
||||||
typ=$(udevadm info --query=property --name="$1" | grep "^ID_FS_TYPE=" | sed 's|^ID_FS_TYPE=||')
|
typ=$(udevadm info --query=property --name="$1" | sed -n 's|^ID_FS_TYPE=||p')
|
||||||
if [ "$typ" = "" ] ; then
|
if [ -z "$typ" ] ; then
|
||||||
typ=$(blkid -c /dev/null "$1" -o value -s TYPE)
|
typ=$(blkid -c /dev/null "$1" -o value -s TYPE)
|
||||||
fi
|
fi
|
||||||
echo "$typ"
|
echo "$typ"
|
||||||
@@ -36,7 +36,6 @@ find_zfs_block_devices() {
|
|||||||
local dev
|
local dev
|
||||||
local mp
|
local mp
|
||||||
local fstype
|
local fstype
|
||||||
local pool
|
|
||||||
local _
|
local _
|
||||||
numfields="$(awk '{print NF; exit}' /proc/self/mountinfo)"
|
numfields="$(awk '{print NF; exit}' /proc/self/mountinfo)"
|
||||||
if [ "$numfields" = "10" ] ; then
|
if [ "$numfields" = "10" ] ; then
|
||||||
@@ -47,10 +46,7 @@ find_zfs_block_devices() {
|
|||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
while read -r ${fields?} ; do
|
while read -r ${fields?} ; do
|
||||||
[ "$fstype" = "zfs" ] || continue
|
[ "$fstype" = "zfs" ] || continue
|
||||||
if [ "$mp" = "$1" ]; then
|
[ "$mp" = "$1" ] && get_pool_devices "${dev%%/*}"
|
||||||
pool=$(echo "$dev" | cut -d / -f 1)
|
|
||||||
get_pool_devices "$pool"
|
|
||||||
fi
|
|
||||||
done < /proc/self/mountinfo
|
done < /proc/self/mountinfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,9 +96,9 @@ if [ -n "$hostonly" ]; then
|
|||||||
majmin=$(get_maj_min "$dev")
|
majmin=$(get_maj_min "$dev")
|
||||||
if [ -d "/sys/dev/block/$majmin/slaves" ] ; then
|
if [ -d "/sys/dev/block/$majmin/slaves" ] ; then
|
||||||
for _depdev in "/sys/dev/block/$majmin/slaves"/*; do
|
for _depdev in "/sys/dev/block/$majmin/slaves"/*; do
|
||||||
[[ -f $_depdev/dev ]] || continue
|
[ -f "$_depdev/dev" ] || continue
|
||||||
_depdev=/dev/$(basename "$_depdev")
|
_depdev="/dev/${_depdev##*/}"
|
||||||
_depdevname=$(udevadm info --query=property --name="$_depdev" | grep "^DEVNAME=" | sed 's|^DEVNAME=||')
|
_depdevname=$(udevadm info --query=property --name="$_depdev" | sed -n 's|^DEVNAME=||p')
|
||||||
_depdevtype=$(get_devtype "$_depdevname")
|
_depdevtype=$(get_devtype "$_depdevname")
|
||||||
dinfo "zfsexpandknowledge: underlying block device backing ZFS dataset $mp: ${_depdevname//$'\n'/ }"
|
dinfo "zfsexpandknowledge: underlying block device backing ZFS dataset $mp: ${_depdevname//$'\n'/ }"
|
||||||
array_contains "$_depdevname" "${host_devs[@]}" || host_devs+=("$_depdevname")
|
array_contains "$_depdevname" "${host_devs[@]}" || host_devs+=("$_depdevname")
|
||||||
|
|||||||
@@ -60,11 +60,17 @@ install() {
|
|||||||
# Fallback: Guess the path and include all matches
|
# Fallback: Guess the path and include all matches
|
||||||
dracut_install /usr/lib*/gcc/**/libgcc_s.so*
|
dracut_install /usr/lib*/gcc/**/libgcc_s.so*
|
||||||
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 @mounthelperdir@/mount.zfs
|
||||||
dracut_install @udevdir@/vdev_id
|
dracut_install @udevdir@/vdev_id
|
||||||
dracut_install awk
|
dracut_install awk
|
||||||
dracut_install basename
|
|
||||||
dracut_install cut
|
dracut_install cut
|
||||||
|
dracut_install tr
|
||||||
dracut_install head
|
dracut_install head
|
||||||
dracut_install @udevdir@/zvol_id
|
dracut_install @udevdir@/zvol_id
|
||||||
inst_hook cmdline 95 "${moddir}/parse-zfs.sh"
|
inst_hook cmdline 95 "${moddir}/parse-zfs.sh"
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ case "${root}" in
|
|||||||
root="${root#FILESYSTEM=}"
|
root="${root#FILESYSTEM=}"
|
||||||
root="zfs:${root#ZFS=}"
|
root="zfs:${root#ZFS=}"
|
||||||
# switch + with spaces because kernel cmdline does not allow us to quote parameters
|
# switch + with spaces because kernel cmdline does not allow us to quote parameters
|
||||||
root=$(printf '%s\n' "$root" | sed "s/+/ /g")
|
root=$(echo "$root" | tr '+' ' ')
|
||||||
rootok=1
|
rootok=1
|
||||||
wait_for_zfs=1
|
wait_for_zfs=1
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Before=zfs-import.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
ExecStart=/bin/sh -c "systemctl set-environment BOOTFS=$(@sbindir@/zpool list -H -o bootfs | grep -m1 -v '^-$')"
|
ExecStart=/bin/sh -c "exec systemctl set-environment BOOTFS=$(@sbindir@/zpool list -H -o bootfs | grep -m1 -v '^-$')"
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=zfs-import.target
|
WantedBy=zfs-import.target
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ else
|
|||||||
_zfs_generator_cb() {
|
_zfs_generator_cb() {
|
||||||
dset="${1}"
|
dset="${1}"
|
||||||
mpnt="${2}"
|
mpnt="${2}"
|
||||||
unit="sysroot$(echo "$mpnt" | sed 's;/;-;g').mount"
|
unit="sysroot$(echo "$mpnt" | tr '/' '-').mount"
|
||||||
|
|
||||||
{
|
{
|
||||||
echo "[Unit]"
|
echo "[Unit]"
|
||||||
|
|||||||
@@ -42,15 +42,32 @@ if [ "$(zpool list -H -o feature@encryption "${BOOTFS%%/*}")" = 'active' ]; then
|
|||||||
[ "$KEYSTATUS" = "unavailable" ] || exit 0
|
[ "$KEYSTATUS" = "unavailable" ] || exit 0
|
||||||
|
|
||||||
KEYLOCATION="$(zfs get -H -o value keylocation "${ENCRYPTIONROOT}")"
|
KEYLOCATION="$(zfs get -H -o value keylocation "${ENCRYPTIONROOT}")"
|
||||||
if ! [ "${KEYLOCATION}" = "prompt" ]; then
|
case "${KEYLOCATION%%://*}" in
|
||||||
zfs load-key "${ENCRYPTIONROOT}"
|
prompt)
|
||||||
else
|
for _ in 1 2 3; do
|
||||||
# decrypt them
|
systemd-ask-password --no-tty "Encrypted ZFS password for ${BOOTFS}" | zfs load-key "${ENCRYPTIONROOT}" && break
|
||||||
TRY_COUNT=5
|
done
|
||||||
while [ $TRY_COUNT -gt 0 ]; do
|
;;
|
||||||
systemd-ask-password "Encrypted ZFS password for ${BOOTFS}" --no-tty | zfs load-key "${ENCRYPTIONROOT}" && break
|
http*)
|
||||||
TRY_COUNT=$((TRY_COUNT - 1))
|
systemctl start network-online.target
|
||||||
done
|
zfs load-key "${ENCRYPTIONROOT}"
|
||||||
fi
|
;;
|
||||||
|
file)
|
||||||
|
KEYFILE="${KEYLOCATION#file://}"
|
||||||
|
[ -r "${KEYFILE}" ] || udevadm settle
|
||||||
|
[ -r "${KEYFILE}" ] || {
|
||||||
|
info "Waiting for key ${KEYFILE} for ${ENCRYPTIONROOT}..."
|
||||||
|
for _ in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
|
||||||
|
sleep 0.5s
|
||||||
|
[ -r "${KEYFILE}" ] && break
|
||||||
|
done
|
||||||
|
}
|
||||||
|
[ -r "${KEYFILE}" ] || warn "Key ${KEYFILE} for ${ENCRYPTIONROOT} hasn't appeared. Trying anyway."
|
||||||
|
zfs load-key "${ENCRYPTIONROOT}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
zfs load-key "${ENCRYPTIONROOT}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -10,5 +10,5 @@ ConditionKernelCommandLine=bootfs.rollback
|
|||||||
# ${BOOTFS} should have been set by zfs-env-bootfs.service
|
# ${BOOTFS} should have been set by zfs-env-bootfs.service
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
ExecStartPre=/bin/sh -c 'test -n "${BOOTFS}"'
|
ExecStartPre=/bin/sh -c 'test -n "${BOOTFS}"'
|
||||||
ExecStart=/bin/sh -c '. /lib/dracut-lib.sh; SNAPNAME="$(getarg bootfs.rollback)"; @sbindir@/zfs rollback -Rf "${BOOTFS}@${SNAPNAME:-%v}"'
|
ExecStart=/bin/sh -c '. /lib/dracut-lib.sh; SNAPNAME="$(getarg bootfs.rollback)"; exec @sbindir@/zfs rollback -Rf "${BOOTFS}@${SNAPNAME:-%v}"'
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
|
|||||||
@@ -10,5 +10,5 @@ ConditionKernelCommandLine=bootfs.snapshot
|
|||||||
# ${BOOTFS} should have been set by zfs-env-bootfs.service
|
# ${BOOTFS} should have been set by zfs-env-bootfs.service
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
ExecStartPre=/bin/sh -c 'test -n "${BOOTFS}"'
|
ExecStartPre=/bin/sh -c 'test -n "${BOOTFS}"'
|
||||||
ExecStart=-/bin/sh -c '. /lib/dracut-lib.sh; SNAPNAME="$(getarg bootfs.snapshot)"; @sbindir@/zfs snapshot "${BOOTFS}@${SNAPNAME:-%v}"'
|
ExecStart=-/bin/sh -c '. /lib/dracut-lib.sh; SNAPNAME="$(getarg bootfs.snapshot)"; exec @sbindir@/zfs snapshot "${BOOTFS}@${SNAPNAME:-%v}"'
|
||||||
RemainAfterExit=yes
|
RemainAfterExit=yes
|
||||||
|
|||||||
@@ -30,6 +30,13 @@ find /lib/ -type f -name "libgcc_s.so.[1-9]" | while read -r libgcc; do
|
|||||||
copy_exec "$libgcc"
|
copy_exec "$libgcc"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# shellcheck disable=SC2050
|
||||||
|
if [ @LIBFETCH_DYNAMIC@ -gt 0 ]; then
|
||||||
|
find /lib/ -name "@LIBFETCH_SONAME@" | while read -r libfetch; do
|
||||||
|
copy_exec "$libfetch"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
copy_file config "/etc/hostid"
|
copy_file config "/etc/hostid"
|
||||||
copy_file cache "@sysconfdir@/zfs/zpool.cache"
|
copy_file cache "@sysconfdir@/zfs/zpool.cache"
|
||||||
copy_file config "@initconfdir@/zfs"
|
copy_file config "@initconfdir@/zfs"
|
||||||
|
|||||||
@@ -105,8 +105,7 @@ find_rootfs()
|
|||||||
find_pools()
|
find_pools()
|
||||||
{
|
{
|
||||||
pools=$("$@" 2> /dev/null | \
|
pools=$("$@" 2> /dev/null | \
|
||||||
grep -E "pool:|^[a-zA-Z0-9]" | \
|
sed -Ee '/pool:|^[a-zA-Z0-9]/!d' -e 's@.*: @@' | \
|
||||||
sed 's@.*: @@' | \
|
|
||||||
tr '\n' ';')
|
tr '\n' ';')
|
||||||
|
|
||||||
echo "${pools%%;}" # Return without the last ';'.
|
echo "${pools%%;}" # Return without the last ';'.
|
||||||
@@ -403,35 +402,32 @@ decrypt_fs()
|
|||||||
KEYSTATUS="$(get_fs_value "${ENCRYPTIONROOT}" keystatus)"
|
KEYSTATUS="$(get_fs_value "${ENCRYPTIONROOT}" keystatus)"
|
||||||
# Continue only if the key needs to be loaded
|
# Continue only if the key needs to be loaded
|
||||||
[ "$KEYSTATUS" = "unavailable" ] || return 0
|
[ "$KEYSTATUS" = "unavailable" ] || return 0
|
||||||
TRY_COUNT=3
|
|
||||||
|
|
||||||
# If key is stored in a file, do not prompt
|
# Do not prompt if key is stored noninteractively,
|
||||||
if ! [ "${KEYLOCATION}" = "prompt" ]; then
|
if ! [ "${KEYLOCATION}" = "prompt" ]; then
|
||||||
$ZFS load-key "${ENCRYPTIONROOT}"
|
$ZFS load-key "${ENCRYPTIONROOT}"
|
||||||
|
|
||||||
# Prompt with plymouth, if active
|
# Prompt with plymouth, if active
|
||||||
elif [ -e /bin/plymouth ] && /bin/plymouth --ping 2>/dev/null; then
|
elif /bin/plymouth --ping 2>/dev/null; then
|
||||||
echo "plymouth" > /run/zfs_console_askpwd_cmd
|
echo "plymouth" > /run/zfs_console_askpwd_cmd
|
||||||
while [ $TRY_COUNT -gt 0 ]; do
|
for _ in 1 2 3; do
|
||||||
plymouth ask-for-password --prompt "Encrypted ZFS password for ${ENCRYPTIONROOT}" | \
|
plymouth ask-for-password --prompt "Encrypted ZFS password for ${ENCRYPTIONROOT}" | \
|
||||||
$ZFS load-key "${ENCRYPTIONROOT}" && break
|
$ZFS load-key "${ENCRYPTIONROOT}" && break
|
||||||
TRY_COUNT=$((TRY_COUNT - 1))
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# Prompt with systemd, if active
|
# Prompt with systemd, if active
|
||||||
elif [ -e /run/systemd/system ]; then
|
elif [ -e /run/systemd/system ]; then
|
||||||
echo "systemd-ask-password" > /run/zfs_console_askpwd_cmd
|
echo "systemd-ask-password" > /run/zfs_console_askpwd_cmd
|
||||||
while [ $TRY_COUNT -gt 0 ]; do
|
for _ in 1 2 3; do
|
||||||
systemd-ask-password "Encrypted ZFS password for ${ENCRYPTIONROOT}" --no-tty | \
|
systemd-ask-password --no-tty "Encrypted ZFS password for ${ENCRYPTIONROOT}" | \
|
||||||
$ZFS load-key "${ENCRYPTIONROOT}" && break
|
$ZFS load-key "${ENCRYPTIONROOT}" && break
|
||||||
TRY_COUNT=$((TRY_COUNT - 1))
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# Prompt with ZFS tty, otherwise
|
# Prompt with ZFS tty, otherwise
|
||||||
else
|
else
|
||||||
# Temporarily setting "printk" to "7" allows the prompt to appear even when the "quiet" kernel option has been used
|
# Temporarily setting "printk" to "7" allows the prompt to appear even when the "quiet" kernel option has been used
|
||||||
echo "load-key" > /run/zfs_console_askpwd_cmd
|
echo "load-key" > /run/zfs_console_askpwd_cmd
|
||||||
storeprintk="$(awk '{print $1}' /proc/sys/kernel/printk)"
|
read -r storeprintk _ < /proc/sys/kernel/printk
|
||||||
echo 7 > /proc/sys/kernel/printk
|
echo 7 > /proc/sys/kernel/printk
|
||||||
$ZFS load-key "${ENCRYPTIONROOT}"
|
$ZFS load-key "${ENCRYPTIONROOT}"
|
||||||
echo "$storeprintk" > /proc/sys/kernel/printk
|
echo "$storeprintk" > /proc/sys/kernel/printk
|
||||||
|
|||||||
+7
-1
@@ -1,4 +1,4 @@
|
|||||||
# ZoL userland configuration.
|
# OpenZFS userland configuration.
|
||||||
|
|
||||||
# NOTE: This file is intended for sysv init and initramfs.
|
# NOTE: This file is intended for sysv init and initramfs.
|
||||||
# Changing some of these settings may not make any difference on
|
# Changing some of these settings may not make any difference on
|
||||||
@@ -9,6 +9,12 @@
|
|||||||
# To enable a boolean setting, set it to yes, on, true, or 1.
|
# To enable a boolean setting, set it to yes, on, true, or 1.
|
||||||
# Anything else will be interpreted as unset.
|
# Anything else will be interpreted as unset.
|
||||||
|
|
||||||
|
# Run `zfs load-key` during system start?
|
||||||
|
ZFS_LOAD_KEY='yes'
|
||||||
|
|
||||||
|
# Run `zfs unload-key` during system stop?
|
||||||
|
ZFS_UNLOAD_KEY='no'
|
||||||
|
|
||||||
# Run `zfs mount -a` during system start?
|
# Run `zfs mount -a` during system start?
|
||||||
ZFS_MOUNT='yes'
|
ZFS_MOUNT='yes'
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
zfs-import
|
zfs-import
|
||||||
|
zfs-load-key
|
||||||
zfs-mount
|
zfs-mount
|
||||||
zfs-share
|
zfs-share
|
||||||
zfs-zed
|
zfs-zed
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ include $(top_srcdir)/config/Shellcheck.am
|
|||||||
|
|
||||||
EXTRA_DIST += README.md
|
EXTRA_DIST += README.md
|
||||||
|
|
||||||
init_SCRIPTS = zfs-import zfs-mount zfs-share zfs-zed
|
init_SCRIPTS = zfs-import zfs-load-key zfs-mount zfs-share zfs-zed
|
||||||
|
|
||||||
SUBSTFILES += $(init_SCRIPTS)
|
SUBSTFILES += $(init_SCRIPTS)
|
||||||
|
|
||||||
|
|||||||
@@ -42,14 +42,16 @@ INSTALLING INIT SCRIPT LINKS
|
|||||||
To setup the init script links in /etc/rc?.d manually on a Debian GNU/Linux
|
To setup the init script links in /etc/rc?.d manually on a Debian GNU/Linux
|
||||||
(or derived) system, run the following commands (the order is important!):
|
(or derived) system, run the following commands (the order is important!):
|
||||||
|
|
||||||
update-rc.d zfs-import start 07 S . stop 07 0 1 6 .
|
update-rc.d zfs-import start 07 S . stop 07 0 1 6 .
|
||||||
update-rc.d zfs-mount start 02 2 3 4 5 . stop 06 0 1 6 .
|
update-rc.d zfs-load-key start 02 2 3 4 5 . stop 06 0 1 6 .
|
||||||
update-rc.d zfs-zed start 07 2 3 4 5 . stop 08 0 1 6 .
|
update-rc.d zfs-mount start 02 2 3 4 5 . stop 06 0 1 6 .
|
||||||
update-rc.d zfs-share start 27 2 3 4 5 . stop 05 0 1 6 .
|
update-rc.d zfs-zed start 07 2 3 4 5 . stop 08 0 1 6 .
|
||||||
|
update-rc.d zfs-share start 27 2 3 4 5 . stop 05 0 1 6 .
|
||||||
|
|
||||||
To do the same on RedHat, Fedora and/or CentOS:
|
To do the same on RedHat, Fedora and/or CentOS:
|
||||||
|
|
||||||
chkconfig zfs-import
|
chkconfig zfs-import
|
||||||
|
chkconfig zfs-load-key
|
||||||
chkconfig zfs-mount
|
chkconfig zfs-mount
|
||||||
chkconfig zfs-zed
|
chkconfig zfs-zed
|
||||||
chkconfig zfs-share
|
chkconfig zfs-share
|
||||||
@@ -57,6 +59,7 @@ INSTALLING INIT SCRIPT LINKS
|
|||||||
On Gentoo:
|
On Gentoo:
|
||||||
|
|
||||||
rc-update add zfs-import boot
|
rc-update add zfs-import boot
|
||||||
|
rc-update add zfs-load-key boot
|
||||||
rc-update add zfs-mount boot
|
rc-update add zfs-mount boot
|
||||||
rc-update add zfs-zed default
|
rc-update add zfs-zed default
|
||||||
rc-update add zfs-share default
|
rc-update add zfs-share default
|
||||||
|
|||||||
@@ -57,8 +57,7 @@ find_pools()
|
|||||||
local pools
|
local pools
|
||||||
|
|
||||||
pools=$("$@" 2> /dev/null | \
|
pools=$("$@" 2> /dev/null | \
|
||||||
grep -E "pool:|^[a-zA-Z0-9]" | \
|
sed -Ee '/pool:|^[a-zA-Z0-9]/!d' -e 's@.*: @@' | \
|
||||||
sed 's@.*: @@' | \
|
|
||||||
sort | \
|
sort | \
|
||||||
tr '\n' ';')
|
tr '\n' ';')
|
||||||
|
|
||||||
|
|||||||
Executable
+131
@@ -0,0 +1,131 @@
|
|||||||
|
#!@DEFAULT_INIT_SHELL@
|
||||||
|
#
|
||||||
|
# zfs-load-key This script will load/unload the zfs filesystems keys.
|
||||||
|
#
|
||||||
|
# chkconfig: 2345 06 99
|
||||||
|
# description: This script will load or unload the zfs filesystems keys during
|
||||||
|
# system boot/shutdown. Only filesystems with key path set
|
||||||
|
# in keylocation property. See the zfs(8) man page for details.
|
||||||
|
# probe: true
|
||||||
|
#
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: zfs-load-key
|
||||||
|
# Required-Start: $local_fs zfs-import
|
||||||
|
# Required-Stop: $local_fs zfs-import
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# X-Start-Before: zfs-mount
|
||||||
|
# X-Stop-After: zfs-zed
|
||||||
|
# Short-Description: Load ZFS keys for filesystems and volumes
|
||||||
|
# Description: Run the `zfs load-key` or `zfs unload-key` commands.
|
||||||
|
### END INIT INFO
|
||||||
|
#
|
||||||
|
# Released under the 2-clause BSD license.
|
||||||
|
#
|
||||||
|
# This script is based on debian/zfsutils.zfs.init from the
|
||||||
|
# Debian GNU/kFreeBSD zfsutils 8.1-3 package, written by Aurelien Jarno.
|
||||||
|
|
||||||
|
# Source the common init script
|
||||||
|
. @sysconfdir@/zfs/zfs-functions
|
||||||
|
|
||||||
|
# ----------------------------------------------------
|
||||||
|
|
||||||
|
do_depend()
|
||||||
|
{
|
||||||
|
# bootmisc will log to /var which may be a different zfs than root.
|
||||||
|
before bootmisc logger zfs-mount
|
||||||
|
|
||||||
|
after zfs-import sysfs
|
||||||
|
keyword -lxc -openvz -prefix -vserver
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load keys for all datasets/filesystems
|
||||||
|
do_load_keys()
|
||||||
|
{
|
||||||
|
zfs_log_begin_msg "Load ZFS filesystem(s) keys"
|
||||||
|
|
||||||
|
"$ZFS" list -Ho name,encryptionroot,keystatus,keylocation |
|
||||||
|
while IFS=" " read -r name encryptionroot keystatus keylocation; do
|
||||||
|
if [ "$encryptionroot" != "-" ] &&
|
||||||
|
[ "$name" = "$encryptionroot" ] &&
|
||||||
|
[ "$keystatus" = "unavailable" ] &&
|
||||||
|
[ "$keylocation" != "prompt" ] &&
|
||||||
|
[ "$keylocation" != "none" ]
|
||||||
|
then
|
||||||
|
zfs_action "Load key for $encryptionroot" \
|
||||||
|
"$ZFS" load-key "$encryptionroot"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
zfs_log_end_msg 0
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Unload keys for all datasets/filesystems
|
||||||
|
do_unload_keys()
|
||||||
|
{
|
||||||
|
zfs_log_begin_msg "Unload ZFS filesystem(s) key"
|
||||||
|
|
||||||
|
"$ZFS" list -Ho name,encryptionroot,keystatus | sed '1!G;h;$!d' |
|
||||||
|
while IFS=" " read -r name encryptionroot keystatus; do
|
||||||
|
if [ "$encryptionroot" != "-" ] &&
|
||||||
|
[ "$name" = "$encryptionroot" ] &&
|
||||||
|
[ "$keystatus" = "available" ]
|
||||||
|
then
|
||||||
|
zfs_action "Unload key for $encryptionroot" \
|
||||||
|
"$ZFS" unload-key "$encryptionroot"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
zfs_log_end_msg 0
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
do_start()
|
||||||
|
{
|
||||||
|
check_boolean "$ZFS_LOAD_KEY" || exit 0
|
||||||
|
|
||||||
|
check_module_loaded "zfs" || exit 0
|
||||||
|
|
||||||
|
do_load_keys
|
||||||
|
}
|
||||||
|
|
||||||
|
do_stop()
|
||||||
|
{
|
||||||
|
check_boolean "$ZFS_UNLOAD_KEY" || exit 0
|
||||||
|
|
||||||
|
check_module_loaded "zfs" || exit 0
|
||||||
|
|
||||||
|
do_unload_keys
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------------------------------------------------
|
||||||
|
|
||||||
|
if [ ! -e /sbin/openrc-run ]
|
||||||
|
then
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
do_start
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
do_stop
|
||||||
|
;;
|
||||||
|
force-reload|condrestart|reload|restart|status)
|
||||||
|
# no-op
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
[ -n "$1" ] && echo "Error: Unknown command $1."
|
||||||
|
echo "Usage: $0 {start|stop}"
|
||||||
|
exit 3
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit $?
|
||||||
|
else
|
||||||
|
# Create wrapper functions since Gentoo don't use the case part.
|
||||||
|
depend() { do_depend; }
|
||||||
|
start() { do_start; }
|
||||||
|
stop() { do_stop; }
|
||||||
|
fi
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
*.service
|
*.service
|
||||||
*.target
|
*.target
|
||||||
*.preset
|
*.preset
|
||||||
|
*.timer
|
||||||
|
|||||||
@@ -12,7 +12,10 @@ systemdunit_DATA = \
|
|||||||
zfs-volume-wait.service \
|
zfs-volume-wait.service \
|
||||||
zfs-import.target \
|
zfs-import.target \
|
||||||
zfs-volumes.target \
|
zfs-volumes.target \
|
||||||
zfs.target
|
zfs.target \
|
||||||
|
zfs-scrub-monthly@.timer \
|
||||||
|
zfs-scrub-weekly@.timer \
|
||||||
|
zfs-scrub@.service
|
||||||
|
|
||||||
SUBSTFILES += $(systemdpreset_DATA) $(systemdunit_DATA)
|
SUBSTFILES += $(systemdpreset_DATA) $(systemdunit_DATA)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Monthly zpool scrub timer for %i
|
||||||
|
Documentation=man:zpool-scrub(8)
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=monthly
|
||||||
|
Persistent=true
|
||||||
|
RandomizedDelaySec=1h
|
||||||
|
Unit=zfs-scrub@%i.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Weekly zpool scrub timer for %i
|
||||||
|
Documentation=man:zpool-scrub(8)
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=weekly
|
||||||
|
Persistent=true
|
||||||
|
RandomizedDelaySec=1h
|
||||||
|
Unit=zfs-scrub@%i.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=zpool scrub on %i
|
||||||
|
Documentation=man:zpool-scrub(8)
|
||||||
|
Requires=zfs.target
|
||||||
|
After=zfs.target
|
||||||
|
ConditionACPower=true
|
||||||
|
ConditionPathIsDirectory=/sys/module/zfs
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/bin/sh -c '\
|
||||||
|
if @sbindir@/zpool status %i | grep "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'
|
||||||
+12
-11
@@ -1,5 +1,5 @@
|
|||||||
# This is a script with common functions etc used by zfs-import, zfs-mount,
|
# This is a script with common functions etc used by zfs-import, zfs-load-key,
|
||||||
# zfs-share and zfs-zed.
|
# zfs-mount, zfs-share and zfs-zed.
|
||||||
#
|
#
|
||||||
# It is _NOT_ to be called independently
|
# It is _NOT_ to be called independently
|
||||||
#
|
#
|
||||||
@@ -92,6 +92,8 @@ ZPOOL="@sbindir@/zpool"
|
|||||||
ZPOOL_CACHE="@sysconfdir@/zfs/zpool.cache"
|
ZPOOL_CACHE="@sysconfdir@/zfs/zpool.cache"
|
||||||
|
|
||||||
# Sensible defaults
|
# Sensible defaults
|
||||||
|
ZFS_LOAD_KEY='yes'
|
||||||
|
ZFS_UNLOAD_KEY='no'
|
||||||
ZFS_MOUNT='yes'
|
ZFS_MOUNT='yes'
|
||||||
ZFS_UNMOUNT='yes'
|
ZFS_UNMOUNT='yes'
|
||||||
ZFS_SHARE='yes'
|
ZFS_SHARE='yes'
|
||||||
@@ -104,7 +106,8 @@ fi
|
|||||||
|
|
||||||
# ----------------------------------------------------
|
# ----------------------------------------------------
|
||||||
|
|
||||||
export ZFS ZED ZPOOL ZPOOL_CACHE ZFS_MOUNT ZFS_UNMOUNT ZFS_SHARE ZFS_UNSHARE
|
export ZFS ZED ZPOOL ZPOOL_CACHE ZFS_LOAD_KEY ZFS_UNLOAD_KEY ZFS_MOUNT ZFS_UNMOUNT \
|
||||||
|
ZFS_SHARE ZFS_UNSHARE
|
||||||
|
|
||||||
zfs_action()
|
zfs_action()
|
||||||
{
|
{
|
||||||
@@ -345,7 +348,7 @@ read_mtab()
|
|||||||
|
|
||||||
# Unset all MTAB_* variables
|
# Unset all MTAB_* variables
|
||||||
# shellcheck disable=SC2046
|
# shellcheck disable=SC2046
|
||||||
unset $(env | grep ^MTAB_ | sed 's,=.*,,')
|
unset $(env | sed -e '/^MTAB_/!d' -e 's,=.*,,')
|
||||||
|
|
||||||
while read -r fs mntpnt fstype opts rest; do
|
while read -r fs mntpnt fstype opts rest; do
|
||||||
if echo "$fs $mntpnt $fstype $opts" | grep -qE "$match"; then
|
if echo "$fs $mntpnt $fstype $opts" | grep -qE "$match"; then
|
||||||
@@ -360,9 +363,8 @@ read_mtab()
|
|||||||
fs=$(/bin/echo "$fs" | sed 's,\\0,\\00,')
|
fs=$(/bin/echo "$fs" | sed 's,\\0,\\00,')
|
||||||
|
|
||||||
# Remove 'unwanted' characters.
|
# Remove 'unwanted' characters.
|
||||||
mntpnt=$(printf '%b\n' "$mntpnt" | sed -e 's,/,,g' \
|
mntpnt=$(printf '%b' "$mntpnt" | tr -d '/. -')
|
||||||
-e 's,-,,g' -e 's,\.,,g' -e 's, ,,g')
|
fs=$(printf '%b' "$fs")
|
||||||
fs=$(printf '%b\n' "$fs")
|
|
||||||
|
|
||||||
# Set the variable.
|
# Set the variable.
|
||||||
eval export "MTAB_$mntpnt=\"$fs\""
|
eval export "MTAB_$mntpnt=\"$fs\""
|
||||||
@@ -374,8 +376,7 @@ in_mtab()
|
|||||||
{
|
{
|
||||||
local mntpnt="$1"
|
local mntpnt="$1"
|
||||||
# Remove 'unwanted' characters.
|
# Remove 'unwanted' characters.
|
||||||
mntpnt=$(printf '%b\n' "$mntpnt" | sed -e 's,/,,g' \
|
mntpnt=$(printf '%b' "$mntpnt" | tr -d '/. -')
|
||||||
-e 's,-,,g' -e 's,\.,,g' -e 's, ,,g')
|
|
||||||
local var
|
local var
|
||||||
|
|
||||||
var="$(eval echo "MTAB_$mntpnt")"
|
var="$(eval echo "MTAB_$mntpnt")"
|
||||||
@@ -391,7 +392,7 @@ read_fstab()
|
|||||||
|
|
||||||
# Unset all FSTAB_* variables
|
# Unset all FSTAB_* variables
|
||||||
# shellcheck disable=SC2046
|
# shellcheck disable=SC2046
|
||||||
unset $(env | grep ^FSTAB_ | sed 's,=.*,,')
|
unset $(env | sed -e '/^FSTAB_/!d' -e 's,=.*,,')
|
||||||
|
|
||||||
i=0
|
i=0
|
||||||
while read -r fs mntpnt fstype opts; do
|
while read -r fs mntpnt fstype opts; do
|
||||||
@@ -401,7 +402,7 @@ read_fstab()
|
|||||||
|
|
||||||
if echo "$fs $mntpnt $fstype $opts" | grep -qE "$match"; then
|
if echo "$fs $mntpnt $fstype $opts" | grep -qE "$match"; then
|
||||||
eval export "FSTAB_dev_$i=$fs"
|
eval export "FSTAB_dev_$i=$fs"
|
||||||
fs=$(printf '%b\n' "$fs" | sed 's,/,_,g')
|
fs=$(printf '%b' "$fs" | tr '/' '_')
|
||||||
eval export "FSTAB_$i=$mntpnt"
|
eval export "FSTAB_$i=$mntpnt"
|
||||||
|
|
||||||
i=$((i + 1))
|
i=$((i + 1))
|
||||||
|
|||||||
@@ -72,6 +72,8 @@ struct libzfs_handle {
|
|||||||
boolean_t libzfs_prop_debug;
|
boolean_t libzfs_prop_debug;
|
||||||
regex_t libzfs_urire;
|
regex_t libzfs_urire;
|
||||||
uint64_t libzfs_max_nvlist;
|
uint64_t libzfs_max_nvlist;
|
||||||
|
void *libfetch;
|
||||||
|
char *libfetch_load_error;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct zfs_handle {
|
struct zfs_handle {
|
||||||
|
|||||||
@@ -159,6 +159,16 @@ void color_start(char *color);
|
|||||||
void color_end(void);
|
void color_end(void);
|
||||||
int printf_color(char *color, char *format, ...);
|
int printf_color(char *color, char *format, ...);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These functions are used by the ZFS libraries and cmd/zpool code, but are
|
||||||
|
* not exported in the ABI.
|
||||||
|
*/
|
||||||
|
typedef int (*pool_vdev_iter_f)(void *, nvlist_t *, void *);
|
||||||
|
int for_each_vdev_cb(void *zhp, nvlist_t *nv, pool_vdev_iter_f func,
|
||||||
|
void *data);
|
||||||
|
int for_each_vdev_in_nvlist(nvlist_t *nvroot, pool_vdev_iter_f func,
|
||||||
|
void *data);
|
||||||
|
void update_vdevs_config_dev_sysfs_path(nvlist_t *config);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -67,6 +67,7 @@
|
|||||||
#define __always_inline inline
|
#define __always_inline inline
|
||||||
#define noinline __noinline
|
#define noinline __noinline
|
||||||
#define ____cacheline_aligned __aligned(CACHE_LINE_SIZE)
|
#define ____cacheline_aligned __aligned(CACHE_LINE_SIZE)
|
||||||
|
#define fallthrough __attribute__((__fallthrough__))
|
||||||
|
|
||||||
#if !defined(_KERNEL) && !defined(_STANDALONE)
|
#if !defined(_KERNEL) && !defined(_STANDALONE)
|
||||||
#define likely(x) __builtin_expect(!!(x), 1)
|
#define likely(x) __builtin_expect(!!(x), 1)
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ random_get_pseudo_bytes(uint8_t *p, size_t s)
|
|||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
random_in_range(uint32_t range)
|
random_in_range(uint32_t range)
|
||||||
{
|
{
|
||||||
#if __FreeBSD_version >= 1300108
|
#if defined(_KERNEL) && __FreeBSD_version >= 1300108
|
||||||
return (prng32_bounded(range));
|
return (prng32_bounded(range));
|
||||||
#else
|
#else
|
||||||
uint32_t r;
|
uint32_t r;
|
||||||
@@ -61,7 +61,7 @@ random_in_range(uint32_t range)
|
|||||||
if (range == 1)
|
if (range == 1)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
(void) random_get_pseudo_bytes((void *)&r, sizeof (r));
|
(void) random_get_pseudo_bytes((uint8_t *)&r, sizeof (r));
|
||||||
|
|
||||||
return (r % range);
|
return (r % range);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -59,6 +59,8 @@ enum symfollow { NO_FOLLOW = NOFOLLOW };
|
|||||||
#include <sys/file.h>
|
#include <sys/file.h>
|
||||||
#include <sys/filedesc.h>
|
#include <sys/filedesc.h>
|
||||||
#include <sys/syscallsubr.h>
|
#include <sys/syscallsubr.h>
|
||||||
|
#include <sys/vm.h>
|
||||||
|
#include <vm/vm_object.h>
|
||||||
|
|
||||||
typedef struct vop_vector vnodeops_t;
|
typedef struct vop_vector vnodeops_t;
|
||||||
#define VOP_FID VOP_VPTOFH
|
#define VOP_FID VOP_VPTOFH
|
||||||
@@ -83,6 +85,22 @@ vn_is_readonly(vnode_t *vp)
|
|||||||
#define vn_has_cached_data(vp) \
|
#define vn_has_cached_data(vp) \
|
||||||
((vp)->v_object != NULL && \
|
((vp)->v_object != NULL && \
|
||||||
(vp)->v_object->resident_page_count > 0)
|
(vp)->v_object->resident_page_count > 0)
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
vn_flush_cached_data(vnode_t *vp, boolean_t sync)
|
||||||
|
{
|
||||||
|
#if __FreeBSD_version > 1300054
|
||||||
|
if (vm_object_mightbedirty(vp->v_object)) {
|
||||||
|
#else
|
||||||
|
if (vp->v_object->flags & OBJ_MIGHTBEDIRTY) {
|
||||||
|
#endif
|
||||||
|
int flags = sync ? OBJPC_SYNC : 0;
|
||||||
|
zfs_vmobject_wlock(vp->v_object);
|
||||||
|
vm_object_page_clean(vp->v_object, 0, 0, flags);
|
||||||
|
zfs_vmobject_wunlock(vp->v_object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define vn_exists(vp) do { } while (0)
|
#define vn_exists(vp) do { } while (0)
|
||||||
#define vn_invalid(vp) do { } while (0)
|
#define vn_invalid(vp) do { } while (0)
|
||||||
#define vn_renamepath(tdvp, svp, tnm, lentnm) do { } while (0)
|
#define vn_renamepath(tdvp, svp, tnm, lentnm) do { } while (0)
|
||||||
@@ -114,7 +132,6 @@ vn_is_readonly(vnode_t *vp)
|
|||||||
/* TODO: This field needs conversion! */
|
/* TODO: This field needs conversion! */
|
||||||
#define va_nblocks va_bytes
|
#define va_nblocks va_bytes
|
||||||
#define va_blksize va_blocksize
|
#define va_blksize va_blocksize
|
||||||
#define va_seq va_gen
|
|
||||||
|
|
||||||
#define MAXOFFSET_T OFF_MAX
|
#define MAXOFFSET_T OFF_MAX
|
||||||
#define EXCL 0
|
#define EXCL 0
|
||||||
|
|||||||
@@ -41,6 +41,10 @@
|
|||||||
#include <sys/ccompat.h>
|
#include <sys/ccompat.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
#if KSTACK_PAGES * PAGE_SIZE >= 16384
|
||||||
|
#define HAVE_LARGE_STACKS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#define cond_resched() kern_yield(PRI_USER)
|
#define cond_resched() kern_yield(PRI_USER)
|
||||||
|
|
||||||
#define taskq_create_sysdc(a, b, d, e, p, dc, f) \
|
#define taskq_create_sysdc(a, b, d, e, p, dc, f) \
|
||||||
|
|||||||
@@ -118,7 +118,8 @@ extern minor_t zfsdev_minor_alloc(void);
|
|||||||
#define Z_ISLNK(type) ((type) == VLNK)
|
#define Z_ISLNK(type) ((type) == VLNK)
|
||||||
#define Z_ISDIR(type) ((type) == VDIR)
|
#define Z_ISDIR(type) ((type) == VDIR)
|
||||||
|
|
||||||
#define zn_has_cached_data(zp) vn_has_cached_data(ZTOV(zp))
|
#define zn_has_cached_data(zp) vn_has_cached_data(ZTOV(zp))
|
||||||
|
#define zn_flush_cached_data(zp, sync) vn_flush_cached_data(ZTOV(zp), sync)
|
||||||
#define zn_rlimit_fsize(zp, uio) \
|
#define zn_rlimit_fsize(zp, uio) \
|
||||||
vn_rlimit_fsize(ZTOV(zp), GET_UIO_STRUCT(uio), zfs_uio_td(uio))
|
vn_rlimit_fsize(ZTOV(zp), GET_UIO_STRUCT(uio), zfs_uio_td(uio))
|
||||||
|
|
||||||
|
|||||||
@@ -30,9 +30,9 @@
|
|||||||
#define _ZFS_BLKDEV_H
|
#define _ZFS_BLKDEV_H
|
||||||
|
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
#include <linux/elevator.h>
|
|
||||||
#include <linux/backing-dev.h>
|
#include <linux/backing-dev.h>
|
||||||
#include <linux/hdreg.h>
|
#include <linux/hdreg.h>
|
||||||
|
#include <linux/major.h>
|
||||||
#include <linux/msdos_fs.h> /* for SECTOR_* */
|
#include <linux/msdos_fs.h> /* for SECTOR_* */
|
||||||
|
|
||||||
#ifndef HAVE_BLK_QUEUE_FLAG_SET
|
#ifndef HAVE_BLK_QUEUE_FLAG_SET
|
||||||
|
|||||||
@@ -28,6 +28,14 @@
|
|||||||
|
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
|
#if !defined(fallthrough)
|
||||||
|
#if defined(HAVE_IMPLICIT_FALLTHROUGH)
|
||||||
|
#define fallthrough __attribute__((__fallthrough__))
|
||||||
|
#else
|
||||||
|
#define fallthrough ((void)0)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(READ_ONCE)
|
#if !defined(READ_ONCE)
|
||||||
#define READ_ONCE(x) ACCESS_ONCE(x)
|
#define READ_ONCE(x) ACCESS_ONCE(x)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -88,6 +88,9 @@
|
|||||||
#if defined(HAVE_KERNEL_FPU_API_HEADER)
|
#if defined(HAVE_KERNEL_FPU_API_HEADER)
|
||||||
#include <asm/fpu/api.h>
|
#include <asm/fpu/api.h>
|
||||||
#include <asm/fpu/internal.h>
|
#include <asm/fpu/internal.h>
|
||||||
|
#if defined(HAVE_KERNEL_FPU_XCR_HEADER)
|
||||||
|
#include <asm/fpu/xcr.h>
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#include <asm/i387.h>
|
#include <asm/i387.h>
|
||||||
#include <asm/xcr.h>
|
#include <asm/xcr.h>
|
||||||
@@ -133,9 +136,27 @@
|
|||||||
* When the kernel_fpu_* symbols are unavailable then provide our own
|
* When the kernel_fpu_* symbols are unavailable then provide our own
|
||||||
* versions which allow the FPU to be safely used.
|
* versions which allow the FPU to be safely used.
|
||||||
*/
|
*/
|
||||||
|
#if defined(HAVE_KERNEL_FPU_INTERNAL) || defined(HAVE_KERNEL_FPU_XSAVE_INTERNAL)
|
||||||
|
|
||||||
|
#if defined(HAVE_KERNEL_FPU_XSAVE_INTERNAL)
|
||||||
|
/*
|
||||||
|
* Some sanity checks.
|
||||||
|
* HAVE_KERNEL_FPU_INTERNAL and HAVE_KERNEL_FPU_XSAVE_INTERNAL are exclusive.
|
||||||
|
*/
|
||||||
#if defined(HAVE_KERNEL_FPU_INTERNAL)
|
#if defined(HAVE_KERNEL_FPU_INTERNAL)
|
||||||
|
#error "HAVE_KERNEL_FPU_INTERNAL and HAVE_KERNEL_FPU_XSAVE_INTERNAL defined"
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* For kernels >= 5.16 we have to use inline assembly with the XSAVE{,OPT,S}
|
||||||
|
* instructions, so we need the toolchain to support at least XSAVE.
|
||||||
|
*/
|
||||||
|
#if !defined(HAVE_XSAVE)
|
||||||
|
#error "Toolchain needs to support the XSAVE assembler instruction"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
extern union fpregs_state **zfs_kfpu_fpregs;
|
extern union fpregs_state **zfs_kfpu_fpregs;
|
||||||
|
|
||||||
@@ -188,7 +209,9 @@ kfpu_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define kfpu_allowed() 1
|
#define kfpu_allowed() 1
|
||||||
|
#if defined(HAVE_KERNEL_FPU_INTERNAL)
|
||||||
#define ex_handler_fprestore ex_handler_default
|
#define ex_handler_fprestore ex_handler_default
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FPU save and restore instructions.
|
* FPU save and restore instructions.
|
||||||
@@ -203,6 +226,7 @@ kfpu_init(void)
|
|||||||
#define kfpu_fxsr_clean(rval) __asm("fnclex; emms; fildl %P[addr]" \
|
#define kfpu_fxsr_clean(rval) __asm("fnclex; emms; fildl %P[addr]" \
|
||||||
: : [addr] "m" (rval));
|
: : [addr] "m" (rval));
|
||||||
|
|
||||||
|
#if defined(HAVE_KERNEL_FPU_INTERNAL)
|
||||||
static inline void
|
static inline void
|
||||||
kfpu_save_xsave(struct xregs_state *addr, uint64_t mask)
|
kfpu_save_xsave(struct xregs_state *addr, uint64_t mask)
|
||||||
{
|
{
|
||||||
@@ -214,6 +238,21 @@ kfpu_save_xsave(struct xregs_state *addr, uint64_t mask)
|
|||||||
XSTATE_XSAVE(addr, low, hi, err);
|
XSTATE_XSAVE(addr, low, hi, err);
|
||||||
WARN_ON_ONCE(err);
|
WARN_ON_ONCE(err);
|
||||||
}
|
}
|
||||||
|
#endif /* defined(HAVE_KERNEL_FPU_INTERNAL) */
|
||||||
|
|
||||||
|
#if defined(HAVE_KERNEL_FPU_XSAVE_INTERNAL)
|
||||||
|
#define kfpu_do_xsave(instruction, addr, mask) \
|
||||||
|
{ \
|
||||||
|
uint32_t low, hi; \
|
||||||
|
\
|
||||||
|
low = mask; \
|
||||||
|
hi = (uint64_t)(mask) >> 32; \
|
||||||
|
__asm(instruction " %[dst]\n\t" \
|
||||||
|
: \
|
||||||
|
: [dst] "m" (*(addr)), "a" (low), "d" (hi) \
|
||||||
|
: "memory"); \
|
||||||
|
}
|
||||||
|
#endif /* defined(HAVE_KERNEL_FPU_XSAVE_INTERNAL) */
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
kfpu_save_fxsr(struct fxregs_state *addr)
|
kfpu_save_fxsr(struct fxregs_state *addr)
|
||||||
@@ -230,6 +269,7 @@ kfpu_save_fsave(struct fregs_state *addr)
|
|||||||
kfpu_fnsave(addr);
|
kfpu_fnsave(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(HAVE_KERNEL_FPU_INTERNAL)
|
||||||
static inline void
|
static inline void
|
||||||
kfpu_begin(void)
|
kfpu_begin(void)
|
||||||
{
|
{
|
||||||
@@ -247,7 +287,6 @@ kfpu_begin(void)
|
|||||||
* FPU state to be correctly preserved and restored.
|
* FPU state to be correctly preserved and restored.
|
||||||
*/
|
*/
|
||||||
union fpregs_state *state = zfs_kfpu_fpregs[smp_processor_id()];
|
union fpregs_state *state = zfs_kfpu_fpregs[smp_processor_id()];
|
||||||
|
|
||||||
if (static_cpu_has(X86_FEATURE_XSAVE)) {
|
if (static_cpu_has(X86_FEATURE_XSAVE)) {
|
||||||
kfpu_save_xsave(&state->xsave, ~0);
|
kfpu_save_xsave(&state->xsave, ~0);
|
||||||
} else if (static_cpu_has(X86_FEATURE_FXSR)) {
|
} else if (static_cpu_has(X86_FEATURE_FXSR)) {
|
||||||
@@ -256,7 +295,49 @@ kfpu_begin(void)
|
|||||||
kfpu_save_fsave(&state->fsave);
|
kfpu_save_fsave(&state->fsave);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* defined(HAVE_KERNEL_FPU_INTERNAL) */
|
||||||
|
|
||||||
|
#if defined(HAVE_KERNEL_FPU_XSAVE_INTERNAL)
|
||||||
|
static inline void
|
||||||
|
kfpu_begin(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Preemption and interrupts must be disabled for the critical
|
||||||
|
* region where the FPU state is being modified.
|
||||||
|
*/
|
||||||
|
preempt_disable();
|
||||||
|
local_irq_disable();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The current FPU registers need to be preserved by kfpu_begin()
|
||||||
|
* and restored by kfpu_end(). They are stored in a dedicated
|
||||||
|
* per-cpu variable, not in the task struct, this allows any user
|
||||||
|
* FPU state to be correctly preserved and restored.
|
||||||
|
*/
|
||||||
|
union fpregs_state *state = zfs_kfpu_fpregs[smp_processor_id()];
|
||||||
|
#if defined(HAVE_XSAVES)
|
||||||
|
if (static_cpu_has(X86_FEATURE_XSAVES)) {
|
||||||
|
kfpu_do_xsave("xsaves", &state->xsave, ~0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_XSAVEOPT)
|
||||||
|
if (static_cpu_has(X86_FEATURE_XSAVEOPT)) {
|
||||||
|
kfpu_do_xsave("xsaveopt", &state->xsave, ~0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (static_cpu_has(X86_FEATURE_XSAVE)) {
|
||||||
|
kfpu_do_xsave("xsave", &state->xsave, ~0);
|
||||||
|
} else if (static_cpu_has(X86_FEATURE_FXSR)) {
|
||||||
|
kfpu_save_fxsr(&state->fxsave);
|
||||||
|
} else {
|
||||||
|
kfpu_save_fsave(&state->fsave);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* defined(HAVE_KERNEL_FPU_XSAVE_INTERNAL) */
|
||||||
|
|
||||||
|
#if defined(HAVE_KERNEL_FPU_INTERNAL)
|
||||||
static inline void
|
static inline void
|
||||||
kfpu_restore_xsave(struct xregs_state *addr, uint64_t mask)
|
kfpu_restore_xsave(struct xregs_state *addr, uint64_t mask)
|
||||||
{
|
{
|
||||||
@@ -266,6 +347,21 @@ kfpu_restore_xsave(struct xregs_state *addr, uint64_t mask)
|
|||||||
hi = mask >> 32;
|
hi = mask >> 32;
|
||||||
XSTATE_XRESTORE(addr, low, hi);
|
XSTATE_XRESTORE(addr, low, hi);
|
||||||
}
|
}
|
||||||
|
#endif /* defined(HAVE_KERNEL_FPU_INTERNAL) */
|
||||||
|
|
||||||
|
#if defined(HAVE_KERNEL_FPU_XSAVE_INTERNAL)
|
||||||
|
#define kfpu_do_xrstor(instruction, addr, mask) \
|
||||||
|
{ \
|
||||||
|
uint32_t low, hi; \
|
||||||
|
\
|
||||||
|
low = mask; \
|
||||||
|
hi = (uint64_t)(mask) >> 32; \
|
||||||
|
__asm(instruction " %[src]" \
|
||||||
|
: \
|
||||||
|
: [src] "m" (*(addr)), "a" (low), "d" (hi) \
|
||||||
|
: "memory"); \
|
||||||
|
}
|
||||||
|
#endif /* defined(HAVE_KERNEL_FPU_XSAVE_INTERNAL) */
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
kfpu_restore_fxsr(struct fxregs_state *addr)
|
kfpu_restore_fxsr(struct fxregs_state *addr)
|
||||||
@@ -291,6 +387,7 @@ kfpu_restore_fsave(struct fregs_state *addr)
|
|||||||
kfpu_frstor(addr);
|
kfpu_frstor(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(HAVE_KERNEL_FPU_INTERNAL)
|
||||||
static inline void
|
static inline void
|
||||||
kfpu_end(void)
|
kfpu_end(void)
|
||||||
{
|
{
|
||||||
@@ -307,6 +404,32 @@ kfpu_end(void)
|
|||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
}
|
}
|
||||||
|
#endif /* defined(HAVE_KERNEL_FPU_INTERNAL) */
|
||||||
|
|
||||||
|
#if defined(HAVE_KERNEL_FPU_XSAVE_INTERNAL)
|
||||||
|
static inline void
|
||||||
|
kfpu_end(void)
|
||||||
|
{
|
||||||
|
union fpregs_state *state = zfs_kfpu_fpregs[smp_processor_id()];
|
||||||
|
#if defined(HAVE_XSAVES)
|
||||||
|
if (static_cpu_has(X86_FEATURE_XSAVES)) {
|
||||||
|
kfpu_do_xrstor("xrstors", &state->xsave, ~0);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (static_cpu_has(X86_FEATURE_XSAVE)) {
|
||||||
|
kfpu_do_xrstor("xrstor", &state->xsave, ~0);
|
||||||
|
} else if (static_cpu_has(X86_FEATURE_FXSR)) {
|
||||||
|
kfpu_save_fxsr(&state->fxsave);
|
||||||
|
} else {
|
||||||
|
kfpu_save_fsave(&state->fsave);
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
local_irq_enable();
|
||||||
|
preempt_enable();
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif /* defined(HAVE_KERNEL_FPU_XSAVE_INTERNAL) */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -319,7 +442,7 @@ kfpu_end(void)
|
|||||||
#define kfpu_init() 0
|
#define kfpu_init() 0
|
||||||
#define kfpu_fini() ((void) 0)
|
#define kfpu_fini() ((void) 0)
|
||||||
|
|
||||||
#endif /* defined(HAVE_KERNEL_FPU_INTERNAL) */
|
#endif /* defined(HAVE_KERNEL_FPU_INTERNAL || HAVE_KERNEL_FPU_XSAVE_INTERNAL) */
|
||||||
#endif /* defined(KERNEL_EXPORTS_X86_FPU) */
|
#endif /* defined(KERNEL_EXPORTS_X86_FPU) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ random_in_range(uint32_t range)
|
|||||||
if (range == 1)
|
if (range == 1)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
(void) random_get_pseudo_bytes((void *)&r, sizeof (r));
|
(void) random_get_pseudo_bytes((uint8_t *)&r, sizeof (r));
|
||||||
|
|
||||||
return (r % range);
|
return (r % range);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,10 @@
|
|||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined(HAVE_VFS_IOV_ITER) && defined(HAVE_FAULT_IN_IOV_ITER_READABLE)
|
||||||
|
#define iov_iter_fault_in_readable(a, b) fault_in_iov_iter_readable(a, b)
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct iovec iovec_t;
|
typedef struct iovec iovec_t;
|
||||||
|
|
||||||
typedef enum zfs_uio_rw {
|
typedef enum zfs_uio_rw {
|
||||||
|
|||||||
@@ -25,5 +25,11 @@
|
|||||||
|
|
||||||
#include <linux/dcache_compat.h>
|
#include <linux/dcache_compat.h>
|
||||||
#include <linux/utsname_compat.h>
|
#include <linux/utsname_compat.h>
|
||||||
|
#include <linux/compiler_compat.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
|
#if THREAD_SIZE >= 16384
|
||||||
|
#define HAVE_LARGE_STACKS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ extern "C" {
|
|||||||
#define Z_ISDIR(type) S_ISDIR(type)
|
#define Z_ISDIR(type) S_ISDIR(type)
|
||||||
|
|
||||||
#define zn_has_cached_data(zp) ((zp)->z_is_mapped)
|
#define zn_has_cached_data(zp) ((zp)->z_is_mapped)
|
||||||
|
#define zn_flush_cached_data(zp, sync) write_inode_now(ZTOI(zp), sync)
|
||||||
#define zn_rlimit_fsize(zp, uio) (0)
|
#define zn_rlimit_fsize(zp, uio) (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -425,6 +425,7 @@ boolean_t dnode_add_ref(dnode_t *dn, void *ref);
|
|||||||
void dnode_rele(dnode_t *dn, void *ref);
|
void dnode_rele(dnode_t *dn, void *ref);
|
||||||
void dnode_rele_and_unlock(dnode_t *dn, void *tag, boolean_t evicting);
|
void dnode_rele_and_unlock(dnode_t *dn, void *tag, boolean_t evicting);
|
||||||
int dnode_try_claim(objset_t *os, uint64_t object, int slots);
|
int dnode_try_claim(objset_t *os, uint64_t object, int slots);
|
||||||
|
boolean_t dnode_is_dirty(dnode_t *dn);
|
||||||
void dnode_setdirty(dnode_t *dn, dmu_tx_t *tx);
|
void dnode_setdirty(dnode_t *dn, dmu_tx_t *tx);
|
||||||
void dnode_set_dirtyctx(dnode_t *dn, dmu_tx_t *tx, void *tag);
|
void dnode_set_dirtyctx(dnode_t *dn, dmu_tx_t *tx, void *tag);
|
||||||
void dnode_sync(dnode_t *dn, dmu_tx_t *tx);
|
void dnode_sync(dnode_t *dn, dmu_tx_t *tx);
|
||||||
|
|||||||
@@ -158,6 +158,7 @@ int dsl_pool_sync_context(dsl_pool_t *dp);
|
|||||||
uint64_t dsl_pool_adjustedsize(dsl_pool_t *dp, zfs_space_check_t slop_policy);
|
uint64_t dsl_pool_adjustedsize(dsl_pool_t *dp, zfs_space_check_t slop_policy);
|
||||||
uint64_t dsl_pool_unreserved_space(dsl_pool_t *dp,
|
uint64_t dsl_pool_unreserved_space(dsl_pool_t *dp,
|
||||||
zfs_space_check_t slop_policy);
|
zfs_space_check_t slop_policy);
|
||||||
|
uint64_t dsl_pool_deferred_space(dsl_pool_t *dp);
|
||||||
void dsl_pool_dirty_space(dsl_pool_t *dp, int64_t space, dmu_tx_t *tx);
|
void dsl_pool_dirty_space(dsl_pool_t *dp, int64_t space, dmu_tx_t *tx);
|
||||||
void dsl_pool_undirty_space(dsl_pool_t *dp, int64_t space, uint64_t txg);
|
void dsl_pool_undirty_space(dsl_pool_t *dp, int64_t space, uint64_t txg);
|
||||||
void dsl_free(dsl_pool_t *dp, uint64_t txg, const blkptr_t *bpp);
|
void dsl_free(dsl_pool_t *dp, uint64_t txg, const blkptr_t *bpp);
|
||||||
|
|||||||
@@ -110,6 +110,10 @@ extern "C" {
|
|||||||
#define FM_EREPORT_PAYLOAD_ZFS_BAD_CLEARED_BITS "bad_cleared_bits"
|
#define FM_EREPORT_PAYLOAD_ZFS_BAD_CLEARED_BITS "bad_cleared_bits"
|
||||||
#define FM_EREPORT_PAYLOAD_ZFS_BAD_SET_HISTOGRAM "bad_set_histogram"
|
#define FM_EREPORT_PAYLOAD_ZFS_BAD_SET_HISTOGRAM "bad_set_histogram"
|
||||||
#define FM_EREPORT_PAYLOAD_ZFS_BAD_CLEARED_HISTOGRAM "bad_cleared_histogram"
|
#define FM_EREPORT_PAYLOAD_ZFS_BAD_CLEARED_HISTOGRAM "bad_cleared_histogram"
|
||||||
|
#define FM_EREPORT_PAYLOAD_ZFS_SNAPSHOT_NAME "snapshot_name"
|
||||||
|
#define FM_EREPORT_PAYLOAD_ZFS_DEVICE_NAME "device_name"
|
||||||
|
#define FM_EREPORT_PAYLOAD_ZFS_RAW_DEVICE_NAME "raw_name"
|
||||||
|
#define FM_EREPORT_PAYLOAD_ZFS_VOLUME "volume"
|
||||||
|
|
||||||
#define FM_EREPORT_FAILMODE_WAIT "wait"
|
#define FM_EREPORT_FAILMODE_WAIT "wait"
|
||||||
#define FM_EREPORT_FAILMODE_CONTINUE "continue"
|
#define FM_EREPORT_FAILMODE_CONTINUE "continue"
|
||||||
@@ -119,6 +123,11 @@ extern "C" {
|
|||||||
#define FM_RESOURCE_AUTOREPLACE "autoreplace"
|
#define FM_RESOURCE_AUTOREPLACE "autoreplace"
|
||||||
#define FM_RESOURCE_STATECHANGE "statechange"
|
#define FM_RESOURCE_STATECHANGE "statechange"
|
||||||
|
|
||||||
|
#define FM_RESOURCE_ZFS_SNAPSHOT_MOUNT "snapshot_mount"
|
||||||
|
#define FM_RESOURCE_ZFS_SNAPSHOT_UNMOUNT "snapshot_unmount"
|
||||||
|
#define FM_RESOURCE_ZVOL_CREATE_SYMLINK "zvol_create"
|
||||||
|
#define FM_RESOURCE_ZVOL_REMOVE_SYMLINK "zvol_remove"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1189,6 +1189,8 @@ extern void spa_configfile_set(spa_t *, nvlist_t *, boolean_t);
|
|||||||
/* asynchronous event notification */
|
/* asynchronous event notification */
|
||||||
extern void spa_event_notify(spa_t *spa, vdev_t *vdev, nvlist_t *hist_nvl,
|
extern void spa_event_notify(spa_t *spa, vdev_t *vdev, nvlist_t *hist_nvl,
|
||||||
const char *name);
|
const char *name);
|
||||||
|
extern void zfs_ereport_zvol_post(const char *subclass, const char *name,
|
||||||
|
const char *device_name, const char *raw_name);
|
||||||
|
|
||||||
/* waiting for pool activities to complete */
|
/* waiting for pool activities to complete */
|
||||||
extern int spa_wait(const char *pool, zpool_wait_activity_t activity,
|
extern int spa_wait(const char *pool, zpool_wait_activity_t activity,
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ extern boolean_t vdev_draid_readable(vdev_t *, uint64_t);
|
|||||||
extern boolean_t vdev_draid_missing(vdev_t *, uint64_t, uint64_t, uint64_t);
|
extern boolean_t vdev_draid_missing(vdev_t *, uint64_t, uint64_t, uint64_t);
|
||||||
extern uint64_t vdev_draid_asize_to_psize(vdev_t *, uint64_t);
|
extern uint64_t vdev_draid_asize_to_psize(vdev_t *, uint64_t);
|
||||||
extern void vdev_draid_map_alloc_empty(zio_t *, struct raidz_row *);
|
extern void vdev_draid_map_alloc_empty(zio_t *, struct raidz_row *);
|
||||||
|
extern int vdev_draid_map_verify_empty(zio_t *, struct raidz_row *);
|
||||||
extern nvlist_t *vdev_draid_read_config_spare(vdev_t *);
|
extern nvlist_t *vdev_draid_read_config_spare(vdev_t *);
|
||||||
|
|
||||||
/* Functions for dRAID distributed spares. */
|
/* Functions for dRAID distributed spares. */
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct zio;
|
struct zio;
|
||||||
|
struct raidz_col;
|
||||||
struct raidz_row;
|
struct raidz_row;
|
||||||
struct raidz_map;
|
struct raidz_map;
|
||||||
#if !defined(_KERNEL)
|
#if !defined(_KERNEL)
|
||||||
@@ -49,6 +50,7 @@ void vdev_raidz_generate_parity(struct raidz_map *);
|
|||||||
void vdev_raidz_reconstruct(struct raidz_map *, const int *, int);
|
void vdev_raidz_reconstruct(struct raidz_map *, const int *, int);
|
||||||
void vdev_raidz_child_done(zio_t *);
|
void vdev_raidz_child_done(zio_t *);
|
||||||
void vdev_raidz_io_done(zio_t *);
|
void vdev_raidz_io_done(zio_t *);
|
||||||
|
void vdev_raidz_checksum_error(zio_t *, struct raidz_col *, abd_t *);
|
||||||
|
|
||||||
extern const zio_vsd_ops_t vdev_raidz_vsd_ops;
|
extern const zio_vsd_ops_t vdev_raidz_vsd_ops;
|
||||||
|
|
||||||
|
|||||||
@@ -650,7 +650,7 @@ random_in_range(uint32_t range)
|
|||||||
if (range == 1)
|
if (range == 1)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
(void) random_get_pseudo_bytes((void *)&r, sizeof (r));
|
(void) random_get_pseudo_bytes((uint8_t *)&r, sizeof (r));
|
||||||
|
|
||||||
return (r % range);
|
return (r % range);
|
||||||
}
|
}
|
||||||
@@ -770,7 +770,6 @@ extern void spl_fstrans_unmark(fstrans_cookie_t);
|
|||||||
extern int __spl_pf_fstrans_check(void);
|
extern int __spl_pf_fstrans_check(void);
|
||||||
extern int kmem_cache_reap_active(void);
|
extern int kmem_cache_reap_active(void);
|
||||||
|
|
||||||
#define ____cacheline_aligned
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kernel modules
|
* Kernel modules
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user