Compare commits
358 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3968b96ed4 | |||
| 32ce077088 | |||
| 68be554e71 | |||
| 6c9ff9b992 | |||
| b48cfd2b15 | |||
| a5e0251015 | |||
| 838cd1d173 | |||
| 5f4f0445f4 | |||
| 81d11761c3 | |||
| 3bda92bd20 | |||
| f67eb9538f | |||
| 00036e5a6e | |||
| 3db00caad9 | |||
| e295f30e6a | |||
| 96c807af63 | |||
| 88fd6e053b | |||
| 4f818e9880 | |||
| 310afb0d19 | |||
| 0f9a07b53e | |||
| aa99285dda | |||
| 7e3b7d81a1 | |||
| 28de0abfa9 | |||
| a20ffcd44f | |||
| 1382616c40 | |||
| 1621cb1079 | |||
| 508220ed2c | |||
| 6da885c3b1 | |||
| 2840fef531 | |||
| 1f8dab1515 | |||
| 2c95b92384 | |||
| 9e8946d4b9 | |||
| 8c6520d1fc | |||
| aa26132525 | |||
| 13c7e925aa | |||
| a80c5e3597 | |||
| 149fd91bb2 | |||
| 362d3432be | |||
| f5ed5be89a | |||
| 5891aaec34 | |||
| 63e591d8a9 | |||
| d855afe7be | |||
| 34d701d1ac | |||
| 40fe66e33e | |||
| 1b7710c13c | |||
| 2f5fca8a1a | |||
| 8ba2c83746 | |||
| dff6b68bf5 | |||
| 88588cfead | |||
| 1995e62236 | |||
| ab835eff0f | |||
| b0c4d8ac0b | |||
| f4e2c4ae29 | |||
| 4584ec1155 | |||
| 5ea8a38968 | |||
| 7a95e010b1 | |||
| f799169849 | |||
| 3efcc79c39 | |||
| 85a3ff856d | |||
| dca6abbf07 | |||
| 5a2ad46755 | |||
| d0e8c24e02 | |||
| 796e3f981f | |||
| b7feed7429 | |||
| dceb3ed09f | |||
| 8e0b77bbc4 | |||
| 0b16d88d9c | |||
| 81fe4f0591 | |||
| b8330d8fb8 | |||
| 186fde725e | |||
| 06c33ddc17 | |||
| 1eee727ce8 | |||
| 1663c08ec4 | |||
| a7bd81d424 | |||
| 68b54bb663 | |||
| 8f586181c6 | |||
| 3f3541cad0 | |||
| 68469c1a83 | |||
| 41ebc8de33 | |||
| b530052969 | |||
| 75a1232bf6 | |||
| fad6240a58 | |||
| 9a75bb8d65 | |||
| d801a0c5f6 | |||
| ca1ed9a9bf | |||
| 531eac3304 | |||
| 64e59c5ce9 | |||
| 8fef14d56e | |||
| 7ea557926a | |||
| 56ef1ea072 | |||
| 79a02bb27f | |||
| eb93ae9166 | |||
| b4d26406ac | |||
| c79374e7fb | |||
| 97dc14914d | |||
| ef1149ab21 | |||
| b577f030c4 | |||
| 0ee31a51f6 | |||
| a8c499606b | |||
| a330c5a73c | |||
| d4c62c11a3 | |||
| e697cc5992 | |||
| 755c71660a | |||
| 4f457a8285 | |||
| 7764433c70 | |||
| be2dd8e629 | |||
| 5881d024a7 | |||
| fb2819a99e | |||
| a06fb96702 | |||
| f17f9da9f3 | |||
| cb19e379cd | |||
| 85fab4fe16 | |||
| 53b89f82e3 | |||
| c12e9c738d | |||
| 8af2630849 | |||
| 1cd71b3b73 | |||
| 33bcc36963 | |||
| d75312dc84 | |||
| 51204ca4f7 | |||
| 4b661efd65 | |||
| 28dd83391b | |||
| 7a7de98bf2 | |||
| 548b12af1d | |||
| 363c009381 | |||
| 6967bf4185 | |||
| c8ca652406 | |||
| 29e1ddcc26 | |||
| 00fad03966 | |||
| 59b6645a48 | |||
| 8228117e8b | |||
| 387483f555 | |||
| 224ca2e1b4 | |||
| 1f122c546d | |||
| b34f3bcce2 | |||
| 4b8605c4d7 | |||
| 9af86c74fe | |||
| 6afcaafa51 | |||
| 5548e2b0b1 | |||
| 8f4d852dcd | |||
| 01e04e2989 | |||
| fd0cc4becd | |||
| cb47b57463 | |||
| 69b48b05c5 | |||
| 3419ff852f | |||
| 1d07acad8a | |||
| 984ac2c31e | |||
| 292758bd89 | |||
| 457cad5f88 | |||
| 374aad5bea | |||
| 4a743804aa | |||
| d754cc6a74 | |||
| eebb1ff15a | |||
| 5d367893ae | |||
| e3da0bd88a | |||
| 38e2c8078f | |||
| 5bce71e23a | |||
| 4736641e76 | |||
| 9be12e4d30 | |||
| 33baf9d7be | |||
| 7bc48bd452 | |||
| 46c5edb571 | |||
| dd9acc98eb | |||
| 4d56f4c5b5 | |||
| 475af1bc20 | |||
| 4472322f60 | |||
| 9fda81f807 | |||
| 943c54360f | |||
| 99c0cd88af | |||
| a18306641a | |||
| 8f11c72175 | |||
| 45fdd1f323 | |||
| 7c8450b4b1 | |||
| 34f271eaf0 | |||
| 97bcaf4bef | |||
| 955a8beadf | |||
| 08743f90d9 | |||
| 33e3621234 | |||
| 69255727d0 | |||
| 457c4458a2 | |||
| 9cad433df9 | |||
| d1002ffe2c | |||
| f43dbfa752 | |||
| ee9e6a91e5 | |||
| a14f5e761c | |||
| 79736c677e | |||
| 7ef1f901d7 | |||
| f3e3232bf4 | |||
| 49538a61c8 | |||
| 63bd3935c7 | |||
| ae14379f41 | |||
| 13d410f1ab | |||
| 886e4c966e | |||
| 9e02600b0c | |||
| da2c3b42fa | |||
| 402acca54f | |||
| 146da5ad07 | |||
| 92886af5c5 | |||
| 512fb2e4a9 | |||
| 5b9cd1ad57 | |||
| 4114f700a9 | |||
| d551e00492 | |||
| 5dccc94923 | |||
| e4f11a69e8 | |||
| d56eab879e | |||
| 58608b5f2e | |||
| 8c9433c855 | |||
| 88b4c00190 | |||
| 696f8e69e2 | |||
| f8d2e88078 | |||
| 5e3e80687e | |||
| d968500bc7 | |||
| 5440c7266a | |||
| 00430d087a | |||
| c3ea9788ad | |||
| d8740a92c1 | |||
| 256c6c0238 | |||
| f7305de3c0 | |||
| fa456d6c4b | |||
| 3d885de40c | |||
| 4a816df53e | |||
| f3f5ce5d7f | |||
| 2a904e377e | |||
| ac43a7be1f | |||
| dee2ef0e31 | |||
| 28f635be8c | |||
| 2e2aafd11c | |||
| 4e389d452b | |||
| 3e9c7d6dff | |||
| 2249b05575 | |||
| 002d5f1b8c | |||
| 65a9766fa0 | |||
| 04a710dd91 | |||
| 2e5067b011 | |||
| 851f368539 | |||
| 1c36de4a98 | |||
| b6c5bd4c51 | |||
| 1bb9f57dcf | |||
| ff03aa2dfd | |||
| f587002c09 | |||
| ad41a6994b | |||
| 0b063f2c20 | |||
| ea3522b2f7 | |||
| aa7ac7c184 | |||
| a010b40938 | |||
| f0371a1b16 | |||
| 933b31ffad | |||
| 76a4c29ab5 | |||
| afa7541760 | |||
| f3341ff73f | |||
| 50ad4ffe78 | |||
| cabb465d41 | |||
| cd09cd8030 | |||
| fccda2b9e6 | |||
| 5a3a6c060f | |||
| 170bd23f1a | |||
| 7abe13017f | |||
| 47ae0e2662 | |||
| 849c46778d | |||
| fd313b306e | |||
| c0f28922e8 | |||
| 7fdf8cc174 | |||
| 42e934e271 | |||
| 026bc5c9b2 | |||
| edf5051c71 | |||
| 75b07eca3e | |||
| 8324054718 | |||
| 1fa7e3ca4d | |||
| 8a088a9e2a | |||
| 871e750385 | |||
| c43065ced4 | |||
| b199710aee | |||
| 6beaed3f99 | |||
| 6efadbff82 | |||
| ed50d895d0 | |||
| 66609d7572 | |||
| fdd7076d71 | |||
| 7b1cd3b8c0 | |||
| dda3b9248b | |||
| 4e883a4ec5 | |||
| 2e2e28836c | |||
| f7fae412d9 | |||
| 4495daacdc | |||
| b9d59150d1 | |||
| e5fa0aa21d | |||
| 7130c30d2b | |||
| b03175e961 | |||
| cc88cf22d1 | |||
| f07031b9ab | |||
| af05210837 | |||
| c542769d74 | |||
| 2ce263d24d | |||
| 38b6b3a10d | |||
| 65fc6d785f | |||
| f2be26ec96 | |||
| e2f4edc81e | |||
| 3c99d2a035 | |||
| 3264cfc5e7 | |||
| bdc71736c4 | |||
| 11fac95726 | |||
| 012341487f | |||
| ea927859d2 | |||
| e6fdafd565 | |||
| 4c3d639686 | |||
| 8a19f2ad5d | |||
| 56d9662c48 | |||
| a59077893a | |||
| 4156449701 | |||
| 8dbff718a0 | |||
| 58a974f8f0 | |||
| 1e88a70802 | |||
| 59653d92a8 | |||
| a5dfd38639 | |||
| 100fba2dff | |||
| eee857a82b | |||
| 33edb24418 | |||
| 2d5ff41105 | |||
| d93bc1b005 | |||
| 18708aae25 | |||
| 904f90c739 | |||
| 81f5dae8f7 | |||
| 7bfc3db5e1 | |||
| 49f86653f1 | |||
| 3474a9b46b | |||
| d0b125705d | |||
| 8a287a137b | |||
| 00d871a78a | |||
| 23db36409e | |||
| d72bef5bd3 | |||
| b894a06c2c | |||
| 0b15456e05 | |||
| 2aba4528fd | |||
| 00c2573479 | |||
| 531bc89e39 | |||
| de76987c78 | |||
| 8155ecfe17 | |||
| c5aee9e4ce | |||
| 03ab644074 | |||
| acef550f8d | |||
| c7fd7e24f5 | |||
| d064c14aad | |||
| 8d62a89482 | |||
| 5a1f030de3 | |||
| bc3a2de1e1 | |||
| 944a4708cf | |||
| 3435683847 | |||
| 64d186b910 | |||
| eb4bd3cde8 | |||
| c6ed1ff858 | |||
| 20bb0ecfa0 | |||
| 1c1a906890 | |||
| 787716f74d | |||
| 46e32ac3b7 | |||
| f5c66275b3 | |||
| e479455eaf | |||
| 10b48f6191 | |||
| 09b78d33bc | |||
| 2335fd5207 | |||
| 9959b4fc3a | |||
| 5ce963e7da |
@@ -0,0 +1,7 @@
|
|||||||
|
/*.build
|
||||||
|
/*.buildinfo
|
||||||
|
/*.changes
|
||||||
|
/*.deb
|
||||||
|
/*.dsc
|
||||||
|
/*.tar*
|
||||||
|
/zfs-utils-*.*/
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "zfs/upstream"]
|
||||||
|
path = upstream
|
||||||
|
url = ../mirror_zfs
|
||||||
@@ -1,84 +1,93 @@
|
|||||||
RELEASE=3.4
|
include /usr/share/dpkg/default.mk
|
||||||
|
|
||||||
# source form https://github.com/zfsonlinux/
|
# source form https://github.com/zfsonlinux/
|
||||||
|
|
||||||
# also update version in
|
PACKAGE = zfs-linux
|
||||||
# zfs-changelog.Debian and spl-changelog.Debian
|
|
||||||
ZFSVER=0.6.5.7
|
|
||||||
ZFSPKGREL=5~bpo70
|
|
||||||
SPLPKGREL=5~bpo70
|
|
||||||
ZFSPKGVER=${ZFSVER}-${ZFSPKGREL}
|
|
||||||
SPLPKGVER=${ZFSVER}-${SPLPKGREL}
|
|
||||||
|
|
||||||
SPLDIR=pkg-spl
|
SRCDIR = upstream
|
||||||
SPLSRC=pkg-spl.tar.gz
|
BUILDDIR ?= $(PACKAGE)-$(DEB_VERSION_UPSTREAM)
|
||||||
ZFSDIR=pkg-zfs
|
ORIG_SRC_TAR = $(PACKAGE)_$(DEB_VERSION_UPSTREAM).orig.tar.gz
|
||||||
ZFSSRC=pkg-zfs.tar.gz
|
|
||||||
|
|
||||||
SPL_DEBS= \
|
ZFS_DEB1= libnvpair3linux_$(DEB_VERSION)_amd64.deb
|
||||||
spl_${SPLPKGVER}_amd64.deb
|
|
||||||
|
|
||||||
ZFS_DEBS= \
|
ZFS_DEB_BINARY = \
|
||||||
libnvpair1_${ZFSPKGVER}_amd64.deb \
|
libpam-zfs_$(DEB_VERSION)_amd64.deb \
|
||||||
libuutil1_${ZFSPKGVER}_amd64.deb \
|
libuutil3linux_$(DEB_VERSION)_amd64.deb \
|
||||||
libzfs2_${ZFSPKGVER}_amd64.deb \
|
libzfs4linux_$(DEB_VERSION)_amd64.deb \
|
||||||
libzfs-dev_${ZFSPKGVER}_amd64.deb \
|
libzfsbootenv1linux_$(DEB_VERSION)_amd64.deb \
|
||||||
libzpool2_${ZFSPKGVER}_amd64.deb \
|
libzpool5linux_$(DEB_VERSION)_amd64.deb \
|
||||||
zfs-dbg_${ZFSPKGVER}_amd64.deb \
|
zfs-test_$(DEB_VERSION)_amd64.deb \
|
||||||
zfs-initramfs_${ZFSPKGVER}_amd64.deb \
|
zfsutils-linux_$(DEB_VERSION)_amd64.deb \
|
||||||
zfsutils_${ZFSPKGVER}_amd64.deb
|
zfs-zed_$(DEB_VERSION)_amd64.deb
|
||||||
|
|
||||||
DEBS=${SPL_DEBS} ${ZFS_DEBS}
|
ZFS_DBG_DEBS = $(patsubst %_$(DEB_VERSION)_amd64.deb, %-dbgsym_$(DEB_VERSION)_amd64.deb, $(ZFS_DEB1) $(ZFS_DEB_BINARY))
|
||||||
|
|
||||||
all: ${DEBS}
|
ZFS_DEB2= $(ZFS_DEB_BINARY) \
|
||||||
|
libzfslinux-dev_$(DEB_VERSION)_amd64.deb \
|
||||||
|
python3-pyzfs_$(DEB_VERSION)_amd64.deb \
|
||||||
|
pyzfs-doc_$(DEB_VERSION)_all.deb \
|
||||||
|
spl_$(DEB_VERSION)_all.deb \
|
||||||
|
zfs-initramfs_$(DEB_VERSION)_all.deb
|
||||||
|
DEBS= $(ZFS_DEB1) $(ZFS_DEB2) $(ZFS_DBG_DEBS)
|
||||||
|
|
||||||
.PHONY: deb
|
ZFS_DSC = zfs-linux_$(DEB_VERSION).dsc
|
||||||
deb: ${DEBS}
|
|
||||||
|
all: deb
|
||||||
|
|
||||||
|
.PHONY: deb dsc
|
||||||
|
deb: $(DEBS)
|
||||||
|
|
||||||
|
dsc:
|
||||||
|
rm -rf *.dsc $(BUILDDIR)
|
||||||
|
$(MAKE) $(ZFS_DSC)
|
||||||
|
lintian $(ZFS_DSC)
|
||||||
|
|
||||||
|
# called from pve-kernel's Makefile to get patched sources
|
||||||
|
.PHONY: kernel
|
||||||
|
kernel: $(ZFS_DSC)
|
||||||
|
dpkg-source -x $(ZFS_DSC) ../pkg-zfs
|
||||||
|
$(MAKE) -C ../pkg-zfs -f debian/rules adapt_meta_file
|
||||||
|
|
||||||
.PHONY: dinstall
|
.PHONY: dinstall
|
||||||
dinstall: ${DEBS}
|
dinstall: $(DEBS)
|
||||||
dpkg -i ${DEBS}
|
dpkg -i $(DEBS)
|
||||||
|
|
||||||
.PHONY: spl
|
.PHONY: submodule
|
||||||
spl ${SPL_DEBS}: ${SPLSRC}
|
submodule:
|
||||||
rm -rf ${SPLDIR}
|
test -f "$(SRCDIR)/README.md" || git submodule update --init
|
||||||
tar xf ${SPLSRC}
|
|
||||||
mv ${SPLDIR}/debian/changelog ${SPLDIR}/debian/changelog.org
|
$(SRCDIR)/README.md: submodule
|
||||||
cat spl-changelog.Debian ${SPLDIR}/debian/changelog.org > ${SPLDIR}/debian/changelog
|
|
||||||
cd ${SPLDIR}; ln -s ../spl-patches patches
|
|
||||||
cd ${SPLDIR}; quilt push -a
|
|
||||||
cd ${SPLDIR}; rm -rf .pc ./patches
|
|
||||||
cd ${SPLDIR}; ./debian/rules override_dh_prep-base-deb-files
|
|
||||||
cd ${SPLDIR}; dpkg-buildpackage -b -uc -us
|
|
||||||
|
|
||||||
.PHONY: zfs
|
.PHONY: zfs
|
||||||
zfs ${ZFS_DEBS}: ${ZFSSRC}
|
zfs: $(DEBS)
|
||||||
rm -rf ${ZFSDIR}
|
$(ZFS_DEB2) $(ZFS_DBG_DEBS): $(ZFS_DEB1)
|
||||||
tar xf ${ZFSSRC}
|
$(ZFS_DEB1): $(BUILDDIR)
|
||||||
mv ${ZFSDIR}/debian/changelog ${ZFSDIR}/debian/changelog.org
|
cd $(BUILDDIR); dpkg-buildpackage -b -uc -us
|
||||||
cat zfs-changelog.Debian ${ZFSDIR}/debian/changelog.org > ${ZFSDIR}/debian/changelog
|
lintian $(DEBS)
|
||||||
cd ${ZFSDIR}; ln -s ../zfs-patches patches
|
|
||||||
cd ${ZFSDIR}; quilt push -a
|
|
||||||
cd ${ZFSDIR}; rm -rf .pc ./patches
|
|
||||||
cd ${ZFSDIR}; ./debian/rules override_dh_prep-base-deb-files
|
|
||||||
cd ${ZFSDIR}; dpkg-buildpackage -b -uc -us
|
|
||||||
|
|
||||||
.PHONY: download
|
$(ORIG_SRC_TAR): $(BUILDDIR)
|
||||||
download:
|
tar czf $(ORIG_SRC_TAR) --exclude="$(BUILDDIR)/debian" $(BUILDDIR)
|
||||||
rm -rf pkg-spl pkg-zfs ${SPLSRC} ${ZFSSRC}
|
|
||||||
git clone -b master/debian/wheezy/0.6.5.7-3-wheezy https://github.com/zfsonlinux/pkg-spl.git
|
$(ZFS_DSC): $(BUILDDIR) $(ORIG_SRC_TAR)
|
||||||
git clone -b master/debian/wheezy/0.6.5.7-8-wheezy https://github.com/zfsonlinux/pkg-zfs.git
|
cd $(BUILDDIR); dpkg-buildpackage -S -uc -us -d
|
||||||
tar czf ${SPLSRC} pkg-spl
|
|
||||||
tar czf ${ZFSSRC} pkg-zfs
|
sbuild: $(ZFS_DSC)
|
||||||
|
sbuild $(ZFS_DSC)
|
||||||
|
|
||||||
|
$(BUILDDIR): $(SRCDIR)/README.md $(SRCDIR) debian
|
||||||
|
rm -rf $@ $@.tmp
|
||||||
|
cp -a $(SRCDIR) $@.tmp
|
||||||
|
cp -a debian $@.tmp/debian
|
||||||
|
mv $@.tmp $@
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
rm -rf *~ *.deb *.changes ${ZFSDIR} ${SPLDIR}
|
rm -rf $(PACKAGE)-[0-9]*/
|
||||||
|
rm -f *~ *.deb *.changes *.buildinfo *.build *.dsc *.orig.tar.* *.debian.tar.*
|
||||||
|
|
||||||
.PHONY: distclean
|
.PHONY: distclean
|
||||||
distclean: clean
|
distclean: clean
|
||||||
|
|
||||||
|
|
||||||
.PHONY: upload
|
.PHONY: upload
|
||||||
upload: ${DEBS}
|
upload: UPLOAD_DIST ?= $(DEB_DISTRIBUTION)
|
||||||
tar -cf - ${DEBS} | ssh repoman@repo.proxmox.com upload --dist wheezy
|
upload: $(DEBS)
|
||||||
|
tar -cf - $(DEBS) | ssh repoman@repo.proxmox.com -- upload --product pve,pmg,pbs --dist $(UPLOAD_DIST) --arch $(DEB_HOST_ARCH)
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ Proxmox VE packaging for ZFS on Linux
|
|||||||
|
|
||||||
This is based on code from:
|
This is based on code from:
|
||||||
|
|
||||||
https://github.com/zfsonlinux/pkg-spl.git
|
https://salsa.debian.org/zfsonlinux-team/zfs
|
||||||
https://github.com/zfsonlinux/pkg-zfs.git
|
https://salsa.debian.org/zfsonlinux-team/spl
|
||||||
|
|
||||||
We removed the dkms/modules related code, because we ship the
|
We removed the dkms/modules related code, because we ship the
|
||||||
modules with the kernel.
|
modules with the kernel.
|
||||||
|
|
||||||
For licensing questions, see:
|
For licensing questions, see:
|
||||||
|
|
||||||
http://open-zfs.org/wiki/Talk:FAQ
|
http://open-zfs.org/wiki/Talk:FAQ
|
||||||
|
|||||||
Vendored
+991
@@ -0,0 +1,991 @@
|
|||||||
|
zfs-linux (2.2.3-pve2) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* fix #4835: order zfs-import@ before -cache/-scan
|
||||||
|
|
||||||
|
* backport (module) patches from the 2.2.4 staging tree for better Linux 6.8
|
||||||
|
support
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 08 Apr 2024 17:43:35 +0200
|
||||||
|
|
||||||
|
zfs-linux (2.2.3-pve1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* update to new ZFS upstream 2.2.3 release
|
||||||
|
|
||||||
|
* fix #5288: correctly handle zvols with more than 15 partitions in udev
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 11 Mar 2024 13:42:50 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.2.2-pve2) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* fix #5101: ensure datasets that have sharenfs enabled are not unexported
|
||||||
|
after a `zfs mount -a` call.
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 19 Feb 2024 16:56:37 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.2.2-pve1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* update to new ZFS upstream 2.2.2 release, as we have all important fixes
|
||||||
|
for recent discovered data integrity issues backported to previous
|
||||||
|
versions, there should be no visible change in that regard.
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 04 Dec 2023 16:50:25 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.2.0-pve4) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* pick bug-fix staged for 2.2.2:
|
||||||
|
- fix (rare) corruption caused by dirty dnode being treated as clean
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 29 Nov 2023 09:21:26 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.2.0-pve3) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* pick bug-fixes staged for 2.2.1:
|
||||||
|
- add a tunable to disable BRT support and disable it by default
|
||||||
|
- fix block cloning between unencrypted and encrypted datasets
|
||||||
|
- disable block cloning by default
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 17 Nov 2023 17:32:58 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.2.0-pve2) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* avoid error from zfs-mount when /etc/exports.d does not exist (yet)
|
||||||
|
|
||||||
|
* ensure vdev_stat struct layout compat between 2.1 and 2.2, avoiding
|
||||||
|
false-positive detection of the non-allocating feature from 2.2 when the
|
||||||
|
kernel still used the 2.1 module.
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Sun, 12 Nov 2023 16:02:02 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.2.0-pve1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.2.0
|
||||||
|
|
||||||
|
* zfsutils-linux:
|
||||||
|
- install new systemd units to trim a pool periodically
|
||||||
|
- ship new `zilstat` binary
|
||||||
|
- and new man pages for zfs lock, zfs unlock and vdev properties
|
||||||
|
- remove man pages for zfs jail and zfs unjail, those are for FreeBSD only
|
||||||
|
and the respective commands where never exposed for Linux
|
||||||
|
|
||||||
|
* fix #5014: re-enable blk-mq optimization
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Sun, 15 Oct 2023 12:09:24 +0200
|
||||||
|
|
||||||
|
zfs-linux (2.1.13-pve1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.13
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 28 Sep 2023 12:22:28 +0200
|
||||||
|
|
||||||
|
zfs-linux (2.1.12-pve1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.12
|
||||||
|
|
||||||
|
* zfs trim: avoid exit-failure if last pool isn't nvme-only
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 13 Jun 2023 15:25:16 +0200
|
||||||
|
|
||||||
|
zfs-linux (2.1.11-pve2) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* re-build for Debian 12 Bookworm based releases
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Sat, 20 May 2023 19:32:04 +0200
|
||||||
|
|
||||||
|
zfs-linux (2.1.11-pve1) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.11
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 20 Apr 2023 09:30:53 +0200
|
||||||
|
|
||||||
|
zfs-linux (2.1.9-pve1) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.9
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Sat, 28 Jan 2023 15:03:22 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.1.7-pve3) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* backport a fix for as potentially hanging pipe when resizing it on recv
|
||||||
|
|
||||||
|
* backport a fix for setting extended attributes (xattr)
|
||||||
|
|
||||||
|
* adapt to 6.1 changes for open syscall with TMPFILE option
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Sat, 07 Jan 2023 13:21:57 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.1.7-pve2) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* backport fix for initramfs script when detecting rootfs legacy mountpoints
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 02 Jan 2023 17:07:18 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.1.7-pve1) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.7
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 06 Dec 2022 16:41:31 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.1.6-pve1) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.6
|
||||||
|
|
||||||
|
* symlink zpool_influxdb to /bin
|
||||||
|
|
||||||
|
* symlink zfs, zpool to /bin/ for non-root usage
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 04 Oct 2022 16:09:17 +0200
|
||||||
|
|
||||||
|
zfs-linux (2.1.5-pve1) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.5
|
||||||
|
|
||||||
|
* Build with libcurl for new keylocation=https://
|
||||||
|
|
||||||
|
* d/control: add new zfs-dracut package
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 28 Jun 2022 16:13:24 +0200
|
||||||
|
|
||||||
|
zfs-linux (2.1.4-pve1) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.4
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 24 Mar 2022 09:28:50 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.1.3-pve1) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.3
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 11 Mar 2022 16:36:22 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.1.2-pve1) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.2
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 11 Jan 2022 11:31:34 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.1.1-pve3) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* zfs-utils: arc stat/summary: guard access to l2arc MFU/MRU stats to avoid
|
||||||
|
bogus exception when checking the ARC stats/summary on a older, 2.0 based
|
||||||
|
ZFS kernel module with the newer, 2.1 based, user space tools.
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 10 Nov 2021 09:58:31 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.1.1-pve1) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.1.1
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 28 Sep 2021 06:16:14 +0200
|
||||||
|
|
||||||
|
zfs-linux (2.0.5-pve1) bullseye; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.0.5
|
||||||
|
|
||||||
|
* do not restart most services upon upgrade
|
||||||
|
|
||||||
|
* add a script and cronjob for regular trimming of pools
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 09 Jul 2021 18:23:58 +0200
|
||||||
|
|
||||||
|
zfs-linux (2.0.4-pve1) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.0.4
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 18 Mar 2021 13:31:18 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.0.3-pve2) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* match package names to the ones used by Debian
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 25 Feb 2021 13:06:07 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.0.3-pve1) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* buildsys: make libpam-zfs a separate package
|
||||||
|
|
||||||
|
* update ZFS to 2.0.3
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 15 Feb 2021 15:46:03 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.0.2-pve1) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.0.2
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Sat, 06 Feb 2021 10:23:03 +0100
|
||||||
|
|
||||||
|
zfs-linux (2.0.1-pve1) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 2.0.1
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 13 Jan 2021 14:16:02 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.8.5-pve1) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.8.5
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 08 Oct 2020 10:45:28 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.8.4-pve2) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* add systemd-unit for importing specific pools
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 29 Sep 2020 05:31:35 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.8.4-pve1) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.8.4
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 14 May 2020 10:39:11 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.8.3-pve1) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.8.3
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 24 Jan 2020 09:10:41 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.8.2-pve2) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* save and restore the FPU state using ZFS dedicated per-cpu FPU state
|
||||||
|
variables.
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 23 Oct 2019 17:14:22 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.8.2-pve1) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* update to new 0.8.2 upstream stable release
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Sat, 28 Sep 2019 08:34:53 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.8.1-pve3) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* [SIMD]: FPU register save/restore is also required on 5.0 kernel.
|
||||||
|
strict kernel module release, user space tooling is not touched
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 27 Sep 2019 14:37:32 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.8.1-pve2) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* cherry-pick parallel mount fix
|
||||||
|
|
||||||
|
* cherry-pick SIMD compat patches
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 20 Aug 2019 17:10:11 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.8.1-pve1) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.8.1
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 14 Jun 2019 20:43:10 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.8.0-pve1) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.8.0
|
||||||
|
|
||||||
|
* SPL is now included in upstream ZFS packaging.
|
||||||
|
Build dummy spl and spl-dkms packages to ease transition on upgrades.
|
||||||
|
|
||||||
|
* Build pyzfs+documentation package
|
||||||
|
|
||||||
|
* Use arc_summary3.py to provide arc_summary.
|
||||||
|
|
||||||
|
* shipped python scripts now use python3
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 24 May 2019 12:05:22 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.7.13-pve2~bpo2) pve pmg; urgency=medium
|
||||||
|
|
||||||
|
* rebuild for PVE 6.0 / Debian Buster
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 21 May 2019 20:08:45 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.7.13-pve1~bpo2) unstable; urgency=medium
|
||||||
|
|
||||||
|
* remove conflict with insserv (<< 1.18)
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 27 Mar 2019 09:56:15 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.7.13-pve1~bpo1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.7.13
|
||||||
|
|
||||||
|
* base zfs-linux on upstream ZOL instead of debian
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 08 Mar 2019 06:53:00 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.7.12-pve1~bpo1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.7.12
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 14 Nov 2018 17:51:59 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.7.11-pve2~bpo1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to debian/0.7.11-3
|
||||||
|
|
||||||
|
* Cherry-pick two fixes planned for 0.7.12
|
||||||
|
|
||||||
|
* Backport deadlock fix between mm_sem and tx assign in zfs_write() and page
|
||||||
|
fault
|
||||||
|
|
||||||
|
* Fix missing Breaks/Replaces in zfs-initramfs
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 29 Oct 2018 13:45:49 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.7.11-pve1~bpo1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.7.11
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 10 Sep 2018 15:47:31 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.7.9-pve3~bpo9) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Cherry-pick fix for deadlock umount/snapentry_expire
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 03 Aug 2018 11:41:11 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.7.9-pve2~bpo9) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Cherry-pick fix for zpl_mount deadlock
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 12 Jul 2018 12:37:50 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.7.9-pve1~bpo9) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.7.9
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 18 May 2018 13:49:09 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.7.8-pve1~bpo9) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.7.8 (no changes)
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 30 Apr 2018 13:47:22 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.7.7-pve2~bpo9) unstable; urgency=medium
|
||||||
|
|
||||||
|
* (temporarily) revert likely cause of #7401
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 9 Apr 2018 09:49:27 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.7.7-pve1~bpo9) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.7.7
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 3 Apr 2018 14:28:35 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.7.6-pve1~bpo9) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.7.6
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 21 Feb 2018 09:48:29 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.7.4-pve2~bpo9) unstable; urgency=medium
|
||||||
|
|
||||||
|
* cherry-pick ARC hit rate fix from 0.7.6
|
||||||
|
|
||||||
|
* always load ZFS modules on boot
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 19 Jan 2018 11:31:14 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.7.4-pve1~bpo9) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.7.4
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 19 Dec 2017 12:52:42 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.7.3-pve1~bpo9) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update ZFS to 0.7.3
|
||||||
|
|
||||||
|
* include fix for user namespace setgid issue (#6800 upstream)
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 6 Nov 2017 09:14:19 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.7.2-pve1~bpo90) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update zfs to 0.7.2
|
||||||
|
|
||||||
|
* add PR 6616 - zfs send/recv compatibility with 0.6.5
|
||||||
|
|
||||||
|
* add PR 6695 - zfs recv: don't skip over objects which should be freed
|
||||||
|
|
||||||
|
* various small fixes
|
||||||
|
|
||||||
|
* split test suite into zfs-test package
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 12 Oct 2017 13:34:05 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.11-pve18~bpo90) unstable; urgency=medium
|
||||||
|
|
||||||
|
* fix #1509: arc_summary error with L2ARC
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 2 Oct 2017 09:30:41 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.11-pve17~bpo90) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update zfs to debian/0.6.5.11-1
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 27 Jul 2017 13:11:45 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.9-pve16~bpo90) unstable; urgency=medium
|
||||||
|
|
||||||
|
* drop transitional packages
|
||||||
|
|
||||||
|
* convert python scripts to python 3, drop .py suffix
|
||||||
|
|
||||||
|
* rebuild for PVE 5.0 / Debian Stretch
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Fri, 10 Mar 2017 09:45:52 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.9-pve15~bpo80) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update zfs to debian/0.6.5.9-1
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 6 Feb 2017 12:39:10 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.8-pve14~bpo80) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update zfs to debian/0.6.5.8-3
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 11 Jan 2017 09:34:58 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.8-pve13~bpo80) unstable; urgency=medium
|
||||||
|
|
||||||
|
* fix #1184: zfs-share.service has wrong path to 'rm' command
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 27 Oct 2016 11:25:47 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.8-pve12~bpo80) unstable; urgency=medium
|
||||||
|
|
||||||
|
* import with "-d /dev/disk/by-id" in systemd service
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 24 Oct 2016 13:48:08 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.8-pve11~bpo80) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update zfs to debian/0.6.5.8-1
|
||||||
|
|
||||||
|
* switch package upstream sources to Debian (Jessie)
|
||||||
|
|
||||||
|
* add transitional packages for upgrades
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 12 Oct 2016 11:16:02 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.7-pve10~bpo80) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update to pkg-zfs jessie/0.6.5.7-8
|
||||||
|
|
||||||
|
* change package versioning to allow upgrades from PVE3/wheezy
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 28 Jun 2016 09:50:00 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5-pve9~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Update to pkg-zfs jessie/0.6.5.6-3
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 12 Apr 2016 09:51:35 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5-pve8~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update to zfs-0.6.5.6
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 30 Mar 2016 10:50:22 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5-pve7~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update to zfs-0.6.5.4
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 14 Jan 2016 10:51:17 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.6.5-pve6~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Prepare to tag zfs-0.6.5.3
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 05 Nov 2015 07:21:44 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.6.5-pve5~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Illumos 6267 - dn_bonus evicted too early
|
||||||
|
|
||||||
|
* Fix use-after-free in vdev_disk_physio_completion
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 04 Nov 2015 17:42:42 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.6.5-pve4~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update to master/debian/jessie/0.6.5.2-2
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 05 Oct 2015 17:56:45 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5-pve3~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* do not install /etc/init.d/zfs-zed script to avoid double startup
|
||||||
|
with systemd
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 28 Sep 2015 10:14:40 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5-pve2~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update to master/debian/jessie/0.6.5.1-4
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 24 Sep 2015 12:45:33 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5-pve1~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update to master/debian/jessie/0.6.5.1-2
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 21 Sep 2015 10:02:41 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.4-pve3~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update to snapshot/debian/jessie/0.6.4-24-6bec43
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Mon, 24 Aug 2015 06:13:44 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.4-pve2~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update to 0.6.4.2 (snapshot/debian/jessie/0.6.4-21-53b1d9)
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 21 Jul 2015 11:03:21 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.4-pve1~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* update to 0.6.4 (use upstream zol package definitions)
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 14 Apr 2015 10:19:22 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.3-pve3~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* ignore zfs-import-scan errors
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Tue, 31 Mar 2015 17:52:40 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.3-pve2~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* use systemd for service startup
|
||||||
|
|
||||||
|
* install zed configuration file /etc/zfs/zed.d/zed.rc
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Sun, 15 Mar 2015 15:52:54 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.6.3-pve1~jessie) unstable; urgency=medium
|
||||||
|
|
||||||
|
* recompile on jessie
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Sat, 28 Feb 2015 16:02:08 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.6.3-2~wheezy) unstable; urgency=low
|
||||||
|
|
||||||
|
* use /sbin/modprobe to avoid warning inside initrd
|
||||||
|
|
||||||
|
* fix warning about undefined values inside initrd
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Wed, 14 Jan 2015 19:03:04 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.6.3-1~wheezy) unstable; urgency=low
|
||||||
|
|
||||||
|
* first version for Proxmox VE
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Sat, 10 Jan 2015 14:06:34 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.7.12-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Colin Ian King ]
|
||||||
|
* Only run autopkgtests for amd64, arm64, ppc64el and s390x (LP#1805627).
|
||||||
|
|
||||||
|
[ Martin Bagge / brother ]
|
||||||
|
* [INTL:sv] Swedish strings for zfs-linux debconf (Closes: #918020)
|
||||||
|
|
||||||
|
[ Anders Jonsson ]
|
||||||
|
* sv.po: typo fix
|
||||||
|
|
||||||
|
[ Mo Zhou ]
|
||||||
|
* Change init script's behaviour to default during postinst.
|
||||||
|
* Add ${perl:Depends} to zfs-dkms's Depends.
|
||||||
|
* Add autopkgtest script to test zfs-dkms build.
|
||||||
|
* autopkgtest: minor fix
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Add XS-Autobuild: yes to d/control
|
||||||
|
* Conflicts with insserv << 1.18 (Closes: #915831)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Fri, 11 Jan 2019 21:32:06 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.7.12-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Stoiko Ivanov ]
|
||||||
|
* Add Breaks/Replaces to zfs-initramfs
|
||||||
|
|
||||||
|
[ Mo Zhou ]
|
||||||
|
* New upstream version 0.7.12
|
||||||
|
* Drop unnecessary patch init-start-stop-dep-on-local-fs.patch .
|
||||||
|
* Override init.d-script-missing-dependency-on-local_fs for zfs-zed.
|
||||||
|
* Bump linux compatibility to 4.19 .
|
||||||
|
|
||||||
|
-- Mo Zhou <cdluminate@gmail.com> Mon, 19 Nov 2018 11:32:44 +0000
|
||||||
|
|
||||||
|
zfs-linux (0.7.11-3) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Antonio Russo ]
|
||||||
|
+ https://salsa.debian.org/zfsonlinux-team/zfs/merge_requests/9
|
||||||
|
* Break/Replace upstream .deb packages (Closes: #839921)
|
||||||
|
* Install upstream bash completion file instead of embedded one.
|
||||||
|
* Modify META before autoreconf.
|
||||||
|
* Make dkms distdir before build to avoid including build artifacts.
|
||||||
|
* Remove ZFS_AC_PACKAGE macros from DKMS sources.
|
||||||
|
This removes dpkg-dev dependency from zfs-dkms package.
|
||||||
|
* Use upstream's dkms.mkconf script to produce dkms.conf .
|
||||||
|
* Ship initramfs zdev hook in zfs-initramfs (Closes: #902052)
|
||||||
|
|
||||||
|
[ Nicolas Braud-Santoni ]
|
||||||
|
* Update debian/copyright, removing unused wildcards.
|
||||||
|
|
||||||
|
[ Nicholas D Steeves ]
|
||||||
|
* Change -dbg package's priority from extra to optional.
|
||||||
|
|
||||||
|
[ Mo Zhou ]
|
||||||
|
* Fix FTBFS on architecture=all due to FileNotFound. (Closes: #911937)
|
||||||
|
* Add isolation-machine restriction to autopkgtest because the tests
|
||||||
|
needs to interact with the kernel, i.e. loading kernel module.
|
||||||
|
|
||||||
|
-- Mo Zhou <cdluminate@gmail.com> Sun, 28 Oct 2018 10:28:52 +0000
|
||||||
|
|
||||||
|
zfs-linux (0.7.11-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Support Devuan in dkms script. (Closes: #900089)
|
||||||
|
Thanks to Chris Dos <chris@chrisdos.com>
|
||||||
|
* Install init scripts to support non-systemd setups. (Closes: #826994)
|
||||||
|
Thanks to Chris Dos <chris@chrisdos.com>
|
||||||
|
* Override init.d-script-does-not-source-init-functions for
|
||||||
|
zfsutils-linux and zfs-zed.
|
||||||
|
* Patch upstream init scripts to make them work for Debian+OpenRC setup.
|
||||||
|
* Patch upstream init script to fix missing dependency on local_fs.
|
||||||
|
|
||||||
|
-- Mo Zhou <cdluminate@gmail.com> Fri, 26 Oct 2018 09:32:06 +0000
|
||||||
|
|
||||||
|
zfs-linux (0.7.11-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Add dpkg-dev to Depends of zfs-dkms (Closes: #900714)
|
||||||
|
|
||||||
|
[ Nicolas Braud-Santoni ]
|
||||||
|
* Use canonical HTTPS format URL for Vcs-Git (Closes: #895873)
|
||||||
|
|
||||||
|
[ Mo Zhou ]
|
||||||
|
* New upstream version 0.7.11 (Closes: #908290)
|
||||||
|
* Bump linux_compat to 4.18 .
|
||||||
|
* Replace get_next.sh with one-liner awk script in rules.
|
||||||
|
* Append myself to Uploaders and refresh auto-generated control.
|
||||||
|
* Use HTTPS format URI in watch file.
|
||||||
|
* Recommends linux-libc-dev (<< LINUX_NEXT~) instead of (<< LINUX_NEXT).
|
||||||
|
|
||||||
|
-- Mo Zhou <cdluminate@gmail.com> Wed, 19 Sep 2018 08:45:18 +0000
|
||||||
|
|
||||||
|
zfs-linux (0.7.9-3) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Antonio Russo ]
|
||||||
|
* Expand zfs-test and add Breaks/Conflicts (Closes: #899047)
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* d/control: migrate to alioth-lists (Closes: #899756)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Mon, 28 May 2018 18:22:02 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.7.9-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Move more zfs test tools to zfs-test package (Closes: #868653)
|
||||||
|
* New upstream version 0.7.9
|
||||||
|
* d/rules: add --enable-systemd
|
||||||
|
* Fix lintian obsolete-relation-form-in-source
|
||||||
|
* Bump supported linux version to 4.16
|
||||||
|
|
||||||
|
[ Antonio Russo ]
|
||||||
|
* Install enum-extract.pl with dkms
|
||||||
|
* Handle /proc/kallsym obfuscation (Closes: #891936)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Thu, 17 May 2018 23:47:29 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.7.6-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Lev Lamberov ]
|
||||||
|
* [INTL:ru] Updated Russian translation of debconf (Closes: #885990)
|
||||||
|
|
||||||
|
[ Aron Xu]
|
||||||
|
* New upstream release (Closes: #889795, #890576)
|
||||||
|
* 0001-Fix-bug-in-distclean-which-removes-needed-files.patch:
|
||||||
|
removed, applied upstream
|
||||||
|
* Update VCS-* URL to salsa.debian.org
|
||||||
|
* Apply wrap-and-sort
|
||||||
|
* Recommends: linux-libc-dev (< ${LINUX_NEXT}):
|
||||||
|
Tries to prevent unexpected upgrades of kernel that is not known to
|
||||||
|
be supported by the packaged version of ZFS/SPL. (Closes: #849420)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Mon, 26 Feb 2018 16:32:29 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.7.5-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* New upstream version 0.7.5 (Closes: #884812)
|
||||||
|
|
||||||
|
[ Antonio Russo ]
|
||||||
|
* Add version dependency on zfsutils-linux package (Closes: #880889)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Fri, 19 Jan 2018 15:39:23 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.7.4-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream version 0.7.4 (Closes: #884287, #883832)
|
||||||
|
* Require debhelper >= 10.2
|
||||||
|
* cherry-pick: fix distclean which removes needed files (Closes: #884706)
|
||||||
|
* Refresh patches
|
||||||
|
* Update stdver to 4.1.2, no change required
|
||||||
|
* Install zfs-import.target
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Mon, 18 Dec 2017 22:48:59 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.7.3-3) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Antonio Russo ]
|
||||||
|
* Add maximum version dependency on spl-dkms (Closes: #883008)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Thu, 30 Nov 2017 00:34:30 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.7.3-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Fabian Grünbichler ]
|
||||||
|
* d/rules: remove obsolete calls to dpkg-architecture (Closes: #882209)
|
||||||
|
* zfs-test: add proper Breaks+Replaces (Closes: #880902)
|
||||||
|
* build: add implicit version to dh_makeshlibs (Closes: #880709)
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Depend on matching version of spl-dkms (Closes: ##881013)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Tue, 28 Nov 2017 16:16:34 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.7.3-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Antonio Russo ]
|
||||||
|
* Refresh manual builds DKMS prevention patch
|
||||||
|
|
||||||
|
[ Fabian Grünbichler ]
|
||||||
|
* zfs-test package
|
||||||
|
* add files to debian/not-installed
|
||||||
|
* dh_install: switch to --fail-missing
|
||||||
|
* add new files from 0.7 to install
|
||||||
|
* dkms: build icp module as well
|
||||||
|
|
||||||
|
[ Antonio Russo ]
|
||||||
|
* dracut: make module-setup.sh shebang explicit
|
||||||
|
* add man page reference to systemd units
|
||||||
|
* Fix install path of zpool.d scripts
|
||||||
|
* Incorporate DebianPT.org Portuguese translation
|
||||||
|
* Fix typo in debconf templates
|
||||||
|
* Drop dependency on dh-systemd
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Drop merged patches, update remainders
|
||||||
|
* Update std-ver to 4.1.1
|
||||||
|
* New upstream version 0.7.3
|
||||||
|
* Update debconf pot file
|
||||||
|
* Update control.in for dh-systemd deprecation
|
||||||
|
* Add lintian override for zfs-test
|
||||||
|
|
||||||
|
[ Colin King ]
|
||||||
|
* Improve cloning performance for large numbers of clones (LP: #1567557)
|
||||||
|
Bump zcmd buffer from 16K to 256K.
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Tue, 31 Oct 2017 18:52:01 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.11-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Imported Upstream version 0.6.5.11
|
||||||
|
|
||||||
|
[ Fabian Grünbichler ]
|
||||||
|
* fix rm path in zfs-share.service
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Fri, 14 Jul 2017 16:33:23 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.10-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Add kernel version to depmod cmd (Closes: #860958)
|
||||||
|
* New upstream version 0.6.5.10
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Wed, 05 Jul 2017 18:11:39 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.9-5) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Add zfs initramfs conf for root pool setup
|
||||||
|
(Closes: #848157, LP: #1673197)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Sun, 19 Mar 2017 18:14:57 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.9-4) unstable; urgency=medium
|
||||||
|
|
||||||
|
* autopkgtest: load zfs module before running tests
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Tue, 14 Mar 2017 11:38:08 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.9-3) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Petter Reinholdtsen ]
|
||||||
|
* Updated German debconf translation by Helge Kreutzmann. (Closes: #857528)
|
||||||
|
* Updated metadata on a few patches.
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Cherry-pick upstream fix for merged /usr/lib and /lib
|
||||||
|
* Manually maintain adt test Depends
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Mon, 13 Mar 2017 12:23:32 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.9-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Fabian Grünbichler ]
|
||||||
|
* fix zed-service-bindir patch
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Tue, 07 Feb 2017 17:22:02 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.9-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Imported Upstream version 0.6.5.9 (Closes: #851513)
|
||||||
|
|
||||||
|
[ Lukas Wunner ]
|
||||||
|
* Cherry picks for root zpool with dracut (Closes: #849969)
|
||||||
|
* Fix installation path of systemd files
|
||||||
|
* Fix build breakage caused by nonstandard umask
|
||||||
|
|
||||||
|
[ Fabian Grünbichler ]
|
||||||
|
* fix python script install path (Closes: #842237)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Mon, 06 Feb 2017 15:57:50 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.8-3) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Fix the path on the zfs-zed unit file (Closes: #849813)
|
||||||
|
|
||||||
|
-- Carlos Alberto Lopez Perez <clopez@igalia.com> Thu, 05 Jan 2017 16:23:16 +0100
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.8-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Richard Laager ]
|
||||||
|
* Remove .py extension from utilities in /usr/sbin as per policy
|
||||||
|
10.4 Scripts (LP: #1628279)
|
||||||
|
|
||||||
|
[ Colin Ian King ]
|
||||||
|
* Use python3 for arcstat.py, arc_summary.py & dbufstat.py (LP: #1627909)
|
||||||
|
|
||||||
|
[ Richard Laager ]
|
||||||
|
* Set PATH in cron.d job to fix monthly scrubs. (LP: #1548009)
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Install zed into /usr/sbin
|
||||||
|
* Rename zfsutils path to follow the package name
|
||||||
|
* Add missing part in python3 move
|
||||||
|
* Install zed to /usr/sbin
|
||||||
|
|
||||||
|
[ Petter Reinholdtsen ]
|
||||||
|
* Updated Italian debconf translation by Beatrice Torracca.
|
||||||
|
(Closes: #846928)
|
||||||
|
* Added patch 1003-linux-4.9-compat.patch from upstream to build with
|
||||||
|
Linux kernel 4.9. (Closes: #847018)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Sat, 17 Dec 2016 17:42:21 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.8-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Carlos Alberto Lopez Perez ]
|
||||||
|
* Reflow changelog from last upload to avoid lintian warning.
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Imported Upstream version 0.6.5.8 (Closes: #838192)
|
||||||
|
* Conflicts with zutils (Closes: #836853)
|
||||||
|
|
||||||
|
[ Zhou Mo ]
|
||||||
|
* Patch: remove merged patches.
|
||||||
|
* Upstream renamed zed.service to zfs-zed.service .
|
||||||
|
* Avoid installing zfs-zed.service twice.
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Tue, 20 Sep 2016 15:20:21 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.7-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Add busybox to zfs-initramfs list of dependencies. (Closes: #824976)
|
||||||
|
|
||||||
|
[ Petter Reinholdtsen ]
|
||||||
|
* Updated Danish debconf translation by Joe Hansen. (Closes: #830652)
|
||||||
|
* Added Dutch (nl) debconf translation by Frans Spiesschaert.
|
||||||
|
(Closes: #832280)
|
||||||
|
* Norwegian Bokmål (nb) debconf template translation by Petter Reinholdtsen.
|
||||||
|
|
||||||
|
[ Eric Desrochers ]
|
||||||
|
* Change utilities path (bindir) to /usr/sbin. (Closes: #832938)
|
||||||
|
|
||||||
|
[ Carlos Alberto Lopez Perez]
|
||||||
|
* Add tunable to ignore hole_birth, and enable it by default.
|
||||||
|
(Closes: #830824)
|
||||||
|
|
||||||
|
-- Carlos Alberto Lopez Perez <clopez@igalia.com> Tue, 16 Aug 2016 17:43:48 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.7-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ YunQiang Su ]
|
||||||
|
* 1002-fix-mips-build.patch: fix builds on mips* archs
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* New upstream release.
|
||||||
|
* 1001-Fix-aarch64-compilation.patch: dropped, not needed anymore
|
||||||
|
* Merge patches from Ubuntu:
|
||||||
|
- 0002-Check-for-META-and-DCH-consistency-in-autoconf.patch
|
||||||
|
- 0003-Add-libuutil-to-LIBADD-for-libzfs-and-libzfs_core.patch
|
||||||
|
- enable-zed.patch
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Tue, 31 May 2016 14:10:49 +0800
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.6-2) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* Adding smoke testing scripts from Ubuntu
|
||||||
|
* Fix binary module builds
|
||||||
|
* Add libblkid-dev, libattr1-dev to build-dep
|
||||||
|
* Re-sync source tree
|
||||||
|
* Add dh-python to b-d
|
||||||
|
* Remove .gitignore files and clean build tree
|
||||||
|
* Scrub all healthy pools monthly from Richard Laager
|
||||||
|
|
||||||
|
[ Petter Reinholdtsen ]
|
||||||
|
* Copied 1000-ppc64el-endian-support.patch from Ubuntu to fix endian
|
||||||
|
build problem on ppc64el
|
||||||
|
* Copied 1001-Fix-aarch64-compilation.patch from Ubuntu to fix build
|
||||||
|
problem on arm64.
|
||||||
|
* Copied 0001-Prevent-manual-builds-in-the-DKMS-source.patch from
|
||||||
|
Ubuntu to block manual building in the DKMS source tree.
|
||||||
|
* Updated Standards-Version from 3.9.7 to 3.9.8.
|
||||||
|
* Bring some files back to the upstream tarball content to get gbp
|
||||||
|
buildpackage working.
|
||||||
|
|
||||||
|
-- Petter Reinholdtsen <pere@debian.org> Thu, 12 May 2016 12:19:55 +0200
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.6-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Aron Xu ]
|
||||||
|
* New upstream version 0.6.5.6.
|
||||||
|
|
||||||
|
[ Petter Reinholdtsen ]
|
||||||
|
* Generated new copyright.cme file based on version 0.6.5.6.
|
||||||
|
* Updated d/copyright file, add missing BSD licensed init.d scripts, and
|
||||||
|
new copyright holders in the new upstream version.
|
||||||
|
* Updated Standards-Version from 3.9.6 to 3.9.7.
|
||||||
|
* Added myself as uploader.
|
||||||
|
* Updated debconf po files based on newest pot file.
|
||||||
|
* Correct URL to git repo in d/control.
|
||||||
|
|
||||||
|
-- Petter Reinholdtsen <pere@debian.org> Sat, 26 Mar 2016 07:08:11 +0000
|
||||||
|
|
||||||
|
zfs-linux (0.6.5.5-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* Initial Release (Closes: #686447)
|
||||||
|
|
||||||
|
-- Aron Xu <aron@debian.org> Sun, 20 Mar 2016 22:57:06 +0800
|
||||||
Vendored
+288
@@ -0,0 +1,288 @@
|
|||||||
|
Source: zfs-linux
|
||||||
|
Section: contrib/kernel
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Proxmox Support Team <support@proxmox.com>
|
||||||
|
Build-Depends: abigail-tools,
|
||||||
|
debhelper-compat (= 12),
|
||||||
|
dh-python,
|
||||||
|
libaio-dev,
|
||||||
|
libblkid-dev,
|
||||||
|
libcurl4-openssl-dev | libcurl4-gnutls-dev,
|
||||||
|
libelf-dev,
|
||||||
|
libpam0g-dev,
|
||||||
|
libssl-dev | libssl1.0-dev,
|
||||||
|
libtool,
|
||||||
|
libudev-dev,
|
||||||
|
lsb-release,
|
||||||
|
python3-cffi,
|
||||||
|
python3-setuptools,
|
||||||
|
python3-sphinx,
|
||||||
|
python3-all-dev,
|
||||||
|
uuid-dev,
|
||||||
|
zlib1g-dev
|
||||||
|
Standards-Version: 4.5.1
|
||||||
|
Homepage: https://www.zfsonlinux.org/
|
||||||
|
Vcs-Git: https://git.proxmox.com/git/zfsonlinux.git
|
||||||
|
Vcs-Browser: https://git.proxmox.com/?p=zfsonlinux.git;a=summary
|
||||||
|
|
||||||
|
Package: libnvpair3linux
|
||||||
|
Section: contrib/libs
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||||
|
Breaks: libnvpair1, libnvpair1linux, libnvpair2linux, libnvpair3
|
||||||
|
Replaces: libnvpair1, libnvpair1linux, libnvpair2linux, libnvpair3
|
||||||
|
Description: Solaris name-value library for Linux
|
||||||
|
This library provides routines for packing and unpacking nv pairs for
|
||||||
|
transporting data across process boundaries, transporting between
|
||||||
|
kernel and userland, and possibly saving onto disk files.
|
||||||
|
|
||||||
|
Package: libpam-zfs
|
||||||
|
Section: contrib/admin
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: libpam-runtime, ${misc:Depends}, ${shlibs:Depends}
|
||||||
|
Description: PAM module for managing encryption keys for ZFS
|
||||||
|
OpenZFS is a storage platform that encompasses the functionality of
|
||||||
|
traditional filesystems and volume managers. It supports data checksums,
|
||||||
|
compression, encryption, snapshots, and more.
|
||||||
|
.
|
||||||
|
This provides a Pluggable Authentication Module (PAM) that automatically
|
||||||
|
unlocks encrypted ZFS datasets upon login.
|
||||||
|
|
||||||
|
Package: libuutil3linux
|
||||||
|
Section: contrib/libs
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||||
|
Breaks: libuutil1, libuutil1linux, libuutil2linux, libuutil3
|
||||||
|
Replaces: libuutil1, libuutil1linux, libuutil2linux, libuutil3
|
||||||
|
Description: Solaris userland utility library for Linux
|
||||||
|
This library provides a variety of glue functions for ZFS on Linux:
|
||||||
|
* libspl: The Solaris Porting Layer userland library, which provides APIs
|
||||||
|
that make it possible to run Solaris user code in a Linux environment
|
||||||
|
with relatively minimal modification.
|
||||||
|
* libavl: The Adelson-Velskii Landis balanced binary tree manipulation
|
||||||
|
library.
|
||||||
|
* libefi: The Extensible Firmware Interface library for GUID disk
|
||||||
|
partitioning.
|
||||||
|
* libshare: NFS, SMB, and iSCSI service integration for ZFS.
|
||||||
|
|
||||||
|
Package: libzfslinux-dev
|
||||||
|
Section: contrib/libdevel
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: libssl-dev | libssl1.0-dev,
|
||||||
|
libnvpair3linux (= ${binary:Version}),
|
||||||
|
libuutil3linux (= ${binary:Version}),
|
||||||
|
libzfs4linux (= ${binary:Version}),
|
||||||
|
libzfsbootenv1linux (= ${binary:Version}),
|
||||||
|
libzpool5linux (= ${binary:Version}),
|
||||||
|
${misc:Depends}
|
||||||
|
Provides: libnvpair-dev, libuutil-dev
|
||||||
|
Description: OpenZFS filesystem development files for Linux
|
||||||
|
Header files and static libraries for compiling software against
|
||||||
|
libraries of OpenZFS filesystem.
|
||||||
|
.
|
||||||
|
This package includes the development files of libnvpair3, libuutil3,
|
||||||
|
libzpool5 and libzfs4, libzfsbootenv1.
|
||||||
|
|
||||||
|
Package: libzfs4linux
|
||||||
|
Section: contrib/libs
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||||
|
# The libcurl4 is loaded through dlopen("libcurl.so.4").
|
||||||
|
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=988521
|
||||||
|
Recommends: libcurl4
|
||||||
|
Breaks: libzfs2, libzfs2linux, libzfs3linux, libzfs4
|
||||||
|
Replaces: libzfs2, libzfs2linux, libzfs3linux, libzfs4
|
||||||
|
Description: OpenZFS filesystem library for Linux - general support
|
||||||
|
OpenZFS is a storage platform that encompasses the functionality of
|
||||||
|
traditional filesystems and volume managers. It supports data checksums,
|
||||||
|
compression, encryption, snapshots, and more.
|
||||||
|
.
|
||||||
|
The OpenZFS library provides support for managing OpenZFS filesystems.
|
||||||
|
|
||||||
|
Package: libzfsbootenv1linux
|
||||||
|
Section: contrib/libs
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||||
|
Breaks: libzfs2, libzfs4
|
||||||
|
Replaces: libzfs2, libzfs4
|
||||||
|
Description: OpenZFS filesystem library for Linux
|
||||||
|
OpenZFS is a storage platform that encompasses the functionality of
|
||||||
|
traditional filesystems and volume managers. It supports data checksums,
|
||||||
|
compression, encryption, snapshots, and more.
|
||||||
|
.
|
||||||
|
The zfsbootenv library provides support for modifying ZFS label information.
|
||||||
|
|
||||||
|
Package: libzpool5linux
|
||||||
|
Section: contrib/libs
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||||
|
Breaks: libzpool2, libzpool2linux, libzpool3linux, libzpool4
|
||||||
|
Replaces: libzpool2, libzpool2linux, libzpool3linux, libzpool4
|
||||||
|
Description: OpenZFS pool library for Linux
|
||||||
|
OpenZFS is a storage platform that encompasses the functionality of
|
||||||
|
traditional filesystems and volume managers. It supports data checksums,
|
||||||
|
compression, encryption, snapshots, and more.
|
||||||
|
.
|
||||||
|
This zpool library provides support for managing zpools.
|
||||||
|
|
||||||
|
Package: python3-pyzfs
|
||||||
|
Section: contrib/python
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: ${misc:Depends},
|
||||||
|
${python3:Depends},
|
||||||
|
python3-cffi,
|
||||||
|
zfsutils-linux (= ${binary:Version})
|
||||||
|
Description: wrapper for libzfs_core C library
|
||||||
|
libzfs_core is intended to be a stable interface for programmatic
|
||||||
|
administration of ZFS. This wrapper provides one-to-one wrappers for
|
||||||
|
libzfs_core API functions, but the signatures and types are more natural to
|
||||||
|
Python.
|
||||||
|
.
|
||||||
|
nvlists are wrapped as dictionaries or lists depending on their usage.
|
||||||
|
Some parameters have default values depending on typical use for
|
||||||
|
increased convenience. Enumerations and bit flags become strings and lists
|
||||||
|
of strings in Python. Errors are reported as exceptions rather than integer
|
||||||
|
errno-style error codes. The wrapper takes care to provide one-to-many
|
||||||
|
mapping of the error codes to the exceptions by interpreting a context
|
||||||
|
in which the error code is produced.
|
||||||
|
|
||||||
|
Package: pyzfs-doc
|
||||||
|
Section: contrib/doc
|
||||||
|
Architecture: all
|
||||||
|
Depends:
|
||||||
|
${sphinxdoc:Depends},
|
||||||
|
${sphinxdoc:Built-Using},
|
||||||
|
${misc:Depends}
|
||||||
|
Recommends:
|
||||||
|
python3-pyzfs
|
||||||
|
Description: wrapper for libzfs_core C library (documentation)
|
||||||
|
libzfs_core is intended to be a stable interface for programmatic
|
||||||
|
administration of ZFS. This wrapper provides one-to-one wrappers for
|
||||||
|
libzfs_core API functions, but the signatures and types are more natural to
|
||||||
|
Python.
|
||||||
|
.
|
||||||
|
nvlists are wrapped as dictionaries or lists depending on their usage.
|
||||||
|
Some parameters have default values depending on typical use for
|
||||||
|
increased convenience. Enumerations and bit flags become strings and lists
|
||||||
|
of strings in Python. Errors are reported as exceptions rather than integer
|
||||||
|
errno-style error codes. The wrapper takes care to provide one-to-many
|
||||||
|
mapping of the error codes to the exceptions by interpreting a context
|
||||||
|
in which the error code is produced.
|
||||||
|
.
|
||||||
|
This package contains the documentation.
|
||||||
|
|
||||||
|
Package: zfs-initramfs
|
||||||
|
Architecture: all
|
||||||
|
Depends: busybox-initramfs | busybox-static | busybox,
|
||||||
|
initramfs-tools,
|
||||||
|
zfsutils-linux (>= ${binary:Version}),
|
||||||
|
${misc:Depends}
|
||||||
|
Breaks: zfsutils-linux (<= 0.7.11-pve1~bpo1)
|
||||||
|
Replaces: zfsutils-linux (<= 0.7.11-pve1~bpo1)
|
||||||
|
Description: OpenZFS root filesystem capabilities for Linux - initramfs
|
||||||
|
OpenZFS is a storage platform that encompasses the functionality of
|
||||||
|
traditional filesystems and volume managers. It supports data checksums,
|
||||||
|
compression, encryption, snapshots, and more.
|
||||||
|
.
|
||||||
|
This package adds OpenZFS to the system initramfs with a hook
|
||||||
|
for the initramfs-tools infrastructure.
|
||||||
|
|
||||||
|
Package: zfs-dracut
|
||||||
|
Architecture: all
|
||||||
|
Depends: dracut,
|
||||||
|
zfsutils-linux (>= ${source:Version}),
|
||||||
|
${misc:Depends}
|
||||||
|
Description: OpenZFS root filesystem capabilities for Linux - dracut
|
||||||
|
OpenZFS is a storage platform that encompasses the functionality of
|
||||||
|
traditional filesystems and volume managers. It supports data checksums,
|
||||||
|
compression, encryption, snapshots, and more.
|
||||||
|
.
|
||||||
|
This package adds OpenZFS to the system initramfs with a hook
|
||||||
|
for the dracut infrastructure.
|
||||||
|
|
||||||
|
Package: zfsutils-linux
|
||||||
|
Section: contrib/admin
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: python3, ${misc:Depends}, ${shlibs:Depends}
|
||||||
|
Recommends: zfs-zed
|
||||||
|
Suggests: nfs-kernel-server,
|
||||||
|
samba-common-bin (>= 3.0.23),
|
||||||
|
zfs-initramfs
|
||||||
|
Conflicts: zfs, zfs-fuse
|
||||||
|
Provides: zfsutils
|
||||||
|
Description: command-line tools to manage OpenZFS filesystems
|
||||||
|
OpenZFS is a storage platform that encompasses the functionality of
|
||||||
|
traditional filesystems and volume managers. It supports data checksums,
|
||||||
|
compression, encryption, snapshots, and more.
|
||||||
|
.
|
||||||
|
This package provides the zfs and zpool commands to create and administer
|
||||||
|
OpenZFS filesystems.
|
||||||
|
|
||||||
|
Package: zfs-zed
|
||||||
|
Section: contrib/admin
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: zfsutils-linux (>= ${binary:Version}),
|
||||||
|
${misc:Depends},
|
||||||
|
${shlibs:Depends}
|
||||||
|
Recommends: bsd-mailx | mailutils
|
||||||
|
Description: OpenZFS Event Daemon
|
||||||
|
OpenZFS is a storage platform that encompasses the functionality of
|
||||||
|
traditional filesystems and volume managers. It supports data checksums,
|
||||||
|
compression, encryption, snapshots, and more.
|
||||||
|
.
|
||||||
|
ZED (ZFS Event Daemon) monitors events generated by the ZFS kernel
|
||||||
|
module. When a zevent (ZFS Event) is posted, ZED will run any ZEDLETs
|
||||||
|
(ZFS Event Daemon Linkage for Executable Tasks) that have been enabled
|
||||||
|
for the corresponding zevent class.
|
||||||
|
.
|
||||||
|
This package provides the OpenZFS Event Daemon (zed).
|
||||||
|
|
||||||
|
Package: zfs-test
|
||||||
|
Section: contrib/admin
|
||||||
|
Architecture: linux-any
|
||||||
|
Depends: acl,
|
||||||
|
attr,
|
||||||
|
bc,
|
||||||
|
fio,
|
||||||
|
ksh,
|
||||||
|
lsscsi,
|
||||||
|
mdadm,
|
||||||
|
parted,
|
||||||
|
python3,
|
||||||
|
python3-pyzfs,
|
||||||
|
sudo,
|
||||||
|
sysstat,
|
||||||
|
zfsutils-linux (>=${binary:Version}),
|
||||||
|
${misc:Depends},
|
||||||
|
${shlibs:Depends}
|
||||||
|
Recommends: nfs-kernel-server
|
||||||
|
Breaks: zfsutils-linux (<= 0.7.9-2)
|
||||||
|
Replaces: zfsutils-linux (<= 0.7.9-2)
|
||||||
|
Conflicts: zutils
|
||||||
|
Description: OpenZFS test infrastructure and support scripts
|
||||||
|
OpenZFS is a storage platform that encompasses the functionality of
|
||||||
|
traditional filesystems and volume managers. It supports data checksums,
|
||||||
|
compression, encryption, snapshots, and more.
|
||||||
|
.
|
||||||
|
This package provides the OpenZFS test infrastructure for destructively
|
||||||
|
testing and validating a system using OpenZFS. It is entirely optional
|
||||||
|
and should only be installed and used in test environments.
|
||||||
|
|
||||||
|
Package: spl
|
||||||
|
Section: contrib/metapackages
|
||||||
|
Architecture: all
|
||||||
|
Depends: ${misc:Depends},
|
||||||
|
Suggests: zfs-test
|
||||||
|
Description: Solaris Porting Layer user-space utilities for Linux (dummy)
|
||||||
|
The Solaris Porting Layer (SPL) is a Linux kernel module which provides
|
||||||
|
many of the Solaris kernel APIs. This shim layer makes it possible to
|
||||||
|
run Solaris kernel code in the Linux kernel with relatively minimal
|
||||||
|
modification. The Solaris Porting LAyer Tests (SPLAT) is a Linux kernel
|
||||||
|
module which provides a testing harness for the SPL module.
|
||||||
|
.
|
||||||
|
SPL can be particularly useful when you want to track upstream Illumos
|
||||||
|
(or any other OpenSolaris fork) development closely and don't want the
|
||||||
|
overhead of maintaining a large patch which converts Solaris primitives
|
||||||
|
to Linux primitives.
|
||||||
|
.
|
||||||
|
This is a transitional dummy package. It can safely be removed.
|
||||||
Vendored
+1250
File diff suppressed because it is too large
Load Diff
Vendored
+1161
File diff suppressed because it is too large
Load Diff
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
COPYRIGHT
|
||||||
|
LICENSE
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
lib/@DEB_HOST_MULTIARCH@/libnvpair.so.*
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
package-name-doesnt-match-sonames
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
lib/*/security/pam_zfs_key.so
|
||||||
|
usr/share/pam-configs/zfs_key
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
pam-auth-update --package
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ "$1" = remove ] ; then
|
||||||
|
pam-auth-update --package --remove zfs_key
|
||||||
|
fi
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
COPYRIGHT
|
||||||
|
LICENSE
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
lib/@DEB_HOST_MULTIARCH@/libuutil.so.*
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
package-name-doesnt-match-sonames
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
COPYRIGHT
|
||||||
|
LICENSE
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
lib/@DEB_HOST_MULTIARCH@/libzfs.so.*
|
||||||
|
lib/@DEB_HOST_MULTIARCH@/libzfs_core.so.*
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
package-name-doesnt-match-sonames
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
COPYRIGHT
|
||||||
|
LICENSE
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
lib/libzfsbootenv.so.*
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
lib/@DEB_HOST_MULTIARCH@/libzfsbootenv.so.*
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
package-name-doesnt-match-sonames
|
||||||
|
extra-license-file *usr/share/doc/libzfsbootenv1linux/LICENSE.gz*
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
COPYRIGHT
|
||||||
|
LICENSE
|
||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
lib/@DEB_HOST_MULTIARCH@/*.a usr/lib/@DEB_HOST_MULTIARCH@/
|
||||||
|
usr/include
|
||||||
|
usr/lib/@DEB_HOST_MULTIARCH@/*.so
|
||||||
|
/usr/lib/@DEB_HOST_MULTIARCH@/pkgconfig/*.pc
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
COPYRIGHT
|
||||||
|
LICENSE
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
lib/@DEB_HOST_MULTIARCH@/libzpool.so.*
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
package-name-doesnt-match-sonames
|
||||||
Vendored
+13
@@ -0,0 +1,13 @@
|
|||||||
|
usr/share/zfs/enum-extract.pl
|
||||||
|
usr/share/zfs/zfs-helpers.sh
|
||||||
|
etc/default/zfs
|
||||||
|
etc/init.d
|
||||||
|
etc/sudoers.d
|
||||||
|
etc/zfs/vdev_id.conf.alias.example
|
||||||
|
etc/zfs/vdev_id.conf.multipath.example
|
||||||
|
etc/zfs/vdev_id.conf.sas_direct.example
|
||||||
|
etc/zfs/vdev_id.conf.sas_switch.example
|
||||||
|
etc/zfs/vdev_id.conf.scsi.example
|
||||||
|
usr/lib/dracut
|
||||||
|
usr/share/zfs/enum-extract.pl
|
||||||
|
etc/zfs/zfs-functions
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Debian ZFS on Linux maintainers
|
||||||
|
<pkg-zfsonlinux-devel@alioth-lists.debian.net>
|
||||||
|
Date: Wed, 30 Jan 2019 15:12:04 +0100
|
||||||
|
Subject: [PATCH] Check-for-META-and-DCH-consistency-in-autoconf
|
||||||
|
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
config/zfs-meta.m4 | 34 +++++++++++++++++++++++++++++-----
|
||||||
|
1 file changed, 29 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/config/zfs-meta.m4 b/config/zfs-meta.m4
|
||||||
|
index 20064a0fb..4d5f545ad 100644
|
||||||
|
--- a/config/zfs-meta.m4
|
||||||
|
+++ b/config/zfs-meta.m4
|
||||||
|
@@ -1,9 +1,10 @@
|
||||||
|
dnl #
|
||||||
|
dnl # DESCRIPTION:
|
||||||
|
-dnl # Read meta data from the META file. When building from a git repository
|
||||||
|
-dnl # the ZFS_META_RELEASE field will be overwritten if there is an annotated
|
||||||
|
-dnl # tag matching the form ZFS_META_NAME-ZFS_META_VERSION-*. This allows
|
||||||
|
-dnl # for working builds to be uniquely identified using the git commit hash.
|
||||||
|
+dnl # Read meta data from the META file or the debian/changelog file if it
|
||||||
|
+dnl # exists. When building from a git repository the ZFS_META_RELEASE field
|
||||||
|
+dnl # will be overwritten if there is an annotated tag matching the form
|
||||||
|
+dnl # ZFS_META_NAME-ZFS_META_VERSION-*. This allows for working builds to be
|
||||||
|
+dnl # uniquely identified using the git commit hash.
|
||||||
|
dnl #
|
||||||
|
dnl # The META file format is as follows:
|
||||||
|
dnl # ^[ ]*KEY:[ \t]+VALUE$
|
||||||
|
@@ -49,6 +50,7 @@ AC_DEFUN([ZFS_AC_META], [
|
||||||
|
_zfs_ac_meta_type="none"
|
||||||
|
if test -f "$META"; then
|
||||||
|
_zfs_ac_meta_type="META file"
|
||||||
|
+ _dpkg_parsechangelog=$(dpkg-parsechangelog 2>/dev/null)
|
||||||
|
|
||||||
|
ZFS_META_NAME=_ZFS_AC_META_GETVAL([(Name|Project|Package)]);
|
||||||
|
if test -n "$ZFS_META_NAME"; then
|
||||||
|
@@ -69,8 +71,30 @@ AC_DEFUN([ZFS_AC_META], [
|
||||||
|
AC_SUBST([ZFS_META_VERSION])
|
||||||
|
fi
|
||||||
|
|
||||||
|
+ if test -n "${_dpkg_parsechangelog}"; then
|
||||||
|
+ _dpkg_version=$(echo "${_dpkg_parsechangelog}" \
|
||||||
|
+ | $AWK '$[]1 == "Version:" { print $[]2; }' \
|
||||||
|
+ | cut -d- -f1)
|
||||||
|
+ if test "${_dpkg_version}" != "$ZFS_META_VERSION"; then
|
||||||
|
+ AC_MSG_ERROR([
|
||||||
|
+ *** Version $ZFS_META_VERSION in the META file is different than
|
||||||
|
+ *** version $_dpkg_version in the debian/changelog file. DKMS and DEB
|
||||||
|
+ *** packaging require that these files have the same version.
|
||||||
|
+ ])
|
||||||
|
+ fi
|
||||||
|
+ fi
|
||||||
|
+
|
||||||
|
ZFS_META_RELEASE=_ZFS_AC_META_GETVAL([Release]);
|
||||||
|
- if test ! -f ".nogitrelease" && git rev-parse --git-dir > /dev/null 2>&1; then
|
||||||
|
+
|
||||||
|
+ if test -n "${_dpkg_parsechangelog}"; then
|
||||||
|
+ _dpkg_release=$(echo "${_dpkg_parsechangelog}" \
|
||||||
|
+ | $AWK '$[]1 == "Version:" { print $[]2; }' \
|
||||||
|
+ | cut -d- -f2-)
|
||||||
|
+ if test -n "${_dpkg_release}"; then
|
||||||
|
+ ZFS_META_RELEASE=${_dpkg_release}
|
||||||
|
+ _zfs_ac_meta_type="dpkg-parsechangelog"
|
||||||
|
+ fi
|
||||||
|
+ elif test ! -f ".nogitrelease" && git rev-parse --git-dir > /dev/null 2>&1; then
|
||||||
|
_match="${ZFS_META_NAME}-${ZFS_META_VERSION}"
|
||||||
|
_alias=$(git describe --match=${_match} 2>/dev/null)
|
||||||
|
_release=$(echo ${_alias}|sed "s/${ZFS_META_NAME}//"|cut -f3- -d'-'|tr - _)
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= <f.gruenbichler@proxmox.com>
|
||||||
|
Date: Fri, 19 Jan 2018 12:13:46 +0100
|
||||||
|
Subject: [PATCH] always load ZFS module on boot
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
since zfs-import-scan.service is disabled by default, and
|
||||||
|
zfs-import-cache.service only gets started if a cache file exists, this
|
||||||
|
is needed for zfs-mount, zfs-share and zfs-zed services in case ZFS is
|
||||||
|
not actually used.
|
||||||
|
|
||||||
|
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||||
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
etc/modules-load.d/zfs.conf | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/etc/modules-load.d/zfs.conf b/etc/modules-load.d/zfs.conf
|
||||||
|
index 44e1bb3ed..7509b03cb 100644
|
||||||
|
--- a/etc/modules-load.d/zfs.conf
|
||||||
|
+++ b/etc/modules-load.d/zfs.conf
|
||||||
|
@@ -1,3 +1,3 @@
|
||||||
|
# The default behavior is to allow udev to load the kernel modules on demand.
|
||||||
|
# Uncomment the following line to unconditionally load them at boot.
|
||||||
|
-#zfs
|
||||||
|
+zfs
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= <f.gruenbichler@proxmox.com>
|
||||||
|
Date: Mon, 6 Feb 2017 12:04:35 +0100
|
||||||
|
Subject: [PATCH] Fix the path to the zed binary on the systemd unit.
|
||||||
|
|
||||||
|
We install zed into /usr/sbin manually meanwhile the upstream default is
|
||||||
|
installing it into /sbin. Ubuntu packages also install zed to /usr/sbin, but
|
||||||
|
they ship their own zfs-zed unit.
|
||||||
|
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
etc/systemd/system/zfs-zed.service.in | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/etc/systemd/system/zfs-zed.service.in b/etc/systemd/system/zfs-zed.service.in
|
||||||
|
index be2fc6734..7606604ec 100644
|
||||||
|
--- a/etc/systemd/system/zfs-zed.service.in
|
||||||
|
+++ b/etc/systemd/system/zfs-zed.service.in
|
||||||
|
@@ -5,7 +5,7 @@ ConditionPathIsDirectory=/sys/module/zfs
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
EnvironmentFile=-@initconfdir@/zfs
|
||||||
|
-ExecStart=@sbindir@/zed -F
|
||||||
|
+ExecStart=/usr/sbin/zed -F
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= <f.gruenbichler@proxmox.com>
|
||||||
|
Date: Mon, 24 Oct 2016 13:47:06 +0200
|
||||||
|
Subject: [PATCH] import with -d /dev/disk/by-id in scan service
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||||
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
etc/systemd/system/zfs-import-scan.service.in | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/etc/systemd/system/zfs-import-scan.service.in b/etc/systemd/system/zfs-import-scan.service.in
|
||||||
|
index c5dd45d87..1c792edf0 100644
|
||||||
|
--- a/etc/systemd/system/zfs-import-scan.service.in
|
||||||
|
+++ b/etc/systemd/system/zfs-import-scan.service.in
|
||||||
|
@@ -14,7 +14,7 @@ ConditionPathIsDirectory=/sys/module/zfs
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
EnvironmentFile=-@initconfdir@/zfs
|
||||||
|
-ExecStart=@sbindir@/zpool import -aN -o cachefile=none $ZPOOL_IMPORT_OPTS
|
||||||
|
+ExecStart=@sbindir@/zpool import -aN -d /dev/disk/by-id -o cachefile=none $ZPOOL_IMPORT_OPTS
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=zfs-import.target
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Richard Laager <rlaager@wiktel.com>
|
||||||
|
Date: Wed, 30 Jan 2019 15:12:04 +0100
|
||||||
|
Subject: [PATCH] Enable zed emails
|
||||||
|
|
||||||
|
The OpenZFS event daemon monitors pools. This patch enables the email sending
|
||||||
|
function by default (if zed is installed). This is consistent with the default
|
||||||
|
behavior of mdadm.
|
||||||
|
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
cmd/zed/zed.d/zed.rc | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/cmd/zed/zed.d/zed.rc b/cmd/zed/zed.d/zed.rc
|
||||||
|
index bc269b155..e6d4b1703 100644
|
||||||
|
--- a/cmd/zed/zed.d/zed.rc
|
||||||
|
+++ b/cmd/zed/zed.d/zed.rc
|
||||||
|
@@ -41,7 +41,7 @@ ZED_EMAIL_ADDR="root"
|
||||||
|
##
|
||||||
|
# Minimum number of seconds between notifications for a similar event.
|
||||||
|
#
|
||||||
|
-#ZED_NOTIFY_INTERVAL_SECS=3600
|
||||||
|
+ZED_NOTIFY_INTERVAL_SECS=3600
|
||||||
|
|
||||||
|
##
|
||||||
|
# Notification verbosity.
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Antonio Russo <antonio.e.russo@gmail.com>
|
||||||
|
Date: Fri, 20 Mar 2020 17:28:43 +0100
|
||||||
|
Subject: [PATCH] dont symlink zed scripts
|
||||||
|
|
||||||
|
Of the zedlet scripts shipped by upstream, a subset are enabled by
|
||||||
|
default, by creating symlinks in /etc/zfs/zed.d. These symlinks are
|
||||||
|
shipped in the zfs-zed package. dpkg, however, does not support
|
||||||
|
conffile handling of symlinks, and therefore any changes (removals) to
|
||||||
|
the symlinks are not preserved on package upgrade.
|
||||||
|
|
||||||
|
To address this policy violation, we:
|
||||||
|
|
||||||
|
1. During package build, create a list of enabled-by-default zedlets,
|
||||||
|
instead of creating symlinks.
|
||||||
|
2. On package removal, identify all enabled-by-default zedlets whose
|
||||||
|
symlinks do not exist (i.e., were removed by the user). This is done
|
||||||
|
by creating "whiteout" links to /dev/null in their place).
|
||||||
|
3. On package installation, create links to enabled-by-default zedlets
|
||||||
|
UNLESS there is already a file there (i.e., abort if there is a
|
||||||
|
whiteout link).
|
||||||
|
4. We also clean up broken symlinks to removed zedlets at package
|
||||||
|
postinst.
|
||||||
|
|
||||||
|
Description: track default symlinks, instead of symlinking
|
||||||
|
Forwarded: no need
|
||||||
|
(cherry picked from https://salsa.debian.org/zfsonlinux-team/zfs/-/commit/5cee380324d7)
|
||||||
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
cmd/zed/zed.d/Makefile.am | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/cmd/zed/zed.d/Makefile.am b/cmd/zed/zed.d/Makefile.am
|
||||||
|
index 812558cf6..f802cf140 100644
|
||||||
|
--- a/cmd/zed/zed.d/Makefile.am
|
||||||
|
+++ b/cmd/zed/zed.d/Makefile.am
|
||||||
|
@@ -48,7 +48,7 @@ zed-install-data-hook:
|
||||||
|
set -x; for f in $(zedconfdefaults); do \
|
||||||
|
[ -f "$(DESTDIR)$(zedconfdir)/$${f}" ] ||\
|
||||||
|
[ -L "$(DESTDIR)$(zedconfdir)/$${f}" ] || \
|
||||||
|
- $(LN_S) "$(zedexecdir)/$${f}" "$(DESTDIR)$(zedconfdir)"; \
|
||||||
|
+ echo "$${f}" >> "$(DESTDIR)$(zedexecdir)/DEFAULT-ENABLED" ; \
|
||||||
|
done
|
||||||
|
|
||||||
|
SHELLCHECKSCRIPTS += $(dist_zedconf_DATA) $(dist_zedexec_SCRIPTS) $(nodist_zedexec_SCRIPTS)
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Date: Tue, 15 Sep 2020 19:07:24 +0200
|
||||||
|
Subject: [PATCH] Add systemd-unit for importing specific pools
|
||||||
|
|
||||||
|
The unit can be instantiated with a specific poolname, which will get imported
|
||||||
|
by scanning /dev/disk/by-id, irrespective of the existence and content of
|
||||||
|
/etc/zfs/zpool.cache.
|
||||||
|
|
||||||
|
the instance name is used unescaped (see systemd.unit(5)), since zpool names
|
||||||
|
can contain characters which will be escaped by systemd.
|
||||||
|
|
||||||
|
Its instances are ordered before the other two "big" import services to avoid
|
||||||
|
races and spurious (cosmetic!) service failures.
|
||||||
|
|
||||||
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
etc/Makefile.am | 1 +
|
||||||
|
etc/systemd/system/50-zfs.preset | 1 +
|
||||||
|
etc/systemd/system/zfs-import@.service.in | 18 ++++++++++++++++
|
||||||
|
3 files changed, 20 insertions(+)
|
||||||
|
create mode 100644 etc/systemd/system/zfs-import@.service.in
|
||||||
|
|
||||||
|
diff --git a/etc/Makefile.am b/etc/Makefile.am
|
||||||
|
index 7187762d3..de131dc87 100644
|
||||||
|
--- a/etc/Makefile.am
|
||||||
|
+++ b/etc/Makefile.am
|
||||||
|
@@ -54,6 +54,7 @@ dist_systemdpreset_DATA = \
|
||||||
|
systemdunit_DATA = \
|
||||||
|
%D%/systemd/system/zfs-import-cache.service \
|
||||||
|
%D%/systemd/system/zfs-import-scan.service \
|
||||||
|
+ %D%/systemd/system/zfs-import@.service \
|
||||||
|
%D%/systemd/system/zfs-import.target \
|
||||||
|
%D%/systemd/system/zfs-mount.service \
|
||||||
|
%D%/systemd/system/zfs-scrub-monthly@.timer \
|
||||||
|
diff --git a/etc/systemd/system/50-zfs.preset b/etc/systemd/system/50-zfs.preset
|
||||||
|
index e4056a92c..030611419 100644
|
||||||
|
--- a/etc/systemd/system/50-zfs.preset
|
||||||
|
+++ b/etc/systemd/system/50-zfs.preset
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
# ZFS is enabled by default
|
||||||
|
enable zfs-import-cache.service
|
||||||
|
disable zfs-import-scan.service
|
||||||
|
+enable zfs-import@.service
|
||||||
|
enable zfs-import.target
|
||||||
|
enable zfs-mount.service
|
||||||
|
enable zfs-share.service
|
||||||
|
diff --git a/etc/systemd/system/zfs-import@.service.in b/etc/systemd/system/zfs-import@.service.in
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..9b4ee9371
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/etc/systemd/system/zfs-import@.service.in
|
||||||
|
@@ -0,0 +1,18 @@
|
||||||
|
+[Unit]
|
||||||
|
+Description=Import ZFS pool %i
|
||||||
|
+Documentation=man:zpool(8)
|
||||||
|
+DefaultDependencies=no
|
||||||
|
+After=systemd-udev-settle.service
|
||||||
|
+After=cryptsetup.target
|
||||||
|
+After=multipathd.target
|
||||||
|
+Before=zfs-import.target
|
||||||
|
+Before=zfs-import-scan.service
|
||||||
|
+Before=zfs-import-cache.service
|
||||||
|
+
|
||||||
|
+[Service]
|
||||||
|
+Type=oneshot
|
||||||
|
+RemainAfterExit=yes
|
||||||
|
+ExecStart=@sbindir@/zpool import -N -d /dev/disk/by-id -o cachefile=none %I
|
||||||
|
+
|
||||||
|
+[Install]
|
||||||
|
+WantedBy=zfs-import.target
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Date: Thu, 4 Feb 2021 19:01:12 +0100
|
||||||
|
Subject: [PATCH] Patch: move manpage arcstat(1) to arcstat(8).
|
||||||
|
|
||||||
|
Originally-By: Mo Zhou <cdluminate@gmail.com>
|
||||||
|
Originally-By: Antonio Russo <aerusso@aerusso.net>
|
||||||
|
|
||||||
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
man/Makefile.am | 2 +-
|
||||||
|
man/{man1/arcstat.1 => man8/arcstat.8} | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
rename man/{man1/arcstat.1 => man8/arcstat.8} (99%)
|
||||||
|
|
||||||
|
diff --git a/man/Makefile.am b/man/Makefile.am
|
||||||
|
index 45156571e..3713e9371 100644
|
||||||
|
--- a/man/Makefile.am
|
||||||
|
+++ b/man/Makefile.am
|
||||||
|
@@ -2,7 +2,6 @@ dist_noinst_man_MANS = \
|
||||||
|
%D%/man1/cstyle.1
|
||||||
|
|
||||||
|
dist_man_MANS = \
|
||||||
|
- %D%/man1/arcstat.1 \
|
||||||
|
%D%/man1/raidz_test.1 \
|
||||||
|
%D%/man1/test-runner.1 \
|
||||||
|
%D%/man1/zhack.1 \
|
||||||
|
@@ -22,6 +21,7 @@ dist_man_MANS = \
|
||||||
|
%D%/man7/zpoolconcepts.7 \
|
||||||
|
%D%/man7/zpoolprops.7 \
|
||||||
|
\
|
||||||
|
+ %D%/man8/arcstat.8 \
|
||||||
|
%D%/man8/fsck.zfs.8 \
|
||||||
|
%D%/man8/mount.zfs.8 \
|
||||||
|
%D%/man8/vdev_id.8 \
|
||||||
|
diff --git a/man/man1/arcstat.1 b/man/man8/arcstat.8
|
||||||
|
similarity index 99%
|
||||||
|
rename from man/man1/arcstat.1
|
||||||
|
rename to man/man8/arcstat.8
|
||||||
|
index 82358fa68..a8fb55498 100644
|
||||||
|
--- a/man/man1/arcstat.1
|
||||||
|
+++ b/man/man8/arcstat.8
|
||||||
|
@@ -13,7 +13,7 @@
|
||||||
|
.\" Copyright (c) 2020 by AJ Jordan. All rights reserved.
|
||||||
|
.\"
|
||||||
|
.Dd December 23, 2022
|
||||||
|
-.Dt ARCSTAT 1
|
||||||
|
+.Dt ARCSTAT 8
|
||||||
|
.Os
|
||||||
|
.
|
||||||
|
.Sh NAME
|
||||||
+113
@@ -0,0 +1,113 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
Date: Wed, 10 Nov 2021 09:29:47 +0100
|
||||||
|
Subject: [PATCH] arc stat/summary: guard access to l2arc MFU/MRU stats
|
||||||
|
|
||||||
|
commit 085321621e79a75bea41c2b6511da6ebfbf2ba0a added printing MFU
|
||||||
|
and MRU stats for 2.1 user space tools, but those keys are not
|
||||||
|
available in the 2.0 module. That means it may break the arcstat and
|
||||||
|
arc_summary tools after upgrade to 2.1 (user space), before a reboot
|
||||||
|
to the new 2.1 ZFS kernel-module happened, due to python raising a
|
||||||
|
KeyError on the dict access then.
|
||||||
|
|
||||||
|
Move those two keys to a .get accessor with `0` as fallback, as it
|
||||||
|
should be better to show some possible wrong data for new stat-keys
|
||||||
|
than throwing an exception.
|
||||||
|
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
|
||||||
|
also move l2_mfu_asize l2_mru_asize l2_prefetch_asize
|
||||||
|
l2_bufc_data_asize l2_bufc_metadata_asize to .get accessor
|
||||||
|
(these are only present with a cache device in the pool)
|
||||||
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
cmd/arc_summary | 28 ++++++++++++++--------------
|
||||||
|
cmd/arcstat.in | 14 +++++++-------
|
||||||
|
2 files changed, 21 insertions(+), 21 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/cmd/arc_summary b/cmd/arc_summary
|
||||||
|
index 9c69ec4f8..edf94ea2a 100755
|
||||||
|
--- a/cmd/arc_summary
|
||||||
|
+++ b/cmd/arc_summary
|
||||||
|
@@ -655,13 +655,13 @@ def section_arc(kstats_dict):
|
||||||
|
prt_i1('L2 cached evictions:', f_bytes(arc_stats['evict_l2_cached']))
|
||||||
|
prt_i1('L2 eligible evictions:', f_bytes(arc_stats['evict_l2_eligible']))
|
||||||
|
prt_i2('L2 eligible MFU evictions:',
|
||||||
|
- f_perc(arc_stats['evict_l2_eligible_mfu'],
|
||||||
|
+ f_perc(arc_stats.get('evict_l2_eligible_mfu', 0), # 2.0 module compat
|
||||||
|
arc_stats['evict_l2_eligible']),
|
||||||
|
- f_bytes(arc_stats['evict_l2_eligible_mfu']))
|
||||||
|
+ f_bytes(arc_stats.get('evict_l2_eligible_mfu', 0)))
|
||||||
|
prt_i2('L2 eligible MRU evictions:',
|
||||||
|
- f_perc(arc_stats['evict_l2_eligible_mru'],
|
||||||
|
+ f_perc(arc_stats.get('evict_l2_eligible_mru', 0), # 2.0 module compat
|
||||||
|
arc_stats['evict_l2_eligible']),
|
||||||
|
- f_bytes(arc_stats['evict_l2_eligible_mru']))
|
||||||
|
+ f_bytes(arc_stats.get('evict_l2_eligible_mru', 0)))
|
||||||
|
prt_i1('L2 ineligible evictions:',
|
||||||
|
f_bytes(arc_stats['evict_l2_ineligible']))
|
||||||
|
print()
|
||||||
|
@@ -851,20 +851,20 @@ def section_l2arc(kstats_dict):
|
||||||
|
f_perc(arc_stats['l2_hdr_size'], arc_stats['l2_size']),
|
||||||
|
f_bytes(arc_stats['l2_hdr_size']))
|
||||||
|
prt_i2('MFU allocated size:',
|
||||||
|
- f_perc(arc_stats['l2_mfu_asize'], arc_stats['l2_asize']),
|
||||||
|
- f_bytes(arc_stats['l2_mfu_asize']))
|
||||||
|
+ f_perc(arc_stats.get('l2_mfu_asize', 0), arc_stats['l2_asize']),
|
||||||
|
+ f_bytes(arc_stats.get('l2_mfu_asize', 0))) # 2.0 module compat
|
||||||
|
prt_i2('MRU allocated size:',
|
||||||
|
- f_perc(arc_stats['l2_mru_asize'], arc_stats['l2_asize']),
|
||||||
|
- f_bytes(arc_stats['l2_mru_asize']))
|
||||||
|
+ f_perc(arc_stats.get('l2_mru_asize', 0), arc_stats['l2_asize']),
|
||||||
|
+ f_bytes(arc_stats.get('l2_mru_asize', 0))) # 2.0 module compat
|
||||||
|
prt_i2('Prefetch allocated size:',
|
||||||
|
- f_perc(arc_stats['l2_prefetch_asize'], arc_stats['l2_asize']),
|
||||||
|
- f_bytes(arc_stats['l2_prefetch_asize']))
|
||||||
|
+ f_perc(arc_stats.get('l2_prefetch_asize', 0), arc_stats['l2_asize']),
|
||||||
|
+ f_bytes(arc_stats.get('l2_prefetch_asize',0))) # 2.0 module compat
|
||||||
|
prt_i2('Data (buffer content) allocated size:',
|
||||||
|
- f_perc(arc_stats['l2_bufc_data_asize'], arc_stats['l2_asize']),
|
||||||
|
- f_bytes(arc_stats['l2_bufc_data_asize']))
|
||||||
|
+ f_perc(arc_stats.get('l2_bufc_data_asize', 0), arc_stats['l2_asize']),
|
||||||
|
+ f_bytes(arc_stats.get('l2_bufc_data_asize', 0))) # 2.0 module compat
|
||||||
|
prt_i2('Metadata (buffer content) allocated size:',
|
||||||
|
- f_perc(arc_stats['l2_bufc_metadata_asize'], arc_stats['l2_asize']),
|
||||||
|
- f_bytes(arc_stats['l2_bufc_metadata_asize']))
|
||||||
|
+ f_perc(arc_stats.get('l2_bufc_metadata_asize', 0), arc_stats['l2_asize']),
|
||||||
|
+ f_bytes(arc_stats.get('l2_bufc_metadata_asize', 0))) # 2.0 module compat
|
||||||
|
|
||||||
|
print()
|
||||||
|
prt_1('L2ARC breakdown:', f_hits(l2_access_total))
|
||||||
|
diff --git a/cmd/arcstat.in b/cmd/arcstat.in
|
||||||
|
index 8df1c62f7..833348d0e 100755
|
||||||
|
--- a/cmd/arcstat.in
|
||||||
|
+++ b/cmd/arcstat.in
|
||||||
|
@@ -565,8 +565,8 @@ def calculate():
|
||||||
|
v["el2skip"] = d["evict_l2_skip"] // sint
|
||||||
|
v["el2cach"] = d["evict_l2_cached"] // sint
|
||||||
|
v["el2el"] = d["evict_l2_eligible"] // sint
|
||||||
|
- v["el2mfu"] = d["evict_l2_eligible_mfu"] // sint
|
||||||
|
- v["el2mru"] = d["evict_l2_eligible_mru"] // sint
|
||||||
|
+ v["el2mfu"] = d.get("evict_l2_eligible_mfu", 0) // sint
|
||||||
|
+ v["el2mru"] = d.get("evict_l2_eligible_mru", 0) // sint
|
||||||
|
v["el2inel"] = d["evict_l2_ineligible"] // sint
|
||||||
|
v["mtxmis"] = d["mutex_miss"] // sint
|
||||||
|
|
||||||
|
@@ -581,11 +581,11 @@ def calculate():
|
||||||
|
v["l2size"] = cur["l2_size"]
|
||||||
|
v["l2bytes"] = d["l2_read_bytes"] // sint
|
||||||
|
|
||||||
|
- v["l2pref"] = cur["l2_prefetch_asize"]
|
||||||
|
- v["l2mfu"] = cur["l2_mfu_asize"]
|
||||||
|
- v["l2mru"] = cur["l2_mru_asize"]
|
||||||
|
- v["l2data"] = cur["l2_bufc_data_asize"]
|
||||||
|
- v["l2meta"] = cur["l2_bufc_metadata_asize"]
|
||||||
|
+ v["l2pref"] = cur.get("l2_prefetch_asize", 0)
|
||||||
|
+ v["l2mfu"] = cur.get("l2_mfu_asize", 0)
|
||||||
|
+ v["l2mru"] = cur.get("l2_mru_asize", 0)
|
||||||
|
+ v["l2data"] = cur.get("l2_bufc_data_asize", 0)
|
||||||
|
+ v["l2meta"] = cur.get("l2_bufc_metadata_asize", 0)
|
||||||
|
v["l2pref%"] = 100 * v["l2pref"] // v["l2asize"]
|
||||||
|
v["l2mfu%"] = 100 * v["l2mfu"] // v["l2asize"]
|
||||||
|
v["l2mru%"] = 100 * v["l2mru"] // v["l2asize"]
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: siv0 <github@nomore.at>
|
||||||
|
Date: Tue, 31 Oct 2023 21:57:54 +0100
|
||||||
|
Subject: [PATCH] Fix nfs_truncate_shares without /etc/exports.d
|
||||||
|
|
||||||
|
Calling nfs_reset_shares on Linux prints a warning:
|
||||||
|
`failed to lock /etc/exports.d/zfs.exports.lock: No such file or
|
||||||
|
directory`
|
||||||
|
when /etc/exports.d does not exist. The directory gets created, when a
|
||||||
|
filesystem is actually exported through nfs_toggle_share and
|
||||||
|
nfs_init_share. The truncation of /etc/exports.d/zfs.exports happens
|
||||||
|
unconditionally when calling `zfs mount -a` (via zfs_do_mount and
|
||||||
|
share_mount in `cmd/zfs/zfs_main.c`).
|
||||||
|
|
||||||
|
Fixing the issue only in the Linux part, since the exports file on
|
||||||
|
freebsd is in `/etc/zfs/`, which seems present on 2 FreeBSD systems I
|
||||||
|
have access to (through `/etc/zfs/compatibility.d/`), while a Debian
|
||||||
|
box does not have the directory even if `/usr/sbin/exportfs` is
|
||||||
|
present through the `nfs-kernel-server` package.
|
||||||
|
|
||||||
|
The code for exports_available is copied from nfs_available above.
|
||||||
|
|
||||||
|
Fixes: ede037cda73675f42b1452187e8dd3438fafc220
|
||||||
|
("Make zfs-share service resilient to stale exports")
|
||||||
|
|
||||||
|
Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Closes #15369
|
||||||
|
Closes #15468
|
||||||
|
(cherry picked from commit 41e55b476bcfc90f1ad81c02c5375367fdace9e9)
|
||||||
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
---
|
||||||
|
lib/libshare/os/linux/nfs.c | 18 ++++++++++++++++++
|
||||||
|
1 file changed, 18 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/lib/libshare/os/linux/nfs.c b/lib/libshare/os/linux/nfs.c
|
||||||
|
index 004946b0c..3dce81840 100644
|
||||||
|
--- a/lib/libshare/os/linux/nfs.c
|
||||||
|
+++ b/lib/libshare/os/linux/nfs.c
|
||||||
|
@@ -47,6 +47,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
static boolean_t nfs_available(void);
|
||||||
|
+static boolean_t exports_available(void);
|
||||||
|
|
||||||
|
typedef int (*nfs_shareopt_callback_t)(const char *opt, const char *value,
|
||||||
|
void *cookie);
|
||||||
|
@@ -539,6 +540,8 @@ nfs_commit_shares(void)
|
||||||
|
static void
|
||||||
|
nfs_truncate_shares(void)
|
||||||
|
{
|
||||||
|
+ if (!exports_available())
|
||||||
|
+ return;
|
||||||
|
nfs_reset_shares(ZFS_EXPORTS_LOCK, ZFS_EXPORTS_FILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -566,3 +569,18 @@ nfs_available(void)
|
||||||
|
|
||||||
|
return (avail == 1);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+static boolean_t
|
||||||
|
+exports_available(void)
|
||||||
|
+{
|
||||||
|
+ static int avail;
|
||||||
|
+
|
||||||
|
+ if (!avail) {
|
||||||
|
+ if (access(ZFS_EXPORTS_DIR, F_OK) != 0)
|
||||||
|
+ avail = -1;
|
||||||
|
+ else
|
||||||
|
+ avail = 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return (avail == 1);
|
||||||
|
+}
|
||||||
+66
@@ -0,0 +1,66 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
Date: Sun, 12 Nov 2023 15:52:25 +0100
|
||||||
|
Subject: [PATCH] zpool status: tighten bounds for noalloc stat availabillity
|
||||||
|
|
||||||
|
When running zfs 2.2.0 userspace utilities with a kernel that still
|
||||||
|
has 2.1.13 modules zpool status adds `(non-allocating)` next to the
|
||||||
|
disk name of a single-disk pool.
|
||||||
|
|
||||||
|
The reason for this seems to be that the patch adding the `vs_pspace` field was
|
||||||
|
backported, but the one adding `vs_noalloc` was not.
|
||||||
|
|
||||||
|
Itself that is not a problem, but in 2.2 `noalloc` was added before `psspace`,
|
||||||
|
so the struct layout between 2.1.13 and 2.2.0 do NOT match anymore...
|
||||||
|
|
||||||
|
I.e., the struct looks like the following at the end for ZFS 2.1.x:
|
||||||
|
|
||||||
|
```
|
||||||
|
typedef struct vdev_stat {
|
||||||
|
hrtime_t vs_timestamp; /* time since vdev load */
|
||||||
|
// snip
|
||||||
|
uint64_t vs_logical_ashift; /* vdev_logical_ashift */
|
||||||
|
uint64_t vs_physical_ashift; /* vdev_physical_ashift */
|
||||||
|
uint64_t vs_pspace; /* physical capacity */
|
||||||
|
} vdev_stat_t;
|
||||||
|
```
|
||||||
|
|
||||||
|
And like the following on ZFS 2.2.x:
|
||||||
|
```
|
||||||
|
typedef struct vdev_stat {
|
||||||
|
hrtime_t vs_timestamp; /* time since vdev load */
|
||||||
|
// snip
|
||||||
|
uint64_t vs_logical_ashift; /* vdev_logical_ashift */
|
||||||
|
uint64_t vs_physical_ashift; /* vdev_physical_ashift */
|
||||||
|
uint64_t vs_noalloc; /* allocations halted? */
|
||||||
|
uint64_t vs_pspace; /* physical capacity */
|
||||||
|
} vdev_stat_t;
|
||||||
|
```
|
||||||
|
|
||||||
|
Resulting in 2.2.x user-space tooling interpreting the `vs_pspace` field from
|
||||||
|
the 2.1.x kernel module as `vs_noalloc` field.
|
||||||
|
|
||||||
|
For now, work-around that discrepancy by coupling the availability of
|
||||||
|
the vs_noalloc field with the one of the vs_pspace one, as when both
|
||||||
|
are returned from the module we can be sure that our struct layout
|
||||||
|
matches again.
|
||||||
|
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
cmd/zpool/zpool_main.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c
|
||||||
|
index 69bf9649a..fd42ce7c1 100644
|
||||||
|
--- a/cmd/zpool/zpool_main.c
|
||||||
|
+++ b/cmd/zpool/zpool_main.c
|
||||||
|
@@ -2616,7 +2616,8 @@ print_status_config(zpool_handle_t *zhp, status_cbdata_t *cb, const char *name,
|
||||||
|
|
||||||
|
if (vs->vs_scan_removing != 0) {
|
||||||
|
(void) printf(gettext(" (removing)"));
|
||||||
|
- } else if (VDEV_STAT_VALID(vs_noalloc, vsc) && vs->vs_noalloc != 0) {
|
||||||
|
+ } else if (VDEV_STAT_VALID(vs_pspace, vsc)
|
||||||
|
+ && VDEV_STAT_VALID(vs_noalloc, vsc) && vs->vs_noalloc != 0) {
|
||||||
|
(void) printf(gettext(" (non-allocating)"));
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= <f.gruenbichler@proxmox.com>
|
||||||
|
Date: Wed, 6 Mar 2024 10:39:06 +0100
|
||||||
|
Subject: [PATCH] udev: correctly handle partition #16 and later
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
If a zvol has more than 15 partitions, the minor device number exhausts
|
||||||
|
the slot count reserved for partitions next to the zvol itself. As a
|
||||||
|
result, the minor number cannot be used to determine the partition
|
||||||
|
number for the higher partition, and doing so results in wrong named
|
||||||
|
symlinks being generated by udev.
|
||||||
|
|
||||||
|
Since the partition number is encoded in the block device name anyway,
|
||||||
|
let's just extract it from there instead.
|
||||||
|
|
||||||
|
Fixes: #15904
|
||||||
|
|
||||||
|
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||||
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
---
|
||||||
|
udev/zvol_id.c | 9 +++++----
|
||||||
|
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/udev/zvol_id.c b/udev/zvol_id.c
|
||||||
|
index 5960b9787..609349594 100644
|
||||||
|
--- a/udev/zvol_id.c
|
||||||
|
+++ b/udev/zvol_id.c
|
||||||
|
@@ -51,7 +51,7 @@ const char *__asan_default_options(void) {
|
||||||
|
int
|
||||||
|
main(int argc, const char *const *argv)
|
||||||
|
{
|
||||||
|
- if (argc != 2) {
|
||||||
|
+ if (argc != 2 || strncmp(argv[1], "/dev/zd", 7) != 0) {
|
||||||
|
fprintf(stderr, "usage: %s /dev/zdX\n", argv[0]);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
@@ -72,9 +72,10 @@ main(int argc, const char *const *argv)
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- unsigned int dev_part = minor(sb.st_rdev) % ZVOL_MINORS;
|
||||||
|
- if (dev_part != 0)
|
||||||
|
- sprintf(zvol_name + strlen(zvol_name), "-part%u", dev_part);
|
||||||
|
+ const char *dev_part = strrchr(dev_name, 'p');
|
||||||
|
+ if (dev_part != NULL) {
|
||||||
|
+ sprintf(zvol_name + strlen(zvol_name), "-part%s", dev_part + 1);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
for (size_t i = 0; i < strlen(zvol_name); ++i)
|
||||||
|
if (isblank(zvol_name[i]))
|
||||||
+135
@@ -0,0 +1,135 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob N <robn@despairlabs.com>
|
||||||
|
Date: Thu, 21 Mar 2024 10:46:15 +1100
|
||||||
|
Subject: [PATCH] Linux 6.8 compat: use splice_copy_file_range() for fallback
|
||||||
|
|
||||||
|
Linux 6.8 removes generic_copy_file_range(), which had been reduced to a
|
||||||
|
simple wrapper around splice_copy_file_range(). Detect that function
|
||||||
|
directly and use it if generic_ is not available.
|
||||||
|
|
||||||
|
Sponsored-by: https://despairlabs.com/sponsor/
|
||||||
|
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
|
||||||
|
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Rob Norris <robn@despairlabs.com>
|
||||||
|
Closes #15930
|
||||||
|
Closes #15931
|
||||||
|
(cherry picked from commit ef08a4d4065d21414d7fedccac20da6bfda4dfd0)
|
||||||
|
---
|
||||||
|
config/kernel-vfs-file_range.m4 | 27 +++++++++++++++++++++++++++
|
||||||
|
config/kernel.m4 | 2 ++
|
||||||
|
module/os/linux/zfs/zpl_file_range.c | 16 ++++++++++++++--
|
||||||
|
3 files changed, 43 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/config/kernel-vfs-file_range.m4 b/config/kernel-vfs-file_range.m4
|
||||||
|
index cc96404d8..8a5cbe2ee 100644
|
||||||
|
--- a/config/kernel-vfs-file_range.m4
|
||||||
|
+++ b/config/kernel-vfs-file_range.m4
|
||||||
|
@@ -16,6 +16,9 @@ dnl #
|
||||||
|
dnl # 5.3: VFS copy_file_range() expected to do its own fallback,
|
||||||
|
dnl # generic_copy_file_range() added to support it
|
||||||
|
dnl #
|
||||||
|
+dnl # 6.8: generic_copy_file_range() removed, replaced by
|
||||||
|
+dnl # splice_copy_file_range()
|
||||||
|
+dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_COPY_FILE_RANGE], [
|
||||||
|
ZFS_LINUX_TEST_SRC([vfs_copy_file_range], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
@@ -72,6 +75,30 @@ AC_DEFUN([ZFS_AC_KERNEL_VFS_GENERIC_COPY_FILE_RANGE], [
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
+AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_SPLICE_COPY_FILE_RANGE], [
|
||||||
|
+ ZFS_LINUX_TEST_SRC([splice_copy_file_range], [
|
||||||
|
+ #include <linux/splice.h>
|
||||||
|
+ ], [
|
||||||
|
+ struct file *src_file __attribute__ ((unused)) = NULL;
|
||||||
|
+ loff_t src_off __attribute__ ((unused)) = 0;
|
||||||
|
+ struct file *dst_file __attribute__ ((unused)) = NULL;
|
||||||
|
+ loff_t dst_off __attribute__ ((unused)) = 0;
|
||||||
|
+ size_t len __attribute__ ((unused)) = 0;
|
||||||
|
+ splice_copy_file_range(src_file, src_off, dst_file, dst_off,
|
||||||
|
+ len);
|
||||||
|
+ ])
|
||||||
|
+])
|
||||||
|
+AC_DEFUN([ZFS_AC_KERNEL_VFS_SPLICE_COPY_FILE_RANGE], [
|
||||||
|
+ AC_MSG_CHECKING([whether splice_copy_file_range() is available])
|
||||||
|
+ ZFS_LINUX_TEST_RESULT([splice_copy_file_range], [
|
||||||
|
+ AC_MSG_RESULT(yes)
|
||||||
|
+ AC_DEFINE(HAVE_VFS_SPLICE_COPY_FILE_RANGE, 1,
|
||||||
|
+ [splice_copy_file_range() is available])
|
||||||
|
+ ],[
|
||||||
|
+ AC_MSG_RESULT(no)
|
||||||
|
+ ])
|
||||||
|
+])
|
||||||
|
+
|
||||||
|
AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_CLONE_FILE_RANGE], [
|
||||||
|
ZFS_LINUX_TEST_SRC([vfs_clone_file_range], [
|
||||||
|
#include <linux/fs.h>
|
||||||
|
diff --git a/config/kernel.m4 b/config/kernel.m4
|
||||||
|
index e3f864577..1d0c5a27f 100644
|
||||||
|
--- a/config/kernel.m4
|
||||||
|
+++ b/config/kernel.m4
|
||||||
|
@@ -118,6 +118,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
||||||
|
ZFS_AC_KERNEL_SRC_VFS_IOV_ITER
|
||||||
|
ZFS_AC_KERNEL_SRC_VFS_COPY_FILE_RANGE
|
||||||
|
ZFS_AC_KERNEL_SRC_VFS_GENERIC_COPY_FILE_RANGE
|
||||||
|
+ ZFS_AC_KERNEL_SRC_VFS_SPLICE_COPY_FILE_RANGE
|
||||||
|
ZFS_AC_KERNEL_SRC_VFS_REMAP_FILE_RANGE
|
||||||
|
ZFS_AC_KERNEL_SRC_VFS_CLONE_FILE_RANGE
|
||||||
|
ZFS_AC_KERNEL_SRC_VFS_DEDUPE_FILE_RANGE
|
||||||
|
@@ -266,6 +267,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
||||||
|
ZFS_AC_KERNEL_VFS_IOV_ITER
|
||||||
|
ZFS_AC_KERNEL_VFS_COPY_FILE_RANGE
|
||||||
|
ZFS_AC_KERNEL_VFS_GENERIC_COPY_FILE_RANGE
|
||||||
|
+ ZFS_AC_KERNEL_VFS_SPLICE_COPY_FILE_RANGE
|
||||||
|
ZFS_AC_KERNEL_VFS_REMAP_FILE_RANGE
|
||||||
|
ZFS_AC_KERNEL_VFS_CLONE_FILE_RANGE
|
||||||
|
ZFS_AC_KERNEL_VFS_DEDUPE_FILE_RANGE
|
||||||
|
diff --git a/module/os/linux/zfs/zpl_file_range.c b/module/os/linux/zfs/zpl_file_range.c
|
||||||
|
index 3065d54fa..64728fdb1 100644
|
||||||
|
--- a/module/os/linux/zfs/zpl_file_range.c
|
||||||
|
+++ b/module/os/linux/zfs/zpl_file_range.c
|
||||||
|
@@ -26,6 +26,9 @@
|
||||||
|
#include <linux/compat.h>
|
||||||
|
#endif
|
||||||
|
#include <linux/fs.h>
|
||||||
|
+#ifdef HAVE_VFS_SPLICE_COPY_FILE_RANGE
|
||||||
|
+#include <linux/splice.h>
|
||||||
|
+#endif
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/zfs_znode.h>
|
||||||
|
#include <sys/zfs_vnops.h>
|
||||||
|
@@ -102,7 +105,7 @@ zpl_copy_file_range(struct file *src_file, loff_t src_off,
|
||||||
|
ret = zpl_clone_file_range_impl(src_file, src_off,
|
||||||
|
dst_file, dst_off, len);
|
||||||
|
|
||||||
|
-#ifdef HAVE_VFS_GENERIC_COPY_FILE_RANGE
|
||||||
|
+#if defined(HAVE_VFS_GENERIC_COPY_FILE_RANGE)
|
||||||
|
/*
|
||||||
|
* Since Linux 5.3 the filesystem driver is responsible for executing
|
||||||
|
* an appropriate fallback, and a generic fallback function is provided.
|
||||||
|
@@ -111,6 +114,15 @@ zpl_copy_file_range(struct file *src_file, loff_t src_off,
|
||||||
|
ret == -EAGAIN)
|
||||||
|
ret = generic_copy_file_range(src_file, src_off, dst_file,
|
||||||
|
dst_off, len, flags);
|
||||||
|
+#elif defined(HAVE_VFS_SPLICE_COPY_FILE_RANGE)
|
||||||
|
+ /*
|
||||||
|
+ * Since 6.8 the fallback function is called splice_copy_file_range
|
||||||
|
+ * and has a slightly different signature.
|
||||||
|
+ */
|
||||||
|
+ if (ret == -EOPNOTSUPP || ret == -EINVAL || ret == -EXDEV ||
|
||||||
|
+ ret == -EAGAIN)
|
||||||
|
+ ret = splice_copy_file_range(src_file, src_off, dst_file,
|
||||||
|
+ dst_off, len);
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* Before Linux 5.3 the filesystem has to return -EOPNOTSUPP to signal
|
||||||
|
@@ -118,7 +130,7 @@ zpl_copy_file_range(struct file *src_file, loff_t src_off,
|
||||||
|
*/
|
||||||
|
if (ret == -EINVAL || ret == -EXDEV || ret == -EAGAIN)
|
||||||
|
ret = -EOPNOTSUPP;
|
||||||
|
-#endif /* HAVE_VFS_GENERIC_COPY_FILE_RANGE */
|
||||||
|
+#endif /* HAVE_VFS_GENERIC_COPY_FILE_RANGE || HAVE_VFS_SPLICE_COPY_FILE_RANGE */
|
||||||
|
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Mon, 13 Nov 2023 17:55:29 +1100
|
||||||
|
Subject: [PATCH] linux 5.4 compat: page_size()
|
||||||
|
|
||||||
|
Before 5.4 we have to do a little math.
|
||||||
|
|
||||||
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
Closes #15533
|
||||||
|
Closes #15588
|
||||||
|
(cherry picked from commit df04efe321a49c650f1fbaa6fd701fa2928cbe21)
|
||||||
|
---
|
||||||
|
config/kernel-mm-page-size.m4 | 17 +++++++++++
|
||||||
|
config/kernel.m4 | 2 ++
|
||||||
|
include/os/linux/Makefile.am | 1 +
|
||||||
|
include/os/linux/kernel/linux/mm_compat.h | 36 +++++++++++++++++++++++
|
||||||
|
4 files changed, 56 insertions(+)
|
||||||
|
create mode 100644 config/kernel-mm-page-size.m4
|
||||||
|
create mode 100644 include/os/linux/kernel/linux/mm_compat.h
|
||||||
|
|
||||||
|
diff --git a/config/kernel-mm-page-size.m4 b/config/kernel-mm-page-size.m4
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..d5ebd9269
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/config/kernel-mm-page-size.m4
|
||||||
|
@@ -0,0 +1,17 @@
|
||||||
|
+AC_DEFUN([ZFS_AC_KERNEL_SRC_MM_PAGE_SIZE], [
|
||||||
|
+ ZFS_LINUX_TEST_SRC([page_size], [
|
||||||
|
+ #include <linux/mm.h>
|
||||||
|
+ ],[
|
||||||
|
+ unsigned long s;
|
||||||
|
+ s = page_size(NULL);
|
||||||
|
+ ])
|
||||||
|
+])
|
||||||
|
+AC_DEFUN([ZFS_AC_KERNEL_MM_PAGE_SIZE], [
|
||||||
|
+ AC_MSG_CHECKING([whether page_size() is available])
|
||||||
|
+ ZFS_LINUX_TEST_RESULT([page_size], [
|
||||||
|
+ AC_MSG_RESULT(yes)
|
||||||
|
+ AC_DEFINE(HAVE_MM_PAGE_SIZE, 1, [page_size() is available])
|
||||||
|
+ ],[
|
||||||
|
+ AC_MSG_RESULT(no)
|
||||||
|
+ ])
|
||||||
|
+])
|
||||||
|
diff --git a/config/kernel.m4 b/config/kernel.m4
|
||||||
|
index 1d0c5a27f..548905ccd 100644
|
||||||
|
--- a/config/kernel.m4
|
||||||
|
+++ b/config/kernel.m4
|
||||||
|
@@ -167,6 +167,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
||||||
|
ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_TABLE
|
||||||
|
ZFS_AC_KERNEL_SRC_COPY_SPLICE_READ
|
||||||
|
ZFS_AC_KERNEL_SRC_SYNC_BDEV
|
||||||
|
+ ZFS_AC_KERNEL_SRC_MM_PAGE_SIZE
|
||||||
|
case "$host_cpu" in
|
||||||
|
powerpc*)
|
||||||
|
ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
|
||||||
|
@@ -316,6 +317,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
||||||
|
ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE
|
||||||
|
ZFS_AC_KERNEL_COPY_SPLICE_READ
|
||||||
|
ZFS_AC_KERNEL_SYNC_BDEV
|
||||||
|
+ ZFS_AC_KERNEL_MM_PAGE_SIZE
|
||||||
|
case "$host_cpu" in
|
||||||
|
powerpc*)
|
||||||
|
ZFS_AC_KERNEL_CPU_HAS_FEATURE
|
||||||
|
diff --git a/include/os/linux/Makefile.am b/include/os/linux/Makefile.am
|
||||||
|
index 3830d198d..51c27132b 100644
|
||||||
|
--- a/include/os/linux/Makefile.am
|
||||||
|
+++ b/include/os/linux/Makefile.am
|
||||||
|
@@ -5,6 +5,7 @@ kernel_linux_HEADERS = \
|
||||||
|
%D%/kernel/linux/compiler_compat.h \
|
||||||
|
%D%/kernel/linux/dcache_compat.h \
|
||||||
|
%D%/kernel/linux/kmap_compat.h \
|
||||||
|
+ %D%/kernel/linux/mm_compat.h \
|
||||||
|
%D%/kernel/linux/mod_compat.h \
|
||||||
|
%D%/kernel/linux/page_compat.h \
|
||||||
|
%D%/kernel/linux/percpu_compat.h \
|
||||||
|
diff --git a/include/os/linux/kernel/linux/mm_compat.h b/include/os/linux/kernel/linux/mm_compat.h
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..40056c68d
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/include/os/linux/kernel/linux/mm_compat.h
|
||||||
|
@@ -0,0 +1,36 @@
|
||||||
|
+/*
|
||||||
|
+ * CDDL HEADER START
|
||||||
|
+ *
|
||||||
|
+ * The contents of this file are subject to the terms of the
|
||||||
|
+ * Common Development and Distribution License (the "License").
|
||||||
|
+ * You may not use this file except in compliance with the License.
|
||||||
|
+ *
|
||||||
|
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||||
|
+ * or https://opensource.org/licenses/CDDL-1.0.
|
||||||
|
+ * See the License for the specific language governing permissions
|
||||||
|
+ * and limitations under the License.
|
||||||
|
+ *
|
||||||
|
+ * When distributing Covered Code, include this CDDL HEADER in each
|
||||||
|
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||||
|
+ * If applicable, add the following below this CDDL HEADER, with the
|
||||||
|
+ * fields enclosed by brackets "[]" replaced with your own identifying
|
||||||
|
+ * information: Portions Copyright [yyyy] [name of copyright owner]
|
||||||
|
+ *
|
||||||
|
+ * CDDL HEADER END
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Copyright (c) 2023, 2024, Klara Inc.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef _ZFS_MM_COMPAT_H
|
||||||
|
+#define _ZFS_MM_COMPAT_H
|
||||||
|
+
|
||||||
|
+#include <linux/mm.h>
|
||||||
|
+
|
||||||
|
+/* 5.4 introduced page_size(). Older kernels can use a trivial macro instead */
|
||||||
|
+#ifndef HAVE_MM_PAGE_SIZE
|
||||||
|
+#define page_size(p) ((unsigned long)(PAGE_SIZE << compound_order(p)))
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#endif /* _ZFS_MM_COMPAT_H */
|
||||||
+334
@@ -0,0 +1,334 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Mon, 11 Dec 2023 16:05:54 +1100
|
||||||
|
Subject: [PATCH] abd: add page iterator
|
||||||
|
|
||||||
|
The regular ABD iterators yield data buffers, so they have to map and
|
||||||
|
unmap pages into kernel memory. If the caller only wants to count
|
||||||
|
chunks, or can use page pointers directly, then the map/unmap is just
|
||||||
|
unnecessary overhead.
|
||||||
|
|
||||||
|
This adds adb_iterate_page_func, which yields unmapped struct page
|
||||||
|
instead.
|
||||||
|
|
||||||
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
Closes #15533
|
||||||
|
Closes #15588
|
||||||
|
(cherry picked from commit 390b448726c580999dd337be7a40b0e95cf1d50b)
|
||||||
|
---
|
||||||
|
include/sys/abd.h | 7 +++
|
||||||
|
include/sys/abd_impl.h | 26 ++++++++-
|
||||||
|
module/os/freebsd/zfs/abd_os.c | 4 +-
|
||||||
|
module/os/linux/zfs/abd_os.c | 104 ++++++++++++++++++++++++++++++---
|
||||||
|
module/zfs/abd.c | 42 +++++++++++++
|
||||||
|
5 files changed, 169 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/sys/abd.h b/include/sys/abd.h
|
||||||
|
index 750f9986c..8a2df0bca 100644
|
||||||
|
--- a/include/sys/abd.h
|
||||||
|
+++ b/include/sys/abd.h
|
||||||
|
@@ -79,6 +79,9 @@ typedef struct abd {
|
||||||
|
|
||||||
|
typedef int abd_iter_func_t(void *buf, size_t len, void *priv);
|
||||||
|
typedef int abd_iter_func2_t(void *bufa, void *bufb, size_t len, void *priv);
|
||||||
|
+#if defined(__linux__) && defined(_KERNEL)
|
||||||
|
+typedef int abd_iter_page_func_t(struct page *, size_t, size_t, void *);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
extern int zfs_abd_scatter_enabled;
|
||||||
|
|
||||||
|
@@ -125,6 +128,10 @@ void abd_release_ownership_of_buf(abd_t *);
|
||||||
|
int abd_iterate_func(abd_t *, size_t, size_t, abd_iter_func_t *, void *);
|
||||||
|
int abd_iterate_func2(abd_t *, abd_t *, size_t, size_t, size_t,
|
||||||
|
abd_iter_func2_t *, void *);
|
||||||
|
+#if defined(__linux__) && defined(_KERNEL)
|
||||||
|
+int abd_iterate_page_func(abd_t *, size_t, size_t, abd_iter_page_func_t *,
|
||||||
|
+ void *);
|
||||||
|
+#endif
|
||||||
|
void abd_copy_off(abd_t *, abd_t *, size_t, size_t, size_t);
|
||||||
|
void abd_copy_from_buf_off(abd_t *, const void *, size_t, size_t);
|
||||||
|
void abd_copy_to_buf_off(void *, abd_t *, size_t, size_t);
|
||||||
|
diff --git a/include/sys/abd_impl.h b/include/sys/abd_impl.h
|
||||||
|
index 40546d4af..f88ea25e2 100644
|
||||||
|
--- a/include/sys/abd_impl.h
|
||||||
|
+++ b/include/sys/abd_impl.h
|
||||||
|
@@ -21,6 +21,7 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014 by Chunwei Chen. All rights reserved.
|
||||||
|
* Copyright (c) 2016, 2019 by Delphix. All rights reserved.
|
||||||
|
+ * Copyright (c) 2023, 2024, Klara Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ABD_IMPL_H
|
||||||
|
@@ -38,12 +39,30 @@ typedef enum abd_stats_op {
|
||||||
|
ABDSTAT_DECR /* Decrease abdstat values */
|
||||||
|
} abd_stats_op_t;
|
||||||
|
|
||||||
|
-struct scatterlist; /* forward declaration */
|
||||||
|
+/* forward declarations */
|
||||||
|
+struct scatterlist;
|
||||||
|
+struct page;
|
||||||
|
|
||||||
|
struct abd_iter {
|
||||||
|
/* public interface */
|
||||||
|
- void *iter_mapaddr; /* addr corresponding to iter_pos */
|
||||||
|
- size_t iter_mapsize; /* length of data valid at mapaddr */
|
||||||
|
+ union {
|
||||||
|
+ /* for abd_iter_map()/abd_iter_unmap() */
|
||||||
|
+ struct {
|
||||||
|
+ /* addr corresponding to iter_pos */
|
||||||
|
+ void *iter_mapaddr;
|
||||||
|
+ /* length of data valid at mapaddr */
|
||||||
|
+ size_t iter_mapsize;
|
||||||
|
+ };
|
||||||
|
+ /* for abd_iter_page() */
|
||||||
|
+ struct {
|
||||||
|
+ /* current page */
|
||||||
|
+ struct page *iter_page;
|
||||||
|
+ /* offset of data in page */
|
||||||
|
+ size_t iter_page_doff;
|
||||||
|
+ /* size of data in page */
|
||||||
|
+ size_t iter_page_dsize;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
|
||||||
|
/* private */
|
||||||
|
abd_t *iter_abd; /* ABD being iterated through */
|
||||||
|
@@ -78,6 +97,7 @@ boolean_t abd_iter_at_end(struct abd_iter *);
|
||||||
|
void abd_iter_advance(struct abd_iter *, size_t);
|
||||||
|
void abd_iter_map(struct abd_iter *);
|
||||||
|
void abd_iter_unmap(struct abd_iter *);
|
||||||
|
+void abd_iter_page(struct abd_iter *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper macros
|
||||||
|
diff --git a/module/os/freebsd/zfs/abd_os.c b/module/os/freebsd/zfs/abd_os.c
|
||||||
|
index 58a37df62..3b812271f 100644
|
||||||
|
--- a/module/os/freebsd/zfs/abd_os.c
|
||||||
|
+++ b/module/os/freebsd/zfs/abd_os.c
|
||||||
|
@@ -417,10 +417,8 @@ abd_iter_init(struct abd_iter *aiter, abd_t *abd)
|
||||||
|
{
|
||||||
|
ASSERT(!abd_is_gang(abd));
|
||||||
|
abd_verify(abd);
|
||||||
|
+ memset(aiter, 0, sizeof (struct abd_iter));
|
||||||
|
aiter->iter_abd = abd;
|
||||||
|
- aiter->iter_pos = 0;
|
||||||
|
- aiter->iter_mapaddr = NULL;
|
||||||
|
- aiter->iter_mapsize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff --git a/module/os/linux/zfs/abd_os.c b/module/os/linux/zfs/abd_os.c
|
||||||
|
index 24390fbbf..dae128012 100644
|
||||||
|
--- a/module/os/linux/zfs/abd_os.c
|
||||||
|
+++ b/module/os/linux/zfs/abd_os.c
|
||||||
|
@@ -21,6 +21,7 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014 by Chunwei Chen. All rights reserved.
|
||||||
|
* Copyright (c) 2019 by Delphix. All rights reserved.
|
||||||
|
+ * Copyright (c) 2023, 2024, Klara Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -59,6 +60,7 @@
|
||||||
|
#include <sys/zfs_znode.h>
|
||||||
|
#ifdef _KERNEL
|
||||||
|
#include <linux/kmap_compat.h>
|
||||||
|
+#include <linux/mm_compat.h>
|
||||||
|
#include <linux/scatterlist.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@@ -895,14 +897,9 @@ abd_iter_init(struct abd_iter *aiter, abd_t *abd)
|
||||||
|
{
|
||||||
|
ASSERT(!abd_is_gang(abd));
|
||||||
|
abd_verify(abd);
|
||||||
|
+ memset(aiter, 0, sizeof (struct abd_iter));
|
||||||
|
aiter->iter_abd = abd;
|
||||||
|
- aiter->iter_mapaddr = NULL;
|
||||||
|
- aiter->iter_mapsize = 0;
|
||||||
|
- aiter->iter_pos = 0;
|
||||||
|
- if (abd_is_linear(abd)) {
|
||||||
|
- aiter->iter_offset = 0;
|
||||||
|
- aiter->iter_sg = NULL;
|
||||||
|
- } else {
|
||||||
|
+ if (!abd_is_linear(abd)) {
|
||||||
|
aiter->iter_offset = ABD_SCATTER(abd).abd_offset;
|
||||||
|
aiter->iter_sg = ABD_SCATTER(abd).abd_sgl;
|
||||||
|
}
|
||||||
|
@@ -915,6 +912,7 @@ abd_iter_init(struct abd_iter *aiter, abd_t *abd)
|
||||||
|
boolean_t
|
||||||
|
abd_iter_at_end(struct abd_iter *aiter)
|
||||||
|
{
|
||||||
|
+ ASSERT3U(aiter->iter_pos, <=, aiter->iter_abd->abd_size);
|
||||||
|
return (aiter->iter_pos == aiter->iter_abd->abd_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -926,8 +924,15 @@ abd_iter_at_end(struct abd_iter *aiter)
|
||||||
|
void
|
||||||
|
abd_iter_advance(struct abd_iter *aiter, size_t amount)
|
||||||
|
{
|
||||||
|
+ /*
|
||||||
|
+ * Ensure that last chunk is not in use. abd_iterate_*() must clear
|
||||||
|
+ * this state (directly or abd_iter_unmap()) before advancing.
|
||||||
|
+ */
|
||||||
|
ASSERT3P(aiter->iter_mapaddr, ==, NULL);
|
||||||
|
ASSERT0(aiter->iter_mapsize);
|
||||||
|
+ ASSERT3P(aiter->iter_page, ==, NULL);
|
||||||
|
+ ASSERT0(aiter->iter_page_doff);
|
||||||
|
+ ASSERT0(aiter->iter_page_dsize);
|
||||||
|
|
||||||
|
/* There's nothing left to advance to, so do nothing */
|
||||||
|
if (abd_iter_at_end(aiter))
|
||||||
|
@@ -1009,6 +1014,88 @@ abd_cache_reap_now(void)
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_KERNEL)
|
||||||
|
+/*
|
||||||
|
+ * Yield the next page struct and data offset and size within it, without
|
||||||
|
+ * mapping it into the address space.
|
||||||
|
+ */
|
||||||
|
+void
|
||||||
|
+abd_iter_page(struct abd_iter *aiter)
|
||||||
|
+{
|
||||||
|
+ if (abd_iter_at_end(aiter)) {
|
||||||
|
+ aiter->iter_page = NULL;
|
||||||
|
+ aiter->iter_page_doff = 0;
|
||||||
|
+ aiter->iter_page_dsize = 0;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ struct page *page;
|
||||||
|
+ size_t doff, dsize;
|
||||||
|
+
|
||||||
|
+ if (abd_is_linear(aiter->iter_abd)) {
|
||||||
|
+ ASSERT3U(aiter->iter_pos, ==, aiter->iter_offset);
|
||||||
|
+
|
||||||
|
+ /* memory address at iter_pos */
|
||||||
|
+ void *paddr = ABD_LINEAR_BUF(aiter->iter_abd) + aiter->iter_pos;
|
||||||
|
+
|
||||||
|
+ /* struct page for address */
|
||||||
|
+ page = is_vmalloc_addr(paddr) ?
|
||||||
|
+ vmalloc_to_page(paddr) : virt_to_page(paddr);
|
||||||
|
+
|
||||||
|
+ /* offset of address within the page */
|
||||||
|
+ doff = offset_in_page(paddr);
|
||||||
|
+
|
||||||
|
+ /* total data remaining in abd from this position */
|
||||||
|
+ dsize = aiter->iter_abd->abd_size - aiter->iter_offset;
|
||||||
|
+ } else {
|
||||||
|
+ ASSERT(!abd_is_gang(aiter->iter_abd));
|
||||||
|
+
|
||||||
|
+ /* current scatter page */
|
||||||
|
+ page = sg_page(aiter->iter_sg);
|
||||||
|
+
|
||||||
|
+ /* position within page */
|
||||||
|
+ doff = aiter->iter_offset;
|
||||||
|
+
|
||||||
|
+ /* remaining data in scatterlist */
|
||||||
|
+ dsize = MIN(aiter->iter_sg->length - aiter->iter_offset,
|
||||||
|
+ aiter->iter_abd->abd_size - aiter->iter_pos);
|
||||||
|
+ }
|
||||||
|
+ ASSERT(page);
|
||||||
|
+
|
||||||
|
+ if (PageTail(page)) {
|
||||||
|
+ /*
|
||||||
|
+ * This page is part of a "compound page", which is a group of
|
||||||
|
+ * pages that can be referenced from a single struct page *.
|
||||||
|
+ * Its organised as a "head" page, followed by a series of
|
||||||
|
+ * "tail" pages.
|
||||||
|
+ *
|
||||||
|
+ * In OpenZFS, compound pages are allocated using the
|
||||||
|
+ * __GFP_COMP flag, which we get from scatter ABDs and SPL
|
||||||
|
+ * vmalloc slabs (ie >16K allocations). So a great many of the
|
||||||
|
+ * IO buffers we get are going to be of this type.
|
||||||
|
+ *
|
||||||
|
+ * The tail pages are just regular PAGE_SIZE pages, and can be
|
||||||
|
+ * safely used as-is. However, the head page has length
|
||||||
|
+ * covering itself and all the tail pages. If this ABD chunk
|
||||||
|
+ * spans multiple pages, then we can use the head page and a
|
||||||
|
+ * >PAGE_SIZE length, which is far more efficient.
|
||||||
|
+ *
|
||||||
|
+ * To do this, we need to adjust the offset to be counted from
|
||||||
|
+ * the head page. struct page for compound pages are stored
|
||||||
|
+ * contiguously, so we can just adjust by a simple offset.
|
||||||
|
+ */
|
||||||
|
+ struct page *head = compound_head(page);
|
||||||
|
+ doff += ((page - head) * PAGESIZE);
|
||||||
|
+ page = head;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* final page and position within it */
|
||||||
|
+ aiter->iter_page = page;
|
||||||
|
+ aiter->iter_page_doff = doff;
|
||||||
|
+
|
||||||
|
+ /* amount of data in the chunk, up to the end of the page */
|
||||||
|
+ aiter->iter_page_dsize = MIN(dsize, page_size(page) - doff);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* bio_nr_pages for ABD.
|
||||||
|
* @off is the offset in @abd
|
||||||
|
@@ -1163,4 +1250,5 @@ MODULE_PARM_DESC(zfs_abd_scatter_min_size,
|
||||||
|
module_param(zfs_abd_scatter_max_order, uint, 0644);
|
||||||
|
MODULE_PARM_DESC(zfs_abd_scatter_max_order,
|
||||||
|
"Maximum order allocation used for a scatter ABD.");
|
||||||
|
-#endif
|
||||||
|
+
|
||||||
|
+#endif /* _KERNEL */
|
||||||
|
diff --git a/module/zfs/abd.c b/module/zfs/abd.c
|
||||||
|
index d982f201c..3388e2357 100644
|
||||||
|
--- a/module/zfs/abd.c
|
||||||
|
+++ b/module/zfs/abd.c
|
||||||
|
@@ -826,6 +826,48 @@ abd_iterate_func(abd_t *abd, size_t off, size_t size,
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if defined(__linux__) && defined(_KERNEL)
|
||||||
|
+int
|
||||||
|
+abd_iterate_page_func(abd_t *abd, size_t off, size_t size,
|
||||||
|
+ abd_iter_page_func_t *func, void *private)
|
||||||
|
+{
|
||||||
|
+ struct abd_iter aiter;
|
||||||
|
+ int ret = 0;
|
||||||
|
+
|
||||||
|
+ if (size == 0)
|
||||||
|
+ return (0);
|
||||||
|
+
|
||||||
|
+ abd_verify(abd);
|
||||||
|
+ ASSERT3U(off + size, <=, abd->abd_size);
|
||||||
|
+
|
||||||
|
+ abd_t *c_abd = abd_init_abd_iter(abd, &aiter, off);
|
||||||
|
+
|
||||||
|
+ while (size > 0) {
|
||||||
|
+ IMPLY(abd_is_gang(abd), c_abd != NULL);
|
||||||
|
+
|
||||||
|
+ abd_iter_page(&aiter);
|
||||||
|
+
|
||||||
|
+ size_t len = MIN(aiter.iter_page_dsize, size);
|
||||||
|
+ ASSERT3U(len, >, 0);
|
||||||
|
+
|
||||||
|
+ ret = func(aiter.iter_page, aiter.iter_page_doff,
|
||||||
|
+ len, private);
|
||||||
|
+
|
||||||
|
+ aiter.iter_page = NULL;
|
||||||
|
+ aiter.iter_page_doff = 0;
|
||||||
|
+ aiter.iter_page_dsize = 0;
|
||||||
|
+
|
||||||
|
+ if (ret != 0)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ size -= len;
|
||||||
|
+ c_abd = abd_advance_abd_iter(abd, c_abd, &aiter, len);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return (ret);
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
struct buf_arg {
|
||||||
|
void *arg_buf;
|
||||||
|
};
|
||||||
+349
@@ -0,0 +1,349 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Tue, 9 Jan 2024 12:12:56 +1100
|
||||||
|
Subject: [PATCH] vdev_disk: rename existing functions to vdev_classic_*
|
||||||
|
|
||||||
|
This is just renaming the existing functions we're about to replace and
|
||||||
|
grouping them together to make the next commits easier to follow.
|
||||||
|
|
||||||
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
Closes #15533
|
||||||
|
Closes #15588
|
||||||
|
(cherry picked from commit f3b85d706bae82957d2e3e0ef1d53a1cfab60eb4)
|
||||||
|
---
|
||||||
|
include/sys/abd.h | 2 +
|
||||||
|
module/os/linux/zfs/abd_os.c | 5 +
|
||||||
|
module/os/linux/zfs/vdev_disk.c | 215 +++++++++++++++++---------------
|
||||||
|
3 files changed, 120 insertions(+), 102 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/sys/abd.h b/include/sys/abd.h
|
||||||
|
index 8a2df0bca..bee38b831 100644
|
||||||
|
--- a/include/sys/abd.h
|
||||||
|
+++ b/include/sys/abd.h
|
||||||
|
@@ -220,6 +220,8 @@ void abd_fini(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Linux ABD bio functions
|
||||||
|
+ * Note: these are only needed to support vdev_classic. See comment in
|
||||||
|
+ * vdev_disk.c.
|
||||||
|
*/
|
||||||
|
#if defined(__linux__) && defined(_KERNEL)
|
||||||
|
unsigned int abd_bio_map_off(struct bio *, abd_t *, unsigned int, size_t);
|
||||||
|
diff --git a/module/os/linux/zfs/abd_os.c b/module/os/linux/zfs/abd_os.c
|
||||||
|
index dae128012..3fe01c0b7 100644
|
||||||
|
--- a/module/os/linux/zfs/abd_os.c
|
||||||
|
+++ b/module/os/linux/zfs/abd_os.c
|
||||||
|
@@ -1096,6 +1096,11 @@ abd_iter_page(struct abd_iter *aiter)
|
||||||
|
aiter->iter_page_dsize = MIN(dsize, page_size(page) - doff);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Note: ABD BIO functions only needed to support vdev_classic. See comments in
|
||||||
|
+ * vdev_disk.c.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* bio_nr_pages for ABD.
|
||||||
|
* @off is the offset in @abd
|
||||||
|
diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
index b0bda5fa2..957619b87 100644
|
||||||
|
--- a/module/os/linux/zfs/vdev_disk.c
|
||||||
|
+++ b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
@@ -83,17 +83,6 @@ static uint_t zfs_vdev_open_timeout_ms = 1000;
|
||||||
|
*/
|
||||||
|
#define EFI_MIN_RESV_SIZE (16 * 1024)
|
||||||
|
|
||||||
|
-/*
|
||||||
|
- * Virtual device vector for disks.
|
||||||
|
- */
|
||||||
|
-typedef struct dio_request {
|
||||||
|
- zio_t *dr_zio; /* Parent ZIO */
|
||||||
|
- atomic_t dr_ref; /* References */
|
||||||
|
- int dr_error; /* Bio error */
|
||||||
|
- int dr_bio_count; /* Count of bio's */
|
||||||
|
- struct bio *dr_bio[]; /* Attached bio's */
|
||||||
|
-} dio_request_t;
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* BIO request failfast mask.
|
||||||
|
*/
|
||||||
|
@@ -467,85 +456,6 @@ vdev_disk_close(vdev_t *v)
|
||||||
|
v->vdev_tsd = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static dio_request_t *
|
||||||
|
-vdev_disk_dio_alloc(int bio_count)
|
||||||
|
-{
|
||||||
|
- dio_request_t *dr = kmem_zalloc(sizeof (dio_request_t) +
|
||||||
|
- sizeof (struct bio *) * bio_count, KM_SLEEP);
|
||||||
|
- atomic_set(&dr->dr_ref, 0);
|
||||||
|
- dr->dr_bio_count = bio_count;
|
||||||
|
- dr->dr_error = 0;
|
||||||
|
-
|
||||||
|
- for (int i = 0; i < dr->dr_bio_count; i++)
|
||||||
|
- dr->dr_bio[i] = NULL;
|
||||||
|
-
|
||||||
|
- return (dr);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void
|
||||||
|
-vdev_disk_dio_free(dio_request_t *dr)
|
||||||
|
-{
|
||||||
|
- int i;
|
||||||
|
-
|
||||||
|
- for (i = 0; i < dr->dr_bio_count; i++)
|
||||||
|
- if (dr->dr_bio[i])
|
||||||
|
- bio_put(dr->dr_bio[i]);
|
||||||
|
-
|
||||||
|
- kmem_free(dr, sizeof (dio_request_t) +
|
||||||
|
- sizeof (struct bio *) * dr->dr_bio_count);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void
|
||||||
|
-vdev_disk_dio_get(dio_request_t *dr)
|
||||||
|
-{
|
||||||
|
- atomic_inc(&dr->dr_ref);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void
|
||||||
|
-vdev_disk_dio_put(dio_request_t *dr)
|
||||||
|
-{
|
||||||
|
- int rc = atomic_dec_return(&dr->dr_ref);
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * Free the dio_request when the last reference is dropped and
|
||||||
|
- * ensure zio_interpret is called only once with the correct zio
|
||||||
|
- */
|
||||||
|
- if (rc == 0) {
|
||||||
|
- zio_t *zio = dr->dr_zio;
|
||||||
|
- int error = dr->dr_error;
|
||||||
|
-
|
||||||
|
- vdev_disk_dio_free(dr);
|
||||||
|
-
|
||||||
|
- if (zio) {
|
||||||
|
- zio->io_error = error;
|
||||||
|
- ASSERT3S(zio->io_error, >=, 0);
|
||||||
|
- if (zio->io_error)
|
||||||
|
- vdev_disk_error(zio);
|
||||||
|
-
|
||||||
|
- zio_delay_interrupt(zio);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-BIO_END_IO_PROTO(vdev_disk_physio_completion, bio, error)
|
||||||
|
-{
|
||||||
|
- dio_request_t *dr = bio->bi_private;
|
||||||
|
-
|
||||||
|
- if (dr->dr_error == 0) {
|
||||||
|
-#ifdef HAVE_1ARG_BIO_END_IO_T
|
||||||
|
- dr->dr_error = BIO_END_IO_ERROR(bio);
|
||||||
|
-#else
|
||||||
|
- if (error)
|
||||||
|
- dr->dr_error = -(error);
|
||||||
|
- else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
|
||||||
|
- dr->dr_error = EIO;
|
||||||
|
-#endif
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Drop reference acquired by __vdev_disk_physio */
|
||||||
|
- vdev_disk_dio_put(dr);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static inline void
|
||||||
|
vdev_submit_bio_impl(struct bio *bio)
|
||||||
|
{
|
||||||
|
@@ -697,8 +607,107 @@ vdev_bio_alloc(struct block_device *bdev, gfp_t gfp_mask,
|
||||||
|
return (bio);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* ========== */
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * This is the classic, battle-tested BIO submission code.
|
||||||
|
+ *
|
||||||
|
+ * These functions have been renamed to vdev_classic_* to make it clear what
|
||||||
|
+ * they belong to, but their implementations are unchanged.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Virtual device vector for disks.
|
||||||
|
+ */
|
||||||
|
+typedef struct dio_request {
|
||||||
|
+ zio_t *dr_zio; /* Parent ZIO */
|
||||||
|
+ atomic_t dr_ref; /* References */
|
||||||
|
+ int dr_error; /* Bio error */
|
||||||
|
+ int dr_bio_count; /* Count of bio's */
|
||||||
|
+ struct bio *dr_bio[]; /* Attached bio's */
|
||||||
|
+} dio_request_t;
|
||||||
|
+
|
||||||
|
+static dio_request_t *
|
||||||
|
+vdev_classic_dio_alloc(int bio_count)
|
||||||
|
+{
|
||||||
|
+ dio_request_t *dr = kmem_zalloc(sizeof (dio_request_t) +
|
||||||
|
+ sizeof (struct bio *) * bio_count, KM_SLEEP);
|
||||||
|
+ atomic_set(&dr->dr_ref, 0);
|
||||||
|
+ dr->dr_bio_count = bio_count;
|
||||||
|
+ dr->dr_error = 0;
|
||||||
|
+
|
||||||
|
+ for (int i = 0; i < dr->dr_bio_count; i++)
|
||||||
|
+ dr->dr_bio[i] = NULL;
|
||||||
|
+
|
||||||
|
+ return (dr);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+vdev_classic_dio_free(dio_request_t *dr)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < dr->dr_bio_count; i++)
|
||||||
|
+ if (dr->dr_bio[i])
|
||||||
|
+ bio_put(dr->dr_bio[i]);
|
||||||
|
+
|
||||||
|
+ kmem_free(dr, sizeof (dio_request_t) +
|
||||||
|
+ sizeof (struct bio *) * dr->dr_bio_count);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+vdev_classic_dio_get(dio_request_t *dr)
|
||||||
|
+{
|
||||||
|
+ atomic_inc(&dr->dr_ref);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+vdev_classic_dio_put(dio_request_t *dr)
|
||||||
|
+{
|
||||||
|
+ int rc = atomic_dec_return(&dr->dr_ref);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Free the dio_request when the last reference is dropped and
|
||||||
|
+ * ensure zio_interpret is called only once with the correct zio
|
||||||
|
+ */
|
||||||
|
+ if (rc == 0) {
|
||||||
|
+ zio_t *zio = dr->dr_zio;
|
||||||
|
+ int error = dr->dr_error;
|
||||||
|
+
|
||||||
|
+ vdev_classic_dio_free(dr);
|
||||||
|
+
|
||||||
|
+ if (zio) {
|
||||||
|
+ zio->io_error = error;
|
||||||
|
+ ASSERT3S(zio->io_error, >=, 0);
|
||||||
|
+ if (zio->io_error)
|
||||||
|
+ vdev_disk_error(zio);
|
||||||
|
+
|
||||||
|
+ zio_delay_interrupt(zio);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+BIO_END_IO_PROTO(vdev_classic_physio_completion, bio, error)
|
||||||
|
+{
|
||||||
|
+ dio_request_t *dr = bio->bi_private;
|
||||||
|
+
|
||||||
|
+ if (dr->dr_error == 0) {
|
||||||
|
+#ifdef HAVE_1ARG_BIO_END_IO_T
|
||||||
|
+ dr->dr_error = BIO_END_IO_ERROR(bio);
|
||||||
|
+#else
|
||||||
|
+ if (error)
|
||||||
|
+ dr->dr_error = -(error);
|
||||||
|
+ else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
|
||||||
|
+ dr->dr_error = EIO;
|
||||||
|
+#endif
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Drop reference acquired by vdev_classic_physio */
|
||||||
|
+ vdev_classic_dio_put(dr);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static inline unsigned int
|
||||||
|
-vdev_bio_max_segs(zio_t *zio, int bio_size, uint64_t abd_offset)
|
||||||
|
+vdev_classic_bio_max_segs(zio_t *zio, int bio_size, uint64_t abd_offset)
|
||||||
|
{
|
||||||
|
unsigned long nr_segs = abd_nr_pages_off(zio->io_abd,
|
||||||
|
bio_size, abd_offset);
|
||||||
|
@@ -711,7 +720,7 @@ vdev_bio_max_segs(zio_t *zio, int bio_size, uint64_t abd_offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-__vdev_disk_physio(struct block_device *bdev, zio_t *zio,
|
||||||
|
+vdev_classic_physio(struct block_device *bdev, zio_t *zio,
|
||||||
|
size_t io_size, uint64_t io_offset, int rw, int flags)
|
||||||
|
{
|
||||||
|
dio_request_t *dr;
|
||||||
|
@@ -736,7 +745,7 @@ __vdev_disk_physio(struct block_device *bdev, zio_t *zio,
|
||||||
|
}
|
||||||
|
|
||||||
|
retry:
|
||||||
|
- dr = vdev_disk_dio_alloc(bio_count);
|
||||||
|
+ dr = vdev_classic_dio_alloc(bio_count);
|
||||||
|
|
||||||
|
if (!(zio->io_flags & (ZIO_FLAG_IO_RETRY | ZIO_FLAG_TRYHARD)) &&
|
||||||
|
zio->io_vd->vdev_failfast == B_TRUE) {
|
||||||
|
@@ -771,23 +780,23 @@ retry:
|
||||||
|
* this should be rare - see the comment above.
|
||||||
|
*/
|
||||||
|
if (dr->dr_bio_count == i) {
|
||||||
|
- vdev_disk_dio_free(dr);
|
||||||
|
+ vdev_classic_dio_free(dr);
|
||||||
|
bio_count *= 2;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
|
||||||
|
- nr_vecs = vdev_bio_max_segs(zio, bio_size, abd_offset);
|
||||||
|
+ nr_vecs = vdev_classic_bio_max_segs(zio, bio_size, abd_offset);
|
||||||
|
dr->dr_bio[i] = vdev_bio_alloc(bdev, GFP_NOIO, nr_vecs);
|
||||||
|
if (unlikely(dr->dr_bio[i] == NULL)) {
|
||||||
|
- vdev_disk_dio_free(dr);
|
||||||
|
+ vdev_classic_dio_free(dr);
|
||||||
|
return (SET_ERROR(ENOMEM));
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Matching put called by vdev_disk_physio_completion */
|
||||||
|
- vdev_disk_dio_get(dr);
|
||||||
|
+ /* Matching put called by vdev_classic_physio_completion */
|
||||||
|
+ vdev_classic_dio_get(dr);
|
||||||
|
|
||||||
|
BIO_BI_SECTOR(dr->dr_bio[i]) = bio_offset >> 9;
|
||||||
|
- dr->dr_bio[i]->bi_end_io = vdev_disk_physio_completion;
|
||||||
|
+ dr->dr_bio[i]->bi_end_io = vdev_classic_physio_completion;
|
||||||
|
dr->dr_bio[i]->bi_private = dr;
|
||||||
|
bio_set_op_attrs(dr->dr_bio[i], rw, flags);
|
||||||
|
|
||||||
|
@@ -801,7 +810,7 @@ retry:
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Extra reference to protect dio_request during vdev_submit_bio */
|
||||||
|
- vdev_disk_dio_get(dr);
|
||||||
|
+ vdev_classic_dio_get(dr);
|
||||||
|
|
||||||
|
if (dr->dr_bio_count > 1)
|
||||||
|
blk_start_plug(&plug);
|
||||||
|
@@ -815,11 +824,13 @@ retry:
|
||||||
|
if (dr->dr_bio_count > 1)
|
||||||
|
blk_finish_plug(&plug);
|
||||||
|
|
||||||
|
- vdev_disk_dio_put(dr);
|
||||||
|
+ vdev_classic_dio_put(dr);
|
||||||
|
|
||||||
|
return (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* ========== */
|
||||||
|
+
|
||||||
|
BIO_END_IO_PROTO(vdev_disk_io_flush_completion, bio, error)
|
||||||
|
{
|
||||||
|
zio_t *zio = bio->bi_private;
|
||||||
|
@@ -1023,7 +1034,7 @@ vdev_disk_io_start(zio_t *zio)
|
||||||
|
}
|
||||||
|
|
||||||
|
zio->io_target_timestamp = zio_handle_io_delay(zio);
|
||||||
|
- error = __vdev_disk_physio(BDH_BDEV(vd->vd_bdh), zio,
|
||||||
|
+ error = vdev_classic_physio(BDH_BDEV(vd->vd_bdh), zio,
|
||||||
|
zio->io_size, zio->io_offset, rw, 0);
|
||||||
|
rw_exit(&vd->vd_lock);
|
||||||
|
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Tue, 9 Jan 2024 12:23:30 +1100
|
||||||
|
Subject: [PATCH] vdev_disk: reorganise vdev_disk_io_start
|
||||||
|
|
||||||
|
Light reshuffle to make it a bit more linear to read and get rid of a
|
||||||
|
bunch of args that aren't needed in all cases.
|
||||||
|
|
||||||
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
Closes #15533
|
||||||
|
Closes #15588
|
||||||
|
(cherry picked from commit 867178ae1db28e73051c8a7ce662f2f2f81cd8e6)
|
||||||
|
---
|
||||||
|
module/os/linux/zfs/vdev_disk.c | 51 ++++++++++++++++++++-------------
|
||||||
|
1 file changed, 31 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
index 957619b87..51e7cef2f 100644
|
||||||
|
--- a/module/os/linux/zfs/vdev_disk.c
|
||||||
|
+++ b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
@@ -720,9 +720,16 @@ vdev_classic_bio_max_segs(zio_t *zio, int bio_size, uint64_t abd_offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-vdev_classic_physio(struct block_device *bdev, zio_t *zio,
|
||||||
|
- size_t io_size, uint64_t io_offset, int rw, int flags)
|
||||||
|
+vdev_classic_physio(zio_t *zio)
|
||||||
|
{
|
||||||
|
+ vdev_t *v = zio->io_vd;
|
||||||
|
+ vdev_disk_t *vd = v->vdev_tsd;
|
||||||
|
+ struct block_device *bdev = BDH_BDEV(vd->vd_bdh);
|
||||||
|
+ size_t io_size = zio->io_size;
|
||||||
|
+ uint64_t io_offset = zio->io_offset;
|
||||||
|
+ int rw = zio->io_type == ZIO_TYPE_READ ? READ : WRITE;
|
||||||
|
+ int flags = 0;
|
||||||
|
+
|
||||||
|
dio_request_t *dr;
|
||||||
|
uint64_t abd_offset;
|
||||||
|
uint64_t bio_offset;
|
||||||
|
@@ -944,7 +951,7 @@ vdev_disk_io_start(zio_t *zio)
|
||||||
|
{
|
||||||
|
vdev_t *v = zio->io_vd;
|
||||||
|
vdev_disk_t *vd = v->vdev_tsd;
|
||||||
|
- int rw, error;
|
||||||
|
+ int error;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the vdev is closed, it's likely in the REMOVED or FAULTED state.
|
||||||
|
@@ -1007,13 +1014,6 @@ vdev_disk_io_start(zio_t *zio)
|
||||||
|
rw_exit(&vd->vd_lock);
|
||||||
|
zio_execute(zio);
|
||||||
|
return;
|
||||||
|
- case ZIO_TYPE_WRITE:
|
||||||
|
- rw = WRITE;
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- case ZIO_TYPE_READ:
|
||||||
|
- rw = READ;
|
||||||
|
- break;
|
||||||
|
|
||||||
|
case ZIO_TYPE_TRIM:
|
||||||
|
zio->io_error = vdev_disk_io_trim(zio);
|
||||||
|
@@ -1026,23 +1026,34 @@ vdev_disk_io_start(zio_t *zio)
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
|
||||||
|
- default:
|
||||||
|
+ case ZIO_TYPE_READ:
|
||||||
|
+ case ZIO_TYPE_WRITE:
|
||||||
|
+ zio->io_target_timestamp = zio_handle_io_delay(zio);
|
||||||
|
+ error = vdev_classic_physio(zio);
|
||||||
|
rw_exit(&vd->vd_lock);
|
||||||
|
- zio->io_error = SET_ERROR(ENOTSUP);
|
||||||
|
- zio_interrupt(zio);
|
||||||
|
+ if (error) {
|
||||||
|
+ zio->io_error = error;
|
||||||
|
+ zio_interrupt(zio);
|
||||||
|
+ }
|
||||||
|
return;
|
||||||
|
- }
|
||||||
|
|
||||||
|
- zio->io_target_timestamp = zio_handle_io_delay(zio);
|
||||||
|
- error = vdev_classic_physio(BDH_BDEV(vd->vd_bdh), zio,
|
||||||
|
- zio->io_size, zio->io_offset, rw, 0);
|
||||||
|
- rw_exit(&vd->vd_lock);
|
||||||
|
+ default:
|
||||||
|
+ /*
|
||||||
|
+ * Getting here means our parent vdev has made a very strange
|
||||||
|
+ * request of us, and shouldn't happen. Assert here to force a
|
||||||
|
+ * crash in dev builds, but in production return the IO
|
||||||
|
+ * unhandled. The pool will likely suspend anyway but that's
|
||||||
|
+ * nicer than crashing the kernel.
|
||||||
|
+ */
|
||||||
|
+ ASSERT3S(zio->io_type, ==, -1);
|
||||||
|
|
||||||
|
- if (error) {
|
||||||
|
- zio->io_error = error;
|
||||||
|
+ rw_exit(&vd->vd_lock);
|
||||||
|
+ zio->io_error = SET_ERROR(ENOTSUP);
|
||||||
|
zio_interrupt(zio);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ __builtin_unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Tue, 9 Jan 2024 12:29:19 +1100
|
||||||
|
Subject: [PATCH] vdev_disk: make read/write IO function configurable
|
||||||
|
|
||||||
|
This is just setting up for the next couple of commits, which will add a
|
||||||
|
new IO function and a parameter to select it.
|
||||||
|
|
||||||
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
Closes #15533
|
||||||
|
Closes #15588
|
||||||
|
(cherry picked from commit c4a13ba483f08a81aa47479d2f763a470d95b2b0)
|
||||||
|
---
|
||||||
|
module/os/linux/zfs/vdev_disk.c | 23 +++++++++++++++++++++--
|
||||||
|
1 file changed, 21 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
index 51e7cef2f..de4dba72f 100644
|
||||||
|
--- a/module/os/linux/zfs/vdev_disk.c
|
||||||
|
+++ b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
@@ -946,6 +946,8 @@ vdev_disk_io_trim(zio_t *zio)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
+int (*vdev_disk_io_rw_fn)(zio_t *zio) = NULL;
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
vdev_disk_io_start(zio_t *zio)
|
||||||
|
{
|
||||||
|
@@ -1029,7 +1031,7 @@ vdev_disk_io_start(zio_t *zio)
|
||||||
|
case ZIO_TYPE_READ:
|
||||||
|
case ZIO_TYPE_WRITE:
|
||||||
|
zio->io_target_timestamp = zio_handle_io_delay(zio);
|
||||||
|
- error = vdev_classic_physio(zio);
|
||||||
|
+ error = vdev_disk_io_rw_fn(zio);
|
||||||
|
rw_exit(&vd->vd_lock);
|
||||||
|
if (error) {
|
||||||
|
zio->io_error = error;
|
||||||
|
@@ -1102,8 +1104,25 @@ vdev_disk_rele(vdev_t *vd)
|
||||||
|
/* XXX: Implement me as a vnode rele for the device */
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * At first use vdev use, set the submission function from the default value if
|
||||||
|
+ * it hasn't been set already.
|
||||||
|
+ */
|
||||||
|
+static int
|
||||||
|
+vdev_disk_init(spa_t *spa, nvlist_t *nv, void **tsd)
|
||||||
|
+{
|
||||||
|
+ (void) spa;
|
||||||
|
+ (void) nv;
|
||||||
|
+ (void) tsd;
|
||||||
|
+
|
||||||
|
+ if (vdev_disk_io_rw_fn == NULL)
|
||||||
|
+ vdev_disk_io_rw_fn = vdev_classic_physio;
|
||||||
|
+
|
||||||
|
+ return (0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
vdev_ops_t vdev_disk_ops = {
|
||||||
|
- .vdev_op_init = NULL,
|
||||||
|
+ .vdev_op_init = vdev_disk_init,
|
||||||
|
.vdev_op_fini = NULL,
|
||||||
|
.vdev_op_open = vdev_disk_open,
|
||||||
|
.vdev_op_close = vdev_disk_close,
|
||||||
+671
@@ -0,0 +1,671 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Tue, 18 Jul 2023 11:11:29 +1000
|
||||||
|
Subject: [PATCH] vdev_disk: rewrite BIO filling machinery to avoid split pages
|
||||||
|
|
||||||
|
This commit tackles a number of issues in the way BIOs (`struct bio`)
|
||||||
|
are constructed for submission to the Linux block layer.
|
||||||
|
|
||||||
|
The kernel has a hard upper limit on the number of pages/segments that
|
||||||
|
can be added to a BIO, as well as a separate limit for each device
|
||||||
|
(related to its queue depth and other scheduling characteristics).
|
||||||
|
|
||||||
|
ZFS counts the number of memory pages in the request ABD
|
||||||
|
(`abd_nr_pages_off()`, and then uses that as the number of segments to
|
||||||
|
put into the BIO, up to the hard upper limit. If it requires more than
|
||||||
|
the limit, it will create multiple BIOs.
|
||||||
|
|
||||||
|
Leaving aside the fact that page count method is wrong (see below), not
|
||||||
|
limiting to the device segment max means that the device driver will
|
||||||
|
need to split the BIO in half. This is alone is not necessarily a
|
||||||
|
problem, but it interacts with another issue to cause a much larger
|
||||||
|
problem.
|
||||||
|
|
||||||
|
The kernel function to add a segment to a BIO (`bio_add_page()`) takes a
|
||||||
|
`struct page` pointer, and offset+len within it. `struct page` can
|
||||||
|
represent a run of contiguous memory pages (known as a "compound page").
|
||||||
|
In can be of arbitrary length.
|
||||||
|
|
||||||
|
The ZFS functions that count ABD pages and load them into the BIO
|
||||||
|
(`abd_nr_pages_off()`, `bio_map()` and `abd_bio_map_off()`) will never
|
||||||
|
consider a page to be more than `PAGE_SIZE` (4K), even if the `struct
|
||||||
|
page` is for multiple pages. In this case, it will load the same `struct
|
||||||
|
page` into the BIO multiple times, with the offset adjusted each time.
|
||||||
|
|
||||||
|
With a sufficiently large ABD, this can easily lead to the BIO being
|
||||||
|
entirely filled much earlier than it could have been. This is also
|
||||||
|
further contributes to the problem caused by the incorrect segment limit
|
||||||
|
calculation, as its much easier to go past the device limit, and so
|
||||||
|
require a split.
|
||||||
|
|
||||||
|
Again, this is not a problem on its own.
|
||||||
|
|
||||||
|
The logic for "never submit more than `PAGE_SIZE`" is actually a little
|
||||||
|
more subtle. It will actually never submit a buffer that crosses a 4K
|
||||||
|
page boundary.
|
||||||
|
|
||||||
|
In practice, this is fine, as most ABDs are scattered, that is a list of
|
||||||
|
complete 4K pages, and so are loaded in as such.
|
||||||
|
|
||||||
|
Linear ABDs are typically allocated from slabs, and for small sizes they
|
||||||
|
are frequently not aligned to page boundaries. For example, a 12K
|
||||||
|
allocation can span four pages, eg:
|
||||||
|
|
||||||
|
-- 4K -- -- 4K -- -- 4K -- -- 4K --
|
||||||
|
| | | | |
|
||||||
|
:## ######## ######## ######: [1K, 4K, 4K, 3K]
|
||||||
|
|
||||||
|
Such an allocation would be loaded into a BIO as you see:
|
||||||
|
|
||||||
|
[1K, 4K, 4K, 3K]
|
||||||
|
|
||||||
|
This tends not to be a problem in practice, because even if the BIO were
|
||||||
|
filled and needed to be split, each half would still have either a start
|
||||||
|
or end aligned to the logical block size of the device (assuming 4K at
|
||||||
|
least).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
In ideal circumstances, these shortcomings don't cause any particular
|
||||||
|
problems. Its when they start to interact with other ZFS features that
|
||||||
|
things get interesting.
|
||||||
|
|
||||||
|
Aggregation will create a "gang" ABD, which is simply a list of other
|
||||||
|
ABDs. Iterating over a gang ABD is just iterating over each ABD within
|
||||||
|
it in turn.
|
||||||
|
|
||||||
|
Because the segments are simply loaded in order, we can end up with
|
||||||
|
uneven segments either side of the "gap" between the two ABDs. For
|
||||||
|
example, two 12K ABDs might be aggregated and then loaded as:
|
||||||
|
|
||||||
|
[1K, 4K, 4K, 3K, 2K, 4K, 4K, 2K]
|
||||||
|
|
||||||
|
Should a split occur, each individual BIO can end up either having an
|
||||||
|
start or end offset that is not aligned to the logical block size, which
|
||||||
|
some drivers (eg SCSI) will reject. However, this tends not to happen
|
||||||
|
because the default aggregation limit usually keeps the BIO small enough
|
||||||
|
to not require more than one split, and most pages are actually full 4K
|
||||||
|
pages, so hitting an uneven gap is very rare anyway.
|
||||||
|
|
||||||
|
If the pool is under particular memory pressure, then an IO can be
|
||||||
|
broken down into a "gang block", a 512-byte block composed of a header
|
||||||
|
and up to three block pointers. Each points to a fragment of the
|
||||||
|
original write, or in turn, another gang block, breaking the original
|
||||||
|
data up over and over until space can be found in the pool for each of
|
||||||
|
them.
|
||||||
|
|
||||||
|
Each gang header is a separate 512-byte memory allocation from a slab,
|
||||||
|
that needs to be written down to disk. When the gang header is added to
|
||||||
|
the BIO, its a single 512-byte segment.
|
||||||
|
|
||||||
|
Pulling all this together, consider a large aggregated write of gang
|
||||||
|
blocks. This results a BIO containing lots of 512-byte segments. Given
|
||||||
|
our tendency to overfill the BIO, a split is likely, and most possible
|
||||||
|
split points will yield a pair of BIOs that are misaligned. Drivers that
|
||||||
|
care, like the SCSI driver, will reject them.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
This commit is a substantial refactor and rewrite of much of `vdev_disk`
|
||||||
|
to sort all this out.
|
||||||
|
|
||||||
|
`vdev_bio_max_segs()` now returns the ideal maximum size for the device,
|
||||||
|
if available. There's also a tuneable `zfs_vdev_disk_max_segs` to
|
||||||
|
override this, to assist with testing.
|
||||||
|
|
||||||
|
We scan the ABD up front to count the number of pages within it, and to
|
||||||
|
confirm that if we submitted all those pages to one or more BIOs, it
|
||||||
|
could be split at any point with creating a misaligned BIO. If the
|
||||||
|
pages in the BIO are not usable (as in any of the above situations), the
|
||||||
|
ABD is linearised, and then checked again. This is the same technique
|
||||||
|
used in `vdev_geom` on FreeBSD, adjusted for Linux's variable page size
|
||||||
|
and allocator quirks.
|
||||||
|
|
||||||
|
`vbio_t` is a cleanup and enhancement of the old `dio_request_t`. The
|
||||||
|
idea is simply that it can hold all the state needed to create, submit
|
||||||
|
and return multiple BIOs, including all the refcounts, the ABD copy if
|
||||||
|
it was needed, and so on. Apart from what I hope is a clearer interface,
|
||||||
|
the major difference is that because we know how many BIOs we'll need up
|
||||||
|
front, we don't need the old overflow logic that would grow the BIO
|
||||||
|
array, throw away all the old work and restart. We can get it right from
|
||||||
|
the start.
|
||||||
|
|
||||||
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
Closes #15533
|
||||||
|
Closes #15588
|
||||||
|
(cherry picked from commit 06a196020e6f70d2fedbd4d0d05bbe0c1ac6e4d8)
|
||||||
|
---
|
||||||
|
include/os/linux/kernel/linux/mod_compat.h | 1 +
|
||||||
|
man/man4/zfs.4 | 10 +-
|
||||||
|
module/os/linux/zfs/vdev_disk.c | 439 ++++++++++++++++++++-
|
||||||
|
3 files changed, 447 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/os/linux/kernel/linux/mod_compat.h b/include/os/linux/kernel/linux/mod_compat.h
|
||||||
|
index 8e20a9613..039865b70 100644
|
||||||
|
--- a/include/os/linux/kernel/linux/mod_compat.h
|
||||||
|
+++ b/include/os/linux/kernel/linux/mod_compat.h
|
||||||
|
@@ -68,6 +68,7 @@ enum scope_prefix_types {
|
||||||
|
zfs_trim,
|
||||||
|
zfs_txg,
|
||||||
|
zfs_vdev,
|
||||||
|
+ zfs_vdev_disk,
|
||||||
|
zfs_vdev_file,
|
||||||
|
zfs_vdev_mirror,
|
||||||
|
zfs_vnops,
|
||||||
|
diff --git a/man/man4/zfs.4 b/man/man4/zfs.4
|
||||||
|
index 352990e02..b5679f2f0 100644
|
||||||
|
--- a/man/man4/zfs.4
|
||||||
|
+++ b/man/man4/zfs.4
|
||||||
|
@@ -2,6 +2,7 @@
|
||||||
|
.\" Copyright (c) 2013 by Turbo Fredriksson <turbo@bayour.com>. All rights reserved.
|
||||||
|
.\" Copyright (c) 2019, 2021 by Delphix. All rights reserved.
|
||||||
|
.\" Copyright (c) 2019 Datto Inc.
|
||||||
|
+.\" Copyright (c) 2023, 2024 Klara, Inc.
|
||||||
|
.\" The contents of this file are subject to the terms of the Common Development
|
||||||
|
.\" and Distribution License (the "License"). You may not use this file except
|
||||||
|
.\" in compliance with the License. You can obtain a copy of the license at
|
||||||
|
@@ -15,7 +16,7 @@
|
||||||
|
.\" own identifying information:
|
||||||
|
.\" Portions Copyright [yyyy] [name of copyright owner]
|
||||||
|
.\"
|
||||||
|
-.Dd July 21, 2023
|
||||||
|
+.Dd January 9, 2024
|
||||||
|
.Dt ZFS 4
|
||||||
|
.Os
|
||||||
|
.
|
||||||
|
@@ -1345,6 +1346,13 @@ _
|
||||||
|
4 Driver No driver retries on driver errors.
|
||||||
|
.TE
|
||||||
|
.
|
||||||
|
+.It Sy zfs_vdev_disk_max_segs Ns = Ns Sy 0 Pq uint
|
||||||
|
+Maximum number of segments to add to a BIO (min 4).
|
||||||
|
+If this is higher than the maximum allowed by the device queue or the kernel
|
||||||
|
+itself, it will be clamped.
|
||||||
|
+Setting it to zero will cause the kernel's ideal size to be used.
|
||||||
|
+This parameter only applies on Linux.
|
||||||
|
+.
|
||||||
|
.It Sy zfs_expire_snapshot Ns = Ns Sy 300 Ns s Pq int
|
||||||
|
Time before expiring
|
||||||
|
.Pa .zfs/snapshot .
|
||||||
|
diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
index de4dba72f..0ccb9ad96 100644
|
||||||
|
--- a/module/os/linux/zfs/vdev_disk.c
|
||||||
|
+++ b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
@@ -24,6 +24,7 @@
|
||||||
|
* Rewritten for Linux by Brian Behlendorf <behlendorf1@llnl.gov>.
|
||||||
|
* LLNL-CODE-403049.
|
||||||
|
* Copyright (c) 2012, 2019 by Delphix. All rights reserved.
|
||||||
|
+ * Copyright (c) 2023, 2024, Klara Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/zfs_context.h>
|
||||||
|
@@ -66,6 +67,13 @@ typedef struct vdev_disk {
|
||||||
|
krwlock_t vd_lock;
|
||||||
|
} vdev_disk_t;
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Maximum number of segments to add to a bio (min 4). If this is higher than
|
||||||
|
+ * the maximum allowed by the device queue or the kernel itself, it will be
|
||||||
|
+ * clamped. Setting it to zero will cause the kernel's ideal size to be used.
|
||||||
|
+ */
|
||||||
|
+uint_t zfs_vdev_disk_max_segs = 0;
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Unique identifier for the exclusive vdev holder.
|
||||||
|
*/
|
||||||
|
@@ -607,10 +615,433 @@ vdev_bio_alloc(struct block_device *bdev, gfp_t gfp_mask,
|
||||||
|
return (bio);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static inline uint_t
|
||||||
|
+vdev_bio_max_segs(struct block_device *bdev)
|
||||||
|
+{
|
||||||
|
+ /*
|
||||||
|
+ * Smallest of the device max segs and the tuneable max segs. Minimum
|
||||||
|
+ * 4, so there's room to finish split pages if they come up.
|
||||||
|
+ */
|
||||||
|
+ const uint_t dev_max_segs = queue_max_segments(bdev_get_queue(bdev));
|
||||||
|
+ const uint_t tune_max_segs = (zfs_vdev_disk_max_segs > 0) ?
|
||||||
|
+ MAX(4, zfs_vdev_disk_max_segs) : dev_max_segs;
|
||||||
|
+ const uint_t max_segs = MIN(tune_max_segs, dev_max_segs);
|
||||||
|
+
|
||||||
|
+#ifdef HAVE_BIO_MAX_SEGS
|
||||||
|
+ return (bio_max_segs(max_segs));
|
||||||
|
+#else
|
||||||
|
+ return (MIN(max_segs, BIO_MAX_PAGES));
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline uint_t
|
||||||
|
+vdev_bio_max_bytes(struct block_device *bdev)
|
||||||
|
+{
|
||||||
|
+ return (queue_max_sectors(bdev_get_queue(bdev)) << 9);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Virtual block IO object (VBIO)
|
||||||
|
+ *
|
||||||
|
+ * Linux block IO (BIO) objects have a limit on how many data segments (pages)
|
||||||
|
+ * they can hold. Depending on how they're allocated and structured, a large
|
||||||
|
+ * ZIO can require more than one BIO to be submitted to the kernel, which then
|
||||||
|
+ * all have to complete before we can return the completed ZIO back to ZFS.
|
||||||
|
+ *
|
||||||
|
+ * A VBIO is a wrapper around multiple BIOs, carrying everything needed to
|
||||||
|
+ * translate a ZIO down into the kernel block layer and back again.
|
||||||
|
+ *
|
||||||
|
+ * Note that these are only used for data ZIOs (read/write). Meta-operations
|
||||||
|
+ * (flush/trim) don't need multiple BIOs and so can just make the call
|
||||||
|
+ * directly.
|
||||||
|
+ */
|
||||||
|
+typedef struct {
|
||||||
|
+ zio_t *vbio_zio; /* parent zio */
|
||||||
|
+
|
||||||
|
+ struct block_device *vbio_bdev; /* blockdev to submit bios to */
|
||||||
|
+
|
||||||
|
+ abd_t *vbio_abd; /* abd carrying borrowed linear buf */
|
||||||
|
+
|
||||||
|
+ atomic_t vbio_ref; /* bio refcount */
|
||||||
|
+ int vbio_error; /* error from failed bio */
|
||||||
|
+
|
||||||
|
+ uint_t vbio_max_segs; /* max segs per bio */
|
||||||
|
+
|
||||||
|
+ uint_t vbio_max_bytes; /* max bytes per bio */
|
||||||
|
+ uint_t vbio_lbs_mask; /* logical block size mask */
|
||||||
|
+
|
||||||
|
+ uint64_t vbio_offset; /* start offset of next bio */
|
||||||
|
+
|
||||||
|
+ struct bio *vbio_bio; /* pointer to the current bio */
|
||||||
|
+ struct bio *vbio_bios; /* list of all bios */
|
||||||
|
+} vbio_t;
|
||||||
|
+
|
||||||
|
+static vbio_t *
|
||||||
|
+vbio_alloc(zio_t *zio, struct block_device *bdev)
|
||||||
|
+{
|
||||||
|
+ vbio_t *vbio = kmem_zalloc(sizeof (vbio_t), KM_SLEEP);
|
||||||
|
+
|
||||||
|
+ vbio->vbio_zio = zio;
|
||||||
|
+ vbio->vbio_bdev = bdev;
|
||||||
|
+ atomic_set(&vbio->vbio_ref, 0);
|
||||||
|
+ vbio->vbio_max_segs = vdev_bio_max_segs(bdev);
|
||||||
|
+ vbio->vbio_max_bytes = vdev_bio_max_bytes(bdev);
|
||||||
|
+ vbio->vbio_lbs_mask = ~(bdev_logical_block_size(bdev)-1);
|
||||||
|
+ vbio->vbio_offset = zio->io_offset;
|
||||||
|
+
|
||||||
|
+ return (vbio);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+vbio_add_page(vbio_t *vbio, struct page *page, uint_t size, uint_t offset)
|
||||||
|
+{
|
||||||
|
+ struct bio *bio;
|
||||||
|
+ uint_t ssize;
|
||||||
|
+
|
||||||
|
+ while (size > 0) {
|
||||||
|
+ bio = vbio->vbio_bio;
|
||||||
|
+ if (bio == NULL) {
|
||||||
|
+ /* New BIO, allocate and set up */
|
||||||
|
+ bio = vdev_bio_alloc(vbio->vbio_bdev, GFP_NOIO,
|
||||||
|
+ vbio->vbio_max_segs);
|
||||||
|
+ if (unlikely(bio == NULL))
|
||||||
|
+ return (SET_ERROR(ENOMEM));
|
||||||
|
+ BIO_BI_SECTOR(bio) = vbio->vbio_offset >> 9;
|
||||||
|
+
|
||||||
|
+ bio->bi_next = vbio->vbio_bios;
|
||||||
|
+ vbio->vbio_bios = vbio->vbio_bio = bio;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Only load as much of the current page data as will fit in
|
||||||
|
+ * the space left in the BIO, respecting lbs alignment. Older
|
||||||
|
+ * kernels will error if we try to overfill the BIO, while
|
||||||
|
+ * newer ones will accept it and split the BIO. This ensures
|
||||||
|
+ * everything works on older kernels, and avoids an additional
|
||||||
|
+ * overhead on the new.
|
||||||
|
+ */
|
||||||
|
+ ssize = MIN(size, (vbio->vbio_max_bytes - BIO_BI_SIZE(bio)) &
|
||||||
|
+ vbio->vbio_lbs_mask);
|
||||||
|
+ if (ssize > 0 &&
|
||||||
|
+ bio_add_page(bio, page, ssize, offset) == ssize) {
|
||||||
|
+ /* Accepted, adjust and load any remaining. */
|
||||||
|
+ size -= ssize;
|
||||||
|
+ offset += ssize;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* No room, set up for a new BIO and loop */
|
||||||
|
+ vbio->vbio_offset += BIO_BI_SIZE(bio);
|
||||||
|
+
|
||||||
|
+ /* Signal new BIO allocation wanted */
|
||||||
|
+ vbio->vbio_bio = NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return (0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+BIO_END_IO_PROTO(vdev_disk_io_rw_completion, bio, error);
|
||||||
|
+static void vbio_put(vbio_t *vbio);
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+vbio_submit(vbio_t *vbio, int flags)
|
||||||
|
+{
|
||||||
|
+ ASSERT(vbio->vbio_bios);
|
||||||
|
+ struct bio *bio = vbio->vbio_bios;
|
||||||
|
+ vbio->vbio_bio = vbio->vbio_bios = NULL;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * We take a reference for each BIO as we submit it, plus one to
|
||||||
|
+ * protect us from BIOs completing before we're done submitting them
|
||||||
|
+ * all, causing vbio_put() to free vbio out from under us and/or the
|
||||||
|
+ * zio to be returned before all its IO has completed.
|
||||||
|
+ */
|
||||||
|
+ atomic_set(&vbio->vbio_ref, 1);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * If we're submitting more than one BIO, inform the block layer so
|
||||||
|
+ * it can batch them if it wants.
|
||||||
|
+ */
|
||||||
|
+ struct blk_plug plug;
|
||||||
|
+ boolean_t do_plug = (bio->bi_next != NULL);
|
||||||
|
+ if (do_plug)
|
||||||
|
+ blk_start_plug(&plug);
|
||||||
|
+
|
||||||
|
+ /* Submit all the BIOs */
|
||||||
|
+ while (bio != NULL) {
|
||||||
|
+ atomic_inc(&vbio->vbio_ref);
|
||||||
|
+
|
||||||
|
+ struct bio *next = bio->bi_next;
|
||||||
|
+ bio->bi_next = NULL;
|
||||||
|
+
|
||||||
|
+ bio->bi_end_io = vdev_disk_io_rw_completion;
|
||||||
|
+ bio->bi_private = vbio;
|
||||||
|
+ bio_set_op_attrs(bio,
|
||||||
|
+ vbio->vbio_zio->io_type == ZIO_TYPE_WRITE ?
|
||||||
|
+ WRITE : READ, flags);
|
||||||
|
+
|
||||||
|
+ vdev_submit_bio(bio);
|
||||||
|
+
|
||||||
|
+ bio = next;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Finish the batch */
|
||||||
|
+ if (do_plug)
|
||||||
|
+ blk_finish_plug(&plug);
|
||||||
|
+
|
||||||
|
+ /* Release the extra reference */
|
||||||
|
+ vbio_put(vbio);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+vbio_return_abd(vbio_t *vbio)
|
||||||
|
+{
|
||||||
|
+ zio_t *zio = vbio->vbio_zio;
|
||||||
|
+ if (vbio->vbio_abd == NULL)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * If we copied the ABD before issuing it, clean up and return the copy
|
||||||
|
+ * to the ADB, with changes if appropriate.
|
||||||
|
+ */
|
||||||
|
+ void *buf = abd_to_buf(vbio->vbio_abd);
|
||||||
|
+ abd_free(vbio->vbio_abd);
|
||||||
|
+ vbio->vbio_abd = NULL;
|
||||||
|
+
|
||||||
|
+ if (zio->io_type == ZIO_TYPE_READ)
|
||||||
|
+ abd_return_buf_copy(zio->io_abd, buf, zio->io_size);
|
||||||
|
+ else
|
||||||
|
+ abd_return_buf(zio->io_abd, buf, zio->io_size);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+vbio_free(vbio_t *vbio)
|
||||||
|
+{
|
||||||
|
+ VERIFY0(atomic_read(&vbio->vbio_ref));
|
||||||
|
+
|
||||||
|
+ vbio_return_abd(vbio);
|
||||||
|
+
|
||||||
|
+ kmem_free(vbio, sizeof (vbio_t));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+vbio_put(vbio_t *vbio)
|
||||||
|
+{
|
||||||
|
+ if (atomic_dec_return(&vbio->vbio_ref) > 0)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * This was the last reference, so the entire IO is completed. Clean
|
||||||
|
+ * up and submit it for processing.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Get any data buf back to the original ABD, if necessary. We do this
|
||||||
|
+ * now so we can get the ZIO into the pipeline as quickly as possible,
|
||||||
|
+ * and then do the remaining cleanup after.
|
||||||
|
+ */
|
||||||
|
+ vbio_return_abd(vbio);
|
||||||
|
+
|
||||||
|
+ zio_t *zio = vbio->vbio_zio;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Set the overall error. If multiple BIOs returned an error, only the
|
||||||
|
+ * first will be taken; the others are dropped (see
|
||||||
|
+ * vdev_disk_io_rw_completion()). Its pretty much impossible for
|
||||||
|
+ * multiple IOs to the same device to fail with different errors, so
|
||||||
|
+ * there's no real risk.
|
||||||
|
+ */
|
||||||
|
+ zio->io_error = vbio->vbio_error;
|
||||||
|
+ if (zio->io_error)
|
||||||
|
+ vdev_disk_error(zio);
|
||||||
|
+
|
||||||
|
+ /* All done, submit for processing */
|
||||||
|
+ zio_delay_interrupt(zio);
|
||||||
|
+
|
||||||
|
+ /* Finish cleanup */
|
||||||
|
+ vbio_free(vbio);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+BIO_END_IO_PROTO(vdev_disk_io_rw_completion, bio, error)
|
||||||
|
+{
|
||||||
|
+ vbio_t *vbio = bio->bi_private;
|
||||||
|
+
|
||||||
|
+ if (vbio->vbio_error == 0) {
|
||||||
|
+#ifdef HAVE_1ARG_BIO_END_IO_T
|
||||||
|
+ vbio->vbio_error = BIO_END_IO_ERROR(bio);
|
||||||
|
+#else
|
||||||
|
+ if (error)
|
||||||
|
+ vbio->vbio_error = -(error);
|
||||||
|
+ else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
|
||||||
|
+ vbio->vbio_error = EIO;
|
||||||
|
+#endif
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Destroy the BIO. This is safe to do; the vbio owns its data and the
|
||||||
|
+ * kernel won't touch it again after the completion function runs.
|
||||||
|
+ */
|
||||||
|
+ bio_put(bio);
|
||||||
|
+
|
||||||
|
+ /* Drop this BIOs reference acquired by vbio_submit() */
|
||||||
|
+ vbio_put(vbio);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Iterator callback to count ABD pages and check their size & alignment.
|
||||||
|
+ *
|
||||||
|
+ * On Linux, each BIO segment can take a page pointer, and an offset+length of
|
||||||
|
+ * the data within that page. A page can be arbitrarily large ("compound"
|
||||||
|
+ * pages) but we still have to ensure the data portion is correctly sized and
|
||||||
|
+ * aligned to the logical block size, to ensure that if the kernel wants to
|
||||||
|
+ * split the BIO, the two halves will still be properly aligned.
|
||||||
|
+ */
|
||||||
|
+typedef struct {
|
||||||
|
+ uint_t bmask;
|
||||||
|
+ uint_t npages;
|
||||||
|
+ uint_t end;
|
||||||
|
+} vdev_disk_check_pages_t;
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+vdev_disk_check_pages_cb(struct page *page, size_t off, size_t len, void *priv)
|
||||||
|
+{
|
||||||
|
+ vdev_disk_check_pages_t *s = priv;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * If we didn't finish on a block size boundary last time, then there
|
||||||
|
+ * would be a gap if we tried to use this ABD as-is, so abort.
|
||||||
|
+ */
|
||||||
|
+ if (s->end != 0)
|
||||||
|
+ return (1);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Note if we're taking less than a full block, so we can check it
|
||||||
|
+ * above on the next call.
|
||||||
|
+ */
|
||||||
|
+ s->end = len & s->bmask;
|
||||||
|
+
|
||||||
|
+ /* All blocks after the first must start on a block size boundary. */
|
||||||
|
+ if (s->npages != 0 && (off & s->bmask) != 0)
|
||||||
|
+ return (1);
|
||||||
|
+
|
||||||
|
+ s->npages++;
|
||||||
|
+ return (0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Check if we can submit the pages in this ABD to the kernel as-is. Returns
|
||||||
|
+ * the number of pages, or 0 if it can't be submitted like this.
|
||||||
|
+ */
|
||||||
|
+static boolean_t
|
||||||
|
+vdev_disk_check_pages(abd_t *abd, uint64_t size, struct block_device *bdev)
|
||||||
|
+{
|
||||||
|
+ vdev_disk_check_pages_t s = {
|
||||||
|
+ .bmask = bdev_logical_block_size(bdev)-1,
|
||||||
|
+ .npages = 0,
|
||||||
|
+ .end = 0,
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ if (abd_iterate_page_func(abd, 0, size, vdev_disk_check_pages_cb, &s))
|
||||||
|
+ return (B_FALSE);
|
||||||
|
+
|
||||||
|
+ return (B_TRUE);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* Iterator callback to submit ABD pages to the vbio. */
|
||||||
|
+static int
|
||||||
|
+vdev_disk_fill_vbio_cb(struct page *page, size_t off, size_t len, void *priv)
|
||||||
|
+{
|
||||||
|
+ vbio_t *vbio = priv;
|
||||||
|
+ return (vbio_add_page(vbio, page, len, off));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+vdev_disk_io_rw(zio_t *zio)
|
||||||
|
+{
|
||||||
|
+ vdev_t *v = zio->io_vd;
|
||||||
|
+ vdev_disk_t *vd = v->vdev_tsd;
|
||||||
|
+ struct block_device *bdev = BDH_BDEV(vd->vd_bdh);
|
||||||
|
+ int flags = 0;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Accessing outside the block device is never allowed.
|
||||||
|
+ */
|
||||||
|
+ if (zio->io_offset + zio->io_size > bdev->bd_inode->i_size) {
|
||||||
|
+ vdev_dbgmsg(zio->io_vd,
|
||||||
|
+ "Illegal access %llu size %llu, device size %llu",
|
||||||
|
+ (u_longlong_t)zio->io_offset,
|
||||||
|
+ (u_longlong_t)zio->io_size,
|
||||||
|
+ (u_longlong_t)i_size_read(bdev->bd_inode));
|
||||||
|
+ return (SET_ERROR(EIO));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!(zio->io_flags & (ZIO_FLAG_IO_RETRY | ZIO_FLAG_TRYHARD)) &&
|
||||||
|
+ v->vdev_failfast == B_TRUE) {
|
||||||
|
+ bio_set_flags_failfast(bdev, &flags, zfs_vdev_failfast_mask & 1,
|
||||||
|
+ zfs_vdev_failfast_mask & 2, zfs_vdev_failfast_mask & 4);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Check alignment of the incoming ABD. If any part of it would require
|
||||||
|
+ * submitting a page that is not aligned to the logical block size,
|
||||||
|
+ * then we take a copy into a linear buffer and submit that instead.
|
||||||
|
+ * This should be impossible on a 512b LBS, and fairly rare on 4K,
|
||||||
|
+ * usually requiring abnormally-small data blocks (eg gang blocks)
|
||||||
|
+ * mixed into the same ABD as larger ones (eg aggregated).
|
||||||
|
+ */
|
||||||
|
+ abd_t *abd = zio->io_abd;
|
||||||
|
+ if (!vdev_disk_check_pages(abd, zio->io_size, bdev)) {
|
||||||
|
+ void *buf;
|
||||||
|
+ if (zio->io_type == ZIO_TYPE_READ)
|
||||||
|
+ buf = abd_borrow_buf(zio->io_abd, zio->io_size);
|
||||||
|
+ else
|
||||||
|
+ buf = abd_borrow_buf_copy(zio->io_abd, zio->io_size);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Wrap the copy in an abd_t, so we can use the same iterators
|
||||||
|
+ * to count and fill the vbio later.
|
||||||
|
+ */
|
||||||
|
+ abd = abd_get_from_buf(buf, zio->io_size);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * False here would mean the borrowed copy has an invalid
|
||||||
|
+ * alignment too, which would mean we've somehow been passed a
|
||||||
|
+ * linear ABD with an interior page that has a non-zero offset
|
||||||
|
+ * or a size not a multiple of PAGE_SIZE. This is not possible.
|
||||||
|
+ * It would mean either zio_buf_alloc() or its underlying
|
||||||
|
+ * allocators have done something extremely strange, or our
|
||||||
|
+ * math in vdev_disk_check_pages() is wrong. In either case,
|
||||||
|
+ * something in seriously wrong and its not safe to continue.
|
||||||
|
+ */
|
||||||
|
+ VERIFY(vdev_disk_check_pages(abd, zio->io_size, bdev));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Allocate vbio, with a pointer to the borrowed ABD if necessary */
|
||||||
|
+ int error = 0;
|
||||||
|
+ vbio_t *vbio = vbio_alloc(zio, bdev);
|
||||||
|
+ if (abd != zio->io_abd)
|
||||||
|
+ vbio->vbio_abd = abd;
|
||||||
|
+
|
||||||
|
+ /* Fill it with pages */
|
||||||
|
+ error = abd_iterate_page_func(abd, 0, zio->io_size,
|
||||||
|
+ vdev_disk_fill_vbio_cb, vbio);
|
||||||
|
+ if (error != 0) {
|
||||||
|
+ vbio_free(vbio);
|
||||||
|
+ return (error);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ vbio_submit(vbio, flags);
|
||||||
|
+ return (0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* ========== */
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * This is the classic, battle-tested BIO submission code.
|
||||||
|
+ * This is the classic, battle-tested BIO submission code. Until we're totally
|
||||||
|
+ * sure that the new code is safe and correct in all cases, this will remain
|
||||||
|
+ * available and can be enabled by setting zfs_vdev_disk_classic=1 at module
|
||||||
|
+ * load time.
|
||||||
|
*
|
||||||
|
* These functions have been renamed to vdev_classic_* to make it clear what
|
||||||
|
* they belong to, but their implementations are unchanged.
|
||||||
|
@@ -1116,7 +1547,8 @@ vdev_disk_init(spa_t *spa, nvlist_t *nv, void **tsd)
|
||||||
|
(void) tsd;
|
||||||
|
|
||||||
|
if (vdev_disk_io_rw_fn == NULL)
|
||||||
|
- vdev_disk_io_rw_fn = vdev_classic_physio;
|
||||||
|
+ /* XXX make configurable */
|
||||||
|
+ vdev_disk_io_rw_fn = 0 ? vdev_classic_physio : vdev_disk_io_rw;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
@@ -1215,3 +1647,6 @@ ZFS_MODULE_PARAM(zfs_vdev, zfs_vdev_, open_timeout_ms, UINT, ZMOD_RW,
|
||||||
|
|
||||||
|
ZFS_MODULE_PARAM(zfs_vdev, zfs_vdev_, failfast_mask, UINT, ZMOD_RW,
|
||||||
|
"Defines failfast mask: 1 - device, 2 - transport, 4 - driver");
|
||||||
|
+
|
||||||
|
+ZFS_MODULE_PARAM(zfs_vdev_disk, zfs_vdev_disk_, max_segs, UINT, ZMOD_RW,
|
||||||
|
+ "Maximum number of data segments to add to an IO request (min 4)");
|
||||||
+104
@@ -0,0 +1,104 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Tue, 9 Jan 2024 13:28:57 +1100
|
||||||
|
Subject: [PATCH] vdev_disk: add module parameter to select BIO submission
|
||||||
|
method
|
||||||
|
|
||||||
|
This makes the submission method selectable at module load time via the
|
||||||
|
`zfs_vdev_disk_classic` parameter, allowing this change to be backported
|
||||||
|
to 2.2 safely, and disabled in favour of the "classic" submission method
|
||||||
|
if new problems come up.
|
||||||
|
|
||||||
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
Closes #15533
|
||||||
|
Closes #15588
|
||||||
|
(cherry picked from commit df2169d141aadc0c2cc728c5c5261d6f5c2a27f7)
|
||||||
|
---
|
||||||
|
man/man4/zfs.4 | 16 ++++++++++++++++
|
||||||
|
module/os/linux/zfs/vdev_disk.c | 31 +++++++++++++++++++++++++++++--
|
||||||
|
2 files changed, 45 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/man4/zfs.4 b/man/man4/zfs.4
|
||||||
|
index b5679f2f0..6a628e7f3 100644
|
||||||
|
--- a/man/man4/zfs.4
|
||||||
|
+++ b/man/man4/zfs.4
|
||||||
|
@@ -1352,6 +1352,22 @@ If this is higher than the maximum allowed by the device queue or the kernel
|
||||||
|
itself, it will be clamped.
|
||||||
|
Setting it to zero will cause the kernel's ideal size to be used.
|
||||||
|
This parameter only applies on Linux.
|
||||||
|
+This parameter is ignored if
|
||||||
|
+.Sy zfs_vdev_disk_classic Ns = Ns Sy 1 .
|
||||||
|
+.
|
||||||
|
+.It Sy zfs_vdev_disk_classic Ns = Ns Sy 0 Ns | Ns 1 Pq uint
|
||||||
|
+If set to 1, OpenZFS will submit IO to Linux using the method it used in 2.2
|
||||||
|
+and earlier.
|
||||||
|
+This "classic" method has known issues with highly fragmented IO requests and
|
||||||
|
+is slower on many workloads, but it has been in use for many years and is known
|
||||||
|
+to be very stable.
|
||||||
|
+If you set this parameter, please also open a bug report why you did so,
|
||||||
|
+including the workload involved and any error messages.
|
||||||
|
+.Pp
|
||||||
|
+This parameter and the classic submission method will be removed once we have
|
||||||
|
+total confidence in the new method.
|
||||||
|
+.Pp
|
||||||
|
+This parameter only applies on Linux, and can only be set at module load time.
|
||||||
|
.
|
||||||
|
.It Sy zfs_expire_snapshot Ns = Ns Sy 300 Ns s Pq int
|
||||||
|
Time before expiring
|
||||||
|
diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
index 0ccb9ad96..a9110623a 100644
|
||||||
|
--- a/module/os/linux/zfs/vdev_disk.c
|
||||||
|
+++ b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
@@ -1535,6 +1535,29 @@ vdev_disk_rele(vdev_t *vd)
|
||||||
|
/* XXX: Implement me as a vnode rele for the device */
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * BIO submission method. See comment above about vdev_classic.
|
||||||
|
+ * Set zfs_vdev_disk_classic=0 for new, =1 for classic
|
||||||
|
+ */
|
||||||
|
+static uint_t zfs_vdev_disk_classic = 0; /* default new */
|
||||||
|
+
|
||||||
|
+/* Set submission function from module parameter */
|
||||||
|
+static int
|
||||||
|
+vdev_disk_param_set_classic(const char *buf, zfs_kernel_param_t *kp)
|
||||||
|
+{
|
||||||
|
+ int err = param_set_uint(buf, kp);
|
||||||
|
+ if (err < 0)
|
||||||
|
+ return (SET_ERROR(err));
|
||||||
|
+
|
||||||
|
+ vdev_disk_io_rw_fn =
|
||||||
|
+ zfs_vdev_disk_classic ? vdev_classic_physio : vdev_disk_io_rw;
|
||||||
|
+
|
||||||
|
+ printk(KERN_INFO "ZFS: forcing %s BIO submission\n",
|
||||||
|
+ zfs_vdev_disk_classic ? "classic" : "new");
|
||||||
|
+
|
||||||
|
+ return (0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* At first use vdev use, set the submission function from the default value if
|
||||||
|
* it hasn't been set already.
|
||||||
|
@@ -1547,8 +1570,8 @@ vdev_disk_init(spa_t *spa, nvlist_t *nv, void **tsd)
|
||||||
|
(void) tsd;
|
||||||
|
|
||||||
|
if (vdev_disk_io_rw_fn == NULL)
|
||||||
|
- /* XXX make configurable */
|
||||||
|
- vdev_disk_io_rw_fn = 0 ? vdev_classic_physio : vdev_disk_io_rw;
|
||||||
|
+ vdev_disk_io_rw_fn = zfs_vdev_disk_classic ?
|
||||||
|
+ vdev_classic_physio : vdev_disk_io_rw;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
@@ -1650,3 +1673,7 @@ ZFS_MODULE_PARAM(zfs_vdev, zfs_vdev_, failfast_mask, UINT, ZMOD_RW,
|
||||||
|
|
||||||
|
ZFS_MODULE_PARAM(zfs_vdev_disk, zfs_vdev_disk_, max_segs, UINT, ZMOD_RW,
|
||||||
|
"Maximum number of data segments to add to an IO request (min 4)");
|
||||||
|
+
|
||||||
|
+ZFS_MODULE_PARAM_CALL(zfs_vdev_disk, zfs_vdev_disk_, classic,
|
||||||
|
+ vdev_disk_param_set_classic, param_get_uint, ZMOD_RD,
|
||||||
|
+ "Use classic BIO submission method");
|
||||||
@@ -0,0 +1,363 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Wed, 21 Feb 2024 11:07:21 +1100
|
||||||
|
Subject: [PATCH] vdev_disk: use bio_chain() to submit multiple BIOs
|
||||||
|
|
||||||
|
Simplifies our code a lot, so we don't have to wait for each and
|
||||||
|
reassemble them.
|
||||||
|
|
||||||
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
Closes #15533
|
||||||
|
Closes #15588
|
||||||
|
(cherry picked from commit 72fd834c47558cb10d847948d1a4615e894c77c3)
|
||||||
|
---
|
||||||
|
module/os/linux/zfs/vdev_disk.c | 231 +++++++++++---------------------
|
||||||
|
1 file changed, 80 insertions(+), 151 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
index a9110623a..36468fc21 100644
|
||||||
|
--- a/module/os/linux/zfs/vdev_disk.c
|
||||||
|
+++ b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
@@ -454,10 +454,9 @@ vdev_disk_close(vdev_t *v)
|
||||||
|
if (v->vdev_reopening || vd == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- if (vd->vd_bdh != NULL) {
|
||||||
|
+ if (vd->vd_bdh != NULL)
|
||||||
|
vdev_blkdev_put(vd->vd_bdh, spa_mode(v->vdev_spa),
|
||||||
|
zfs_vdev_holder);
|
||||||
|
- }
|
||||||
|
|
||||||
|
rw_destroy(&vd->vd_lock);
|
||||||
|
kmem_free(vd, sizeof (vdev_disk_t));
|
||||||
|
@@ -663,9 +662,6 @@ typedef struct {
|
||||||
|
|
||||||
|
abd_t *vbio_abd; /* abd carrying borrowed linear buf */
|
||||||
|
|
||||||
|
- atomic_t vbio_ref; /* bio refcount */
|
||||||
|
- int vbio_error; /* error from failed bio */
|
||||||
|
-
|
||||||
|
uint_t vbio_max_segs; /* max segs per bio */
|
||||||
|
|
||||||
|
uint_t vbio_max_bytes; /* max bytes per bio */
|
||||||
|
@@ -674,43 +670,52 @@ typedef struct {
|
||||||
|
uint64_t vbio_offset; /* start offset of next bio */
|
||||||
|
|
||||||
|
struct bio *vbio_bio; /* pointer to the current bio */
|
||||||
|
- struct bio *vbio_bios; /* list of all bios */
|
||||||
|
+ int vbio_flags; /* bio flags */
|
||||||
|
} vbio_t;
|
||||||
|
|
||||||
|
static vbio_t *
|
||||||
|
-vbio_alloc(zio_t *zio, struct block_device *bdev)
|
||||||
|
+vbio_alloc(zio_t *zio, struct block_device *bdev, int flags)
|
||||||
|
{
|
||||||
|
vbio_t *vbio = kmem_zalloc(sizeof (vbio_t), KM_SLEEP);
|
||||||
|
|
||||||
|
vbio->vbio_zio = zio;
|
||||||
|
vbio->vbio_bdev = bdev;
|
||||||
|
- atomic_set(&vbio->vbio_ref, 0);
|
||||||
|
+ vbio->vbio_abd = NULL;
|
||||||
|
vbio->vbio_max_segs = vdev_bio_max_segs(bdev);
|
||||||
|
vbio->vbio_max_bytes = vdev_bio_max_bytes(bdev);
|
||||||
|
vbio->vbio_lbs_mask = ~(bdev_logical_block_size(bdev)-1);
|
||||||
|
vbio->vbio_offset = zio->io_offset;
|
||||||
|
+ vbio->vbio_bio = NULL;
|
||||||
|
+ vbio->vbio_flags = flags;
|
||||||
|
|
||||||
|
return (vbio);
|
||||||
|
}
|
||||||
|
|
||||||
|
+BIO_END_IO_PROTO(vbio_completion, bio, error);
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
vbio_add_page(vbio_t *vbio, struct page *page, uint_t size, uint_t offset)
|
||||||
|
{
|
||||||
|
- struct bio *bio;
|
||||||
|
+ struct bio *bio = vbio->vbio_bio;
|
||||||
|
uint_t ssize;
|
||||||
|
|
||||||
|
while (size > 0) {
|
||||||
|
- bio = vbio->vbio_bio;
|
||||||
|
if (bio == NULL) {
|
||||||
|
/* New BIO, allocate and set up */
|
||||||
|
bio = vdev_bio_alloc(vbio->vbio_bdev, GFP_NOIO,
|
||||||
|
vbio->vbio_max_segs);
|
||||||
|
- if (unlikely(bio == NULL))
|
||||||
|
- return (SET_ERROR(ENOMEM));
|
||||||
|
+ VERIFY(bio);
|
||||||
|
+
|
||||||
|
BIO_BI_SECTOR(bio) = vbio->vbio_offset >> 9;
|
||||||
|
+ bio_set_op_attrs(bio,
|
||||||
|
+ vbio->vbio_zio->io_type == ZIO_TYPE_WRITE ?
|
||||||
|
+ WRITE : READ, vbio->vbio_flags);
|
||||||
|
|
||||||
|
- bio->bi_next = vbio->vbio_bios;
|
||||||
|
- vbio->vbio_bios = vbio->vbio_bio = bio;
|
||||||
|
+ if (vbio->vbio_bio) {
|
||||||
|
+ bio_chain(vbio->vbio_bio, bio);
|
||||||
|
+ vdev_submit_bio(vbio->vbio_bio);
|
||||||
|
+ }
|
||||||
|
+ vbio->vbio_bio = bio;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -735,157 +740,97 @@ vbio_add_page(vbio_t *vbio, struct page *page, uint_t size, uint_t offset)
|
||||||
|
vbio->vbio_offset += BIO_BI_SIZE(bio);
|
||||||
|
|
||||||
|
/* Signal new BIO allocation wanted */
|
||||||
|
- vbio->vbio_bio = NULL;
|
||||||
|
+ bio = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
-BIO_END_IO_PROTO(vdev_disk_io_rw_completion, bio, error);
|
||||||
|
-static void vbio_put(vbio_t *vbio);
|
||||||
|
+/* Iterator callback to submit ABD pages to the vbio. */
|
||||||
|
+static int
|
||||||
|
+vbio_fill_cb(struct page *page, size_t off, size_t len, void *priv)
|
||||||
|
+{
|
||||||
|
+ vbio_t *vbio = priv;
|
||||||
|
+ return (vbio_add_page(vbio, page, len, off));
|
||||||
|
+}
|
||||||
|
|
||||||
|
+/* Create some BIOs, fill them with data and submit them */
|
||||||
|
static void
|
||||||
|
-vbio_submit(vbio_t *vbio, int flags)
|
||||||
|
+vbio_submit(vbio_t *vbio, abd_t *abd, uint64_t size)
|
||||||
|
{
|
||||||
|
- ASSERT(vbio->vbio_bios);
|
||||||
|
- struct bio *bio = vbio->vbio_bios;
|
||||||
|
- vbio->vbio_bio = vbio->vbio_bios = NULL;
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * We take a reference for each BIO as we submit it, plus one to
|
||||||
|
- * protect us from BIOs completing before we're done submitting them
|
||||||
|
- * all, causing vbio_put() to free vbio out from under us and/or the
|
||||||
|
- * zio to be returned before all its IO has completed.
|
||||||
|
- */
|
||||||
|
- atomic_set(&vbio->vbio_ref, 1);
|
||||||
|
+ ASSERT(vbio->vbio_bdev);
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * If we're submitting more than one BIO, inform the block layer so
|
||||||
|
- * it can batch them if it wants.
|
||||||
|
+ * We plug so we can submit the BIOs as we go and only unplug them when
|
||||||
|
+ * they are fully created and submitted. This is important; if we don't
|
||||||
|
+ * plug, then the kernel may start executing earlier BIOs while we're
|
||||||
|
+ * still creating and executing later ones, and if the device goes
|
||||||
|
+ * away while that's happening, older kernels can get confused and
|
||||||
|
+ * trample memory.
|
||||||
|
*/
|
||||||
|
struct blk_plug plug;
|
||||||
|
- boolean_t do_plug = (bio->bi_next != NULL);
|
||||||
|
- if (do_plug)
|
||||||
|
- blk_start_plug(&plug);
|
||||||
|
+ blk_start_plug(&plug);
|
||||||
|
|
||||||
|
- /* Submit all the BIOs */
|
||||||
|
- while (bio != NULL) {
|
||||||
|
- atomic_inc(&vbio->vbio_ref);
|
||||||
|
+ (void) abd_iterate_page_func(abd, 0, size, vbio_fill_cb, vbio);
|
||||||
|
+ ASSERT(vbio->vbio_bio);
|
||||||
|
|
||||||
|
- struct bio *next = bio->bi_next;
|
||||||
|
- bio->bi_next = NULL;
|
||||||
|
+ vbio->vbio_bio->bi_end_io = vbio_completion;
|
||||||
|
+ vbio->vbio_bio->bi_private = vbio;
|
||||||
|
|
||||||
|
- bio->bi_end_io = vdev_disk_io_rw_completion;
|
||||||
|
- bio->bi_private = vbio;
|
||||||
|
- bio_set_op_attrs(bio,
|
||||||
|
- vbio->vbio_zio->io_type == ZIO_TYPE_WRITE ?
|
||||||
|
- WRITE : READ, flags);
|
||||||
|
+ vdev_submit_bio(vbio->vbio_bio);
|
||||||
|
|
||||||
|
- vdev_submit_bio(bio);
|
||||||
|
-
|
||||||
|
- bio = next;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Finish the batch */
|
||||||
|
- if (do_plug)
|
||||||
|
- blk_finish_plug(&plug);
|
||||||
|
+ blk_finish_plug(&plug);
|
||||||
|
|
||||||
|
- /* Release the extra reference */
|
||||||
|
- vbio_put(vbio);
|
||||||
|
+ vbio->vbio_bio = NULL;
|
||||||
|
+ vbio->vbio_bdev = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-vbio_return_abd(vbio_t *vbio)
|
||||||
|
+/* IO completion callback */
|
||||||
|
+BIO_END_IO_PROTO(vbio_completion, bio, error)
|
||||||
|
{
|
||||||
|
+ vbio_t *vbio = bio->bi_private;
|
||||||
|
zio_t *zio = vbio->vbio_zio;
|
||||||
|
- if (vbio->vbio_abd == NULL)
|
||||||
|
- return;
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * If we copied the ABD before issuing it, clean up and return the copy
|
||||||
|
- * to the ADB, with changes if appropriate.
|
||||||
|
- */
|
||||||
|
- void *buf = abd_to_buf(vbio->vbio_abd);
|
||||||
|
- abd_free(vbio->vbio_abd);
|
||||||
|
- vbio->vbio_abd = NULL;
|
||||||
|
-
|
||||||
|
- if (zio->io_type == ZIO_TYPE_READ)
|
||||||
|
- abd_return_buf_copy(zio->io_abd, buf, zio->io_size);
|
||||||
|
- else
|
||||||
|
- abd_return_buf(zio->io_abd, buf, zio->io_size);
|
||||||
|
-}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-vbio_free(vbio_t *vbio)
|
||||||
|
-{
|
||||||
|
- VERIFY0(atomic_read(&vbio->vbio_ref));
|
||||||
|
-
|
||||||
|
- vbio_return_abd(vbio);
|
||||||
|
+ ASSERT(zio);
|
||||||
|
|
||||||
|
- kmem_free(vbio, sizeof (vbio_t));
|
||||||
|
-}
|
||||||
|
+ /* Capture and log any errors */
|
||||||
|
+#ifdef HAVE_1ARG_BIO_END_IO_T
|
||||||
|
+ zio->io_error = BIO_END_IO_ERROR(bio);
|
||||||
|
+#else
|
||||||
|
+ zio->io_error = 0;
|
||||||
|
+ if (error)
|
||||||
|
+ zio->io_error = -(error);
|
||||||
|
+ else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
|
||||||
|
+ zio->io_error = EIO;
|
||||||
|
+#endif
|
||||||
|
+ ASSERT3U(zio->io_error, >=, 0);
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-vbio_put(vbio_t *vbio)
|
||||||
|
-{
|
||||||
|
- if (atomic_dec_return(&vbio->vbio_ref) > 0)
|
||||||
|
- return;
|
||||||
|
+ if (zio->io_error)
|
||||||
|
+ vdev_disk_error(zio);
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * This was the last reference, so the entire IO is completed. Clean
|
||||||
|
- * up and submit it for processing.
|
||||||
|
- */
|
||||||
|
+ /* Return the BIO to the kernel */
|
||||||
|
+ bio_put(bio);
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * Get any data buf back to the original ABD, if necessary. We do this
|
||||||
|
- * now so we can get the ZIO into the pipeline as quickly as possible,
|
||||||
|
- * and then do the remaining cleanup after.
|
||||||
|
+ * If we copied the ABD before issuing it, clean up and return the copy
|
||||||
|
+ * to the ADB, with changes if appropriate.
|
||||||
|
*/
|
||||||
|
- vbio_return_abd(vbio);
|
||||||
|
+ if (vbio->vbio_abd != NULL) {
|
||||||
|
+ void *buf = abd_to_buf(vbio->vbio_abd);
|
||||||
|
+ abd_free(vbio->vbio_abd);
|
||||||
|
+ vbio->vbio_abd = NULL;
|
||||||
|
|
||||||
|
- zio_t *zio = vbio->vbio_zio;
|
||||||
|
+ if (zio->io_type == ZIO_TYPE_READ)
|
||||||
|
+ abd_return_buf_copy(zio->io_abd, buf, zio->io_size);
|
||||||
|
+ else
|
||||||
|
+ abd_return_buf(zio->io_abd, buf, zio->io_size);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * Set the overall error. If multiple BIOs returned an error, only the
|
||||||
|
- * first will be taken; the others are dropped (see
|
||||||
|
- * vdev_disk_io_rw_completion()). Its pretty much impossible for
|
||||||
|
- * multiple IOs to the same device to fail with different errors, so
|
||||||
|
- * there's no real risk.
|
||||||
|
- */
|
||||||
|
- zio->io_error = vbio->vbio_error;
|
||||||
|
- if (zio->io_error)
|
||||||
|
- vdev_disk_error(zio);
|
||||||
|
+ /* Final cleanup */
|
||||||
|
+ kmem_free(vbio, sizeof (vbio_t));
|
||||||
|
|
||||||
|
/* All done, submit for processing */
|
||||||
|
zio_delay_interrupt(zio);
|
||||||
|
-
|
||||||
|
- /* Finish cleanup */
|
||||||
|
- vbio_free(vbio);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-BIO_END_IO_PROTO(vdev_disk_io_rw_completion, bio, error)
|
||||||
|
-{
|
||||||
|
- vbio_t *vbio = bio->bi_private;
|
||||||
|
-
|
||||||
|
- if (vbio->vbio_error == 0) {
|
||||||
|
-#ifdef HAVE_1ARG_BIO_END_IO_T
|
||||||
|
- vbio->vbio_error = BIO_END_IO_ERROR(bio);
|
||||||
|
-#else
|
||||||
|
- if (error)
|
||||||
|
- vbio->vbio_error = -(error);
|
||||||
|
- else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
|
||||||
|
- vbio->vbio_error = EIO;
|
||||||
|
-#endif
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * Destroy the BIO. This is safe to do; the vbio owns its data and the
|
||||||
|
- * kernel won't touch it again after the completion function runs.
|
||||||
|
- */
|
||||||
|
- bio_put(bio);
|
||||||
|
-
|
||||||
|
- /* Drop this BIOs reference acquired by vbio_submit() */
|
||||||
|
- vbio_put(vbio);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -948,14 +893,6 @@ vdev_disk_check_pages(abd_t *abd, uint64_t size, struct block_device *bdev)
|
||||||
|
return (B_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* Iterator callback to submit ABD pages to the vbio. */
|
||||||
|
-static int
|
||||||
|
-vdev_disk_fill_vbio_cb(struct page *page, size_t off, size_t len, void *priv)
|
||||||
|
-{
|
||||||
|
- vbio_t *vbio = priv;
|
||||||
|
- return (vbio_add_page(vbio, page, len, off));
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static int
|
||||||
|
vdev_disk_io_rw(zio_t *zio)
|
||||||
|
{
|
||||||
|
@@ -1018,20 +955,12 @@ vdev_disk_io_rw(zio_t *zio)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate vbio, with a pointer to the borrowed ABD if necessary */
|
||||||
|
- int error = 0;
|
||||||
|
- vbio_t *vbio = vbio_alloc(zio, bdev);
|
||||||
|
+ vbio_t *vbio = vbio_alloc(zio, bdev, flags);
|
||||||
|
if (abd != zio->io_abd)
|
||||||
|
vbio->vbio_abd = abd;
|
||||||
|
|
||||||
|
- /* Fill it with pages */
|
||||||
|
- error = abd_iterate_page_func(abd, 0, zio->io_size,
|
||||||
|
- vdev_disk_fill_vbio_cb, vbio);
|
||||||
|
- if (error != 0) {
|
||||||
|
- vbio_free(vbio);
|
||||||
|
- return (error);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- vbio_submit(vbio, flags);
|
||||||
|
+ /* Fill it with data pages and submit it to the kernel */
|
||||||
|
+ vbio_submit(vbio, abd, zio->io_size);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
+96
@@ -0,0 +1,96 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Thu, 14 Mar 2024 10:57:30 +1100
|
||||||
|
Subject: [PATCH] abd_iter_page: don't use compound heads on Linux <4.5
|
||||||
|
|
||||||
|
Before 4.5 (specifically, torvalds/linux@ddc58f2), head and tail pages
|
||||||
|
in a compound page were refcounted separately. This means that using the
|
||||||
|
head page without taking a reference to it could see it cleaned up later
|
||||||
|
before we're finished with it. Specifically, bio_add_page() would take a
|
||||||
|
reference, and drop its reference after the bio completion callback
|
||||||
|
returns.
|
||||||
|
|
||||||
|
If the zio is executed immediately from the completion callback, this is
|
||||||
|
usually ok, as any data is referenced through the tail page referenced
|
||||||
|
by the ABD, and so becomes "live" that way. If there's a delay in zio
|
||||||
|
execution (high load, error injection), then the head page can be freed,
|
||||||
|
along with any dirty flags or other indicators that the underlying
|
||||||
|
memory is used. Later, when the zio completes and that memory is
|
||||||
|
accessed, its either unmapped and an unhandled fault takes down the
|
||||||
|
entire system, or it is mapped and we end up messing around in someone
|
||||||
|
else's memory. Both of these are very bad.
|
||||||
|
|
||||||
|
The solution on these older kernels is to take a reference to the head
|
||||||
|
page when we use it, and release it when we're done. There's not really
|
||||||
|
a sensible way under our current structure to do this; the "best" would
|
||||||
|
be to keep a list of head page references in the ABD, and release them
|
||||||
|
when the ABD is freed.
|
||||||
|
|
||||||
|
Since this additional overhead is totally unnecessary on 4.5+, where
|
||||||
|
head and tail pages share refcounts, I've opted to simply not use the
|
||||||
|
compound head in ABD page iteration there. This is theoretically less
|
||||||
|
efficient (though cleaning up head page references would add overhead),
|
||||||
|
but its safe, and we still get the other benefits of not mapping pages
|
||||||
|
before adding them to a bio and not mis-splitting pages.
|
||||||
|
|
||||||
|
There doesn't appear to be an obvious symbol name or config option we
|
||||||
|
can match on to discover this behaviour in configure (and the mm/page
|
||||||
|
APIs have changed a lot since then anyway), so I've gone with a simple
|
||||||
|
version check.
|
||||||
|
|
||||||
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
Closes #15533
|
||||||
|
Closes #15588
|
||||||
|
(cherry picked from commit c6be6ce1755a3d9a3cbe70256cd8958ef83d8542)
|
||||||
|
---
|
||||||
|
module/os/linux/zfs/abd_os.c | 14 ++++++++++++++
|
||||||
|
1 file changed, 14 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/module/os/linux/zfs/abd_os.c b/module/os/linux/zfs/abd_os.c
|
||||||
|
index 3fe01c0b7..d3255dcbc 100644
|
||||||
|
--- a/module/os/linux/zfs/abd_os.c
|
||||||
|
+++ b/module/os/linux/zfs/abd_os.c
|
||||||
|
@@ -62,6 +62,7 @@
|
||||||
|
#include <linux/kmap_compat.h>
|
||||||
|
#include <linux/mm_compat.h>
|
||||||
|
#include <linux/scatterlist.h>
|
||||||
|
+#include <linux/version.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _KERNEL
|
||||||
|
@@ -1061,6 +1062,7 @@ abd_iter_page(struct abd_iter *aiter)
|
||||||
|
}
|
||||||
|
ASSERT(page);
|
||||||
|
|
||||||
|
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
|
||||||
|
if (PageTail(page)) {
|
||||||
|
/*
|
||||||
|
* This page is part of a "compound page", which is a group of
|
||||||
|
@@ -1082,11 +1084,23 @@ abd_iter_page(struct abd_iter *aiter)
|
||||||
|
* To do this, we need to adjust the offset to be counted from
|
||||||
|
* the head page. struct page for compound pages are stored
|
||||||
|
* contiguously, so we can just adjust by a simple offset.
|
||||||
|
+ *
|
||||||
|
+ * Before kernel 4.5, compound page heads were refcounted
|
||||||
|
+ * separately, such that moving back to the head page would
|
||||||
|
+ * require us to take a reference to it and releasing it once
|
||||||
|
+ * we're completely finished with it. In practice, that means
|
||||||
|
+ * when our caller is done with the ABD, which we have no
|
||||||
|
+ * insight into from here. Rather than contort this API to
|
||||||
|
+ * track head page references on such ancient kernels, we just
|
||||||
|
+ * compile this block out and use the tail pages directly. This
|
||||||
|
+ * is slightly less efficient, but makes everything far
|
||||||
|
+ * simpler.
|
||||||
|
*/
|
||||||
|
struct page *head = compound_head(page);
|
||||||
|
doff += ((page - head) * PAGESIZE);
|
||||||
|
page = head;
|
||||||
|
}
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/* final page and position within it */
|
||||||
|
aiter->iter_page = page;
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Wed, 27 Mar 2024 13:11:12 +1100
|
||||||
|
Subject: [PATCH] vdev_disk: default to classic submission for 2.2.x
|
||||||
|
|
||||||
|
We don't want to change to brand-new code in the middle of a stable
|
||||||
|
series, but we want it available to test for people running into page
|
||||||
|
splitting issues.
|
||||||
|
|
||||||
|
This commits make zfs_vdev_disk_classic=1 the default, and updates the
|
||||||
|
documentation to better explain what's going on.
|
||||||
|
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
---
|
||||||
|
man/man4/zfs.4 | 31 ++++++++++++++++++++++---------
|
||||||
|
module/os/linux/zfs/vdev_disk.c | 8 +++++---
|
||||||
|
2 files changed, 27 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/man4/zfs.4 b/man/man4/zfs.4
|
||||||
|
index 6a628e7f3..a98ec519a 100644
|
||||||
|
--- a/man/man4/zfs.4
|
||||||
|
+++ b/man/man4/zfs.4
|
||||||
|
@@ -1355,17 +1355,30 @@ This parameter only applies on Linux.
|
||||||
|
This parameter is ignored if
|
||||||
|
.Sy zfs_vdev_disk_classic Ns = Ns Sy 1 .
|
||||||
|
.
|
||||||
|
-.It Sy zfs_vdev_disk_classic Ns = Ns Sy 0 Ns | Ns 1 Pq uint
|
||||||
|
-If set to 1, OpenZFS will submit IO to Linux using the method it used in 2.2
|
||||||
|
-and earlier.
|
||||||
|
-This "classic" method has known issues with highly fragmented IO requests and
|
||||||
|
-is slower on many workloads, but it has been in use for many years and is known
|
||||||
|
-to be very stable.
|
||||||
|
-If you set this parameter, please also open a bug report why you did so,
|
||||||
|
+.It Sy zfs_vdev_disk_classic Ns = Ns 0 Ns | Ns Sy 1 Pq uint
|
||||||
|
+Controls the method used to submit IO to the Linux block layer
|
||||||
|
+(default
|
||||||
|
+.Sy 1 "classic" Ns
|
||||||
|
+)
|
||||||
|
+.Pp
|
||||||
|
+If set to 1, the "classic" method is used.
|
||||||
|
+This is the method that has been in use since the earliest versions of
|
||||||
|
+ZFS-on-Linux.
|
||||||
|
+It has known issues with highly fragmented IO requests and is less efficient on
|
||||||
|
+many workloads, but it well known and well understood.
|
||||||
|
+.Pp
|
||||||
|
+If set to 0, the "new" method is used.
|
||||||
|
+This method is available since 2.2.4 and should resolve all known issues and be
|
||||||
|
+far more efficient, but has not had as much testing.
|
||||||
|
+In the 2.2.x series, this parameter defaults to 1, to use the "classic" method.
|
||||||
|
+.Pp
|
||||||
|
+It is not recommended that you change it except on advice from the OpenZFS
|
||||||
|
+developers.
|
||||||
|
+If you do change it, please also open a bug report describing why you did so,
|
||||||
|
including the workload involved and any error messages.
|
||||||
|
.Pp
|
||||||
|
-This parameter and the classic submission method will be removed once we have
|
||||||
|
-total confidence in the new method.
|
||||||
|
+This parameter and the "classic" submission method will be removed in a future
|
||||||
|
+release of OpenZFS once we have total confidence in the new method.
|
||||||
|
.Pp
|
||||||
|
This parameter only applies on Linux, and can only be set at module load time.
|
||||||
|
.
|
||||||
|
diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
index 36468fc21..e1c19a085 100644
|
||||||
|
--- a/module/os/linux/zfs/vdev_disk.c
|
||||||
|
+++ b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
@@ -969,8 +969,10 @@ vdev_disk_io_rw(zio_t *zio)
|
||||||
|
/*
|
||||||
|
* This is the classic, battle-tested BIO submission code. Until we're totally
|
||||||
|
* sure that the new code is safe and correct in all cases, this will remain
|
||||||
|
- * available and can be enabled by setting zfs_vdev_disk_classic=1 at module
|
||||||
|
- * load time.
|
||||||
|
+ * available.
|
||||||
|
+ *
|
||||||
|
+ * It is enabled by setting zfs_vdev_disk_classic=1 at module load time. It is
|
||||||
|
+ * enabled (=1) by default since 2.2.4, and disabled by default (=0) on master.
|
||||||
|
*
|
||||||
|
* These functions have been renamed to vdev_classic_* to make it clear what
|
||||||
|
* they belong to, but their implementations are unchanged.
|
||||||
|
@@ -1468,7 +1470,7 @@ vdev_disk_rele(vdev_t *vd)
|
||||||
|
* BIO submission method. See comment above about vdev_classic.
|
||||||
|
* Set zfs_vdev_disk_classic=0 for new, =1 for classic
|
||||||
|
*/
|
||||||
|
-static uint_t zfs_vdev_disk_classic = 0; /* default new */
|
||||||
|
+static uint_t zfs_vdev_disk_classic = 1; /* default classic */
|
||||||
|
|
||||||
|
/* Set submission function from module parameter */
|
||||||
|
static int
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Evans <rrevans@gmail.com>
|
||||||
|
Date: Mon, 25 Mar 2024 17:56:49 -0400
|
||||||
|
Subject: [PATCH] Fix corruption caused by mmap flushing problems
|
||||||
|
|
||||||
|
1) Make mmap flushes synchronous. Linux may skip flushing dirty pages
|
||||||
|
already in writeback unless data-integrity sync is requested.
|
||||||
|
|
||||||
|
2) Change zfs_putpage to use TXG_WAIT. Otherwise dirty pages may be
|
||||||
|
skipped due to DMU pushing back on TX assign.
|
||||||
|
|
||||||
|
3) Add missing mmap flush when doing block cloning.
|
||||||
|
|
||||||
|
4) While here, pass errors from putpage to writepage/writepages.
|
||||||
|
|
||||||
|
This change fixes corruption edge cases, but unfortunately adds
|
||||||
|
synchronous ZIL flushes for dirty mmap pages to llseek and bclone
|
||||||
|
operations. It may be possible to avoid these sync writes later
|
||||||
|
but would need more tricky refactoring of the writeback code.
|
||||||
|
|
||||||
|
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
|
||||||
|
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Signed-off-by: Robert Evans <evansr@google.com>
|
||||||
|
Closes #15933
|
||||||
|
Closes #16019
|
||||||
|
---
|
||||||
|
module/os/linux/zfs/zfs_vnops_os.c | 5 +----
|
||||||
|
module/os/linux/zfs/zpl_file.c | 8 ++++----
|
||||||
|
module/zfs/zfs_vnops.c | 6 +++++-
|
||||||
|
3 files changed, 10 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/module/os/linux/zfs/zfs_vnops_os.c b/module/os/linux/zfs/zfs_vnops_os.c
|
||||||
|
index c06a75662..7c473bc7e 100644
|
||||||
|
--- a/module/os/linux/zfs/zfs_vnops_os.c
|
||||||
|
+++ b/module/os/linux/zfs/zfs_vnops_os.c
|
||||||
|
@@ -3792,11 +3792,8 @@ zfs_putpage(struct inode *ip, struct page *pp, struct writeback_control *wbc,
|
||||||
|
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
|
||||||
|
zfs_sa_upgrade_txholds(tx, zp);
|
||||||
|
|
||||||
|
- err = dmu_tx_assign(tx, TXG_NOWAIT);
|
||||||
|
+ err = dmu_tx_assign(tx, TXG_WAIT);
|
||||||
|
if (err != 0) {
|
||||||
|
- if (err == ERESTART)
|
||||||
|
- dmu_tx_wait(tx);
|
||||||
|
-
|
||||||
|
dmu_tx_abort(tx);
|
||||||
|
#ifdef HAVE_VFS_FILEMAP_DIRTY_FOLIO
|
||||||
|
filemap_dirty_folio(page_mapping(pp), page_folio(pp));
|
||||||
|
diff --git a/module/os/linux/zfs/zpl_file.c b/module/os/linux/zfs/zpl_file.c
|
||||||
|
index 3caa0fc6c..9dec52215 100644
|
||||||
|
--- a/module/os/linux/zfs/zpl_file.c
|
||||||
|
+++ b/module/os/linux/zfs/zpl_file.c
|
||||||
|
@@ -720,23 +720,23 @@ zpl_putpage(struct page *pp, struct writeback_control *wbc, void *data)
|
||||||
|
{
|
||||||
|
boolean_t *for_sync = data;
|
||||||
|
fstrans_cookie_t cookie;
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
ASSERT(PageLocked(pp));
|
||||||
|
ASSERT(!PageWriteback(pp));
|
||||||
|
|
||||||
|
cookie = spl_fstrans_mark();
|
||||||
|
- (void) zfs_putpage(pp->mapping->host, pp, wbc, *for_sync);
|
||||||
|
+ ret = zfs_putpage(pp->mapping->host, pp, wbc, *for_sync);
|
||||||
|
spl_fstrans_unmark(cookie);
|
||||||
|
|
||||||
|
- return (0);
|
||||||
|
+ return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_WRITEPAGE_T_FOLIO
|
||||||
|
static int
|
||||||
|
zpl_putfolio(struct folio *pp, struct writeback_control *wbc, void *data)
|
||||||
|
{
|
||||||
|
- (void) zpl_putpage(&pp->page, wbc, data);
|
||||||
|
- return (0);
|
||||||
|
+ return (zpl_putpage(&pp->page, wbc, data));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c
|
||||||
|
index 2b37834d5..7020f88ec 100644
|
||||||
|
--- a/module/zfs/zfs_vnops.c
|
||||||
|
+++ b/module/zfs/zfs_vnops.c
|
||||||
|
@@ -130,7 +130,7 @@ zfs_holey_common(znode_t *zp, ulong_t cmd, loff_t *off)
|
||||||
|
|
||||||
|
/* Flush any mmap()'d data to disk */
|
||||||
|
if (zn_has_cached_data(zp, 0, file_sz - 1))
|
||||||
|
- zn_flush_cached_data(zp, B_FALSE);
|
||||||
|
+ zn_flush_cached_data(zp, B_TRUE);
|
||||||
|
|
||||||
|
lr = zfs_rangelock_enter(&zp->z_rangelock, 0, UINT64_MAX, RL_READER);
|
||||||
|
error = dmu_offset_next(ZTOZSB(zp)->z_os, zp->z_id, hole, &noff);
|
||||||
|
@@ -1193,6 +1193,10 @@ zfs_clone_range(znode_t *inzp, uint64_t *inoffp, znode_t *outzp,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Flush any mmap()'d data to disk */
|
||||||
|
+ if (zn_has_cached_data(inzp, inoff, inoff + len - 1))
|
||||||
|
+ zn_flush_cached_data(inzp, B_TRUE);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Maintain predictable lock order.
|
||||||
|
*/
|
||||||
+57
@@ -0,0 +1,57 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Date: Tue, 2 Apr 2024 15:14:54 +1100
|
||||||
|
Subject: [PATCH] vdev_disk: don't touch vbio after its handed off to the
|
||||||
|
kernel
|
||||||
|
|
||||||
|
After IO is unplugged, it may complete immediately and vbio_completion
|
||||||
|
be called on interrupt context. That may interrupt or deschedule our
|
||||||
|
task. If its the last bio, the vbio will be freed. Then, we get
|
||||||
|
rescheduled, and try to write to freed memory through vbio->.
|
||||||
|
|
||||||
|
This patch just removes the the cleanup, and the corresponding assert.
|
||||||
|
These were leftovers from a previous iteration of vbio_submit() and were
|
||||||
|
always "belt and suspenders" ops anyway, never strictly required.
|
||||||
|
|
||||||
|
Reported-by: Rich Ercolani <rincebrain@gmail.com>
|
||||||
|
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
|
||||||
|
Sponsored-by: Klara, Inc.
|
||||||
|
Sponsored-by: Wasabi Technology, Inc.
|
||||||
|
(cherry picked from commit 34f662ad22206af6852020fd923ceccd836a855f)
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
|
---
|
||||||
|
module/os/linux/zfs/vdev_disk.c | 11 ++++++-----
|
||||||
|
1 file changed, 6 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
index e1c19a085..62c7aa14f 100644
|
||||||
|
--- a/module/os/linux/zfs/vdev_disk.c
|
||||||
|
+++ b/module/os/linux/zfs/vdev_disk.c
|
||||||
|
@@ -758,8 +758,6 @@ vbio_fill_cb(struct page *page, size_t off, size_t len, void *priv)
|
||||||
|
static void
|
||||||
|
vbio_submit(vbio_t *vbio, abd_t *abd, uint64_t size)
|
||||||
|
{
|
||||||
|
- ASSERT(vbio->vbio_bdev);
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* We plug so we can submit the BIOs as we go and only unplug them when
|
||||||
|
* they are fully created and submitted. This is important; if we don't
|
||||||
|
@@ -777,12 +775,15 @@ vbio_submit(vbio_t *vbio, abd_t *abd, uint64_t size)
|
||||||
|
vbio->vbio_bio->bi_end_io = vbio_completion;
|
||||||
|
vbio->vbio_bio->bi_private = vbio;
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Once submitted, vbio_bio now owns vbio (through bi_private) and we
|
||||||
|
+ * can't touch it again. The bio may complete and vbio_completion() be
|
||||||
|
+ * called and free the vbio before this task is run again, so we must
|
||||||
|
+ * consider it invalid from this point.
|
||||||
|
+ */
|
||||||
|
vdev_submit_bio(vbio->vbio_bio);
|
||||||
|
|
||||||
|
blk_finish_plug(&plug);
|
||||||
|
-
|
||||||
|
- vbio->vbio_bio = NULL;
|
||||||
|
- vbio->vbio_bdev = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* IO completion callback */
|
||||||
Vendored
+25
@@ -0,0 +1,25 @@
|
|||||||
|
0001-Check-for-META-and-DCH-consistency-in-autoconf.patch
|
||||||
|
0002-always-load-ZFS-module-on-boot.patch
|
||||||
|
0003-Fix-the-path-to-the-zed-binary-on-the-systemd-unit.patch
|
||||||
|
0004-import-with-d-dev-disk-by-id-in-scan-service.patch
|
||||||
|
0005-Enable-zed-emails.patch
|
||||||
|
0006-dont-symlink-zed-scripts.patch
|
||||||
|
0007-Add-systemd-unit-for-importing-specific-pools.patch
|
||||||
|
0008-Patch-move-manpage-arcstat-1-to-arcstat-8.patch
|
||||||
|
0009-arc-stat-summary-guard-access-to-l2arc-MFU-MRU-stats.patch
|
||||||
|
0010-Fix-nfs_truncate_shares-without-etc-exports.d.patch
|
||||||
|
0011-zpool-status-tighten-bounds-for-noalloc-stat-availab.patch
|
||||||
|
0012-udev-correctly-handle-partition-16-and-later.patch
|
||||||
|
0013-Linux-6.8-compat-use-splice_copy_file_range-for-fall.patch
|
||||||
|
0014-linux-5.4-compat-page_size.patch
|
||||||
|
0015-abd-add-page-iterator.patch
|
||||||
|
0016-vdev_disk-rename-existing-functions-to-vdev_classic_.patch
|
||||||
|
0017-vdev_disk-reorganise-vdev_disk_io_start.patch
|
||||||
|
0018-vdev_disk-make-read-write-IO-function-configurable.patch
|
||||||
|
0019-vdev_disk-rewrite-BIO-filling-machinery-to-avoid-spl.patch
|
||||||
|
0020-vdev_disk-add-module-parameter-to-select-BIO-submiss.patch
|
||||||
|
0021-vdev_disk-use-bio_chain-to-submit-multiple-BIOs.patch
|
||||||
|
0022-abd_iter_page-don-t-use-compound-heads-on-Linux-4.5.patch
|
||||||
|
0023-vdev_disk-default-to-classic-submission-for-2.2.x.patch
|
||||||
|
0024-Fix-corruption-caused-by-mmap-flushing-problems.patch
|
||||||
|
0025-vdev_disk-don-t-touch-vbio-after-its-handed-off-to-t.patch
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
usr/lib/python3*
|
||||||
+119
@@ -0,0 +1,119 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
|
include /usr/share/dpkg/default.mk
|
||||||
|
|
||||||
|
VERSION := $(DEB_VERSION_UPSTREAM)
|
||||||
|
REVISION := $(shell echo $(DEB_VERSION) | cut -d- -f2)
|
||||||
|
|
||||||
|
SPHINX_BUILD = $(shell dpkg -L python3-sphinx | grep -m 1 "/sphinx-build$$")
|
||||||
|
|
||||||
|
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@ --with autoreconf,python3,sphinxdoc
|
||||||
|
|
||||||
|
adapt_meta_file:
|
||||||
|
@# Embed the downstream version in the module.
|
||||||
|
@sed \
|
||||||
|
-e 's/^Version:.*/Version: $(VERSION)/' \
|
||||||
|
-e 's/^Release:.*/Release: $(REVISION)/' \
|
||||||
|
-i.orig META
|
||||||
|
|
||||||
|
|
||||||
|
override_dh_autoreconf: adapt_meta_file
|
||||||
|
dh_autoreconf
|
||||||
|
|
||||||
|
override_dh_auto_configure:
|
||||||
|
@# Build the userland, but don't build the kernel modules.
|
||||||
|
dh_auto_configure -- \
|
||||||
|
--bindir=/usr/bin \
|
||||||
|
--sbindir=/sbin \
|
||||||
|
--libdir=/lib/"$(DEB_HOST_MULTIARCH)" \
|
||||||
|
--with-udevdir=/lib/udev \
|
||||||
|
--with-zfsexecdir=/usr/lib/zfs-linux \
|
||||||
|
--enable-systemd \
|
||||||
|
--enable-pyzfs \
|
||||||
|
--with-python=python3 \
|
||||||
|
--with-pammoduledir='/lib/$(DEB_HOST_MULTIARCH)/security' \
|
||||||
|
--with-pkgconfigdir='/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig' \
|
||||||
|
--with-systemdunitdir=/lib/systemd/system \
|
||||||
|
--with-systemdpresetdir=/lib/systemd/system-preset \
|
||||||
|
--with-systemdgeneratordir=/lib/systemd/system-generators \
|
||||||
|
--with-config=user
|
||||||
|
|
||||||
|
for i in $(wildcard $(CURDIR)/debian/*.install.in) ; do \
|
||||||
|
basename "$$i" | grep _KVERS_ && continue ; \
|
||||||
|
sed 's/@DEB_HOST_MULTIARCH@/$(DEB_HOST_MULTIARCH)/g' "$$i" > "$${i%%.in}" ; \
|
||||||
|
done
|
||||||
|
|
||||||
|
override_dh_auto_test:
|
||||||
|
override_dh_auto_test:
|
||||||
|
ifeq (amd64,$(DEB_HOST_ARCH))
|
||||||
|
# Upstream provides an ABI guarantee that we validate here
|
||||||
|
-$(MAKE) checkabi
|
||||||
|
endif
|
||||||
|
|
||||||
|
# The dh_auto_test rule is disabled because
|
||||||
|
# `make check` cannot run in an unprivileged build environment.
|
||||||
|
|
||||||
|
override_dh_auto_install:
|
||||||
|
@# Install the utilities.
|
||||||
|
$(MAKE) install DESTDIR='$(CURDIR)/debian/tmp'
|
||||||
|
|
||||||
|
# Move from bin_dir to /usr/sbin
|
||||||
|
# Remove suffix (.py) as per policy 10.4 - Scripts
|
||||||
|
# https://www.debian.org/doc/debian-policy/ch-files.html#s-scripts
|
||||||
|
mkdir -p '$(CURDIR)/debian/tmp/usr/sbin/'
|
||||||
|
mv '$(CURDIR)/debian/tmp/usr/bin/arc_summary' '$(CURDIR)/debian/tmp/usr/sbin/arc_summary'
|
||||||
|
mv '$(CURDIR)/debian/tmp/usr/bin/arcstat' '$(CURDIR)/debian/tmp/usr/sbin/arcstat'
|
||||||
|
mv '$(CURDIR)/debian/tmp/usr/bin/dbufstat' '$(CURDIR)/debian/tmp/usr/sbin/dbufstat'
|
||||||
|
|
||||||
|
@# Zed has dependencies outside of the system root.
|
||||||
|
mv '$(CURDIR)/debian/tmp/sbin/zed' '$(CURDIR)/debian/tmp/usr/sbin/zed'
|
||||||
|
|
||||||
|
mkdir -p $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)
|
||||||
|
for i in `ls $(CURDIR)/debian/tmp/lib/$(DEB_HOST_MULTIARCH)/*.so`; do \
|
||||||
|
ln -s /lib/$(DEB_HOST_MULTIARCH)/`readlink $${i}` $(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/`basename $${i}`; \
|
||||||
|
rm $${i}; \
|
||||||
|
done
|
||||||
|
|
||||||
|
chmod a-x '$(CURDIR)/debian/tmp/etc/zfs/zfs-functions'
|
||||||
|
chmod a-x '$(CURDIR)/debian/tmp/etc/default/zfs'
|
||||||
|
|
||||||
|
override_dh_python3:
|
||||||
|
dh_python3 -p python3-pyzfs
|
||||||
|
|
||||||
|
override_dh_makeshlibs:
|
||||||
|
dh_makeshlibs -a -V
|
||||||
|
|
||||||
|
override_dh_auto_clean:
|
||||||
|
find . -name .gitignore -delete
|
||||||
|
rm -rf zfs-$(DEB_VERSION_UPSTREAM)
|
||||||
|
dh_auto_clean
|
||||||
|
@if test -e META.orig; then mv META.orig META; fi
|
||||||
|
|
||||||
|
override_dh_install:
|
||||||
|
find debian/tmp/lib -name '*.la' -delete
|
||||||
|
dh_install
|
||||||
|
|
||||||
|
override_dh_missing:
|
||||||
|
dh_missing --fail-missing
|
||||||
|
|
||||||
|
override_dh_installsystemd:
|
||||||
|
# these to lines prevent the restarting of all systemd services, except
|
||||||
|
# zfs-zed - they should not be restarted (importing, mounting, creating
|
||||||
|
# links in /dev, and can cause erros in the log
|
||||||
|
# (upon major.minor change)
|
||||||
|
dh_installsystemd --no-stop-on-upgrade -X zfs-zed.service
|
||||||
|
dh_installsystemd --name zfs-zed
|
||||||
|
|
||||||
|
override_dh_installdocs:
|
||||||
|
dh_installdocs
|
||||||
|
ifeq (,$(findstring nodoc, $(DEB_BUILD_OPTIONS)))
|
||||||
|
http_proxy='127.0.0.1:9' $(SPHINX_BUILD) -N -bhtml "$(CURDIR)/contrib/pyzfs/docs/source/" debian/pyzfs-doc/usr/share/doc/pyzfs-doc/html/
|
||||||
|
endif
|
||||||
|
|
||||||
|
# ------------
|
||||||
|
|
||||||
|
debian-copyright:
|
||||||
|
cme update dpkg-copyright -file debian/copyright.cme
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
3.0 (quilt)
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
for x in $(cat /proc/cmdline)
|
||||||
|
do
|
||||||
|
case $x in
|
||||||
|
root=ZFS=*)
|
||||||
|
BOOT=zfs
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Add udev rules for ZoL to the initrd.
|
||||||
|
#
|
||||||
|
|
||||||
|
PREREQ="udev"
|
||||||
|
PREREQ_UDEV_RULES="60-zvol.rules 69-vdev.rules"
|
||||||
|
COPY_EXEC_LIST="/lib/udev/zvol_id /lib/udev/vdev_id"
|
||||||
|
|
||||||
|
# Generic result code.
|
||||||
|
RC=0
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
prereqs)
|
||||||
|
echo "$PREREQ"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
for ii in $COPY_EXEC_LIST
|
||||||
|
do
|
||||||
|
if [ ! -x "$ii" ]
|
||||||
|
then
|
||||||
|
echo "Error: $ii is not executable."
|
||||||
|
RC=2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$RC" -ne 0 ]
|
||||||
|
then
|
||||||
|
exit "$RC"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. /usr/share/initramfs-tools/hook-functions
|
||||||
|
|
||||||
|
mkdir -p "$DESTDIR/lib/udev/rules.d/"
|
||||||
|
for ii in $PREREQ_UDEV_RULES
|
||||||
|
do
|
||||||
|
if [ -e "/etc/udev/rules.d/$ii" ]
|
||||||
|
then
|
||||||
|
cp -p "/etc/udev/rules.d/$ii" "$DESTDIR/lib/udev/rules.d/"
|
||||||
|
elif [ -e "/lib/udev/rules.d/$ii" ]
|
||||||
|
then
|
||||||
|
cp -p "/lib/udev/rules.d/$ii" "$DESTDIR/lib/udev/rules.d/"
|
||||||
|
else
|
||||||
|
echo "Error: Missing udev rule: $ii"
|
||||||
|
echo " This file must be in the /etc/udev/rules.d or /lib/udev/rules.d directory."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for ii in $COPY_EXEC_LIST
|
||||||
|
do
|
||||||
|
copy_exec "$ii"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -f '/etc/default/zfs' -a -r '/etc/default/zfs' ]
|
||||||
|
then
|
||||||
|
mkdir -p "$DESTDIR/etc/default"
|
||||||
|
cp -a '/etc/default/zfs' "$DESTDIR/etc/default/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d '/etc/zfs' -a -r '/etc/zfs' ]
|
||||||
|
then
|
||||||
|
mkdir -p "$DESTDIR/etc"
|
||||||
|
cp -a '/etc/zfs' "$DESTDIR/etc/"
|
||||||
|
fi
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
## Allow read-only ZoL commands to be called through sudo
|
||||||
|
## without a password. Remove the first '#' column to enable.
|
||||||
|
##
|
||||||
|
## CAUTION: Any syntax error introduced here will break sudo.
|
||||||
|
##
|
||||||
|
## Cmnd alias specification
|
||||||
|
#Cmnd_Alias C_ZFS = \
|
||||||
|
# /sbin/zfs "", /sbin/zfs help *, \
|
||||||
|
# /sbin/zfs get, /sbin/zfs get *, \
|
||||||
|
# /sbin/zfs list, /sbin/zfs list *, \
|
||||||
|
# /sbin/zpool "", /sbin/zpool help *, \
|
||||||
|
# /sbin/zpool iostat, /sbin/zpool iostat *, \
|
||||||
|
# /sbin/zpool list, /sbin/zpool list *, \
|
||||||
|
# /sbin/zpool status, /sbin/zpool status *, \
|
||||||
|
# /sbin/zpool upgrade, /sbin/zpool upgrade -v
|
||||||
|
#
|
||||||
|
## allow any user to use basic read-only ZFS commands
|
||||||
|
#ALL ALL = (root) NOPASSWD: C_ZFS
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Sub-test to exclude ZVOLs
|
||||||
|
set -e
|
||||||
|
partition="$1"
|
||||||
|
|
||||||
|
. /usr/share/os-prober/common.sh
|
||||||
|
|
||||||
|
if [ "$(stat -L -c %t "$partition")" = "e6" ] ; then
|
||||||
|
debug "$1 is a ZVOL; skipping"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No ZVOLs found
|
||||||
|
exit 1
|
||||||
+45
@@ -0,0 +1,45 @@
|
|||||||
|
#!/bin/sh -eu
|
||||||
|
|
||||||
|
# directly exit successfully when zfs module is not loaded
|
||||||
|
if ! [ -d /sys/module/zfs ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# [auto] / enable / disable
|
||||||
|
PROPERTY_NAME="org.debian:periodic-scrub"
|
||||||
|
|
||||||
|
get_property () {
|
||||||
|
# Detect the ${PROPERTY_NAME} property on a given pool.
|
||||||
|
# We are abusing user-defined properties on the root dataset,
|
||||||
|
# since they're not available on pools https://github.com/openzfs/zfs/pull/11680
|
||||||
|
# TODO: use zpool user-defined property when such feature is available.
|
||||||
|
pool="$1"
|
||||||
|
zfs get -H -o value "${PROPERTY_NAME}" "${pool}" 2>/dev/null || return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
scrub_if_not_scrub_in_progress () {
|
||||||
|
pool="$1"
|
||||||
|
if ! zpool status "${pool}" | grep -q "scrub in progress"; then
|
||||||
|
# Ignore errors and continue with scrubbing other pools.
|
||||||
|
zpool scrub "${pool}" || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Scrub all healthy pools that are not already scrubbing as per their configs.
|
||||||
|
zpool list -H -o health,name 2>&1 | \
|
||||||
|
awk -F'\t' '$1 == "ONLINE" {print $2}' | \
|
||||||
|
while read pool
|
||||||
|
do
|
||||||
|
# read user-defined config
|
||||||
|
ret=$(get_property "${pool}")
|
||||||
|
if [ $? -ne 0 ] || [ "disable" = "${ret}" ]; then
|
||||||
|
:
|
||||||
|
elif [ "-" = "${ret}" ] || [ "auto" = "${ret}" ] || [ "enable" = "${ret}" ]; then
|
||||||
|
scrub_if_not_scrub_in_progress "${pool}"
|
||||||
|
else
|
||||||
|
cat > /dev/stderr <<EOF
|
||||||
|
$0: [WARNING] illegal value "${ret}" for property "${PROPERTY_NAME}" of ZFS dataset "${pool}".
|
||||||
|
$0: Acceptable choices for this property are: auto, enable, disable. The default is auto.
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
done
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
#!/bin/sh -u
|
||||||
|
|
||||||
|
# directly exit successfully when zfs module is not loaded
|
||||||
|
if ! [ -d /sys/module/zfs ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# [auto] / enable / disable
|
||||||
|
PROPERTY_NAME="org.debian:periodic-trim"
|
||||||
|
|
||||||
|
get_property () {
|
||||||
|
# Detect the ${PROPERTY_NAME} property on a given pool.
|
||||||
|
# We are abusing user-defined properties on the root dataset,
|
||||||
|
# since they're not available on pools https://github.com/openzfs/zfs/pull/11680
|
||||||
|
# TODO: use zpool user-defined property when such feature is available.
|
||||||
|
pool="$1"
|
||||||
|
zfs get -H -o value "${PROPERTY_NAME}" "${pool}" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
trim_if_not_already_trimming () {
|
||||||
|
pool="$1"
|
||||||
|
if ! zpool status "${pool}" | grep -q "trimming"; then
|
||||||
|
# This will error on HDD-only pools: doesn't matter
|
||||||
|
zpool trim "${pool}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Walk up the kernel parent names:
|
||||||
|
# this will catch devices from LVM &a.
|
||||||
|
get_transp () {
|
||||||
|
dev="$1"
|
||||||
|
while pd="$(lsblk -dnr -o PKNAME "$dev")"; do
|
||||||
|
if [ -z "$pd" ]; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
dev="/dev/$pd"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
lsblk -dnr -o TRAN "$dev"
|
||||||
|
}
|
||||||
|
|
||||||
|
pool_is_nvme_only () {
|
||||||
|
pool="$1"
|
||||||
|
# get a list of devices attached to the specified pool
|
||||||
|
zpool list -vHP "${pool}" | \
|
||||||
|
awk -F'\t' '$2 ~ "^/dev/" {print $2}' | \
|
||||||
|
while read -r dev
|
||||||
|
do
|
||||||
|
[ "$(get_transp "$dev")" = "nvme" ] || return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# TRIM all healthy pools that are not already trimming as per their configs.
|
||||||
|
zpool list -H -o health,name 2>&1 | \
|
||||||
|
awk -F'\t' '$1 == "ONLINE" {print $2}' | \
|
||||||
|
while read -r pool
|
||||||
|
do
|
||||||
|
# read user-defined config
|
||||||
|
ret=$(get_property "${pool}") || continue
|
||||||
|
case "${ret}" in
|
||||||
|
disable);;
|
||||||
|
enable) trim_if_not_already_trimming "${pool}" ;;
|
||||||
|
-|auto) if pool_is_nvme_only "${pool}"; then trim_if_not_already_trimming "${pool}"; fi ;;
|
||||||
|
*) cat > /dev/stderr <<EOF
|
||||||
|
$0: [WARNING] illegal value "${ret}" for property "${PROPERTY_NAME}" of ZFS dataset "${pool}".
|
||||||
|
$0: Acceptable choices for this property are: auto, enable, disable. The default is auto.
|
||||||
|
EOF
|
||||||
|
esac
|
||||||
|
done
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
version=3
|
||||||
|
https://zfsonlinux.org/ .*zfs-([\d\.]+)\.tar\.gz$
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
usr/lib/dracut
|
||||||
|
usr/share/man/man7/dracut.zfs.7
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
../tree/zfs-initramfs/* /
|
||||||
|
usr/share/initramfs-tools/*
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
executable-not-elf-or-script *usr/share/initramfs-tools/scripts/zfs*
|
||||||
Vendored
+15
@@ -0,0 +1,15 @@
|
|||||||
|
sbin/zinject
|
||||||
|
sbin/ztest
|
||||||
|
usr/bin/raidz_test
|
||||||
|
usr/share/man/man1/raidz_test.1
|
||||||
|
usr/share/man/man1/test-runner.1
|
||||||
|
usr/share/man/man1/ztest.1
|
||||||
|
usr/share/man/man8/zinject.8
|
||||||
|
usr/share/zfs/common.sh
|
||||||
|
usr/share/zfs/runfiles/
|
||||||
|
usr/share/zfs/test-runner
|
||||||
|
usr/share/zfs/zfs-tests.sh
|
||||||
|
usr/share/zfs/zfs-tests/
|
||||||
|
usr/share/zfs/zfs.sh
|
||||||
|
usr/share/zfs/zimport.sh
|
||||||
|
usr/share/zfs/zloop.sh
|
||||||
Vendored
+10
@@ -0,0 +1,10 @@
|
|||||||
|
arch-dependent-file-in-usr-share
|
||||||
|
command-in-sbin-has-manpage-in-incorrect-section
|
||||||
|
arch-dep-package-has-big-usr-share
|
||||||
|
manpage-without-executable
|
||||||
|
national-encoding *usr/share/zfs/zfs-tests/tests/functional/channel_program/lua_core/tst.lib_table.lua*
|
||||||
|
executable-not-elf-or-script *usr/share/zfs/zfs-tests/tests/functional/cli_root/*
|
||||||
|
package-contains-documentation-outside-usr-share-doc *usr/share/zfs/zfs-tests/*
|
||||||
|
script-not-executable [usr/share/zfs/common.sh]
|
||||||
|
script-not-executable [usr/share/zfs/zfs-tests/include/default.cfg]
|
||||||
|
script-not-executable [usr/share/zfs/zfs-tests/tests/functional/*]
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
etc/zfs/zed.d/*
|
||||||
|
lib/systemd/system/zfs-zed.service
|
||||||
|
usr/lib/zfs-linux/zed.d/*
|
||||||
|
usr/sbin/zed
|
||||||
|
usr/share/man/man8/zed.8
|
||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
script-not-executable
|
||||||
|
# https://github.com/zfsonlinux/zfs/issues/8064
|
||||||
|
systemd-service-file-refers-to-unusual-wantedby-target
|
||||||
Vendored
+20
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
zedd="/usr/lib/zfs-linux/zed.d"
|
||||||
|
etcd="/etc/zfs/zed.d"
|
||||||
|
|
||||||
|
# enable all default zedlets that are not overridden
|
||||||
|
while read -r file ; do
|
||||||
|
etcfile="${etcd}/${file}"
|
||||||
|
[ -e "${etcfile}" ] && continue
|
||||||
|
ln -sfT "${zedd}/${file}" "${etcfile}"
|
||||||
|
done < "${zedd}/DEFAULT-ENABLED"
|
||||||
|
|
||||||
|
# remove the overrides created in prerm
|
||||||
|
find "${etcd}" -maxdepth 1 -lname '/dev/null' -delete
|
||||||
|
# remove any dangling symlinks to old zedlets
|
||||||
|
find "${etcd}" -maxdepth 1 -lname "${zedd}/*" -xtype l -delete
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
Vendored
+17
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
zedd="/usr/lib/zfs-linux/zed.d"
|
||||||
|
etcd="/etc/zfs/zed.d"
|
||||||
|
|
||||||
|
if [ "$1" = "purge" ] && [ -d "$etcd" ] ; then
|
||||||
|
# remove the overrides created in prerm
|
||||||
|
find "${etcd}" -maxdepth 1 -lname '/dev/null' -delete
|
||||||
|
# remove any dangling symlinks to old zedlets
|
||||||
|
find "${etcd}" -maxdepth 1 -lname "${zedd}/*" -xtype l -delete
|
||||||
|
# clean up any empty directories
|
||||||
|
( rmdir "$etcd" && rmdir "/etc/zfs" ) || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
Vendored
+16
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
zedd="/usr/lib/zfs-linux/zed.d"
|
||||||
|
etcd="/etc/zfs/zed.d"
|
||||||
|
|
||||||
|
if [ "$1" != "failed-upgrade" ] && [ -d "${etcd}" ] && [ -d "${zedd}" ] ; then
|
||||||
|
while read -r file ; do
|
||||||
|
etcfile="${etcd}/${file}"
|
||||||
|
( [ -L "${etcfile}" ] || [ -e "${etcfile}" ] ) && continue
|
||||||
|
ln -sT /dev/null "${etcfile}"
|
||||||
|
done < "${zedd}/DEFAULT-ENABLED"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
||||||
|
|
||||||
|
# TRIM the first Sunday of every month.
|
||||||
|
24 0 1-7 * * root if [ $(date +\%w) -eq 0 ] && [ -x /usr/lib/zfs-linux/trim ]; then /usr/lib/zfs-linux/trim; fi
|
||||||
|
|
||||||
|
# Scrub the second Sunday of every month.
|
||||||
|
24 0 8-14 * * root if [ $(date +\%w) -eq 0 ] && [ -x /usr/lib/zfs-linux/scrub ]; then /usr/lib/zfs-linux/scrub; fi
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
COPYRIGHT
|
||||||
|
LICENSE
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
etc/zfs/vdev_id.conf.alias.example
|
||||||
|
etc/zfs/vdev_id.conf.multipath.example
|
||||||
|
etc/zfs/vdev_id.conf.sas_direct.example
|
||||||
|
etc/zfs/vdev_id.conf.sas_switch.example
|
||||||
|
etc/zfs/vdev_id.conf.scsi.example
|
||||||
Vendored
+137
@@ -0,0 +1,137 @@
|
|||||||
|
../tree/zfsutils-linux/* /
|
||||||
|
etc/default/zfs
|
||||||
|
etc/zfs/zfs-functions
|
||||||
|
etc/zfs/zpool.d/
|
||||||
|
lib/systemd/system-preset/
|
||||||
|
lib/systemd/system/zfs-import-cache.service
|
||||||
|
lib/systemd/system/zfs-import-scan.service
|
||||||
|
lib/systemd/system/zfs-import@.service
|
||||||
|
lib/systemd/system/zfs-import.target
|
||||||
|
lib/systemd/system/zfs-import.service
|
||||||
|
lib/systemd/system/zfs-load-key.service
|
||||||
|
lib/systemd/system/zfs-mount.service
|
||||||
|
lib/systemd/system/zfs-scrub-monthly@.timer
|
||||||
|
lib/systemd/system/zfs-scrub-weekly@.timer
|
||||||
|
lib/systemd/system/zfs-scrub@.service
|
||||||
|
lib/systemd/system/zfs-share.service
|
||||||
|
lib/systemd/system/zfs-trim-monthly@.timer
|
||||||
|
lib/systemd/system/zfs-trim-weekly@.timer
|
||||||
|
lib/systemd/system/zfs-trim@.service
|
||||||
|
lib/systemd/system/zfs-volume-wait.service
|
||||||
|
lib/systemd/system/zfs-volumes.target
|
||||||
|
lib/systemd/system/zfs.target
|
||||||
|
lib/systemd/system-generators/zfs-mount-generator
|
||||||
|
lib/udev/
|
||||||
|
sbin/fsck.zfs
|
||||||
|
sbin/mount.zfs
|
||||||
|
sbin/zdb
|
||||||
|
sbin/zfs
|
||||||
|
sbin/zfs_ids_to_path
|
||||||
|
sbin/zgenhostid
|
||||||
|
sbin/zhack
|
||||||
|
sbin/zpool
|
||||||
|
sbin/zstream
|
||||||
|
sbin/zstreamdump
|
||||||
|
usr/bin/zvol_wait
|
||||||
|
usr/bin/zilstat
|
||||||
|
usr/lib/modules-load.d/ lib/
|
||||||
|
usr/lib/zfs-linux/zfs_prepare_disk
|
||||||
|
usr/lib/zfs-linux/zpool.d/
|
||||||
|
usr/lib/zfs-linux/zpool_influxdb
|
||||||
|
usr/sbin/arc_summary
|
||||||
|
usr/sbin/arcstat
|
||||||
|
usr/sbin/dbufstat
|
||||||
|
usr/share/bash-completion/completions
|
||||||
|
usr/share/man/man8/arcstat.8
|
||||||
|
usr/share/man/man1/zhack.1
|
||||||
|
usr/share/man/man1/zvol_wait.1
|
||||||
|
usr/share/man/man4/zfs.4
|
||||||
|
usr/share/man/man4/spl.4
|
||||||
|
usr/share/man/man5/
|
||||||
|
usr/share/man/man7/vdevprops.7
|
||||||
|
usr/share/man/man7/zfsconcepts.7
|
||||||
|
usr/share/man/man7/zfsprops.7
|
||||||
|
usr/share/man/man7/zpoolconcepts.7
|
||||||
|
usr/share/man/man7/zpoolprops.7
|
||||||
|
usr/share/man/man7/zpool-features.7
|
||||||
|
usr/share/man/man8/fsck.zfs.8
|
||||||
|
usr/share/man/man8/mount.zfs.8
|
||||||
|
usr/share/man/man8/vdev_id.8
|
||||||
|
usr/share/man/man8/zdb.8
|
||||||
|
usr/share/man/man8/zfs-allow.8
|
||||||
|
usr/share/man/man8/zfs-bookmark.8
|
||||||
|
usr/share/man/man8/zfs-change-key.8
|
||||||
|
usr/share/man/man8/zfs-clone.8
|
||||||
|
usr/share/man/man8/zfs-create.8
|
||||||
|
usr/share/man/man8/zfs-destroy.8
|
||||||
|
usr/share/man/man8/zfs-diff.8
|
||||||
|
usr/share/man/man8/zfs-get.8
|
||||||
|
usr/share/man/man8/zfs-groupspace.8
|
||||||
|
usr/share/man/man8/zfs-hold.8
|
||||||
|
usr/share/man/man8/zfs-inherit.8
|
||||||
|
usr/share/man/man8/zfs-list.8
|
||||||
|
usr/share/man/man8/zfs-load-key.8
|
||||||
|
usr/share/man/man8/zfs-mount-generator.8
|
||||||
|
usr/share/man/man8/zfs-mount.8
|
||||||
|
usr/share/man/man8/zfs_prepare_disk.8
|
||||||
|
usr/share/man/man8/zfs-program.8
|
||||||
|
usr/share/man/man8/zfs-project.8
|
||||||
|
usr/share/man/man8/zfs-projectspace.8
|
||||||
|
usr/share/man/man8/zfs-promote.8
|
||||||
|
usr/share/man/man8/zfs-receive.8
|
||||||
|
usr/share/man/man8/zfs-recv.8
|
||||||
|
usr/share/man/man8/zfs-redact.8
|
||||||
|
usr/share/man/man8/zfs-release.8
|
||||||
|
usr/share/man/man8/zfs-rename.8
|
||||||
|
usr/share/man/man8/zfs-rollback.8
|
||||||
|
usr/share/man/man8/zfs-send.8
|
||||||
|
usr/share/man/man8/zfs-set.8
|
||||||
|
usr/share/man/man8/zfs-share.8
|
||||||
|
usr/share/man/man8/zfs-snapshot.8
|
||||||
|
usr/share/man/man8/zfs-unallow.8
|
||||||
|
usr/share/man/man8/zfs-unload-key.8
|
||||||
|
usr/share/man/man8/zfs-unmount.8
|
||||||
|
usr/share/man/man8/zfs-unzone.8
|
||||||
|
usr/share/man/man8/zfs-upgrade.8
|
||||||
|
usr/share/man/man8/zfs-userspace.8
|
||||||
|
usr/share/man/man8/zfs-wait.8
|
||||||
|
usr/share/man/man8/zfs.8
|
||||||
|
usr/share/man/man8/zfs_ids_to_path.8
|
||||||
|
usr/share/man/man8/zgenhostid.8
|
||||||
|
usr/share/man/man8/zpool-add.8
|
||||||
|
usr/share/man/man8/zpool-attach.8
|
||||||
|
usr/share/man/man8/zpool-checkpoint.8
|
||||||
|
usr/share/man/man8/zpool-clear.8
|
||||||
|
usr/share/man/man8/zpool-create.8
|
||||||
|
usr/share/man/man8/zpool-destroy.8
|
||||||
|
usr/share/man/man8/zpool-detach.8
|
||||||
|
usr/share/man/man8/zpool-events.8
|
||||||
|
usr/share/man/man8/zpool-export.8
|
||||||
|
usr/share/man/man8/zpool-get.8
|
||||||
|
usr/share/man/man8/zpool-history.8
|
||||||
|
usr/share/man/man8/zpool-import.8
|
||||||
|
usr/share/man/man8/zpool_influxdb.8
|
||||||
|
usr/share/man/man8/zpool-initialize.8
|
||||||
|
usr/share/man/man8/zpool-iostat.8
|
||||||
|
usr/share/man/man8/zpool-labelclear.8
|
||||||
|
usr/share/man/man8/zpool-list.8
|
||||||
|
usr/share/man/man8/zpool-offline.8
|
||||||
|
usr/share/man/man8/zpool-online.8
|
||||||
|
usr/share/man/man8/zpool-reguid.8
|
||||||
|
usr/share/man/man8/zpool-remove.8
|
||||||
|
usr/share/man/man8/zpool-reopen.8
|
||||||
|
usr/share/man/man8/zpool-replace.8
|
||||||
|
usr/share/man/man8/zpool-resilver.8
|
||||||
|
usr/share/man/man8/zpool-scrub.8
|
||||||
|
usr/share/man/man8/zpool-set.8
|
||||||
|
usr/share/man/man8/zpool-split.8
|
||||||
|
usr/share/man/man8/zpool-status.8
|
||||||
|
usr/share/man/man8/zpool-sync.8
|
||||||
|
usr/share/man/man8/zpool-trim.8
|
||||||
|
usr/share/man/man8/zpool-upgrade.8
|
||||||
|
usr/share/man/man8/zpool-wait.8
|
||||||
|
usr/share/man/man8/zfs-zone.8
|
||||||
|
usr/share/man/man8/zpool.8
|
||||||
|
usr/share/man/man8/zstream.8
|
||||||
|
usr/share/man/man8/zstreamdump.8
|
||||||
|
usr/share/zfs/compatibility.d/
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
sbin/zfs bin/zfs
|
||||||
|
sbin/zpool bin/zpool
|
||||||
|
usr/lib/zfs-linux/zpool_influxdb bin/zpool_influxdb
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
spare-manual-page
|
||||||
|
systemd-service-file-refers-to-unusual-wantedby-target
|
||||||
|
binary-without-manpage *usr/sbin/dbufstat*
|
||||||
|
binary-without-manpage *usr/sbin/arc_summary*
|
||||||
|
manpage-has-errors-from-man
|
||||||
|
appstream-metadata-missing-modalias-provide
|
||||||
|
command-in-sbin-has-manpage-in-incorrect-section
|
||||||
|
package-supports-alternative-init-but-no-init.d-script *lib/systemd/system/zfs-import-cache.service*
|
||||||
|
package-supports-alternative-init-but-no-init.d-script *lib/systemd/system/zfs-import-scan.service*
|
||||||
|
spelling-error-in-manpage
|
||||||
|
package-supports-alternative-init-but-no-init.d-script *lib/systemd/system/zfs-volume-wait.service*
|
||||||
|
systemd-service-file-missing-documentation-key *lib/systemd/system/zfs-volume-wait.service*
|
||||||
|
extra-license-file *usr/share/doc/zfsutils-linux/LICENSE.gz*
|
||||||
Vendored
+19
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
# The hostname and hostid of the last system to access a ZFS pool are stored in
|
||||||
|
# the ZFS pool itself. A pool is foreign if, during `zpool import`, the
|
||||||
|
# current hostname and hostid are different than the stored values thereof.
|
||||||
|
#
|
||||||
|
# The only way of having a stable hostid is to define it in /etc/hostid.
|
||||||
|
# This postinst helper will check if we already have the hostid stabilized by
|
||||||
|
# checking the existence of the file /etc/hostid to be 4 bytes at least.
|
||||||
|
# If this file don't already exists on our system or has less than 4 bytes, then
|
||||||
|
# a new (random) value is generated with zgenhostid (8) and stored in
|
||||||
|
# /etc/hostid
|
||||||
|
|
||||||
|
if [ ! -f /etc/hostid ] || [ "$(stat -c %s /etc/hostid)" -lt 4 ] ; then
|
||||||
|
zgenhostid
|
||||||
|
fi
|
||||||
|
|
||||||
|
#DEBHELPER#
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1,61 +0,0 @@
|
|||||||
spl-linux (0.6.5.7-5~bpo70) unstable; urgency=low
|
|
||||||
|
|
||||||
* rebuild using wheezy
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Tue, 28 Jun 2016 15:41:00 +0200
|
|
||||||
|
|
||||||
spl-linux (0.6.5.7-4~bpo70) unstable; urgency=low
|
|
||||||
|
|
||||||
* update pkg-spl to spl-0.6.5.7-3-wheezy
|
|
||||||
|
|
||||||
* change versioning scheme to allow upgrades from PVE 3.4 to PVE 4.2
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Tue, 28 Jun 2016 13:45:00 +0200
|
|
||||||
|
|
||||||
spl-linux (0.6.5-3~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to 0.6.5.6
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Wed, 30 Mar 2016 11:32:38 +0200
|
|
||||||
|
|
||||||
spl-linux (0.6.5-2~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to 0.6.5.4
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Sun, 17 Jan 2016 14:44:31 +0100
|
|
||||||
|
|
||||||
spl-linux (0.6.5-1~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to master/debian/wheezy/0.6.5-1-wheezy
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Fri, 09 Oct 2015 10:03:25 +0200
|
|
||||||
|
|
||||||
spl-linux (0.6.4-4~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to 0.6.4.2 (snapshot/debian/wheezy/0.6.4-6-37d7cd-wheezy)
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Tue, 21 Jul 2015 07:16:12 +0200
|
|
||||||
|
|
||||||
spl-linux (0.6.4-3~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to 0.6.4.1
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Thu, 30 Apr 2015 07:31:14 +0200
|
|
||||||
|
|
||||||
spl-linux (0.6.4-2~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* include original zol changelog files
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Tue, 14 Apr 2015 07:38:02 +0200
|
|
||||||
|
|
||||||
spl-linux (0.6.4-1~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to 0.6.4 (keep Proxmox VE versioning schema)
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Sun, 12 Apr 2015 09:32:24 +0200
|
|
||||||
|
|
||||||
spl-linux (0.6.3-1~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* first version for Proxmox VE
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Sat, 10 Jan 2015 14:06:34 +0100
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
Index: new/debian/rules
|
|
||||||
===================================================================
|
|
||||||
--- new.orig/debian/rules 2015-10-09 10:02:21.000000000 +0200
|
|
||||||
+++ new/debian/rules 2015-10-09 10:12:04.000000000 +0200
|
|
||||||
@@ -22,9 +22,7 @@
|
|
||||||
KVERS=$(shell uname -r | sed 's/-$(DEB_HOST_ARCH)//')
|
|
||||||
endif
|
|
||||||
|
|
||||||
-CFG_OPTS=--without-selinux \
|
|
||||||
- --with-linux=$(KSRC) \
|
|
||||||
- --with-linux-obj=$(KOBJ)
|
|
||||||
+CFG_OPTS=--without-selinux
|
|
||||||
|
|
||||||
non_epoch_version=$(shell echo $(KVERS) | perl -pe 's/^\d+://')
|
|
||||||
PACKAGE=spl
|
|
||||||
@@ -33,7 +31,7 @@
|
|
||||||
KIMGVER=$(shell dpkg -s linux-image-$(KVERS)-$(DEB_HOST_ARCH) | grep ^Version | sed 's/.*: //')
|
|
||||||
|
|
||||||
%:
|
|
||||||
- dh $@ --with dkms --parallel
|
|
||||||
+ dh $@ --parallel
|
|
||||||
|
|
||||||
override_dh_prep-base-deb-files:
|
|
||||||
sed -e 's/##SHLIB_MAJOR##/$(SHLIB_MAJOR)/g' < debian/control.in > debian/control
|
|
||||||
@@ -75,59 +73,6 @@
|
|
||||||
@# contain the userland sources. NB: Remove-userland-dist-rules.patch
|
|
||||||
$(MAKE) distdir
|
|
||||||
|
|
||||||
- @# Install the DKMS source.
|
|
||||||
- @# We only want the files needed to build the modules
|
|
||||||
- mkdir -p '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)'
|
|
||||||
- touch '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/.nogitrelease'
|
|
||||||
- cp '$(CURDIR)/autogen.sh' '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/'
|
|
||||||
- ( for d in include module config; do \
|
|
||||||
- rm -Rf $(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/$$d; \
|
|
||||||
- done)
|
|
||||||
- $(foreach file,$(DKMSFILES),mv '$(CURDIR)/$(NAME)-$(VERSION)/$(file)' '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)' || exit 1;)
|
|
||||||
- @# Hellish awk line:
|
|
||||||
- @# * Deletes from configure.ac the parts not needed for building the kernel module
|
|
||||||
- @# * It deletes from inside AC_CONFIG_FILES([]) everything except:
|
|
||||||
- @# (Makefile$|include/|module/|*.release$)
|
|
||||||
- @# * Takes care of spaces and tabs
|
|
||||||
- awk '/^AC_CONFIG_FILES\(\[/,/^\]\)/ { if ($$0 !~ /^(AC_CONFIG_FILES\(\[([ \t]+)?$$|\]\)([ \t]+)?$$|([ \t]+)?(include\/|module\/|Makefile([ \t]+)?$$|spl\.release([ \t]+)?$$))/){next} } {print}' \
|
|
||||||
- '$(CURDIR)/$(NAME)-$(VERSION)/configure.ac' > '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/configure.ac'
|
|
||||||
- @# Set "SUBDIRS = module include" for CONFIG_KERNEL and remove SUBDIRS for all other configs.
|
|
||||||
- sed '1,/CONFIG_KERNEL/s/SUBDIRS.*=.*//g;s/SUBDIRS.*=.*/SUBDIRS = module include/g;' \
|
|
||||||
- '$(CURDIR)/$(NAME)-$(VERSION)/Makefile.am' > '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/Makefile.am'
|
|
||||||
- @# Sanity test
|
|
||||||
- grep -q 'SUBDIRS = module include' '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/Makefile.am'
|
|
||||||
- @# Run autogen on the stripped source tree
|
|
||||||
- cd '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)'; ./autogen.sh
|
|
||||||
- rm -fr '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/autom4te.cache'
|
|
||||||
-
|
|
||||||
- @# This shunt allows DKMS to install the Module.symvers and spl_config.h
|
|
||||||
- @# files to the ${dkms_tree} area through the POST_INSTALL directive.
|
|
||||||
- echo '#!/bin/sh' >'$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/cp'
|
|
||||||
- echo 'cp "$$@"' >>'$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/cp'
|
|
||||||
- chmod 755 '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/cp'
|
|
||||||
-
|
|
||||||
- @# Duplicate the dkms directory for module-assistant source package
|
|
||||||
- install -d $(CURDIR)/debian/tmp/usr/src/modules
|
|
||||||
- cp -r $(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION) $(CURDIR)/debian/tmp/usr/src/modules/$(PACKAGE)
|
|
||||||
- mkdir -p $(CURDIR)/debian/tmp/usr/src/modules/$(PACKAGE)/debian
|
|
||||||
- cp debian/copyright debian/module/* \
|
|
||||||
- $(CURDIR)/debian/tmp/usr/src/modules/$(PACKAGE)/debian/
|
|
||||||
- sed 's/^spl-linux /spl-modules /' debian/changelog \
|
|
||||||
- > $(CURDIR)/debian/tmp/usr/src/modules/$(PACKAGE)/debian/changelog
|
|
||||||
- chmod 755 $(CURDIR)/debian/tmp/usr/src/modules/$(PACKAGE)/debian/rules
|
|
||||||
- chown -R root.src $(CURDIR)/debian/tmp
|
|
||||||
- find $(CURDIR)/debian/tmp/usr/src -type d | xargs chmod 755
|
|
||||||
- find $(CURDIR)/debian/tmp/usr/src -type f -perm -100 | xargs chmod 755
|
|
||||||
- find $(CURDIR)/debian/tmp/usr/src -type f -not -perm -100 | xargs chmod 644
|
|
||||||
- chmod 775 $(CURDIR)/debian/tmp/usr/src/modules
|
|
||||||
- cd $(CURDIR)/debian/tmp/usr/src && tar cf $(PACKAGE).tar modules
|
|
||||||
- rm -Rf $(CURDIR)/debian/tmp/usr/src/modules
|
|
||||||
- bzip2 $(CURDIR)/debian/tmp/usr/src/$(PACKAGE).tar
|
|
||||||
- chmod 644 $(CURDIR)/debian/tmp/usr/src/$(PACKAGE).tar.bz2
|
|
||||||
- install -d $(CURDIR)/debian/spl-modules-source/usr/src
|
|
||||||
- mv $(CURDIR)/debian/tmp/usr/src/$(PACKAGE).tar.bz2 $(CURDIR)/debian/spl-modules-source/usr/src/
|
|
||||||
- rm -Rf $(CURDIR)/debian/spl-modules-source/usr/src/$(NAME)-$(VERSION)
|
|
||||||
-
|
|
||||||
override_dh_dkms:
|
|
||||||
dh_dkms -V $(VERSION)
|
|
||||||
|
|
||||||
Index: new/debian/control.in
|
|
||||||
===================================================================
|
|
||||||
--- new.orig/debian/control.in 2015-10-09 10:02:21.000000000 +0200
|
|
||||||
+++ new/debian/control.in 2015-10-09 10:12:44.000000000 +0200
|
|
||||||
@@ -35,30 +35,6 @@
|
|
||||||
This package provides the source to the SPL kernel module in a form
|
|
||||||
suitable for use by module-assistant or kernel-package.
|
|
||||||
|
|
||||||
-Package: spl-dkms
|
|
||||||
-Architecture: all
|
|
||||||
-Depends: linux-headers-amd64, libc6-dev, ${misc:Depends}, dkms (>> 2.1.1.2-5), lsb-release, file
|
|
||||||
-Recommends: spl (>= ${source:Upstream-Version})
|
|
||||||
-Provides: spl-modules
|
|
||||||
-Conflicts: spl-modules-source
|
|
||||||
-Replaces: spl-modules-source
|
|
||||||
-Description: Solaris Porting Layer kernel modules for Linux
|
|
||||||
- The Solaris Porting Layer (SPL) is a Linux kernel module which provides
|
|
||||||
- many of the Solaris kernel APIs. This shim layer makes it possible to
|
|
||||||
- run Solaris kernel code in the Linux kernel with relatively minimal
|
|
||||||
- modification. The Solaris Porting LAyer Tests (SPLAT) is a Linux kernel
|
|
||||||
- module which provides a testing harness for the SPL module.
|
|
||||||
- .
|
|
||||||
- SPL can be particularly useful when you want to track upstream Illumos
|
|
||||||
- (or any other OpenSolaris fork) development closely and don't want the
|
|
||||||
- overhead of maintaining a large patch which converts Solaris primitives
|
|
||||||
- to Linux primitives.
|
|
||||||
- .
|
|
||||||
- This package contains the source code for the SPL and SPLAT Linux kernel
|
|
||||||
- modules, which can be used with DKMS, so that local kernel modules are
|
|
||||||
- automatically built and installed every time the kernel packages are
|
|
||||||
- upgraded.
|
|
||||||
-
|
|
||||||
Package: spl
|
|
||||||
Architecture: linux-any
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
fix-control
|
|
||||||
Submodule
+1
Submodule upstream added at c883088df8
@@ -1,85 +0,0 @@
|
|||||||
zfs-linux (0.6.5.7-5~bpo70) unstable; urgency=low
|
|
||||||
|
|
||||||
* rebuild using wheezy
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Tue, 28 Jun 2016 15:41:00 +0200
|
|
||||||
|
|
||||||
zfs-linux (0.6.5.7-4~bpo70) unstable; urgency=low
|
|
||||||
|
|
||||||
* update pkg-zfs to 0.6.5.7-8-wheezy
|
|
||||||
|
|
||||||
* drop unneeded/non-upstream pull requests:
|
|
||||||
- #1099: iSCSI support for ZoL
|
|
||||||
- #1476: Change sharesmb to use REGISTRY shares for better control by user/admin
|
|
||||||
- #2790: Rewrite of nfs.c to keep options per host separated.
|
|
||||||
- #3238: Allow "zfs unshare <proto> -a" much like "zfs share <proto> -a" (WIP)
|
|
||||||
|
|
||||||
* change versioning scheme to allow upgrades from PVE 3.4 to PVE 4.2
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Tue, 28 Jun 2016 13:45:00 +0200
|
|
||||||
|
|
||||||
zfs-linux (0.6.5-3~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to 0.6.5.6
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Wed, 30 Mar 2016 11:32:59 +0200
|
|
||||||
|
|
||||||
zfs-linux (0.6.5-2~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to 0.6.5.4
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Sun, 17 Jan 2016 14:44:55 +0100
|
|
||||||
|
|
||||||
zfs-linux (0.6.5-1~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to master/debian/wheezy/0.6.5.2-2-wheezy
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Fri, 09 Oct 2015 10:04:04 +0200
|
|
||||||
|
|
||||||
zfs-linux (0.6.4-4~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to 0.6.4.2 (snapshot/debian/wheezy/0.6.4-21-53b1d9-wheezy)
|
|
||||||
|
|
||||||
* use upstream version of /etc/default/zfs
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Tue, 21 Jul 2015 07:17:40 +0200
|
|
||||||
|
|
||||||
zfs-linux (0.6.4-3~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to 0.6.4.1
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Thu, 30 Apr 2015 07:31:44 +0200
|
|
||||||
|
|
||||||
zfs-linux (0.6.4-2~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* cleanup /etc/default/zfs
|
|
||||||
|
|
||||||
* include orignial zol changelog files
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Tue, 14 Apr 2015 07:30:59 +0200
|
|
||||||
|
|
||||||
zfs-linux (0.6.4-1~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* update to 0.6.4
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Sun, 12 Apr 2015 09:33:13 +0200
|
|
||||||
|
|
||||||
zfs-linux (0.6.3-3~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* install init.d file for zed daemon
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Sun, 15 Mar 2015 14:57:30 +0100
|
|
||||||
|
|
||||||
zfs-linux (0.6.3-2~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* use /sbin/modprobe to avoid warning inside initrd
|
|
||||||
|
|
||||||
* fix warning about undefined values inside initrd
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Wed, 14 Jan 2015 19:03:04 +0100
|
|
||||||
|
|
||||||
zfs-linux (0.6.3-1~wheezy) unstable; urgency=low
|
|
||||||
|
|
||||||
* first version for Proxmox VE
|
|
||||||
|
|
||||||
-- Proxmox Support Team <support@proxmox.com> Sat, 10 Jan 2015 14:06:34 +0100
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
Index: new/debian/control.in
|
|
||||||
===================================================================
|
|
||||||
--- new.orig/debian/control.in 2015-10-09 10:02:40.000000000 +0200
|
|
||||||
+++ new/debian/control.in 2015-10-09 10:15:36.000000000 +0200
|
|
||||||
@@ -104,39 +104,9 @@
|
|
||||||
This package provides the source to the SPL kernel module in a form
|
|
||||||
suitable for use by module-assistant or kernel-package.
|
|
||||||
|
|
||||||
-Package: zfs-dkms
|
|
||||||
-Architecture: all
|
|
||||||
-Pre-Depends: spl-dkms
|
|
||||||
-Depends: dkms (>> 2.1.1.2-5), lsb-release, ${misc:Depends}, file
|
|
||||||
-Recommends: zfsutils
|
|
||||||
-Replaces: lzfs, lzfs-dkms, zfs-modules-source
|
|
||||||
-Provides: lustre-backend-fs, lzfs, lzfs-dkms, zfs-modules, zfs-modules-source
|
|
||||||
-Conflicts: lzfs, lzfs-dkms, zfs-modules-source
|
|
||||||
-Description: Native ZFS filesystem kernel modules for Linux
|
|
||||||
- The Z file system is a pooled filesystem designed for maximum data
|
|
||||||
- integrity, supporting data snapshots, multiple copies, and data
|
|
||||||
- checksums.
|
|
||||||
- .
|
|
||||||
- This DKMS package includes the SPA, DMU, ZVOL, and ZPL components of ZFS.
|
|
||||||
-
|
|
||||||
-Package: zfs-dracut
|
|
||||||
-Section: utils
|
|
||||||
-Architecture: linux-any
|
|
||||||
-Depends: dracut,
|
|
||||||
- zfs-modules | zfs-dkms | zfs-modules-source (>= ${source:Version}),
|
|
||||||
- zfsutils, ${misc:Depends}
|
|
||||||
-Description: Native ZFS root filesystem capabilities for Linux
|
|
||||||
- The Z file system is a pooled filesystem designed for maximum data
|
|
||||||
- integrity, supporting data snapshots, multiple copies, and data
|
|
||||||
- checksums.
|
|
||||||
- .
|
|
||||||
- This package adds ZFS to the system initramfs with a hook
|
|
||||||
- for the dracut infrastructure.
|
|
||||||
-
|
|
||||||
Package: zfs-initramfs
|
|
||||||
Architecture: linux-any
|
|
||||||
Depends: initramfs-tools, busybox,
|
|
||||||
- zfs-modules | zfs-dkms | zfs-modules-source (>= ${source:Version}),
|
|
||||||
zfsutils, ${misc:Depends}
|
|
||||||
Description: Native ZFS root filesystem capabilities for Linux
|
|
||||||
The Z file system is a pooled filesystem designed for maximum data
|
|
||||||
@@ -150,7 +120,6 @@
|
|
||||||
Section: admin
|
|
||||||
Architecture: linux-any
|
|
||||||
Depends: initscripts, lsb-base, python, ${misc:Depends}, ${shlibs:Depends}
|
|
||||||
-Recommends: zfs-modules | zfs-dkms | zfs-modules-source (>= ${source:Version})
|
|
||||||
Suggests: nfs-kernel-server, samba-common-bin (>= 3.0.23), zfs-initramfs
|
|
||||||
Conflicts: zfs, zfs-fuse
|
|
||||||
Replaces: zfs
|
|
||||||
Index: new/debian/rules
|
|
||||||
===================================================================
|
|
||||||
--- new.orig/debian/rules 2015-10-09 10:02:40.000000000 +0200
|
|
||||||
+++ new/debian/rules 2015-10-09 10:14:14.000000000 +0200
|
|
||||||
@@ -25,12 +25,10 @@
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifndef SPL
|
|
||||||
-SPLSRC=/usr/src/spl-$(VERSION)
|
|
||||||
+SPLSRC=../pkg-spl
|
|
||||||
endif
|
|
||||||
|
|
||||||
-CFG_OPTS=--with-linux=$(KSRC) \
|
|
||||||
- --with-linux-obj=$(KOBJ) \
|
|
||||||
- --with-spl=$(SPLSRC)
|
|
||||||
+CFG_OPTS=--with-spl=$(SPLSRC)
|
|
||||||
|
|
||||||
non_epoch_version=$(shell echo $(KVERS) | perl -pe 's/^\d+://')
|
|
||||||
PACKAGE=zfs
|
|
||||||
@@ -83,42 +81,6 @@
|
|
||||||
@# Install the utilities.
|
|
||||||
$(MAKE) install DESTDIR='$(CURDIR)/debian/tmp'
|
|
||||||
|
|
||||||
- @# Get a bare copy of the source code for DKMS.
|
|
||||||
- @# This creates the $(CURDIR)/$(NAME)-$(VERSION)/ tree, which does not
|
|
||||||
- @# contain the userland sources. NB: Remove-userland-dist-rules.patch
|
|
||||||
- $(MAKE) distdir
|
|
||||||
-
|
|
||||||
- @# Install the DKMS source.
|
|
||||||
- @# We only want the files needed to build the modules
|
|
||||||
- mkdir -p '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)'
|
|
||||||
- touch '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/.nogitrelease'
|
|
||||||
- cp '$(CURDIR)/autogen.sh' '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/'
|
|
||||||
- ( for d in include module config; do \
|
|
||||||
- rm -Rf $(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/$$d; \
|
|
||||||
- done)
|
|
||||||
- $(foreach file,$(DKMSFILES),mv '$(CURDIR)/$(NAME)-$(VERSION)/$(file)' '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)' || exit 1;)
|
|
||||||
- @# Hellish awk line:
|
|
||||||
- @# * Deletes from configure.ac the parts not needed for building the kernel module
|
|
||||||
- @# * It deletes from inside AC_CONFIG_FILES([]) everything except:
|
|
||||||
- @# (Makefile$|include/|module/|*.release$)
|
|
||||||
- @# * Takes care of spaces and tabs
|
|
||||||
- awk '/^AC_CONFIG_FILES\(\[/,/^\]\)/ { if ($$0 !~ /^(AC_CONFIG_FILES\(\[([ \t]+)?$$|\]\)([ \t]+)?$$|([ \t]+)?(include\/|module\/|Makefile([ \t]+)?$$|zfs\.release([ \t]+)?$$))/){next} } {print}' \
|
|
||||||
- '$(CURDIR)/$(NAME)-$(VERSION)/configure.ac' > '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/configure.ac'
|
|
||||||
- @# Set "SUBDIRS = module include" for CONFIG_KERNEL and remove SUBDIRS for all other configs.
|
|
||||||
- sed '1,/CONFIG_KERNEL/s/SUBDIRS.*=.*//g;s/SUBDIRS.*=.*/SUBDIRS = module include/g;' \
|
|
||||||
- '$(CURDIR)/$(NAME)-$(VERSION)/Makefile.am' > '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/Makefile.am'
|
|
||||||
- @# Sanity test
|
|
||||||
- grep -q 'SUBDIRS = module include' '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/Makefile.am'
|
|
||||||
- @# Run autogen on the stripped source tree
|
|
||||||
- cd '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)'; ./autogen.sh
|
|
||||||
- rm -fr '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/autom4te.cache'
|
|
||||||
-
|
|
||||||
- @# This shunt allows DKMS to install the Module.symvers and zfs_config.h
|
|
||||||
- @# files to the ${dkms_tree} area through the POST_INSTALL directive.
|
|
||||||
- echo '#!/bin/sh' >'$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/cp'
|
|
||||||
- echo 'cp "$$@"' >>'$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/cp'
|
|
||||||
- chmod 755 '$(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION)/cp'
|
|
||||||
-
|
|
||||||
mkdir -p $(CURDIR)/debian/tmp/usr/lib
|
|
||||||
for i in `ls $(CURDIR)/debian/tmp/lib/*.so`; do \
|
|
||||||
ln -s /lib/`readlink $${i}` $(CURDIR)/debian/tmp/usr/lib/`basename $${i}`; \
|
|
||||||
@@ -137,28 +99,6 @@
|
|
||||||
# Fix the includes according to https://github.com/zfsonlinux/zfs/issues/2903
|
|
||||||
./debian/fix_includes-libspl.sh
|
|
||||||
|
|
||||||
- @# Duplicate the dkms directory for module-assistant source package
|
|
||||||
- install -d $(CURDIR)/debian/tmp/usr/src/modules
|
|
||||||
- cp -r $(CURDIR)/debian/tmp/usr/src/$(NAME)-$(VERSION) $(CURDIR)/debian/tmp/usr/src/modules/$(PACKAGE)
|
|
||||||
- mkdir -p $(CURDIR)/debian/tmp/usr/src/modules/$(PACKAGE)/debian
|
|
||||||
- cp debian/copyright debian/module/* \
|
|
||||||
- $(CURDIR)/debian/tmp/usr/src/modules/$(PACKAGE)/debian/
|
|
||||||
- sed 's/^zfs-linux /zfs-modules /' debian/changelog \
|
|
||||||
- > $(CURDIR)/debian/tmp/usr/src/modules/$(PACKAGE)/debian/changelog
|
|
||||||
- chmod 755 $(CURDIR)/debian/tmp/usr/src/modules/$(PACKAGE)/debian/rules
|
|
||||||
- chown -R root.src $(CURDIR)/debian/tmp
|
|
||||||
- find $(CURDIR)/debian/tmp/usr/src -type d | xargs chmod 755
|
|
||||||
- find $(CURDIR)/debian/tmp/usr/src -type f -perm -100 | xargs chmod 755
|
|
||||||
- find $(CURDIR)/debian/tmp/usr/src -type f -not -perm -100 | xargs chmod 644
|
|
||||||
- chmod 775 $(CURDIR)/debian/tmp/usr/src/modules
|
|
||||||
- cd $(CURDIR)/debian/tmp/usr/src && tar cf $(PACKAGE).tar modules
|
|
||||||
- rm -Rf $(CURDIR)/debian/tmp/usr/src/modules
|
|
||||||
- bzip2 $(CURDIR)/debian/tmp/usr/src/$(PACKAGE).tar
|
|
||||||
- chmod 644 $(CURDIR)/debian/tmp/usr/src/$(PACKAGE).tar.bz2
|
|
||||||
- install -d $(CURDIR)/debian/zfs-modules-source/usr/src
|
|
||||||
- mv $(CURDIR)/debian/tmp/usr/src/$(PACKAGE).tar.bz2 $(CURDIR)/debian/zfs-modules-source/usr/src/
|
|
||||||
- rm -Rf $(CURDIR)/debian/zfs-modules-source/usr/src/$(NAME)-$(VERSION)
|
|
||||||
-
|
|
||||||
override_dh_installinit:
|
|
||||||
@# Install systemd files
|
|
||||||
dh_systemd_enable -pzfsutils etc/systemd/system/zfs.target
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
fix-control.patch
|
|
||||||
skip-unneeded-pull-requests.patch
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
diff --git a/debian/patches/series b/debian/patches/series
|
|
||||||
index ffafe6c..9823273 100644
|
|
||||||
--- a/debian/patches/series
|
|
||||||
+++ b/debian/patches/series
|
|
||||||
@@ -1,12 +1,12 @@
|
|
||||||
0002-Prevent-manual-builds-in-the-DKMS-source.patch
|
|
||||||
0005-Remove-userland-dist-rules.patch
|
|
||||||
libzfs-dependencies
|
|
||||||
-PR1099.patch
|
|
||||||
-PR1476.patch
|
|
||||||
+#PR1099.patch
|
|
||||||
+#PR1476.patch
|
|
||||||
PR1867.patch
|
|
||||||
PR2668.patch
|
|
||||||
-PR2790.patch
|
|
||||||
-PR3238.patch
|
|
||||||
+#PR2790.patch
|
|
||||||
+#PR3238.patch
|
|
||||||
PR3465.patch
|
|
||||||
PR3559.patch
|
|
||||||
PR3560.patch
|
|
||||||
Reference in New Issue
Block a user