-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Swap deadlock in 0.7.9 #7734
Comments
@jgallag88 and I have been observing this as well. Here's our bug report with a simple reproducer: System information
Describe the problem you're observingWith We also tested this situation with a This is the memory usage on one our of typical VMs:
Reproducing the problemConfigure a
|
Can reproduce this as well on: System information
swap zvol was created as above with " -o compression=zle-o secondarycache=none" as additional parameters. I could reproduce the issue with plain debian stretch: kernel 4.9.110-3+deb9u4 and zfs 0.7.9 (from stretch-backports) Please let me know if/how I can help in hunting this down/fixing this. console output w/ hung tasks on 4.15.18-4 (ZFS 0.7.9):
|
If possible could you dump the stack from the |
Managed to get the following by running
|
I decided to give this a try and, as advertised, the deadlock is quite easy to reproduce. First, in a 4.14 kernel, it's interesting to note that a bunch of the "page allocation stalls for ..." messages are generated. That particular message, however, was removed in later kernels because it was determined that merely trying to print the message could, itself, cause deadlocks. In a 4.16 kernel, which does not have the message, the processes are in quite a few different states. Among other things, an interesting observation is that the "zvol" tasks are generally in a running (R) state. Most of the regular user processes are in various states of dormancy (D). This sshd process is typical ("?" lines elided for brevity):
Other user dormant user processes such as agetty, etc. all have pretty much identical stacks. As far as ZFS is concerned, in the current deadlocked system I've got running, the only blocked process is "txg_quiesce" with a rather uninteresting stack of:
which is in the The most interesting zfs-related thing is that all the
I'm going to try a couple of things: First, set |
naively i don't see how swap can be expected to work as things are, i think we should document/label this as such @behlendorf given the amount of code complexity and potentially allocations required is supporting swap even realistic? |
@cwedgwood It's definitely been a challenging area to get working and is not heavily stress tested on a wide range of kernels. It was working reliably with older zfs releases and older kernels, but as you say given the code complexity and surface area we'd need to test it's not something I'd recommend. I tend to agree we should make this clearer in the documentation. |
I am using this (swap on zfs) on several production systems (home and work) with recent kernels. Thankfully it has not been an issue for me yet. |
Same issue on Gentoo with ZFS 0.8.0-rc1 and native encryption. |
@inpos Out of curiosity, how did you get 0.8.0-rc1 on Gentoo? I have not finished my review of it, so I haven't pushed it to the main tree yet. I might just push it unkeyworded if people would otherwise be resort to building outside the package manager. |
@behlendorf This was never 100% sane, although the return of the zvol threads certainly did not help. I started (but did not finish) writing a patch that could help with this if finished: https://paste.pound-python.org/show/KWlvrHdBU2mA9ev2odXL/ At this point, it is fairly clear to me that my offline obligations prevent me from speculating on if/when I will finish that, but other developers should be able to see the idea there. It ought to help if/when finished. The current version will NOT compile, so I would prefer it if users did not attempt it. Trying to compile it would be a waste of their time. Alternatively, there is a nuclear option for resolving this. If we treat swap like Illumos treats dump devices by disabling CoW and checksums, things will definitely work. That would be at the expense of protection against bitrot on the swap. This requires modifications to the code because the current codebase is not able to support a zvol in that configuration. Quite honestly, if we were going for the nuclear option, I'd prefer to create a new "dataset" type and implement extent based allocation. @ahrens Not that I am seriously considering this, but it would be nice to hear your thoughts on the nuclear option for dealing with swap. |
On second thought, given that swap devices are simultaneously dump devices on Linux, it might make sense to implement support for creating/writing to Illumos dump devices. That would probably be a good middle ground here. |
I'm not an expert in this area of the code, but I think that swap on ZVOL is inherently unreliable due to writes to the swap ZVOL having to go through the normal TXG sync and ZIO write paths, which can require lots of memory allocations by design (and these memory allocations can stall due to a low memory situation). I believe this to be true for swap on ZVOL for illumos, as well as Linux, and presumably FreeBSD too (although I have no experience using it on FreeBSD, so I could be wrong). I think the "proper" way to address this is to mimic the write path for a ZVOL dump device on illumos, for the ZVOL swap device. i.e. preallocate the ZVOL's blocks on disk, then do a "direct write" to the preallocated LBA such that it doesn't go through the normal TXG sync and ZIO write code paths. This would significantly reduce the amount of work (e.g. memory allocations) that's required to write a swap page to disk, thereby increasing the reliability of that write. The drawback to this approach would be that we wont get the data consistency guarantees that we normally get with ZFS, e.g. data checksums. I think this is a reasonable tradeoff (i.e. swap zvol + no hangs + no checksums vs. swap zvol + hangs + checksums), given that other Linux filesystems are no better (right?). I spent a couple hours reading the ZVOL dump device write codepaths during the OpenZFS dev summit last week, and I think this approach is viable. It'll require porting the code over to work on Linux, where we'll need to rework the code to work with the Linux block device layer, since (IIRC) that's what's used to issue the writes to disk (see With all that said, I've only spent an hour or two looking into this and I don't have any prior experience with swap, so I may be over looking something or flat out wrong in my analysis so far. Also, I won't have any time in the near future to look into this in detail, but I could potentially help answer questions if somebody else wants to try to prototype the changes I'm proposing. |
I took a look at mkswap.c and aside from writing a unique signature to the device it doesn't do anything which would let ZFS easily identify it as a swap device. One solution would be to add a udev helper which detects ZFS volumes with the swap signature and calls |
@behlendorf that's unfortunate; given there's no good entry point to do the preallocation, your two suggestions seem reasonable at first glance. Using a new |
Maybe this wiki page https://github.com/zfsonlinux/pkg-zfs/wiki/HOWTO-use-a-zvol-as-a-swap-device should be edited to warn about this issue? |
I took the liberty of amending the wiki (I've been affected by this as well). It's quite reproducible in v0.6.5.9-5~bpo8+1 running on 3.16.0-7-amd64 (Debian 3.16.59-1), so I look forward to an eventual fix. I've found no sustainable workaround (other than to stop using zvols for swap). |
Thanks @MobyGamer, I'm running ZFS 0.7.12-1~bpo9+1 on Debian Stretch (kernel 4.19.12-1~bpo9+1) on a system with 2GB of RAM and I experienced this issue. I had followed the Debian Stretch Root on ZFS and was lead to believe I should use swap on ZFS. Searching for the cause, there was really nothing in the wiki's about potential down-sides to doing it, and the only "against" I managed to find was this issue. It's good that there is at least some documentation regarding it now 😄. |
@mafredri i updated the wiki. Indeed, we didn't find problems with Swap on ZFS 0.7 branch for a while. |
FYI, this issue is what made us switch from a swap zvol to a dedicated partition at the last minute after user's feedback and our own experience in our installer on ubuntu 19.10. (https://bugs.launchpad.net/bugs/1847628) This is quite an annoying issue as for ext4, we are using for quite a long time a swapfile to prevent too much partionning on user's machine and would like our default ZFS experience to be similar. |
With multi_vdev_crash_dump it should be possible to swap into a preallocated zvol or file, the writes bypassing zfs completely, right? But it is not implemented yet. |
@didrocks I gave some information on a possible approach to address this long term, in my comment above. At this point, I think it's accepted that using a ZVOL for swap will result in instabilities, but we haven't had anybody with the time or motivation to step up and attempt to fix this. I think at least partially, the lack of motivation stems from the fact that (I assume) most folks using ZFS on Linux are not using it for the root filesystem (I use it personally, and so does my employer, so I don't mean this as nobody uses root on ZFS). Now that Ubuntu is officially supporting a root filesystem on ZFS configuration, perhaps that will change. I mean that, both in terms of more users of a root filesystem on ZFS, but also in terms of more developers with sufficient motivation to fix this issue. |
and:
Not that my 2¢ means much as a non-contributor, but I'd personally really prefer to see a design where at least checksums can be maintained functional so the possibility of end-to-end integrity can remain. Can anyone speak to the amount of complexity/effort that that single feature would add to this work? I know above Illumos dump devices were mentioned. I am father unfamiliar with Illumos, but I thought dump and swap devices were not the same thing, and that Illumos actually did use zvols for swap. Am I incorrect, or were the above comparisons not quite valid? |
I think we'd all prefer this, but I don't think it's currently possible if we were to write directly to pre-allocated blocks; due to the checksums being stored in the indirect blocks, and the indirect blocks being written during the pre-allocation rather than when we write out the swap data.
Yes, we used ZVOLs for swap on our illumos based appliance, and we often saw (likely the same) deadlocks for workloads that tried to actually use the swap space. |
I have taken @grahamperrin's suggestion at face value, and initiated a conversation about: |
Zram can spill into a block device (e.g. see |
I doubt it. The problem is that ZFS must allocate memory for I/O to succeed. Linux’s I/O stack does not allow this. One option would be to use a mempool instead. |
Thanks to everyone for thinking about solutions. Seems to be a significant technical challenge. Incompatible differences in software design and architecture. Perhaps some interaction among the experts and gurus of the OpenZFS, BSD, and Linux communities can get this solved. Or, at least begin to create a pathway to solving this in future versions of software. Just a humble thought. |
After many years they managed to fix this problem in Btrfs so I'm sure it will eventually get fixed in zfs as well. |
In general, a thought is to design systems to keep it simple (or make it simple). The goal being to simplify and unify. Wish we can have disks (storage devices) that are simplified. For example, have UEFI boot-able GPT disks each with just a single OpenZFS partition and nothing else. Enhance the UEFI firmware standard to boot from native encrypted ZFS. (So that FAT32 partitions etc are not needed.) Supporting boot to Linux, BSD, etc. And, perhaps solve linux swap files/partitions on ZFS. Would like for systems "to live completely in ZFS". At this time, these concepts are more of a "thought experiment". Probably way too much work for any person. Maybe many people somehow coordinating to do little bits is best. Many thoughts here that could be listed as separate but related technical issues. Thanks again to everyone for their thoughts. |
This bug had been filed when I had stepped away from the project. I was the only one who worked on swap issues. I am back now, but I have a backlog of issues from the past several years to go through. I will not get to this until next year. |
Ryao, Yes, understood. Hope it goes well. Much appreciated. Best regards. Thanks |
man zfs-create:
How ZFS Volumes can be used as swap devices, if "Swap deadlock" problem still exists in ZFS ? May be ZFS documentation should be updated - because it is not possible to use swap on ZFS Volumes, because "Swap deadlock" problem still exists in ZFS ? |
yes, i think it's a little bit weird that documentation mentions zfs volumes for swap and then , at the same time, it's being discouraged using them. |
Make the heading more generic. The subtexts are not solely about ZFS volumes. Grammar: remove the second of the three 'the' words from the phrase below. … After creating the volume with the zfs create -V enable the … Insert a comma. Singular, not plural. Whilst here, express caution. Consider <openzfs#7734> (Swap deadlock in 0.7.9).
From #14756 (comment):
True, to the best of my knowledge. Whilst what's below is not the result of a recent installation, it is probably good enough to show the type of layout that can result from taking the following options at the time of installation of the OS (on a computer with UEFI boot capability):
– if a panic occurs, the non-encrypted physical swap partition is used for the crash dump. |
Re: #14756 (comment)
If I stretch the imagination: not memory pressure cases may include use of swap for crash dumps ;-) Stretching, jokes and Futurama GIFs aside (thanks, @adamdmoss): a concise outline of what's fine, and what's not, might make a good addition to https://openzfs.github.io/openzfs-docs/Project%20and%20Community/FAQ.html#using-a-zvol-for-a-swap-device-on-linux. |
FAQ:
FAQ is Ok, because FAQ show information what swap on zvol can cause deadlock and kernel panic. But current version of zfs-create man page is wrong - it say what zvols can be used for swap, but this is not possible for production use. I use ZFS for production (high load servers with 64 CPU cores, many gigabytes of RAM and many terabytes of storage space) and prefer to see in documentation and ZFS man pages only correct information, without deceit and without misleading. Probably on only me, but other people too, why want to use ZFS in the production with mission critical data. Years ago, in 2021 I ask ZFS developers to make ZFS documentation more clear, and user-friendly for production use:
But as far I can see - people not interested in this - may be because ZFS yet not ready for production use, because too many data corruption still exists in the ZFS code? for, example: list of issues with "data corruption" in the issue title. Also interesting feature request, related to my #11481 feature request:
From my point of view - something is very wrong with ZFS documentation, because critical bugs not tracked and not documented in one place - this make more difficult to use ZFS for the production and storing mission critical data in the ZFS filesystems /zvols. And even more - current version of zfs-create man page is wrong - it falsely reports that zvols can be safely used for swap, but this is not true. Pull request
is movement in the right direction, users of ZFS must understand, what using zvols for swap is not safe and it is not suitable yet for production use. Several times I see kernel panic after tries to use zfs zvols for swap in the Linux. |
Current bug, about Linux swap on zvol deadlock #7734 not documented properly, from my point of view, but talk about OpenZFS documentation update better to continued in this dedicated issue, about documenting data corruption bugs and all other critical bugs in the different OpenZFS versions:
|
Make the section heading more generic (the section relates to ZFS files as well as ZFS volumes). Swapping to a ZFS volume is prone to deadlock. Remove the related instruction, direct readers to OpenZFS FAQ. Related, but not linked from within the manual page: <https://openzfs.github.io/openzfs-docs/Project%20and%20Community/FAQ.html#using-a-zvol-for-a-swap-device-on-linux> (Using a zvol for a swap device on Linux). <openzfs#7734> (Swap deadlock in 0.7.9). Singular, not plural, for non-supported swapping to a file. Pull-request: openzfs#14756 Signed-off-by: Graham Perrin <grahamperrin@freebsd.org>
Make the section heading more generic (the section relates to ZFS files as well as ZFS volumes). Swapping to a ZFS volume is prone to deadlock. Remove the related instruction, direct readers to OpenZFS FAQ. Related, but not linked from within the manual page: <https://openzfs.github.io/openzfs-docs/Project%20and%20Community/FAQ.html#using-a-zvol-for-a-swap-device-on-linux> (Using a zvol for a swap device on Linux). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Graham Perrin <grahamperrin@freebsd.org> Issue #7734 Closes #14756
Make the section heading more generic (the section relates to ZFS files as well as ZFS volumes). Swapping to a ZFS volume is prone to deadlock. Remove the related instruction, direct readers to OpenZFS FAQ. Related, but not linked from within the manual page: <https://openzfs.github.io/openzfs-docs/Project%20and%20Community/FAQ.html#using-a-zvol-for-a-swap-device-on-linux> (Using a zvol for a swap device on Linux). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Graham Perrin <grahamperrin@freebsd.org> Issue openzfs#7734 Closes openzfs#14756
Squashed commit of the following: commit 1e255365c9bf0e7858561d527c0ebdf8f90bc925 Author: Alexander Motin <mav@FreeBSD.org> Date: Tue Jun 27 20:03:37 2023 -0400 ZIL: Fix another use-after-free. lwb->lwb_issued_txg can not be accessed after lwb_state is set to LWB_STATE_FLUSH_DONE and zl_lock is dropped, since the lwb may be freed by zil_sync(). We must save the txg number before that. This is similar to the 55b1842f92, but as I see the bug is not new. It existed for quite a while, just was not triggered due to smaller race window. Reviewed-by: Allan Jude <allan@klarasystems.com> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14988 Closes #14999 commit 233893e7cb7a98895061100ef8363f0ac30204b5 Author: Alexander Motin <mav@FreeBSD.org> Date: Tue Jun 27 20:00:30 2023 -0400 Use big transactions for small recordsize writes. When ZFS appends files in chunks bigger than recordsize, it borrows buffer from ARC and fills it before opening transaction. This supposed to help in case of page faults to not hold transaction open indefinitely. The problem appears when recordsize is set lower than default 128KB. Since each block is committed in separate transaction, per-transaction overhead becomes significant, and what is even worse, active use of of per-dataset and per-pool locks to protect space use accounting for each transaction badly hurts the code SMP scalability. The same transaction size limitation applies in case of file rewrite, but without even excuse of buffer borrowing. To address the issue, disable the borrowing mechanism if recordsize is smaller than default and the write request is 4x bigger than it. In such case writes up to 32MB are executed in single transaction, that dramatically reduces overhead and lock contention. Since the borrowing mechanism is not used for file rewrites, and it was never used by zvols, which seem to work fine, I don't think this change should create significant problems, partially because in addition to the borrowing mechanism there are also used pre-faults. My tests with 4/8 threads writing several files same time on datasets with 32KB recordsize in 1MB requests show reduction of CPU usage by the user threads by 25-35%. I would measure it in GB/s, but at that block size we are now limited by the lock contention of single write issue taskqueue, which is a separate problem we are going to work on. Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14964 commit aea27422747921798a9b9e1b8e0f6230d5672ba5 Author: Laevos <5572812+Laevos@users.noreply.github.com> Date: Tue Jun 27 16:58:32 2023 -0700 Remove unnecessary commas in zpool-create.8 Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Laevos <5572812+Laevos@users.noreply.github.com> Closes #15011 commit 38a821c0d8f6bb51a866354e76078abf6a6ba1fc Author: Alexander Motin <mav@FreeBSD.org> Date: Tue Jun 27 12:09:48 2023 -0400 Another set of vdev queue optimizations. Switch FIFO queues (SYNC/TRIM) and active queue of vdev queue from time-sorted AVL-trees to simple lists. AVL-trees are too expensive for such a simple task. To change I/O priority without searching through the trees, add io_queue_state field to struct zio. To not check number of queued I/Os for each priority add vq_cqueued bitmap to struct vdev_queue. Update it when adding/removing I/Os. Make vq_cactive a separate array instead of struct vdev_queue_class member. Together those allow to avoid lots of cache misses when looking for work in vdev_queue_class_to_issue(). Introduce deadline of ~0.5s for LBA-sorted queues. Before this I saw some I/Os waiting in a queue for up to 8 seconds and possibly more due to starvation. With this change I no longer see it. I had to slightly more complicate the comparison function, but since it uses all the same cache lines the difference is minimal. For a sequential I/Os the new code in vdev_queue_io_to_issue() actually often uses more simple avl_first(), falling back to avl_find() and avl_nearest() only when needed. Arrange members in struct zio to access only one cache line when searching through vdev queues. While there, remove io_alloc_node, reusing the io_queue_node instead. Those two are never used same time. Remove zfs_vdev_aggregate_trim parameter. It was disabled for 4 years since implemented, while still wasted time maintaining the offset-sorted tree of TRIM requests. Just remove the tree. Remove locking from txg_all_lists_empty(). It is racy by design, while 2 pair of locks/unlocks take noticeable time under the vdev queue lock. With these changes in my tests with volblocksize=4KB I measure vdev queue lock spin time reduction by 50% on read and 75% on write. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14925 commit 1737e75ab4e09a2d20e7cc64fa83dae047a302e9 Author: Rich Ercolani <214141+rincebrain@users.noreply.github.com> Date: Mon Jun 26 16:57:12 2023 -0400 Add a delay to tearing down threads. It's been observed that in certain workloads (zvol-related being a big one), ZFS will end up spending a large amount of time spinning up taskqs only to tear them down again almost immediately, then spin them up again... I noticed this when I looked at what my mostly-idle system was doing and wondered how on earth taskq creation/destroy was a bunch of time... So I added a configurable delay to avoid it tearing down tasks the first time it notices them idle, and the total number of threads at steady state went up, but the amount of time being burned just tearing down/turning up new ones almost vanished. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rich Ercolani <rincebrain@gmail.com> Closes #14938 commit 68b8e2ffab23cba6ae87f18c59b044c833934f2f Author: Alexander Motin <mav@FreeBSD.org> Date: Sat Jun 17 22:51:37 2023 -0400 Fix memory leak in zil_parse(). 482da24e2 missed arc_buf_destroy() calls on log parse errors, possibly leaking up to 128KB of memory per dataset during ZIL replay. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Paul Dagnelie <pcd@delphix.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14987 commit ea0d03a8bd040e438bcaa43b8e449cbf717e14f3 Author: George Amanakis <gamanakis@gmail.com> Date: Thu Jun 15 21:45:36 2023 +0200 Shorten arcstat_quiescence sleep time With the latest L2ARC fixes, 2 seconds is too long to wait for quiescence of arcstats like l2_size. Shorten this interval to avoid having the persistent L2ARC tests in ZTS prematurely terminated. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14981 commit 3fa141285b8105b3cc11c1296b77ad6d24250f2c Author: Alexander Motin <mav@FreeBSD.org> Date: Thu Jun 15 13:49:03 2023 -0400 Remove ARC/ZIO physdone callbacks. Those callbacks were introduced many years ago as part of a bigger patch to smoothen the write throttling within a txg. They allow to account completion of individual physical writes within a logical one, improving cases when some of physical writes complete much sooner than others, gradually opening the write throttle. Few years after that ZFS got allocation throttling, working on a level of logical writes and limiting number of writes queued to vdevs at any point, and so limiting latency distribution between the physical writes and especially writes of multiple copies. The addition of scheduling deadline I proposed in #14925 should further reduce the latency distribution. Grown memory sizes over the past 10 years should also reduce importance of the smoothing. While the use of physdone callback may still in theory provide some smoother throttling, there are cases where we simply can not afford it. Since dirty data accounting is protected by pool-wide lock, in case of 6-wide RAIDZ, for example, it requires us to take it 8 times per logical block write, creating huge lock contention. My tests of this patch show radical reduction of the lock spinning time on workloads when smaller blocks are written to RAIDZ pools, when each of the disks receives 8-16KB chunks, but the total rate reaching 100K+ blocks per second. Same time attempts to measure any write time fluctuations didn't show anything noticeable. While there, remove also io_child_count/io_parent_count counters. They are used only for couple assertions that can be avoided. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14948 commit 9efc735904d194987f06870f355e08d94e39ab81 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Wed Jun 14 10:04:05 2023 -0500 ZTS: Skip send_raw_ashift on FreeBSD On FreeBSD 14 this test runs slowly in the CI environment and is killed by the 10 minute timeout. Skip the test on FreeBSD until the slow down is resolved. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #14961 commit 9c54894bfc77f585806984f44c70a839543e6715 Author: Alexander Motin <mav@FreeBSD.org> Date: Wed Jun 14 11:02:27 2023 -0400 Switch refcount tracking from lists to AVL-trees. With large number of tracked references list searches under the lock become too expensive, creating enormous lock contention. On my tests with ZFS_DEBUG enabled this increases write throughput with 32KB blocks from ~1.2GB/s to ~7.5GB/s. Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14970 commit 4e62540827a6ed15e08b2a627896d24bc661fa38 Author: George Amanakis <gamanakis@gmail.com> Date: Wed Jun 14 17:01:17 2023 +0200 Store the L2ARC device ashift in the vdev label If this is not done, and the pool has an ashift other than the default (at the moment 9) then the following happens: 1) vdev_alloc() assigns the ashift of the pool to L2ARC device, but upon export it is not stored anywhere 2) at the first import, vdev_open() sees an vdev_ashift() of 0 and assigns the logical_ashift, which is 9 3) reading the contents of L2ARC, including the header fails 4) L2ARC buffers are not restored in ARC. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14313 Closes #14963 commit adaa3e64ea46f21cc5f544228c48363977b7733e Author: George Amanakis <gamanakis@gmail.com> Date: Sat Jun 10 02:05:47 2023 +0200 Fix the L2ARC write size calculating logic (2) While commit bcd5321 adjusts the write size based on the size of the log block, this happens after comparing the unadjusted write size to the evicted (target) size. In this case l2ad_hand will exceed l2ad_evict and violate an assertion at the end of l2arc_write_buffers(). Fix this by adding the max log block size to the allocated size of the buffer to be committed before comparing the result to the target size. Also reset the l2arc_trim_ahead ZFS module variable when the adjusted write size exceeds the size of the L2ARC device. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14936 Closes #14954 commit 67118a7d6e74a6e818127096162478017610d13e Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 28 12:31:10 2023 +0800 Windows: Finally drop long disabled vdev cache. Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 5d80c98c28c931339138753a4e4c1156dbf951f4 Author: Alexander Motin <mav@FreeBSD.org> Date: Fri Jun 9 15:40:55 2023 -0400 Finally drop long disabled vdev cache. It was a vdev level read cache, designed to aggregate many small reads by speculatively issuing bigger reads instead and caching the result. But since it has almost no idea about what is going on with exception of ZIO_FLAG_DONT_CACHE flag set by higher layers, it was found to make more harm than good, for which reason it was disabled for the past 12 years. These days we have much better instruments to enlarge the I/Os, such as speculative and prescient prefetches, I/O scheduler, I/O aggregation etc. Besides just the dead code removal this removes one extra mutex lock/unlock per write inside vdev_cache_write(), not otherwise disabled and trying to do some work. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14953 commit 1f1ab33781b5736654b988e2e618ea79788fa1f7 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Fri Jun 9 11:10:01 2023 -0700 ZTS: Skip checkpoint_discard_busy Until the ASSERT which is occasionally hit while running checkpoint_discard_busy is resolved skip this test case. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #12053 Closes #14952 commit b94049c2cbedbbe2af8e629bf974a6ed93f11acb Author: Alexander Motin <mav@FreeBSD.org> Date: Fri Jun 9 13:14:05 2023 -0400 Improve l2arc reporting in arc_summary. - Do not report L2ARC as FAULTED in presence of in-flight writes. - Report read and write I/Os, bytes and errors. - Remove few numbers not important to average user. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #12304 Closes #14946 commit 31044b5cfb6f91d376034c4d6374f61baaf03232 Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 28 12:00:39 2023 +0800 Windows: Use list_remove_head() where possible. Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 32eda54d0d75a94b6aa71dc80aa958095feb8011 Author: Alexander Motin <mav@FreeBSD.org> Date: Fri Jun 9 13:12:52 2023 -0400 Use list_remove_head() where possible. ... instead of list_head() + list_remove(). On FreeBSD the list functions are not inlined, so in addition to more compact code this also saves another function call. Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14955 commit fe7693a3f87229d1ae93b5ce2bb84d8bb86a9f5c Author: Alexander Motin <mav@FreeBSD.org> Date: Fri Jun 9 13:08:05 2023 -0400 ZIL: Fix race introduced by f63811f0721. We are not allowed to access lwb after setting LWB_STATE_FLUSH_DONE state and dropping zl_lock, since it may be freed by zil_sync(). To free itxs and waiters after dropping the lock we need to move lwb_itxs and lwb_waiters lists elements to local storage. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14957 Closes #14959 commit 44c5a0c92f98e8c21221bd7051729d1947a10736 Author: Rich Ercolani <214141+rincebrain@users.noreply.github.com> Date: Wed Jun 7 14:14:05 2023 -0400 Revert "systemd: Use non-absolute paths in Exec* lines" This reverts commit 79b20949b25c8db4d379f6486b0835a6613b480c since it doesn't work with the systemd version shipped with RHEL7-based systems. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rich Ercolani <rincebrain@gmail.com> Closes #14943 Closes #14945 commit ba5af00257eb4eb3363f297819a21c4da811392f Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Wed Jun 7 10:43:43 2023 -0700 Linux: Never sleep in kmem_cache_alloc(..., KM_NOSLEEP) (#14926) When a kmem cache is exhausted and needs to be expanded a new slab is allocated. KM_SLEEP callers can block and wait for the allocation, but KM_NOSLEEP callers were incorrectly allowed to block as well. Resolve this by attempting an emergency allocation as a best effort. This may fail but that's fine since any KM_NOSLEEP consumer is required to handle an allocation failure. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Adam Moss <c@yotes.com> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Tony Hutter <hutter2@llnl.gov> commit d4ecd4efde1692641d1d0b89851e7a15e90632f8 Author: George Amanakis <gamanakis@gmail.com> Date: Tue Jun 6 21:32:37 2023 +0200 Fix the L2ARC write size calculating logic l2arc_write_size() should return the write size after adjusting for trim and overhead of the L2ARC log blocks. Also take into account the allocated size of log blocks when deciding when to stop writing buffers to L2ARC. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14939 commit 8692ab174e18faf444681d67d7ea4418600553cc Author: Rob Norris <rob.norris@klarasystems.com> Date: Wed Mar 15 18:18:10 2023 +1100 zdb: add -B option to generate backup stream This is more-or-less like `zfs send`, but specifying the snapshot by its objset id for situations where it can't be referenced any other way. Sponsored-By: Klara, Inc. Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Reviewed-by: WHR <msl0000023508@gmail.com> Signed-off-by: Rob Norris <rob.norris@klarasystems.com> Closes #14642 commit df84ca3f3bf9f265ebc76de17394df529fd07af6 Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 28 11:05:55 2023 +0800 Windows: znode: expose zfs_get_zplprop to libzpool Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 944c58247a13a92c9e4ffb2c0a9e6b6293dca37e Author: Rob Norris <rob.norris@klarasystems.com> Date: Sun Jun 4 11:14:20 2023 +1000 znode: expose zfs_get_zplprop to libzpool There's no particular reason this function should be kernel-only, and I want to use it (indirectly) from zdb. I've moved it to zfs_znode.c because libzpool does not compile in zfs_vfsops.c, and this at least matches the header its imported from. Sponsored-By: Klara, Inc. Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Reviewed-by: WHR <msl0000023508@gmail.com> Signed-off-by: Rob Norris <rob.norris@klarasystems.com> Closes #14642 commit 429f58cdbb195c8d50ed95c7309ee54d37526b70 Author: Alexander Motin <mav@FreeBSD.org> Date: Mon Jun 5 14:51:44 2023 -0400 Introduce zfs_refcount_(add|remove)_few(). There are two places where we need to add/remove several references with semantics of zfs_refcount_(add|remove). But when debug/tracing is disabled, it is a crime to run multiple atomic_inc() in a loop, especially under congested pool-wide allocator lock. Introduced new functions implement the same semantics as the loop, but without overhead in production builds. Reviewed-by: Rich Ercolani <rincebrain@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14934 commit 077c2f359feb69a13bee37ac4220d271d1c7bf27 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Mon Jun 5 11:08:24 2023 -0700 Linux 6.3 compat: META (#14930) Update the META file to reflect compatibility with the 6.3 kernel. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tony Hutter <hutter2@llnl.gov> commit c2fcd6e484107fc7435087771757e88ba84f6093 Author: Graham Perrin <grahamperrin@gmail.com> Date: Fri Jun 2 19:25:13 2023 +0100 zfs-create(8): ZFS for swap: caution, clarity Make the section heading more generic (the section relates to ZFS files as well as ZFS volumes). Swapping to a ZFS volume is prone to deadlock. Remove the related instruction, direct readers to OpenZFS FAQ. Related, but not linked from within the manual page: <https://openzfs.github.io/openzfs-docs/Project%20and%20Community/FAQ.html#using-a-zvol-for-a-swap-device-on-linux> (Using a zvol for a swap device on Linux). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Graham Perrin <grahamperrin@freebsd.org> Issue #7734 Closes #14756 commit 251dbe83e14085a26100aa894d79772cbb69dcda Author: Alexander Motin <mav@FreeBSD.org> Date: Fri Jun 2 14:01:58 2023 -0400 ZIL: Allow to replay blocks of any size. There seems to be no reason for ZIL blocks to be limited by 128KB other than replay code is written in such a way. This change does not increase the limit yet, just removes the artificial limitation. Avoided extra memcpy() may save us a second during replay. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Prakash Surya <prakash.surya@delphix.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14910 commit 76170249d538965655dbd3206cd59566b1d3944b Author: Val Packett <val@packett.cool> Date: Thu May 11 18:16:57 2023 -0300 PAM: enable testing on FreeBSD Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit d1b68a45441cae8c399a8a3ed60b29726ed031ff Author: Val Packett <val@packett.cool> Date: Fri May 5 22:17:12 2023 -0300 PAM: support password changes even when not mounted There's usually no requirement that a user be logged in for changing their password, so let's not be surprising here. We need to use the fetch_lazy mechanism for the old password to avoid a double prompt for it, so that mechanism is now generalized a bit. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit 7424feff72f1e17ea27bcfe0d36cabce7c732eea Author: Val Packett <val@packett.cool> Date: Fri May 5 22:34:58 2023 -0300 PAM: add 'uid_min' and 'uid_max' options for changing the uid range Instead of a fixed >=1000 check, allow the configuration to override the minimum UID and add a maximum one as well. While here, add the uid range check to the authenticate method as well, and fix the return in the chauthtok method (seems very wrong to report success when we've done absolutely nothing). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit fc9e012f5fc7e7997acee2b6d8d759622b319f0e Author: Val Packett <val@packett.cool> Date: Fri May 5 22:02:13 2023 -0300 PAM: add 'forceunmount' flag Probably not always a good idea, but it's nice to have the option. It is a workaround for FreeBSD calling the PAM session end earier than the last process is actually done touching the mount, for example. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit a39ed83bd31cc0c8c98dc3c4cc3d11b03d9af620 Author: Val Packett <val@packett.cool> Date: Fri May 5 19:35:57 2023 -0300 PAM: add 'recursive_homes' flag to use with 'prop_mountpoint' It's not always desirable to have a fixed flat homes directory. With the 'recursive_homes' flag, 'prop_mountpoint' search would traverse the whole tree starting at 'homes' (which can now be '*' to mean all pools) to find a dataset with a mountpoint matching the home directory. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit 7f8d5ef815b7559fcc671ff2add33ba9c2a74867 Author: Val Packett <val@packett.cool> Date: Fri May 5 21:56:39 2023 -0300 PAM: use boolean_t for config flags Since we already use boolean_t in the file, we can use it here. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit e2872932c85189f06a68f0ad10bd8eb6895d79c2 Author: Val Packett <val@packett.cool> Date: Fri May 5 20:00:48 2023 -0300 PAM: do not fail to mount if the key's already loaded If we're expecting a working home directory on login, it would be rather frustrating to not have it mounted just because it e.g. failed to unmount once on logout. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit b897137e2044c3ef6120820f753d940b7dfb58be Author: Rich Ercolani <214141+rincebrain@users.noreply.github.com> Date: Wed May 31 19:58:41 2023 -0400 Revert "initramfs: use `mount.zfs` instead of `mount`" This broke mounting of snapshots on / for users. See https://github.com/openzfs/zfs/issues/9461#issuecomment-1376162949 for more context. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rich Ercolani <rincebrain@gmail.com> Closes #14908 commit 10cde4f8f60d4d55887d7122a5742e6e4f90280c Author: Luís Henriques <73643340+lumigch@users.noreply.github.com> Date: Tue May 30 23:15:24 2023 +0100 Fix NULL pointer dereference when doing concurrent 'send' operations A NULL pointer will occur when doing a 'zfs send -S' on a dataset that is still being received. The problem is that the new 'send' will rightfully fail to own the datasets (i.e. dsl_dataset_own_force() will fail), but then dmu_send() will still do the dsl_dataset_disown(). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Luís Henriques <henrix@camandro.org> Closes #14903 Closes #14890 commit 12452d79a3fd29af1dc0b95f3e367e3ce339702b Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Mon May 29 12:55:35 2023 -0700 ZTS: zvol_misc_trim disable blk mq Disable the zvol_misc_fua.ksh and zvol_misc_trim.ksh test cases on impacted kernels. This issue is being actively worked in #14872 and as part of that fix this commit will be reverted. VERIFY(zh->zh_claim_txg == 0) failed PANIC at zil.c:904:zil_create() Reviewed-by: Tony Hutter <hutter2@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #14872 Closes #14870 commit 803c04f233e60a2d23f0463f299eba96c0968602 Author: Richard Yao <richard.yao@alumni.stonybrook.edu> Date: Fri May 26 18:47:52 2023 -0400 Use __attribute__((malloc)) on memory allocation functions This informs the C compiler that pointers returned from these functions do not alias other functions, which allows it to do better code optimization and should make the compiled code smaller. References: https://stackoverflow.com/a/53654773 https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute https://clang.llvm.org/docs/AttributeReference.html#malloc Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14827 commit 64d8bbe15f77876ae9639b9971a743776a41bf9a Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Fri May 26 15:39:23 2023 -0700 ZTS: Add zpool_resilver_concurrent exception The zpool_resilver_concurrent test case requires the ZED which is not used on FreeBSD. Add this test to the known list of skipped tested for FreeBSD. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #14904 commit e396d30d29ed131194605222e6ba1fec1ef8b2ca Author: Mike Swanson <mikeonthecomputer@gmail.com> Date: Fri May 26 15:37:15 2023 -0700 Add compatibility symlinks for FreeBSD 12.{3,4} and 13.{0,1,2} Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Mike Swanson <mikeonthecomputer@gmail.com> Closes #14902 commit f6dd0b8c1cc41707d299b7123f80912f43d03340 Author: Colm <colm@tuatha.org> Date: Fri May 26 10:04:19 2023 -0700 Adding new read-only compatible zpool features to compatibility.d/grub2 GRUB2 is compatible with all "read-only compatible" features, so it is safe to add new features of this type to the grub2 compatibility list. We generally want to include all compatible features, to minimize the differences between grub2-compatible pools and no-compatibility pools. Adding new properties `livelist` and `zpool_checkpoint` accordingly. Also adding them to the man page which references this file as an example, for consistency. Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Colm Buckley <colm@tuatha.org> Closes #14893 commit 013d3a1e0e00d83dabe70837b23dab48c1bac592 Author: Richard Yao <richard.yao@alumni.stonybrook.edu> Date: Fri May 26 13:03:12 2023 -0400 btree: Implement faster binary search algorithm This implements a binary search algorithm for B-Trees that reduces branching to the absolute minimum necessary for a binary search algorithm. It also enables the compiler to inline the comparator to ensure that the only slowdown when doing binary search is from waiting for memory accesses. Additionally, it instructs the compiler to unroll the loop, which gives an additional 40% improve with Clang and 8% improvement with GCC. Consumers must opt into using the faster algorithm. At present, only B-Trees used inside kernel code have been modified to use the faster algorithm. Micro-benchmarks suggest that this can improve binary search performance by up to 3.5 times when compiling with Clang 16 and up to 1.9 times when compiling with GCC 12.2. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14866 commit 1854df330aa57cda39f076e8ab11e17ca3697bb8 Author: George Amanakis <gamanakis@gmail.com> Date: Fri May 26 18:53:00 2023 +0200 Fix inconsistent definition of zfs_scrub_error_blocks_per_txg Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14894 commit 8735e6ac03742fcf43adde3ce127af698a32c53a Author: Damiano Albani <damiano.albani@gmail.com> Date: Fri May 26 01:10:54 2023 +0200 Add missing files to Debian DKMS package Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Reviewed-by: Umer Saleem <usaleem@ixsystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Damiano Albani <damiano.albani@gmail.com> Closes #14887 Closes #14889 commit d439021bd05a5cc0bb271a5470abb67af2f7bcda Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Thu May 25 13:53:08 2023 -0700 Update compatibility.d files Add an openzfs-2.2 compatibility file for the next release. Edon-R support has been enabled for FreeBSD removing the need for different FreeBSD and Linux files. Symlinks for the -linux and -freebsd names are created for any scripts expecting that convention. Additionally, a symlink for ubunutu-22.04 was added. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #14833 commit da54d5f3f9576b958e3eadf4f4d8f68c91b3d6e4 Author: Alexander Motin <mav@FreeBSD.org> Date: Thu May 25 16:51:53 2023 -0400 zil: Add some more statistics. In addition to a number of actual log bytes written, account also a total written bytes including padding and total allocated bytes (bytes <= write <= alloc). It should allow to monitor zil traffic and space efficiency. Add dtrace probe for zil block size selection. Make zilstat report more information and fit it into less width. Reviewed-by: Ameer Hamza <ahamza@ixsystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14863 commit faa4955023d089668bd6c564c195a933d1eac455 Author: Alexander Motin <mav@FreeBSD.org> Date: Thu May 25 12:48:43 2023 -0400 ZIL: Reduce scope of per-dataset zl_issuer_lock. Before this change ZIL copied all log data while holding the lock. It caused huge lock contention on workloads with many big parallel writes. This change splits the process into two parts: first, zil_lwb_assign() estimates the log space needed for all transactions, and zil_lwb_write_close() allocates blocks and zios while holding the lock, then, after the lock in dropped, zil_lwb_commit() copies the data, and zil_lwb_write_issue() issues the I/Os. Also while there slightly reduce scope of zl_lock. Reviewed-by: Paul Dagnelie <pcd@delphix.com> Reviewed-by: Prakash Surya <prakash.surya@delphix.com> Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14841 commit f77b9f7ae83834ade1da21cfc16b8a273df3acfc Author: Dimitri John Ledkov <19779+xnox@users.noreply.github.com> Date: Wed May 24 20:31:28 2023 +0100 systemd: Use non-absolute paths in Exec* lines Since systemd v239, Exec* binaries are resolved from PATH when they are not-absolute. Switch to this by default for ease of downstream maintenance. Many downstream distributions move individual binaries to locations that existing compile-time configurations cannot accommodate. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com> Closes #14880 commit 4bfb9d28cffd4dfeb4b91359b497d100f668bb34 Author: Akash B <akash-b@hpe.com> Date: Thu May 25 00:58:09 2023 +0530 Fix concurrent resilvers initiated at same time For draid vdevs it was possible to initiate both the sequential and healing resilver at same time. This fixes the following two scenarios. 1) There's a window where a sequential rebuild can be started via ZED even if a healing resilver has been scheduled. - This is fixed by adding additional check in spa_vdev_attach() for any scheduled resilver and return appropriate error code when a resilver is already in progress. 2) It was possible for zpool clear to start a healing resilver when it wasn't needed at all. This occurs because during a vdev_open() the device is presumed to be healthy not until the device is validated by vdev_validate() and it's set unavailable. However, by this point an async resilver will have already been requested if the DTL isn't empty. - This is fixed by cancelling the SPA_ASYNC_RESILVER request immediately at the end of vdev_reopen() when a resilver is unneeded. Finally, added a testcase in ZTS for verification. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Dipak Ghosh <dipak.ghosh@hpe.com> Signed-off-by: Akash B <akash-b@hpe.com> Closes #14881 Closes #14892 commit c9bb406d177a00aa1f0058d29aeb29e478223273 Author: youzhongyang <youzhong@gmail.com> Date: Wed May 24 15:23:42 2023 -0400 Linux 6.4 compat: reclaimed_slab renamed to reclaimed Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Youzhong Yang <yyang@mathworks.com> Closes #14891 commit 79e61a873b136f13fcf140beb925ceddc1f94767 Author: Brian Atkinson <batkinson@lanl.gov> Date: Fri May 19 16:05:53 2023 -0400 Hold db_mtx when updating db_state Commit 555ef90 did some general code refactoring for dmu_buf_will_not_fill() and dmu_buf_will_fill(). However, the db_mtx was not held when update db->db_state in those code block. The rest of the dbuf code always holds the db_mtx when updating db_state. This is important because cv_wait() db_changed is used to check for db_state changes. Updating dmu_buf_will_not_fill() and dmu_buf_will_fill() to hold the db_mtx when updating db_state. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Brian Atkinson <batkinson@lanl.gov> Closes #14875 commit d7be0cdf93a568b6c9b4a4e15a88a5d88ebbb764 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Fri May 19 13:05:09 2023 -0700 Probe vdevs before marking removed Before allowing the ZED to mark a vdev as REMOVED due to a hotplug event confirm that it is non-responsive with probe. Any device which can be successfully probed should be left ONLINE to prevent a healthy pool from being incorrectly SUSPENDED. This may occur for at least the following two scenarios. 1) Drive expansion (zpool online -e) in VMware environments. If, during the partition resize operation, a partition is removed and re-created then udev will send a removed event. 2) Re-scanning the namespaces of an NVMe device (nvme ns-rescan) may result in a udev remove and add event being delivered. Finally, update the ZED to only kick in a spare when the removal was successful. Reviewed-by: Ameer Hamza <ahamza@ixsystems.com> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #14859 Closes #14861 commit 054bb22686045ea1499065a4456568f0c21d939b Author: Andrew Innes <andrew.c12@gmail.com> Date: Tue Jun 27 09:20:56 2023 +0800 Windows: Teach zpool scrub to scrub only blocks in error log Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit b61e89a3e68ae19819493183ff3d1fe7bf4ffe2b Author: George Amanakis <gamanakis@gmail.com> Date: Fri Dec 17 21:35:28 2021 +0100 Teach zpool scrub to scrub only blocks in error log Added a flag '-e' in zpool scrub to scrub only blocks in error log. A user can pause, resume and cancel the error scrub by passing additional command line arguments -p -s just like a regular scrub. This involves adding a new flag, creating new libzfs interfaces, a new ioctl, and the actual iteration and read-issuing logic. Error scrubbing is executed in multiple txg to make sure pool performance is not affected. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Co-authored-by: TulsiJain tulsi.jain@delphix.com Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #8995 Closes #12355 commit 61bfb3cb5dd792ec7ca0fbfca59b165f3ddbe1f5 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Thu May 18 10:02:20 2023 -0700 Add the ability to uninitialize zpool initialize functions well for touching every free byte...once. But if we want to do it again, we're currently out of luck. So let's add zpool initialize -u to clear it. Co-authored-by: Rich Ercolani <rincebrain@gmail.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rich Ercolani <rincebrain@gmail.com> Closes #12451 Closes #14873 commit 855b62942d4ca5dab3d65b7000f9d284fd1560bb Author: Antonio Russo <aerusso@aerusso.net> Date: Mon May 15 17:11:33 2023 -0600 test-runner: pass kmemleak and kmsg to Cmd.run test-runner.py orchestrates all of the ZTS executions. The `Cmd` object manages these process, and its `run` method specifically invokes these possibly long-running processes, possibly retrying in the event of a timeout. Since its inception, memory leak detection using the kmemleak infrastructure [1], and kernel logging [2] have been added to this run mechanism. However, the callback to cull a process beyond its timeout threshold, `kill_cmd`, has evaded modernization by both of these changes. As a result, this function fails to properly invoke `run`, leading to an untrapped exception and unreported test failure. This patch extends `kill_cmd` to receive these kernel devices through the `options` parameter, and regularizes all the `.run` calls from `Cmd`, and its subclasses, to accept that parameter. [1] Commit a69765ea5b563e0cd4d15fac4b1ac08c6ccf12d1 [2] Commit fc2c0256c55a2859d1988671b0896d22b75c8aba Reviewed-by: John Wren Kennedy <john.kennedy@delphix.com> Signed-off-by: Antonio Russo <aerusso@aerusso.net> Closes #14849 commit 537939565123fd2afa097e9a56ee3efd28779e5f Author: Richard Yao <richard.yao@alumni.stonybrook.edu> Date: Fri May 12 17:10:14 2023 -0400 Fix undefined behavior in spa_sync_props() 8eae2d214cfa53862833eeeda9a5c1e9d5ded47d caused Coverity to begin complaining about "Improper use of negative value" in two places in spa_sync_props() because Coverity correctly inferred from `prop == ZPOOL_PROP_INVAL` that prop could be -1 while both zpool_prop_to_name() and zpool_prop_get_type() use it an array index, which is undefined behavior. Assuming that the system does not panic from an attempt to read invalid memory, the case statement for ZPOOL_PROP_INVAL will ensure that only user properties will reach this code when prop is ZPOOL_PROP_INVAL, such that execution will continue safely. However, if we are unlucky enough to read invalid memory, then the system will panic. This issue predates the patch that caused coverity to begin complaining. Thankfully, our userland tools do not pass nonsense to us, so this bug should not be triggered unless a future userland tool attempts to set a property that we do not understand. Reported-by: Coverity (CID-1561129) Reported-by: Coverity (CID-1561130) Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: George Amanakis <gamanakis@gmail.com> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14860 commit 02351b380f0430980bfb92e83d0800df104bd06a Author: Richard Yao <richard.yao@alumni.stonybrook.edu> Date: Fri May 12 16:47:56 2023 -0400 Fix use after free regression in spa_remove_healed_errors() 6839ec6f1098c28ff7b772f1b31b832d05e6b567 placed code in spa_remove_healed_errors() that uses a pointer after the kmem_free() call that frees it. Reported-by: Coverity (CID-1562375) Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: George Amanakis <gamanakis@gmail.com> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14860 commit e9b315ffb79ff6419694a2713fcd5fd448317904 Author: Andrew Innes <andrew.c12@gmail.com> Date: Mon May 15 13:52:35 2023 +0800 Use python3 on windows commit 3346a5b78c2db15801ce54a70a323952fdf67fa5 Author: Jorgen Lundman <lundman@lundman.net> Date: Thu Jun 22 08:56:38 2023 +0900 zfs_write() ignores errors If files were advanced by zfs_freesp() we ignored any errors returned by it. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit cce49c08316bc6a5dff287f4fa15856e26d5b18a Author: Jorgen Lundman <lundman@lundman.net> Date: Thu Jun 22 08:55:55 2023 +0900 Correct Stream event path The Stream path events used the incorrect name "stream", now uses "file.txt:stream" as per ntfs. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 0f83d31e288d789fb4e10a7e4b12e27887820498 Author: Jorgen Lundman <lundman@lundman.net> Date: Wed Jun 21 14:30:13 2023 +0900 Add stub for file_hard_link_information() Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 8d6db9490364e4d281546445571d2ca9d5abda22 Author: Jorgen Lundman <lundman@lundman.net> Date: Wed Jun 21 14:29:43 2023 +0900 Return correct FileID in dirlist Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 4c011397229e3c38259d6956458a4fd287dca72d Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 21 10:17:30 2023 +0800 Fix logic (#232) Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 467436b676ad897025b7ed90d8f033969da441cc Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 21 09:47:38 2023 +0800 Run winbtrfs tests by default (#231) Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 56eca2a5d116c66b10579f9cf6d5f271991c7e2e Author: Jorgen Lundman <lundman@lundman.net> Date: Wed Jun 21 09:54:00 2023 +0900 SetFilePositionInformation SetFileValidDataLengthInformation Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit b4fbbda470f27aee565dfa9bc0d68217b969339c Author: Andrew Innes <andrew.c12@gmail.com> Date: Tue Jun 20 16:33:12 2023 +0800 Add sleep to tests (#230) Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 94f1f52807d1f8c0c2931e9e52b91f0ce5e488f4 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue Jun 20 16:53:50 2023 +0900 CreateFile of newfile:newstream should create both In addition, many more stream fixes, illegal chars, and names Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 894d512880d39ecf40e841c6d7b73157dfe397e0 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue Jun 20 08:41:37 2023 +0900 Windows streams should return parent file ID When asked for File ID of a stream, it should return the FileID of the parent file, which is two levels up. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 0cc45d2154a2866b2f494c3790a57555c29e60c3 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue Jun 20 08:32:44 2023 +0900 Support FILE_STANDARD_INFORMATION_EX Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit a6edd02999d581db56f4a53567f4c5db11778f64 Author: Jorgen Lundman <lundman@lundman.net> Date: Mon Jun 19 10:36:13 2023 +0900 Add xattr compat code from upstream and adjust calls to new API calls. This adds xattr=sa support to Windows. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 0e1476a3942990385d32c02403ebe2c815d567db Author: Jorgen Lundman <lundman@lundman.net> Date: Wed Jun 14 11:56:09 2023 +0900 Set EA can panic Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 4a1adef6b8c2851195d692a42d5718c9a1b03490 Author: Jorgen Lundman <lundman@lundman.net> Date: Wed Jun 14 09:49:57 2023 +0900 Incorrect MAXPATH used in delete entry Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 2c0d119e37cb3eed1acac90efa9fe0f8c173e0f0 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue Jun 13 16:19:42 2023 +0900 Large changes fixing FS notify events Some incorrect behavior still, query name of a stream is wrong. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 5b2b2b0550a493497a0b460206079fd57c639543 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue May 16 14:42:52 2023 +0900 file name and file full information buffer overrun When a buffer is not big enough, we would still null terminate on the full string, beyond the supplied buffer. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 94bfb92951a5ccdef7b2a1fb818fafdafbc4fff0 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue May 16 11:48:12 2023 +0900 Correct Query EA and Query Streams Which includes: * NextEntryOffset is not offset from Buffer, but from one struct to the next struct. * Pack only complete EAs, and return Overflow if does not fit * query file EA information would return from Information=size * Call cleareaszie on VP when EAs have changed Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 9c7a4071fcfc99c3308620fc1943355f9ade34b3 Author: Alexander Motin <mav@FreeBSD.org> Date: Fri May 12 12:49:26 2023 -0400 zil: Free lwb_buf after write completion. There is no sense to keep that memory allocated during the flush. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Prakash Surya <prakash.surya@delphix.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14855 commit 7e91b3222ddaadc10c92d1065529886dd3806acc Author: Alexander Motin <mav@FreeBSD.org> Date: Fri May 12 12:14:29 2023 -0400 zil: Some micro-optimizations. Should not cause functional changes. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14854 commit 6b62c3b0e10de782c3aef0e1206aa48875519c4e Author: Don Brady <dev.fs.zfs@gmail.com> Date: Fri May 12 10:12:28 2023 -0600 Refine special_small_blocks property validation When the special_small_blocks property is being set during a pool create it enforces a limit of 128KiB even if the pool's record size is larger. If the recordsize property is being set during a pool create, then use that value instead of the default SPA_OLD_MAXBLOCKSIZE value. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Don Brady <dev.fs.zfs@gmail.com> Closes #13815 Closes #14811 commit d0ab2dddde618c394fa7fe88211276786ba8ca12 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Fri May 12 09:07:58 2023 -0700 ZTS: Add auto_replace_001_pos to exceptions The auto_replace_001_pos test case does not reliably pass on Fedora 37 and newer. Until the test case can be updated to make it reliable add it to the list of "maybe" exceptions on Linux. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #14851 Closes #14852 commit 1e3e7a103a5026e9a2005acec7017e4024d95115 Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Tue May 9 22:32:30 2023 -0700 Make sure we are not trying to clone a spill block. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit a22891c3272d8527d4c8cb7ff52a25ef396e7add Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Thu May 4 16:14:19 2023 -0700 Correct comment. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 9b016166dd5875db87963b5deeca8eeda094b571 Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Wed May 3 23:25:22 2023 -0700 Remove badly placed comment. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 6bcd48e213a279781ecd6df22799532cbec353d6 Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Wed May 3 00:24:47 2023 -0700 Don't call zfs_exit_two() before zfs_enter_two(). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 0919c985e294a89169adacd5ed4a240945e5fbee Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Tue May 2 15:46:14 2023 -0700 Don't use dmu_buf_is_dirty() for unassigned transaction. The dmu_buf_is_dirty() call doesn't make sense here for two reasons: 1. txg is 0 for unassigned tx, so it was a no-op. 2. It is equivalent of checking if we have dirty records and we are doing this few lines earlier. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 7f88494ac91c61aeffad810e7d167badb875166e Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Tue May 2 14:24:43 2023 -0700 Deny block cloning is dbuf size doesn't match BP size. I don't know an easy way to shrink down dbuf size, so just deny block cloning into dbufs that don't match our BP's size. This fixes the following situation: 1. Create a small file, eg. 1kB of random bytes. Its dbuf will be 1kB. 2. Create a larger file, eg. 2kB of random bytes. Its dbuf will be 2kB. 3. Truncate the large file to 0. Its dbuf will remain 2kB. 4. Clone the small file into the large file. Small file's BP lsize is 1kB, but the large file's dbuf is 2kB. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 49657002f9cb57b9b4675100aaf58e1e93984bbf Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Sun Apr 30 02:47:09 2023 -0700 Additional block cloning fixes. Reimplement some of the block cloning vs dbuf logic, mostly to fix situation where we clone a block and in the same transaction group we want to partially overwrite the clone. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 4d31369d3055bf0cf1d4f3e1e7d43d745f2fd05f Author: Alexander Motin <mav@FreeBSD.org> Date: Thu May 11 17:27:12 2023 -0400 zil: Don't expect zio_shrink() to succeed. At least for RAIDZ zio_shrink() does not reduce zio size, but reduced wsz in that case likely results in writing uninitialized memory. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14853 commit 663dc5f616e6d0427207ffcf7a83dd02fe06a707 Author: Ameer Hamza <ahamza@ixsystems.com> Date: Wed May 10 05:56:35 2023 +0500 Prevent panic during concurrent snapshot rollback and zvol read Protect zvol_cdev_read with zv_suspend_lock to prevent concurrent release of the dnode, avoiding panic when a snapshot is rolled back in parallel during ongoing zvol read operation. Reviewed-by: Chunwei Chen <tuxoko@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Signed-off-by: Ameer Hamza <ahamza@ixsystems.com> Closes #14839 commit 7375f4f61ca587f893435184f398a767ae52fbea Author: Tony Hutter <hutter2@llnl.gov> Date: Tue May 9 17:55:19 2023 -0700 pam: Fix "buffer overflow" in pam ZTS tests on F38 The pam ZTS tests were reporting a buffer overflow on F38, possibly due to F38 now setting _FORTIFY_SOURCE=3 by default. gdb and valgrind narrowed this down to a snprintf() buffer overflow in zfs_key_config_modify_session_counter(). I'm not clear why this particular snprintf() was being flagged as an overflow, but when I replaced it with an asprintf(), the test passed reliably. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Tony Hutter <hutter2@llnl.gov> Closes #14802 Closes #14842 commit 9d3ed831f309e28a9cad56c8b1520292dbad0d7b Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Tue May 9 09:03:10 2023 -0700 Add dmu_tx_hold_append() interface Provides an interface which callers can use to declare a write when the exact starting offset in not yet known. Since the full range being updated is not available only the first L0 block at the provided offset will be prefetched. Reviewed-by: Olaf Faaland <faaland1@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #14819 commit 2b6033d71da38015c885297d1ee6577871099744 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Tue May 9 08:57:02 2023 -0700 Debug auto_replace_001_pos failures Reduced the timeout to 60 seconds which should be more than sufficient and allow the test to be marked as FAILED rather than KILLED. Also dump the pool status on cleanup. Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #14829 commit f4adc2882fb162c82e9738c5d2d30e3ba8a66367 Author: George Amanakis <gamanakis@gmail.com> Date: Tue May 9 17:54:41 2023 +0200 Remove duplicate code in l2arc_evict() l2arc_evict() performs the adjustment of the size of buffers to be written on L2ARC unnecessarily. l2arc_write_size() is called right before l2arc_evict() and performs those adjustments. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14828 commit 9b2c182d291bbb3ece9ceb1c72800d238d19b2e7 Author: Alexander Motin <mav@FreeBSD.org> Date: Tue May 9 11:54:01 2023 -0400 Remove single parent assertion from zio_nowait(). We only need to know if ZIO has any parent there. We do not care if it has more than one, but use of zio_unique_parent() == NULL asserts that. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14823 commit 4def61804c052a1235179e3a7c98305d8075e0e9 Author: George Amanakis <gamanakis@gmail.com> Date: Tue May 9 17:53:27 2023 +0200 Enable the head_errlog feature to remove errors In case check_filesystem() does not error out and does not report an error, remove that error block from error lists and logs without requiring a scrub. This can happen when the original file and all snapshots/clones referencing it have been removed. Otherwise zpool status will still report that "Permanent errors have been detected..." without actually reporting any of them. To implement this change the functions introduced in corrective receive were modified to take into account the head_errlog feature. Before this change: ============================= pool: test state: ONLINE status: One or more devices has experienced an error resulting in data corruption. Applications may be affected. action: Restore the file in question if possible. Otherwise restore the entire pool from backup. see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-8A config: NAME STATE READ WRITE CKSUM test ONLINE 0 0 0 /home/user/vdev_a ONLINE 0 0 2 errors: Permanent errors have been detected in the following files: ============================= After this change: ============================= pool: test state: ONLINE status: One or more devices has experienced an unrecoverable error. An attempt was made to correct the error. Applications are unaffected. action: Determine if the device needs to be replaced, and clear the errors using 'zpool clear' or replace the device with 'zpool replace'. see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-9P config: NAME STATE READ WRITE CKSUM test ONLINE 0 0 0 /home/user/vdev_a ONLINE 0 0 2 errors: No known data errors ============================= Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14813 commit 3f2f9533ca8512ef515a73ac5661598a65b896b6 Author: George Amanakis <gamanakis@gmail.com> Date: Mon May 8 22:35:03 2023 +0200 Fixes in head_errlog feature with encryption For the head_errlog feature use dsl_dataset_hold_obj_flags() instead of dsl_dataset_hold_obj() in order to enable access to the encryption keys (if loaded). This enables reporting of errors in encrypted filesystems which are not mounted but have their keys loaded. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14837 commit 288ea63effae3ba24fcb6dc412a3125b9f3e1da9 Author: Matthew Ahrens <mahrens@delphix.com> Date: Mon May 8 11:20:23 2023 -0700 Verify block pointers before writing them out If a block pointer is corrupted (but the block containing it checksums correctly, e.g. due to a bug that overwrites random memory), we can often detect it before the block is read, with the `zfs_blkptr_verify()` function, which is used in `arc_read()`, `zio_free()`, etc. However, such corruption is not typically recoverable. To recover from it we would need to detect the memory error before the block pointer is written to disk. This PR verifies BP's that are contained in indirect blocks and dnodes before they are written to disk, in `dbuf_write_ready()`. This way, we'll get a panic before the on-disk data is corrupted. This will help us to diagnose what's causing the corruption, as well as being much easier to recover from. To minimize performance impact, only checks that can be done without holding the spa_config_lock are performed. Additionally, when corruption is detected, the raw words of the block pointer are logged. (Note that `dprintf_bp()` is a no-op by default, but if enabled it is not safe to use with invalid block pointers.) Reviewed-by: Rich Ercolani <rincebrain@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Paul Zuchowski <pzuchowski@datto.com> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> Closes #14817 commit 23132688b9d54ef11413925f88c02d83d607ec2b Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Mon May 8 11:17:41 2023 -0700 zdb: consistent xattr output When using zdb to output the value of an xattr only interpret it as printable characters if the entire byte array is printable. Additionally, if the --parseable option is set always output the buffer contents as octal for easy parsing. Reviewed-by: Olaf Faaland <faaland1@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #14830 commit 6deb342248e10af92e2d3fbb4e4b1221812188ff Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Mon May 8 10:09:30 2023 -0700 ZTS: add snapshot/snapshot_002_pos exception Add snapshot_002_pos to the known list of occasional failures for FreeBSD until it can be made entirely reliable. Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #14831 Closes #14832 commit a0a125bab291fe005d29be5375a5bb2a1c8261c7 Author: Alexander Motin <mav@FreeBSD.org> Date: Fri May 5 12:17:55 2023 -0400 Fix two abd_gang_add_gang() issues. - There is no reason to assert that added gang is not empty. It may be weird to add an empty gang, but it is legal. - When moving chain list from the added gang clear its size, or it will trigger assertion in abd_verify() when that gang is freed. Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14816 commit aefb80389458dcccdcb9659914714264248b8e52 Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Sat May 6 01:09:12 2023 +0900 Simplify and optimize random_int_between(). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14805 commit cf53b4376d902baecc04e450038d49c84c848e56 Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Sat May 6 00:51:41 2023 +0900 Plug memory leak in zfsdev_state. On kernel module unload, free all zfsdev state structures, except for zfsdev_state_listhead, which is statically allocated. Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14824 commit 409f6b6fa0caba14be1995bbe28ca70e55ab7666 Author: Ameer Hamza <ahamza@ixsystems.com> Date: Thu May 4 03:10:32 2023 +0500 zpool import -m also removing spare and cache when log device is missing spa_import() relies on a pool config fetched by spa_try_import() for spare/cache devices. Import flags are not passed to spa_tryimport(), which makes it return early due to a missing log device and missing retrieving the cache dev…
commit 9cde9c07739f76a37d729d3a323f49f5d4bc100f Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 28 19:27:10 2023 +0800 Revert various glitches Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit d0c8c0fb05088bb016bc208d5f8cb709195cff87 Author: Andrew Innes <andrew.c12@gmail.com> Date: Thu Jun 29 08:24:13 2023 +0800 Windows: znode: expose zfs_get_zplprop to libzpool Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 3d747f29b2864b661223d09bc8375d34e2105825 Author: Richard Yao <richard.yao@alumni.stonybrook.edu> Date: Sun Dec 4 17:42:43 2022 -0500 Fix TOCTOU race in zpool_do_labelclear() Coverity reported a TOCTOU race in `zpool_do_labelclear()`. This is not believed to be a real security issue, but fixing it reduces the number of syscalls we do and will prevent other static analyzers from complaining about this. The code is expected to be equivalent. However, under rare circumstances, such as ELOOP, ENAMETOOLONG, ENOMEM, ENOTDIR and EOVERFLOW, we will display the error message that we currently display for the `open()` syscall rather than the one that we currently display for the `stat()` syscall. This is considered to be an improvement. Reported-by: Coverity (CID-1524188) Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14575 commit 1e255365c9bf0e7858561d527c0ebdf8f90bc925 Author: Alexander Motin <mav@FreeBSD.org> Date: Tue Jun 27 20:03:37 2023 -0400 ZIL: Fix another use-after-free. lwb->lwb_issued_txg can not be accessed after lwb_state is set to LWB_STATE_FLUSH_DONE and zl_lock is dropped, since the lwb may be freed by zil_sync(). We must save the txg number before that. This is similar to the 55b1842f92, but as I see the bug is not new. It existed for quite a while, just was not triggered due to smaller race window. Reviewed-by: Allan Jude <allan@klarasystems.com> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14988 Closes #14999 commit 233893e7cb7a98895061100ef8363f0ac30204b5 Author: Alexander Motin <mav@FreeBSD.org> Date: Tue Jun 27 20:00:30 2023 -0400 Use big transactions for small recordsize writes. When ZFS appends files in chunks bigger than recordsize, it borrows buffer from ARC and fills it before opening transaction. This supposed to help in case of page faults to not hold transaction open indefinitely. The problem appears when recordsize is set lower than default 128KB. Since each block is committed in separate transaction, per-transaction overhead becomes significant, and what is even worse, active use of of per-dataset and per-pool locks to protect space use accounting for each transaction badly hurts the code SMP scalability. The same transaction size limitation applies in case of file rewrite, but without even excuse of buffer borrowing. To address the issue, disable the borrowing mechanism if recordsize is smaller than default and the write request is 4x bigger than it. In such case writes up to 32MB are executed in single transaction, that dramatically reduces overhead and lock contention. Since the borrowing mechanism is not used for file rewrites, and it was never used by zvols, which seem to work fine, I don't think this change should create significant problems, partially because in addition to the borrowing mechanism there are also used pre-faults. My tests with 4/8 threads writing several files same time on datasets with 32KB recordsize in 1MB requests show reduction of CPU usage by the user threads by 25-35%. I would measure it in GB/s, but at that block size we are now limited by the lock contention of single write issue taskqueue, which is a separate problem we are going to work on. Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14964 commit aea27422747921798a9b9e1b8e0f6230d5672ba5 Author: Laevos <5572812+Laevos@users.noreply.github.com> Date: Tue Jun 27 16:58:32 2023 -0700 Remove unnecessary commas in zpool-create.8 Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Laevos <5572812+Laevos@users.noreply.github.com> Closes #15011 commit 38a821c0d8f6bb51a866354e76078abf6a6ba1fc Author: Alexander Motin <mav@FreeBSD.org> Date: Tue Jun 27 12:09:48 2023 -0400 Another set of vdev queue optimizations. Switch FIFO queues (SYNC/TRIM) and active queue of vdev queue from time-sorted AVL-trees to simple lists. AVL-trees are too expensive for such a simple task. To change I/O priority without searching through the trees, add io_queue_state field to struct zio. To not check number of queued I/Os for each priority add vq_cqueued bitmap to struct vdev_queue. Update it when adding/removing I/Os. Make vq_cactive a separate array instead of struct vdev_queue_class member. Together those allow to avoid lots of cache misses when looking for work in vdev_queue_class_to_issue(). Introduce deadline of ~0.5s for LBA-sorted queues. Before this I saw some I/Os waiting in a queue for up to 8 seconds and possibly more due to starvation. With this change I no longer see it. I had to slightly more complicate the comparison function, but since it uses all the same cache lines the difference is minimal. For a sequential I/Os the new code in vdev_queue_io_to_issue() actually often uses more simple avl_first(), falling back to avl_find() and avl_nearest() only when needed. Arrange members in struct zio to access only one cache line when searching through vdev queues. While there, remove io_alloc_node, reusing the io_queue_node instead. Those two are never used same time. Remove zfs_vdev_aggregate_trim parameter. It was disabled for 4 years since implemented, while still wasted time maintaining the offset-sorted tree of TRIM requests. Just remove the tree. Remove locking from txg_all_lists_empty(). It is racy by design, while 2 pair of locks/unlocks take noticeable time under the vdev queue lock. With these changes in my tests with volblocksize=4KB I measure vdev queue lock spin time reduction by 50% on read and 75% on write. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14925 commit 1737e75ab4e09a2d20e7cc64fa83dae047a302e9 Author: Rich Ercolani <214141+rincebrain@users.noreply.github.com> Date: Mon Jun 26 16:57:12 2023 -0400 Add a delay to tearing down threads. It's been observed that in certain workloads (zvol-related being a big one), ZFS will end up spending a large amount of time spinning up taskqs only to tear them down again almost immediately, then spin them up again... I noticed this when I looked at what my mostly-idle system was doing and wondered how on earth taskq creation/destroy was a bunch of time... So I added a configurable delay to avoid it tearing down tasks the first time it notices them idle, and the total number of threads at steady state went up, but the amount of time being burned just tearing down/turning up new ones almost vanished. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rich Ercolani <rincebrain@gmail.com> Closes #14938 commit 68b8e2ffab23cba6ae87f18c59b044c833934f2f Author: Alexander Motin <mav@FreeBSD.org> Date: Sat Jun 17 22:51:37 2023 -0400 Fix memory leak in zil_parse(). 482da24e2 missed arc_buf_destroy() calls on log parse errors, possibly leaking up to 128KB of memory per dataset during ZIL replay. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Paul Dagnelie <pcd@delphix.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14987 commit ea0d03a8bd040e438bcaa43b8e449cbf717e14f3 Author: George Amanakis <gamanakis@gmail.com> Date: Thu Jun 15 21:45:36 2023 +0200 Shorten arcstat_quiescence sleep time With the latest L2ARC fixes, 2 seconds is too long to wait for quiescence of arcstats like l2_size. Shorten this interval to avoid having the persistent L2ARC tests in ZTS prematurely terminated. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14981 commit 3fa141285b8105b3cc11c1296b77ad6d24250f2c Author: Alexander Motin <mav@FreeBSD.org> Date: Thu Jun 15 13:49:03 2023 -0400 Remove ARC/ZIO physdone callbacks. Those callbacks were introduced many years ago as part of a bigger patch to smoothen the write throttling within a txg. They allow to account completion of individual physical writes within a logical one, improving cases when some of physical writes complete much sooner than others, gradually opening the write throttle. Few years after that ZFS got allocation throttling, working on a level of logical writes and limiting number of writes queued to vdevs at any point, and so limiting latency distribution between the physical writes and especially writes of multiple copies. The addition of scheduling deadline I proposed in #14925 should further reduce the latency distribution. Grown memory sizes over the past 10 years should also reduce importance of the smoothing. While the use of physdone callback may still in theory provide some smoother throttling, there are cases where we simply can not afford it. Since dirty data accounting is protected by pool-wide lock, in case of 6-wide RAIDZ, for example, it requires us to take it 8 times per logical block write, creating huge lock contention. My tests of this patch show radical reduction of the lock spinning time on workloads when smaller blocks are written to RAIDZ pools, when each of the disks receives 8-16KB chunks, but the total rate reaching 100K+ blocks per second. Same time attempts to measure any write time fluctuations didn't show anything noticeable. While there, remove also io_child_count/io_parent_count counters. They are used only for couple assertions that can be avoided. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14948 commit 9efc735904d194987f06870f355e08d94e39ab81 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Wed Jun 14 10:04:05 2023 -0500 ZTS: Skip send_raw_ashift on FreeBSD On FreeBSD 14 this test runs slowly in the CI environment and is killed by the 10 minute timeout. Skip the test on FreeBSD until the slow down is resolved. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #14961 commit 9c54894bfc77f585806984f44c70a839543e6715 Author: Alexander Motin <mav@FreeBSD.org> Date: Wed Jun 14 11:02:27 2023 -0400 Switch refcount tracking from lists to AVL-trees. With large number of tracked references list searches under the lock become too expensive, creating enormous lock contention. On my tests with ZFS_DEBUG enabled this increases write throughput with 32KB blocks from ~1.2GB/s to ~7.5GB/s. Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14970 commit 4e62540827a6ed15e08b2a627896d24bc661fa38 Author: George Amanakis <gamanakis@gmail.com> Date: Wed Jun 14 17:01:17 2023 +0200 Store the L2ARC device ashift in the vdev label If this is not done, and the pool has an ashift other than the default (at the moment 9) then the following happens: 1) vdev_alloc() assigns the ashift of the pool to L2ARC device, but upon export it is not stored anywhere 2) at the first import, vdev_open() sees an vdev_ashift() of 0 and assigns the logical_ashift, which is 9 3) reading the contents of L2ARC, including the header fails 4) L2ARC buffers are not restored in ARC. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14313 Closes #14963 commit adaa3e64ea46f21cc5f544228c48363977b7733e Author: George Amanakis <gamanakis@gmail.com> Date: Sat Jun 10 02:05:47 2023 +0200 Fix the L2ARC write size calculating logic (2) While commit bcd5321 adjusts the write size based on the size of the log block, this happens after comparing the unadjusted write size to the evicted (target) size. In this case l2ad_hand will exceed l2ad_evict and violate an assertion at the end of l2arc_write_buffers(). Fix this by adding the max log block size to the allocated size of the buffer to be committed before comparing the result to the target size. Also reset the l2arc_trim_ahead ZFS module variable when the adjusted write size exceeds the size of the L2ARC device. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14936 Closes #14954 commit 67118a7d6e74a6e818127096162478017610d13e Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 28 12:31:10 2023 +0800 Windows: Finally drop long disabled vdev cache. Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 5d80c98c28c931339138753a4e4c1156dbf951f4 Author: Alexander Motin <mav@FreeBSD.org> Date: Fri Jun 9 15:40:55 2023 -0400 Finally drop long disabled vdev cache. It was a vdev level read cache, designed to aggregate many small reads by speculatively issuing bigger reads instead and caching the result. But since it has almost no idea about what is going on with exception of ZIO_FLAG_DONT_CACHE flag set by higher layers, it was found to make more harm than good, for which reason it was disabled for the past 12 years. These days we have much better instruments to enlarge the I/Os, such as speculative and prescient prefetches, I/O scheduler, I/O aggregation etc. Besides just the dead code removal this removes one extra mutex lock/unlock per write inside vdev_cache_write(), not otherwise disabled and trying to do some work. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14953 commit 1f1ab33781b5736654b988e2e618ea79788fa1f7 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Fri Jun 9 11:10:01 2023 -0700 ZTS: Skip checkpoint_discard_busy Until the ASSERT which is occasionally hit while running checkpoint_discard_busy is resolved skip this test case. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #12053 Closes #14952 commit b94049c2cbedbbe2af8e629bf974a6ed93f11acb Author: Alexander Motin <mav@FreeBSD.org> Date: Fri Jun 9 13:14:05 2023 -0400 Improve l2arc reporting in arc_summary. - Do not report L2ARC as FAULTED in presence of in-flight writes. - Report read and write I/Os, bytes and errors. - Remove few numbers not important to average user. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #12304 Closes #14946 commit 31044b5cfb6f91d376034c4d6374f61baaf03232 Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 28 12:00:39 2023 +0800 Windows: Use list_remove_head() where possible. Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 32eda54d0d75a94b6aa71dc80aa958095feb8011 Author: Alexander Motin <mav@FreeBSD.org> Date: Fri Jun 9 13:12:52 2023 -0400 Use list_remove_head() where possible. ... instead of list_head() + list_remove(). On FreeBSD the list functions are not inlined, so in addition to more compact code this also saves another function call. Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14955 commit fe7693a3f87229d1ae93b5ce2bb84d8bb86a9f5c Author: Alexander Motin <mav@FreeBSD.org> Date: Fri Jun 9 13:08:05 2023 -0400 ZIL: Fix race introduced by f63811f0721. We are not allowed to access lwb after setting LWB_STATE_FLUSH_DONE state and dropping zl_lock, since it may be freed by zil_sync(). To free itxs and waiters after dropping the lock we need to move lwb_itxs and lwb_waiters lists elements to local storage. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14957 Closes #14959 commit 44c5a0c92f98e8c21221bd7051729d1947a10736 Author: Rich Ercolani <214141+rincebrain@users.noreply.github.com> Date: Wed Jun 7 14:14:05 2023 -0400 Revert "systemd: Use non-absolute paths in Exec* lines" This reverts commit 79b20949b25c8db4d379f6486b0835a6613b480c since it doesn't work with the systemd version shipped with RHEL7-based systems. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rich Ercolani <rincebrain@gmail.com> Closes #14943 Closes #14945 commit ba5af00257eb4eb3363f297819a21c4da811392f Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Wed Jun 7 10:43:43 2023 -0700 Linux: Never sleep in kmem_cache_alloc(..., KM_NOSLEEP) (#14926) When a kmem cache is exhausted and needs to be expanded a new slab is allocated. KM_SLEEP callers can block and wait for the allocation, but KM_NOSLEEP callers were incorrectly allowed to block as well. Resolve this by attempting an emergency allocation as a best effort. This may fail but that's fine since any KM_NOSLEEP consumer is required to handle an allocation failure. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Adam Moss <c@yotes.com> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Tony Hutter <hutter2@llnl.gov> commit d4ecd4efde1692641d1d0b89851e7a15e90632f8 Author: George Amanakis <gamanakis@gmail.com> Date: Tue Jun 6 21:32:37 2023 +0200 Fix the L2ARC write size calculating logic l2arc_write_size() should return the write size after adjusting for trim and overhead of the L2ARC log blocks. Also take into account the allocated size of log blocks when deciding when to stop writing buffers to L2ARC. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14939 commit 8692ab174e18faf444681d67d7ea4418600553cc Author: Rob Norris <rob.norris@klarasystems.com> Date: Wed Mar 15 18:18:10 2023 +1100 zdb: add -B option to generate backup stream This is more-or-less like `zfs send`, but specifying the snapshot by its objset id for situations where it can't be referenced any other way. Sponsored-By: Klara, Inc. Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Reviewed-by: WHR <msl0000023508@gmail.com> Signed-off-by: Rob Norris <rob.norris@klarasystems.com> Closes #14642 commit df84ca3f3bf9f265ebc76de17394df529fd07af6 Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 28 11:05:55 2023 +0800 Windows: znode: expose zfs_get_zplprop to libzpool Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 944c58247a13a92c9e4ffb2c0a9e6b6293dca37e Author: Rob Norris <rob.norris@klarasystems.com> Date: Sun Jun 4 11:14:20 2023 +1000 znode: expose zfs_get_zplprop to libzpool There's no particular reason this function should be kernel-only, and I want to use it (indirectly) from zdb. I've moved it to zfs_znode.c because libzpool does not compile in zfs_vfsops.c, and this at least matches the header its imported from. Sponsored-By: Klara, Inc. Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Reviewed-by: WHR <msl0000023508@gmail.com> Signed-off-by: Rob Norris <rob.norris@klarasystems.com> Closes #14642 commit 429f58cdbb195c8d50ed95c7309ee54d37526b70 Author: Alexander Motin <mav@FreeBSD.org> Date: Mon Jun 5 14:51:44 2023 -0400 Introduce zfs_refcount_(add|remove)_few(). There are two places where we need to add/remove several references with semantics of zfs_refcount_(add|remove). But when debug/tracing is disabled, it is a crime to run multiple atomic_inc() in a loop, especially under congested pool-wide allocator lock. Introduced new functions implement the same semantics as the loop, but without overhead in production builds. Reviewed-by: Rich Ercolani <rincebrain@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14934 commit 077c2f359feb69a13bee37ac4220d271d1c7bf27 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Mon Jun 5 11:08:24 2023 -0700 Linux 6.3 compat: META (#14930) Update the META file to reflect compatibility with the 6.3 kernel. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tony Hutter <hutter2@llnl.gov> commit c2fcd6e484107fc7435087771757e88ba84f6093 Author: Graham Perrin <grahamperrin@gmail.com> Date: Fri Jun 2 19:25:13 2023 +0100 zfs-create(8): ZFS for swap: caution, clarity Make the section heading more generic (the section relates to ZFS files as well as ZFS volumes). Swapping to a ZFS volume is prone to deadlock. Remove the related instruction, direct readers to OpenZFS FAQ. Related, but not linked from within the manual page: <https://openzfs.github.io/openzfs-docs/Project%20and%20Community/FAQ.html#using-a-zvol-for-a-swap-device-on-linux> (Using a zvol for a swap device on Linux). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Graham Perrin <grahamperrin@freebsd.org> Issue #7734 Closes #14756 commit 251dbe83e14085a26100aa894d79772cbb69dcda Author: Alexander Motin <mav@FreeBSD.org> Date: Fri Jun 2 14:01:58 2023 -0400 ZIL: Allow to replay blocks of any size. There seems to be no reason for ZIL blocks to be limited by 128KB other than replay code is written in such a way. This change does not increase the limit yet, just removes the artificial limitation. Avoided extra memcpy() may save us a second during replay. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Prakash Surya <prakash.surya@delphix.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14910 commit 76170249d538965655dbd3206cd59566b1d3944b Author: Val Packett <val@packett.cool> Date: Thu May 11 18:16:57 2023 -0300 PAM: enable testing on FreeBSD Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit d1b68a45441cae8c399a8a3ed60b29726ed031ff Author: Val Packett <val@packett.cool> Date: Fri May 5 22:17:12 2023 -0300 PAM: support password changes even when not mounted There's usually no requirement that a user be logged in for changing their password, so let's not be surprising here. We need to use the fetch_lazy mechanism for the old password to avoid a double prompt for it, so that mechanism is now generalized a bit. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit 7424feff72f1e17ea27bcfe0d36cabce7c732eea Author: Val Packett <val@packett.cool> Date: Fri May 5 22:34:58 2023 -0300 PAM: add 'uid_min' and 'uid_max' options for changing the uid range Instead of a fixed >=1000 check, allow the configuration to override the minimum UID and add a maximum one as well. While here, add the uid range check to the authenticate method as well, and fix the return in the chauthtok method (seems very wrong to report success when we've done absolutely nothing). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit fc9e012f5fc7e7997acee2b6d8d759622b319f0e Author: Val Packett <val@packett.cool> Date: Fri May 5 22:02:13 2023 -0300 PAM: add 'forceunmount' flag Probably not always a good idea, but it's nice to have the option. It is a workaround for FreeBSD calling the PAM session end earier than the last process is actually done touching the mount, for example. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit a39ed83bd31cc0c8c98dc3c4cc3d11b03d9af620 Author: Val Packett <val@packett.cool> Date: Fri May 5 19:35:57 2023 -0300 PAM: add 'recursive_homes' flag to use with 'prop_mountpoint' It's not always desirable to have a fixed flat homes directory. With the 'recursive_homes' flag, 'prop_mountpoint' search would traverse the whole tree starting at 'homes' (which can now be '*' to mean all pools) to find a dataset with a mountpoint matching the home directory. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit 7f8d5ef815b7559fcc671ff2add33ba9c2a74867 Author: Val Packett <val@packett.cool> Date: Fri May 5 21:56:39 2023 -0300 PAM: use boolean_t for config flags Since we already use boolean_t in the file, we can use it here. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit e2872932c85189f06a68f0ad10bd8eb6895d79c2 Author: Val Packett <val@packett.cool> Date: Fri May 5 20:00:48 2023 -0300 PAM: do not fail to mount if the key's already loaded If we're expecting a working home directory on login, it would be rather frustrating to not have it mounted just because it e.g. failed to unmount once on logout. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Felix Dörre <felix@dogcraft.de> Signed-off-by: Val Packett <val@packett.cool> Closes #14834 commit b897137e2044c3ef6120820f753d940b7dfb58be Author: Rich Ercolani <214141+rincebrain@users.noreply.github.com> Date: Wed May 31 19:58:41 2023 -0400 Revert "initramfs: use `mount.zfs` instead of `mount`" This broke mounting of snapshots on / for users. See https://github.com/openzfs/zfs/issues/9461#issuecomment-1376162949 for more context. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rich Ercolani <rincebrain@gmail.com> Closes #14908 commit 10cde4f8f60d4d55887d7122a5742e6e4f90280c Author: Luís Henriques <73643340+lumigch@users.noreply.github.com> Date: Tue May 30 23:15:24 2023 +0100 Fix NULL pointer dereference when doing concurrent 'send' operations A NULL pointer will occur when doing a 'zfs send -S' on a dataset that is still being received. The problem is that the new 'send' will rightfully fail to own the datasets (i.e. dsl_dataset_own_force() will fail), but then dmu_send() will still do the dsl_dataset_disown(). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Luís Henriques <henrix@camandro.org> Closes #14903 Closes #14890 commit 12452d79a3fd29af1dc0b95f3e367e3ce339702b Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Mon May 29 12:55:35 2023 -0700 ZTS: zvol_misc_trim disable blk mq Disable the zvol_misc_fua.ksh and zvol_misc_trim.ksh test cases on impacted kernels. This issue is being actively worked in #14872 and as part of that fix this commit will be reverted. VERIFY(zh->zh_claim_txg == 0) failed PANIC at zil.c:904:zil_create() Reviewed-by: Tony Hutter <hutter2@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #14872 Closes #14870 commit 803c04f233e60a2d23f0463f299eba96c0968602 Author: Richard Yao <richard.yao@alumni.stonybrook.edu> Date: Fri May 26 18:47:52 2023 -0400 Use __attribute__((malloc)) on memory allocation functions This informs the C compiler that pointers returned from these functions do not alias other functions, which allows it to do better code optimization and should make the compiled code smaller. References: https://stackoverflow.com/a/53654773 https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute https://clang.llvm.org/docs/AttributeReference.html#malloc Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14827 commit 64d8bbe15f77876ae9639b9971a743776a41bf9a Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Fri May 26 15:39:23 2023 -0700 ZTS: Add zpool_resilver_concurrent exception The zpool_resilver_concurrent test case requires the ZED which is not used on FreeBSD. Add this test to the known list of skipped tested for FreeBSD. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #14904 commit e396d30d29ed131194605222e6ba1fec1ef8b2ca Author: Mike Swanson <mikeonthecomputer@gmail.com> Date: Fri May 26 15:37:15 2023 -0700 Add compatibility symlinks for FreeBSD 12.{3,4} and 13.{0,1,2} Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Mike Swanson <mikeonthecomputer@gmail.com> Closes #14902 commit f6dd0b8c1cc41707d299b7123f80912f43d03340 Author: Colm <colm@tuatha.org> Date: Fri May 26 10:04:19 2023 -0700 Adding new read-only compatible zpool features to compatibility.d/grub2 GRUB2 is compatible with all "read-only compatible" features, so it is safe to add new features of this type to the grub2 compatibility list. We generally want to include all compatible features, to minimize the differences between grub2-compatible pools and no-compatibility pools. Adding new properties `livelist` and `zpool_checkpoint` accordingly. Also adding them to the man page which references this file as an example, for consistency. Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Colm Buckley <colm@tuatha.org> Closes #14893 commit 013d3a1e0e00d83dabe70837b23dab48c1bac592 Author: Richard Yao <richard.yao@alumni.stonybrook.edu> Date: Fri May 26 13:03:12 2023 -0400 btree: Implement faster binary search algorithm This implements a binary search algorithm for B-Trees that reduces branching to the absolute minimum necessary for a binary search algorithm. It also enables the compiler to inline the comparator to ensure that the only slowdown when doing binary search is from waiting for memory accesses. Additionally, it instructs the compiler to unroll the loop, which gives an additional 40% improve with Clang and 8% improvement with GCC. Consumers must opt into using the faster algorithm. At present, only B-Trees used inside kernel code have been modified to use the faster algorithm. Micro-benchmarks suggest that this can improve binary search performance by up to 3.5 times when compiling with Clang 16 and up to 1.9 times when compiling with GCC 12.2. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14866 commit 1854df330aa57cda39f076e8ab11e17ca3697bb8 Author: George Amanakis <gamanakis@gmail.com> Date: Fri May 26 18:53:00 2023 +0200 Fix inconsistent definition of zfs_scrub_error_blocks_per_txg Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14894 commit 8735e6ac03742fcf43adde3ce127af698a32c53a Author: Damiano Albani <damiano.albani@gmail.com> Date: Fri May 26 01:10:54 2023 +0200 Add missing files to Debian DKMS package Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Reviewed-by: Umer Saleem <usaleem@ixsystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Damiano Albani <damiano.albani@gmail.com> Closes #14887 Closes #14889 commit d439021bd05a5cc0bb271a5470abb67af2f7bcda Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Thu May 25 13:53:08 2023 -0700 Update compatibility.d files Add an openzfs-2.2 compatibility file for the next release. Edon-R support has been enabled for FreeBSD removing the need for different FreeBSD and Linux files. Symlinks for the -linux and -freebsd names are created for any scripts expecting that convention. Additionally, a symlink for ubunutu-22.04 was added. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #14833 commit da54d5f3f9576b958e3eadf4f4d8f68c91b3d6e4 Author: Alexander Motin <mav@FreeBSD.org> Date: Thu May 25 16:51:53 2023 -0400 zil: Add some more statistics. In addition to a number of actual log bytes written, account also a total written bytes including padding and total allocated bytes (bytes <= write <= alloc). It should allow to monitor zil traffic and space efficiency. Add dtrace probe for zil block size selection. Make zilstat report more information and fit it into less width. Reviewed-by: Ameer Hamza <ahamza@ixsystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14863 commit faa4955023d089668bd6c564c195a933d1eac455 Author: Alexander Motin <mav@FreeBSD.org> Date: Thu May 25 12:48:43 2023 -0400 ZIL: Reduce scope of per-dataset zl_issuer_lock. Before this change ZIL copied all log data while holding the lock. It caused huge lock contention on workloads with many big parallel writes. This change splits the process into two parts: first, zil_lwb_assign() estimates the log space needed for all transactions, and zil_lwb_write_close() allocates blocks and zios while holding the lock, then, after the lock in dropped, zil_lwb_commit() copies the data, and zil_lwb_write_issue() issues the I/Os. Also while there slightly reduce scope of zl_lock. Reviewed-by: Paul Dagnelie <pcd@delphix.com> Reviewed-by: Prakash Surya <prakash.surya@delphix.com> Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14841 commit f77b9f7ae83834ade1da21cfc16b8a273df3acfc Author: Dimitri John Ledkov <19779+xnox@users.noreply.github.com> Date: Wed May 24 20:31:28 2023 +0100 systemd: Use non-absolute paths in Exec* lines Since systemd v239, Exec* binaries are resolved from PATH when they are not-absolute. Switch to this by default for ease of downstream maintenance. Many downstream distributions move individual binaries to locations that existing compile-time configurations cannot accommodate. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com> Closes #14880 commit 4bfb9d28cffd4dfeb4b91359b497d100f668bb34 Author: Akash B <akash-b@hpe.com> Date: Thu May 25 00:58:09 2023 +0530 Fix concurrent resilvers initiated at same time For draid vdevs it was possible to initiate both the sequential and healing resilver at same time. This fixes the following two scenarios. 1) There's a window where a sequential rebuild can be started via ZED even if a healing resilver has been scheduled. - This is fixed by adding additional check in spa_vdev_attach() for any scheduled resilver and return appropriate error code when a resilver is already in progress. 2) It was possible for zpool clear to start a healing resilver when it wasn't needed at all. This occurs because during a vdev_open() the device is presumed to be healthy not until the device is validated by vdev_validate() and it's set unavailable. However, by this point an async resilver will have already been requested if the DTL isn't empty. - This is fixed by cancelling the SPA_ASYNC_RESILVER request immediately at the end of vdev_reopen() when a resilver is unneeded. Finally, added a testcase in ZTS for verification. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Dipak Ghosh <dipak.ghosh@hpe.com> Signed-off-by: Akash B <akash-b@hpe.com> Closes #14881 Closes #14892 commit c9bb406d177a00aa1f0058d29aeb29e478223273 Author: youzhongyang <youzhong@gmail.com> Date: Wed May 24 15:23:42 2023 -0400 Linux 6.4 compat: reclaimed_slab renamed to reclaimed Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Youzhong Yang <yyang@mathworks.com> Closes #14891 commit 79e61a873b136f13fcf140beb925ceddc1f94767 Author: Brian Atkinson <batkinson@lanl.gov> Date: Fri May 19 16:05:53 2023 -0400 Hold db_mtx when updating db_state Commit 555ef90 did some general code refactoring for dmu_buf_will_not_fill() and dmu_buf_will_fill(). However, the db_mtx was not held when update db->db_state in those code block. The rest of the dbuf code always holds the db_mtx when updating db_state. This is important because cv_wait() db_changed is used to check for db_state changes. Updating dmu_buf_will_not_fill() and dmu_buf_will_fill() to hold the db_mtx when updating db_state. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Brian Atkinson <batkinson@lanl.gov> Closes #14875 commit d7be0cdf93a568b6c9b4a4e15a88a5d88ebbb764 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Fri May 19 13:05:09 2023 -0700 Probe vdevs before marking removed Before allowing the ZED to mark a vdev as REMOVED due to a hotplug event confirm that it is non-responsive with probe. Any device which can be successfully probed should be left ONLINE to prevent a healthy pool from being incorrectly SUSPENDED. This may occur for at least the following two scenarios. 1) Drive expansion (zpool online -e) in VMware environments. If, during the partition resize operation, a partition is removed and re-created then udev will send a removed event. 2) Re-scanning the namespaces of an NVMe device (nvme ns-rescan) may result in a udev remove and add event being delivered. Finally, update the ZED to only kick in a spare when the removal was successful. Reviewed-by: Ameer Hamza <ahamza@ixsystems.com> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #14859 Closes #14861 commit 054bb22686045ea1499065a4456568f0c21d939b Author: Andrew Innes <andrew.c12@gmail.com> Date: Tue Jun 27 09:20:56 2023 +0800 Windows: Teach zpool scrub to scrub only blocks in error log Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit b61e89a3e68ae19819493183ff3d1fe7bf4ffe2b Author: George Amanakis <gamanakis@gmail.com> Date: Fri Dec 17 21:35:28 2021 +0100 Teach zpool scrub to scrub only blocks in error log Added a flag '-e' in zpool scrub to scrub only blocks in error log. A user can pause, resume and cancel the error scrub by passing additional command line arguments -p -s just like a regular scrub. This involves adding a new flag, creating new libzfs interfaces, a new ioctl, and the actual iteration and read-issuing logic. Error scrubbing is executed in multiple txg to make sure pool performance is not affected. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Co-authored-by: TulsiJain tulsi.jain@delphix.com Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #8995 Closes #12355 commit 61bfb3cb5dd792ec7ca0fbfca59b165f3ddbe1f5 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Thu May 18 10:02:20 2023 -0700 Add the ability to uninitialize zpool initialize functions well for touching every free byte...once. But if we want to do it again, we're currently out of luck. So let's add zpool initialize -u to clear it. Co-authored-by: Rich Ercolani <rincebrain@gmail.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Rich Ercolani <rincebrain@gmail.com> Closes #12451 Closes #14873 commit 855b62942d4ca5dab3d65b7000f9d284fd1560bb Author: Antonio Russo <aerusso@aerusso.net> Date: Mon May 15 17:11:33 2023 -0600 test-runner: pass kmemleak and kmsg to Cmd.run test-runner.py orchestrates all of the ZTS executions. The `Cmd` object manages these process, and its `run` method specifically invokes these possibly long-running processes, possibly retrying in the event of a timeout. Since its inception, memory leak detection using the kmemleak infrastructure [1], and kernel logging [2] have been added to this run mechanism. However, the callback to cull a process beyond its timeout threshold, `kill_cmd`, has evaded modernization by both of these changes. As a result, this function fails to properly invoke `run`, leading to an untrapped exception and unreported test failure. This patch extends `kill_cmd` to receive these kernel devices through the `options` parameter, and regularizes all the `.run` calls from `Cmd`, and its subclasses, to accept that parameter. [1] Commit a69765ea5b563e0cd4d15fac4b1ac08c6ccf12d1 [2] Commit fc2c0256c55a2859d1988671b0896d22b75c8aba Reviewed-by: John Wren Kennedy <john.kennedy@delphix.com> Signed-off-by: Antonio Russo <aerusso@aerusso.net> Closes #14849 commit 537939565123fd2afa097e9a56ee3efd28779e5f Author: Richard Yao <richard.yao@alumni.stonybrook.edu> Date: Fri May 12 17:10:14 2023 -0400 Fix undefined behavior in spa_sync_props() 8eae2d214cfa53862833eeeda9a5c1e9d5ded47d caused Coverity to begin complaining about "Improper use of negative value" in two places in spa_sync_props() because Coverity correctly inferred from `prop == ZPOOL_PROP_INVAL` that prop could be -1 while both zpool_prop_to_name() and zpool_prop_get_type() use it an array index, which is undefined behavior. Assuming that the system does not panic from an attempt to read invalid memory, the case statement for ZPOOL_PROP_INVAL will ensure that only user properties will reach this code when prop is ZPOOL_PROP_INVAL, such that execution will continue safely. However, if we are unlucky enough to read invalid memory, then the system will panic. This issue predates the patch that caused coverity to begin complaining. Thankfully, our userland tools do not pass nonsense to us, so this bug should not be triggered unless a future userland tool attempts to set a property that we do not understand. Reported-by: Coverity (CID-1561129) Reported-by: Coverity (CID-1561130) Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: George Amanakis <gamanakis@gmail.com> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14860 commit 02351b380f0430980bfb92e83d0800df104bd06a Author: Richard Yao <richard.yao@alumni.stonybrook.edu> Date: Fri May 12 16:47:56 2023 -0400 Fix use after free regression in spa_remove_healed_errors() 6839ec6f1098c28ff7b772f1b31b832d05e6b567 placed code in spa_remove_healed_errors() that uses a pointer after the kmem_free() call that frees it. Reported-by: Coverity (CID-1562375) Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: George Amanakis <gamanakis@gmail.com> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14860 commit e9b315ffb79ff6419694a2713fcd5fd448317904 Author: Andrew Innes <andrew.c12@gmail.com> Date: Mon May 15 13:52:35 2023 +0800 Use python3 on windows commit 3346a5b78c2db15801ce54a70a323952fdf67fa5 Author: Jorgen Lundman <lundman@lundman.net> Date: Thu Jun 22 08:56:38 2023 +0900 zfs_write() ignores errors If files were advanced by zfs_freesp() we ignored any errors returned by it. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit cce49c08316bc6a5dff287f4fa15856e26d5b18a Author: Jorgen Lundman <lundman@lundman.net> Date: Thu Jun 22 08:55:55 2023 +0900 Correct Stream event path The Stream path events used the incorrect name "stream", now uses "file.txt:stream" as per ntfs. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 0f83d31e288d789fb4e10a7e4b12e27887820498 Author: Jorgen Lundman <lundman@lundman.net> Date: Wed Jun 21 14:30:13 2023 +0900 Add stub for file_hard_link_information() Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 8d6db9490364e4d281546445571d2ca9d5abda22 Author: Jorgen Lundman <lundman@lundman.net> Date: Wed Jun 21 14:29:43 2023 +0900 Return correct FileID in dirlist Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 4c011397229e3c38259d6956458a4fd287dca72d Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 21 10:17:30 2023 +0800 Fix logic (#232) Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 467436b676ad897025b7ed90d8f033969da441cc Author: Andrew Innes <andrew.c12@gmail.com> Date: Wed Jun 21 09:47:38 2023 +0800 Run winbtrfs tests by default (#231) Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 56eca2a5d116c66b10579f9cf6d5f271991c7e2e Author: Jorgen Lundman <lundman@lundman.net> Date: Wed Jun 21 09:54:00 2023 +0900 SetFilePositionInformation SetFileValidDataLengthInformation Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit b4fbbda470f27aee565dfa9bc0d68217b969339c Author: Andrew Innes <andrew.c12@gmail.com> Date: Tue Jun 20 16:33:12 2023 +0800 Add sleep to tests (#230) Signed-off-by: Andrew Innes <andrew.c12@gmail.com> commit 94f1f52807d1f8c0c2931e9e52b91f0ce5e488f4 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue Jun 20 16:53:50 2023 +0900 CreateFile of newfile:newstream should create both In addition, many more stream fixes, illegal chars, and names Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 894d512880d39ecf40e841c6d7b73157dfe397e0 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue Jun 20 08:41:37 2023 +0900 Windows streams should return parent file ID When asked for File ID of a stream, it should return the FileID of the parent file, which is two levels up. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 0cc45d2154a2866b2f494c3790a57555c29e60c3 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue Jun 20 08:32:44 2023 +0900 Support FILE_STANDARD_INFORMATION_EX Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit a6edd02999d581db56f4a53567f4c5db11778f64 Author: Jorgen Lundman <lundman@lundman.net> Date: Mon Jun 19 10:36:13 2023 +0900 Add xattr compat code from upstream and adjust calls to new API calls. This adds xattr=sa support to Windows. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 0e1476a3942990385d32c02403ebe2c815d567db Author: Jorgen Lundman <lundman@lundman.net> Date: Wed Jun 14 11:56:09 2023 +0900 Set EA can panic Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 4a1adef6b8c2851195d692a42d5718c9a1b03490 Author: Jorgen Lundman <lundman@lundman.net> Date: Wed Jun 14 09:49:57 2023 +0900 Incorrect MAXPATH used in delete entry Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 2c0d119e37cb3eed1acac90efa9fe0f8c173e0f0 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue Jun 13 16:19:42 2023 +0900 Large changes fixing FS notify events Some incorrect behavior still, query name of a stream is wrong. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 5b2b2b0550a493497a0b460206079fd57c639543 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue May 16 14:42:52 2023 +0900 file name and file full information buffer overrun When a buffer is not big enough, we would still null terminate on the full string, beyond the supplied buffer. Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 94bfb92951a5ccdef7b2a1fb818fafdafbc4fff0 Author: Jorgen Lundman <lundman@lundman.net> Date: Tue May 16 11:48:12 2023 +0900 Correct Query EA and Query Streams Which includes: * NextEntryOffset is not offset from Buffer, but from one struct to the next struct. * Pack only complete EAs, and return Overflow if does not fit * query file EA information would return from Information=size * Call cleareaszie on VP when EAs have changed Signed-off-by: Jorgen Lundman <lundman@lundman.net> commit 9c7a4071fcfc99c3308620fc1943355f9ade34b3 Author: Alexander Motin <mav@FreeBSD.org> Date: Fri May 12 12:49:26 2023 -0400 zil: Free lwb_buf after write completion. There is no sense to keep that memory allocated during the flush. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Prakash Surya <prakash.surya@delphix.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14855 commit 7e91b3222ddaadc10c92d1065529886dd3806acc Author: Alexander Motin <mav@FreeBSD.org> Date: Fri May 12 12:14:29 2023 -0400 zil: Some micro-optimizations. Should not cause functional changes. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14854 commit 6b62c3b0e10de782c3aef0e1206aa48875519c4e Author: Don Brady <dev.fs.zfs@gmail.com> Date: Fri May 12 10:12:28 2023 -0600 Refine special_small_blocks property validation When the special_small_blocks property is being set during a pool create it enforces a limit of 128KiB even if the pool's record size is larger. If the recordsize property is being set during a pool create, then use that value instead of the default SPA_OLD_MAXBLOCKSIZE value. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Don Brady <dev.fs.zfs@gmail.com> Closes #13815 Closes #14811 commit d0ab2dddde618c394fa7fe88211276786ba8ca12 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Fri May 12 09:07:58 2023 -0700 ZTS: Add auto_replace_001_pos to exceptions The auto_replace_001_pos test case does not reliably pass on Fedora 37 and newer. Until the test case can be updated to make it reliable add it to the list of "maybe" exceptions on Linux. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #14851 Closes #14852 commit 1e3e7a103a5026e9a2005acec7017e4024d95115 Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Tue May 9 22:32:30 2023 -0700 Make sure we are not trying to clone a spill block. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit a22891c3272d8527d4c8cb7ff52a25ef396e7add Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Thu May 4 16:14:19 2023 -0700 Correct comment. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 9b016166dd5875db87963b5deeca8eeda094b571 Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Wed May 3 23:25:22 2023 -0700 Remove badly placed comment. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 6bcd48e213a279781ecd6df22799532cbec353d6 Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Wed May 3 00:24:47 2023 -0700 Don't call zfs_exit_two() before zfs_enter_two(). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 0919c985e294a89169adacd5ed4a240945e5fbee Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Tue May 2 15:46:14 2023 -0700 Don't use dmu_buf_is_dirty() for unassigned transaction. The dmu_buf_is_dirty() call doesn't make sense here for two reasons: 1. txg is 0 for unassigned tx, so it was a no-op. 2. It is equivalent of checking if we have dirty records and we are doing this few lines earlier. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 7f88494ac91c61aeffad810e7d167badb875166e Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Tue May 2 14:24:43 2023 -0700 Deny block cloning is dbuf size doesn't match BP size. I don't know an easy way to shrink down dbuf size, so just deny block cloning into dbufs that don't match our BP's size. This fixes the following situation: 1. Create a small file, eg. 1kB of random bytes. Its dbuf will be 1kB. 2. Create a larger file, eg. 2kB of random bytes. Its dbuf will be 2kB. 3. Truncate the large file to 0. Its dbuf will remain 2kB. 4. Clone the small file into the large file. Small file's BP lsize is 1kB, but the large file's dbuf is 2kB. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 49657002f9cb57b9b4675100aaf58e1e93984bbf Author: Pawel Jakub Dawidek <pawel@dawidek.net> Date: Sun Apr 30 02:47:09 2023 -0700 Additional block cloning fixes. Reimplement some of the block cloning vs dbuf logic, mostly to fix situation where we clone a block and in the same transaction group we want to partially overwrite the clone. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Pawel Jakub Dawidek <pawel@dawidek.net> Closes #14825 commit 4d31369d3055bf0cf1d4f3e1e7d43d745f2fd05f Author: Alexander Motin <mav@FreeBSD.org> Date: Thu May 11 17:27:12 2023 -0400 zil: Don't expect zio_shrink() to succeed. At least for RAIDZ zio_shrink() does not reduce zio size, but reduced wsz in that case likely results in writing uninitialized memory. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14853 commit 663dc5f616e6d0427207ffcf7a83dd02fe06a707 Author: Ameer Hamza <ahamza@ixsystems.com> Date: Wed May 10 05:56:35 2023 +0500 Prevent panic during concurrent snapshot rollback and zvol read Protect zvol_cdev_read with zv_suspend_lock to prevent concurrent release of the dnode, avoiding panic when a snapshot is rolled back in parallel during ongoing zvol read operation. Reviewed-by: Chunwei Chen <tuxoko@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Signed-off-by: Ameer Hamza <ahamza@ixsystems.com> Closes #14839 commit 7375f4f61ca587f893435184f398a767ae52fbea Author: Tony Hutter <hutter2@llnl.gov> Date: Tue May 9 17:55:19 2023 -0700 pam: Fix "buffer overflow" in pam ZTS tests on F38 The pam ZTS tests were reporting a buffer overflow on F38, possibly due to F38 now setting _FORTIFY_SOURCE=3 by default. gdb and valgrind narrowed this down to a snprintf() buffer overflow in zfs_key_config_modify_session_counter(). I'm not clear why this particular snprintf() was being flagged as an overflow, but when I replaced it with an asprintf(), the test passed reliably. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Tony Hutter <hutter2@llnl.gov> Closes #14802 Closes #14842 commit 9d3ed831f309e28a9cad56c8b1520292dbad0d7b Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Tue May 9 09:03:10 2023 -0700 Add dmu_tx_hold_append() interface Provides an interface which callers can use to declare a write when the exact starting offset in not yet known. Since the full range being updated is not available only the first L0 block at the provided offset will be prefetched. Reviewed-by: Olaf Faaland <faaland1@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #14819 commit 2b6033d71da38015c885297d1ee6577871099744 Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Tue May 9 08:57:02 2023 -0700 Debug auto_replace_001_pos failures Reduced the timeout to 60 seconds which should be more than sufficient and allow the test to be marked as FAILED rather than KILLED. Also dump the pool status on cleanup. Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #14829 commit f4adc2882fb162c82e9738c5d2d30e3ba8a66367 Author: George Amanakis <gamanakis@gmail.com> Date: Tue May 9 17:54:41 2023 +0200 Remove duplicate code in l2arc_evict() l2arc_evict() performs the adjustment of the size of buffers to be written on L2ARC unnecessarily. l2arc_write_size() is called right before l2arc_evict() and performs those adjustments. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14828 commit 9b2c182d291bbb3ece9ceb1c72800d238d19b2e7 Author: Alexander Motin <mav@FreeBSD.org> Date: Tue May 9 11:54:01 2023 -0400 Remove single parent assertion from zio_nowait(). We only need to know if ZIO has any parent there. We do not care if it has more than one, but use of zio_unique_parent() == NULL asserts that. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14823 commit 4def61804c052a1235179e3a7c98305d8075e0e9 Author: George Amanakis <gamanakis@gmail.com> Date: Tue May 9 17:53:27 2023 +0200 Enable the head_errlog feature to remove errors In case check_filesystem() does not error out and does not report an error, remove that error block from error lists and logs without requiring a scrub. This can happen when the original file and all snapshots/clones referencing it have been removed. Otherwise zpool status will still report that "Permanent errors have been detected..." without actually reporting any of them. To implement this change the functions introduced in corrective receive were modified to take into account the head_errlog feature. Before this change: ============================= pool: test state: ONLINE status: One or more devices has experienced an error resulting in data corruption. Applications may be affected. action: Restore the file in question if possible. Otherwise restore the entire pool from backup. see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-8A config: NAME STATE READ WRITE CKSUM test ONLINE 0 0 0 /home/user/vdev_a ONLINE 0 0 2 errors: Permanent errors have been detected in the following files: ============================= After this change: ============================= pool: test state: ONLINE status: One or more devices has experienced an unrecoverable error. An attempt was made to correct the error. Applications are unaffected. action: Determine if the device needs to be replaced, and clear the errors using 'zpool clear' or replace the device with 'zpool replace'. see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-9P config: NAME STATE READ WRITE CKSUM test ONLINE 0 0 0 /home/user/vdev_a ONLINE 0 0 2 errors: No known data errors ============================= Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14813 commit 3f2f9533ca8512ef515a73ac5661598a65b896b6 Author: George Amanakis <gamanakis@gmail.com> Date: Mon May 8 22:35:03 2023 +0200 Fixes in head_errlog feature with encryption For the head_errlog feature use dsl_dataset_hold_obj_flags() instead of dsl_dataset_hold_obj() in order to enable access to the encryption keys (if loaded). This enables reporting of errors in encrypted filesystems which are not mounted but have their keys loaded. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Amanakis <gamanakis@gmail.com> Closes #14837 commit 288ea63effae3ba24fcb6dc412a3125b9f3e1da9 Author: Matthew Ahrens <mahrens@delphix.com> Date: Mon May 8 11:20:23 2023 -0700 Verify block pointers before writing them out If a block pointer is corrupted (but the block containing it checksums correctly, e.g. due to a bug that overwrites random memory), we can often detect it before the block is read, with the `zfs_blkptr_verify()` function, which is used in `arc_read()`, `zio_free()`, etc. However, such corruption is not typically recoverable. To recover from it we would need to detect the memory error before the block pointer is written to disk. This PR verifies BP's that are contained in indirect blocks and dnodes before they are written to disk, in `dbuf_write_ready()`. This way, we'll get a panic before the on-disk data is corrupted. This will help us to diagnose what's causing the corruption, as well as being much easier to recover from. To minimize performance impact, only checks that can be done without holding the spa_config_lock are performed. Additionally, when corruption is detected, the raw words of the block pointer are logged. (Note that `dprintf_bp()` is a no-op by default, but if enabled it is not safe to use with invalid block pointers.) Reviewed-by: Rich Ercolani <rincebrain@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Paul Zuchowski <pzuchowski@datto.com> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> Closes #14817 commit 23132688b9d54ef11413925f88c02d83d607ec2b Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Mon May 8 11:17:41 2023 -0700 zdb: consistent xattr output When using zdb to output the value of an xattr only interpret it as printable characters if the entire byte array is printable. Additionally, if the --parseable option is set always output the buffer contents as octal for easy parsing. Reviewed-by: Olaf Faaland <faaland1@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #14830 commit 6deb342248e10af92e2d3fbb4e4b1221812188ff Author: Brian Behlendorf <behlendorf1@llnl.gov> Date: Mon May 8 10:09:30 2023 -0700 ZTS: add snapshot/snapshot_002_pos exception Add snapshot_002_pos to the known list of occasional failures for FreeBSD until it can be made entirely reliable. Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #14831 Closes #14832 commit a0a125bab291fe005d29be5375a5bb2a1c8261c7 Author: Alexander Motin <mav@FreeBSD.org> Date: Fri May 5 12:17:55 2023 -0400 Fix two abd_gang_add_gang() issues. - There is no reason to assert that added gang is not empty. It may be weird to add an empty gang, but it is legal. - When moving chain list from the added gang clear its size, or it will trigger assertion in abd_verify() when that gang is freed. Revie…
zdb(8) example 2: Lines 530 to 534 in ca960ce
Does that exemplify a ZFS volume for swap? Blame: dd4769a#diff-c91195b2e58857a22090fb105807f3a46299eeba2a46d78d44dbff64d4e2ca7aR440-R442 |
Any update on this in 2024? Provisioning some servers and wanted to move to ZFS swap device and not having to partition up the spinning disks. |
I'm using one zvol as ZRAM writeback-device and another zvol as secondary swap, after ZRAM. No issues so far. Just sharing my observations, no guarantee, thought. zvol for swap got the following settings:
On the ZRAM writeback-device same settings, except encryption is off - obviously. ZRAM has 25% size of the memory, the ZRAM writeback-device and the swap size are large enough to never run into any trouble - but I made them thin provisioned. So keep in mind that there needs to be storage left to not run into trouble with the server - if you want to do this as well. The only change I made for the settings of ZFS is to pin down the maximum and minimum ARC size, as ZFS currently seems to all of a sudden drop the whole ARC space down to a couple of hundred mb, running into real trouble keeping up with IO afterward. So I set the ARC size with the boot parameters Regarding swapping I run Hope this helps. |
@RubenKelevra what ZFS version? That doesn't match my last attempt at swap-on-zvol (early 2024 git?) so I'm excited that maybe something improved. |
I think swap after zram can lead to priority inversion. On harder memory pressure pages used more frequently can end up on a disk and less frequent pages will be compressed in ram. I think zram backing device is the recommended way to spill data to dusk. It is possible to configure it to be aggressive in spilling it out, so that there is enough zram free for new pages. I didn't try to use zvol for backing device though, but it might be an interesting opportunity. |
@IvanVolosyuk well there are modes to play with on the backing device. But I selected to just push uncompressable pages to the backing device, as this way I can avoid trying to compress them on ZFS level. Sure, the priority may invert, but does that really matter that much? Decompression of zstd is quite fast on modern CPUs, but depending on the cores used it could very well be slower than reading from a fast NVMe storage. So it just depends on how random the chunks have to be read from the NVMe then, I guess, if zram decompression or the NVMe can deliver the data faster back to memory. I certainly can feel swapping in and out sometimes, as its a desktop system, but it's just a tad sluggish for half a second or so. I often see 6-8 GB swapped out on the ZFS. So it seems to work fine. |
System information
Describe the problem you're observing
System deadlocked while forcing a page out to a swap zvol. Unfortunately I do not have the rest of the backtraces.
Describe how to reproduce the problem
rsync a filesystem with O(1M) files.
Include any warning/errors/backtraces from the system logs
The text was updated successfully, but these errors were encountered: