FreeBSD/src 230d581 — sys/kern kern_descrip.c, sys/sys syscallsubr.h

fstat(2): add user_fstat

Effort:         CHERI upstreaming
Sponsored by:   Innovate UK
Pull Request:   https://github.com/freebsd/freebsd-src/pull/2284
DeltaFile
+8-7sys/kern/kern_descrip.c
+1-0sys/sys/syscallsubr.h
+9-72 files

FreeBSD/src 4ca9291 — sys/kern kern_environment.c, sys/sys syscallsubr.h

kenv(2): add kern_kenv

Effort:         CHERI upstreaming
Sponsored by:   Innovate UK
Pull Request:   https://github.com/freebsd/freebsd-src/pull/2284
DeltaFile
+22-14sys/kern/kern_environment.c
+2-0sys/sys/syscallsubr.h
+24-142 files

FreeBSD/src 3369af6 — sys/kern kern_cpuset.c, sys/sys syscallsubr.h

cpuset(2): add kern_cpuset

Effort:         CHERI upstreaming
Sponsored by:    Innovate UK
Pull Request:   https://github.com/freebsd/freebsd-src/pull/2284
DeltaFile
+7-2sys/kern/kern_cpuset.c
+1-0sys/sys/syscallsubr.h
+8-22 files

FreeBSD/src 7b18863 — sys/security/mac mac_syscalls.c, sys/sys syscallsubr.h

mac syscalls: add kern_ implementations

Where the kern_ interfaces map trivially to the syscall interface, follow
the syscall name even if awkward (e.g., sys___mac* -> kern___mac*).
Otherwise use shorter names.

Effort:         CHERI upstreaming
Sponsored by:   DARPA, AFRL
Pull Request:   https://github.com/freebsd/freebsd-src/pull/2284
DeltaFile
+57-31sys/security/mac/mac_syscalls.c
+11-0sys/sys/syscallsubr.h
+68-312 files

FreeBSD/src d7c0ab9 — sys/kern kern_acct.c, sys/sys syscallsubr.h

acct(2): add kern_acct

Effort:         CHERI upstreaming
Sponsored by:   Innovate UK
Pull Request:   https://github.com/freebsd/freebsd-src/pull/2284
DeltaFile
+11-4sys/kern/kern_acct.c
+1-0sys/sys/syscallsubr.h
+12-42 files

FreeBSD/src 6d5c80a — sys/dev/usb/controller xhcireg.h xhci.h

xhci: only set the slot context parent hub fields on xHCI 1.2

The Enhanced SuperSpeed meaning of the slot context parent hub slot ID
and port number fields was introduced in xHCI 1.2. Controllers built to
an earlier revision define them only for a Low- or Full-speed device
behind a High-speed hub.

A SuperSpeed device behind a USB 3.2 hub on an Intel Alpine Ridge
controller, an xHCI 1.1 part, stops responding to Address Device and
loops in uhub_reattach_port until the port is disabled.

Fixes:          20b19982545e ("usb: support SSP and SSPx2 xHCI")

Reviewed by:    aokblast, ngie, adrian
Differential Revision:  https://reviews.freebsd.org/D61278
DeltaFile
+9-2sys/dev/usb/controller/xhci.c
+2-0sys/dev/usb/controller/xhcireg.h
+2-0sys/dev/usb/controller/xhci.h
+13-23 files

FreeBSD/src 4ce90d5 — sys/dev/asmc asmcvar.h asmc.c

asmc: notify the SMC of shutdown and restart

Nothing tells the SMC that a power off or restart was user requested, so
the T2 keeps rebooting the machine thinking the system is wedged.

Approved-by: ngie (co-mentor)

Reviewed by:    ngie, adrian
Differential Revision:  https://reviews.freebsd.org/D61260
DeltaFile
+23-0sys/dev/asmc/asmc.c
+7-0sys/dev/asmc/asmcvar.h
+30-02 files

FreeBSD/src 0f908da — sys/powerpc/include atomic.h

powerpc: Define the sub-word atomic load and store directly

All currently supported powerpc CPUs handle single-copy atomicity for
any size up to the native word size, so load and store operations are
guaranteed for sub-word size that are naturally aligned.
DeltaFile
+6-0sys/powerpc/include/atomic.h
+6-01 files

FreeBSD/src 934ffa4 — sys/powerpc/powerpc elf64_machdep.c

powerpc64: Don't ignore lookup errors in kernel linker

If a lookup fails for a R_PPC_JMP_SLOT (PLT relocation) ignoring errors
results in an address of 0 gets written into the jump slot, leading to a
NULL pointer jump when attempting to call the function it points to.
Fix this with proper error checking so that a module will fail to load
instead of crashing later on.
DeltaFile
+3-1sys/powerpc/powerpc/elf64_machdep.c
+3-11 files

FreeBSD/src 68ba58a — sbin/camcontrol nvres.c

camcontrol: Fix -Wcast-align errors in the NVMe reservation report

Casting the byte buffer that holds the Reservation Report payload to
the status structures trips -Wcast-align on strict-alignment
architectures, which broke the CI builds there.  Put the buffer in a
union with the two status structures instead, so it is properly
aligned and no casts are needed.

Reported by:    FreeBSD CI
Fixes:  ba75cf05727e ("camcontrol: Support NVMe reservations via the persist subcommand")
Co-authored-by: Claude Fable 5 <noreply at anthropic.com>
MFC after:      1 week
Sponsored by:   Spectra Logic
DeltaFile
+11-7sbin/camcontrol/nvres.c
+11-71 files

FreeBSD/src cea524b — module/zfs zio.c

zio_reexecute() keeps the old allocation trace

An allocating write that fails with anything but ENOSPC is reexecuted,
and keeps being reexecuted for as long as its vdev fails writes but
passes probes. With metaslab tracing enabled, each attempt adds its
allocation trace entries to the same io_alloc_list, which is only
reset when the zio is created. After a few thousand entries a debug
build panics with "too many entries in allocation list"; a non-debug
build keeps a list full of stale entries.

zio_reexecute() now starts a fresh trace list.

Reviewed by: George Wilson <gwilson at zfsmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Matthew Ahrens <matt at mahrens.org>
Co-authored-by: Claude Opus 5.5 <noreply at anthropic.com>
Closes #19634
DeltaFile
+8-0module/zfs/zio.c
+8-01 files

FreeBSD/src 26321b7 — lib/msun/src s_nexttowardf.c s_nexttoward.c

msun: fix behaviour of nextafter*() and nexttoward*() for MAX value

For an edge case at an extreme, e.g., nextafter(-DBL_MAX,-INFINITY)
do not return x+x.  Instead, evaluate x+x and assign it to a volatile
to raise an exception, and then fall through to return the correct
result in current rounding mode.

Approved by:    re (cperciva)
PR:             299389
MFC after:      6 days (for inclusion into releng/15.2)

(cherry picked from commit 1fb5d8265bc4bbbf1f5bc79cc1d2a7f280b446b2)
(cherry picked from commit 42f926513b74cbac09d4d63a9daf8cb489078671)
DeltaFile
+1-1lib/msun/src/s_nexttowardf.c
+1-1lib/msun/src/s_nexttoward.c
+1-1lib/msun/src/s_nextafterl.c
+1-1lib/msun/src/s_nextafterf.c
+1-1lib/msun/src/s_nextafter.c
+5-55 files

FreeBSD/src df0ff57 — contrib/bc/vs bcl.vcxproj.filters bc.vcxproj.filters, contrib/bc/vs/tests tests_dc.bat tests_bc.bat

contrib/bc: remove vs sub-directory

Some of the files in the vs sub-directory are checked out with  CRLF
line breaks via .getattributes. This causes issues when checking out
the source tree with other tools that operate on Git repositories like
"got". Remove the vs sub-directory from the contrib tree, since it is
not required on FreeBSD.

Approved by:    re (cperciva)

(cherry picked from commit 94d4ba04a96f495d635bf246e4d5021eb1faab22)
(cherry picked from commit 5b5f93f12e3683b3ba7d2d600384bb5c4ed6e91a)
DeltaFile
+0-301contrib/bc/vs/bc.vcxproj
+0-264contrib/bc/vs/bcl.vcxproj
+0-170contrib/bc/vs/bc.vcxproj.filters
+0-104contrib/bc/vs/tests/tests_bc.bat
+0-87contrib/bc/vs/bcl.vcxproj.filters
+0-61contrib/bc/vs/tests/tests_dc.bat
+0-9873 files not shown
+1-1,0559 files

FreeBSD/src c17aa09 — usr.sbin/camdd camdd.c

camdd: Fix the worker startup race

The reader can hand off its first buffer before the writer sets
CAMDD_DEV_FLAG_ACTIVE.  camdd_queue_peer_buf() then mistakes the writer
for an exited peer and releases the buffer instead of queueing it.  This
can make a copy fail with bytes read but nothing written, without an
error message.

Mark both devices active before creating either worker, leaving the
workers to clear the flag on exit.  The work queues and EVFILT_USER
events are already initialized, so queued buffers and their notification
can wait for the writer to start without a startup barrier.

Treat pthread_create() failure as fatal.  Returning through the normal
cleanup path can free devices that an already-started worker is still
using, and an unstarted peer cannot consume any queued buffers.

Reviewed by:    imp, markj, ken
MFC after:      1 week
Differential Revision:  https://reviews.freebsd.org/D61277
DeltaFile
+9-6usr.sbin/camdd/camdd.c
+9-61 files

FreeBSD/src 6eae951 — sbin/camcontrol Makefile camcontrol.h

camcontrol: Add a feature subcommand for NVMe Get/Set Features

Add a feature subcommand for the NVMe Get Features and Set Features
commands:

  camcontrol feature ndaX -a <get|set> -f feature [-d data]
      [-s num] [-U]

There is no transport-specific prefix in the name: SCSI has no
feature command (the closest equivalents are mode pages), and the
ATA SET FEATURES subcommands are already exposed through dedicated
camcontrol subcommands (apm, aam, epc and the power commands), so
the name is unclaimed.  The subcommand returns an error for
non-NVMe devices.

Currently, only the hostid feature is fully implemented.  The
hostid value for set is specified with -d as a UUID or an integer
in decimal, hex, or octal, and -U outputs the hostid as a UUID on
get.

    [36 lines not shown]
DeltaFile
+539-0sbin/camcontrol/nvfeature.c
+182-0sbin/camcontrol/camcontrol.8
+32-1sbin/camcontrol/camcontrol.c
+3-0sbin/camcontrol/camcontrol.h
+1-1sbin/camcontrol/Makefile
+757-25 files

FreeBSD/src 80f0901 — sbin/camcontrol Makefile camcontrol.h

camcontrol: Support NVMe namespace formatting via the format subcommand

Support formatting NVMe namespaces through the existing format
subcommand.  The format subcommand now dispatches on the device
protocol, in the same way the identify and persist subcommands do,
and issues the NVMe FORMAT NVM command for NVMe devices.

The SCSI syntax and behavior are unchanged.  The NVMe-specific
options are -e (secure erase setting), -G (format all namespaces),
-f (LBA format), -l (protection information location), -m (metadata
setting) and -p (protection information type).  The -q and -y options
work for both protocols; NVMe formats gain the same confirmation
question that SCSI formats have always had.  The -r and -w options
are SCSI only; -r returns an error for NVMe devices and -w has no
effect, since the NVMe format command does not complete until the
format is finished.

The default timeout for NVMe is 30 seconds for a cryptographic erase
and 30 minutes otherwise; the generic -t option overrides it.

    [23 lines not shown]
DeltaFile
+313-0sbin/camcontrol/nvformat.c
+114-1sbin/camcontrol/camcontrol.8
+30-8sbin/camcontrol/camcontrol.c
+3-0sbin/camcontrol/camcontrol.h
+1-1sbin/camcontrol/Makefile
+461-105 files

FreeBSD/src 961fa19 — sbin/camcontrol camcontrol.h camcontrol.8

camcontrol: Add support for NVMe namespace Identify

Add a -N argument to camcontrol identify.  This will fetch and
display namespace Identify data for NVMe drives, using
nvme_print_namespace() from nvmecontrol(8).

This gets the namespace Identify data via XPT_DEV_ADVINFO (i.e.
data cached in the kernel) like the standard NVMe identify command
does, and so works even on NVMe devices that do not support NVMe
Namespace Management.

sbin/camcontrol/camcontrol.c:
        Add a -N argument to camcontrol identify.

        Rename nvme_get_cdata() to nvme_get_data(), and give it the
        ability to fetch controller or namespace Identify data.
        While here, improve its error reporting with
        cam_error_print(), and only look at the CAM status bits of
        the returned CCB.

    [22 lines not shown]
DeltaFile
+87-26sbin/camcontrol/camcontrol.c
+12-2sbin/camcontrol/camcontrol.8
+2-0sbin/camcontrol/camcontrol.h
+101-283 files

FreeBSD/src ba75cf0 — sbin/camcontrol Makefile camcontrol.h

camcontrol: Support NVMe reservations via the persist subcommand

The NVMe reservation model is closely patterned after SCSI Persistent
Reservations, so support NVMe devices through the existing persist
subcommand rather than adding a transport-specific subcommand.  The
persist subcommand now dispatches on the device protocol, in the same
way the identify subcommand does.

The SCSI syntax is unchanged.  For NVMe devices, the -i modes all map
to the Reservation Report command (read_full_status requests the
extended data structure, which contains 128-bit Host Identifiers), and
the -o service actions map to the corresponding NVMe reservation
operations: register, register_ignore, reserve, preempt,
preempt_abort, release and clear, plus two NVMe-only actions,
unregister and replace.  The reservation type names for -T are shared
between SCSI and NVMe.  A new -c option gives explicit control over
the NVMe Persist Through Power Loss State; -p is equivalent to
-c enable.  SCSI-only options return an error for NVMe devices.


    [32 lines not shown]
DeltaFile
+674-0sbin/camcontrol/nvres.c
+107-7sbin/camcontrol/camcontrol.8
+23-9sbin/camcontrol/camcontrol.c
+3-0sbin/camcontrol/camcontrol.h
+1-1sbin/camcontrol/Makefile
+808-175 files

FreeBSD/src 9814633 — sys/cam/nvme nvme_all.h nvme_all.c

cam: Add NVMe reservation, format and features CCB building functions

Add NVMe CCB (union ccb / struct ccb_nvmeio) building functions for
the four NVMe reservation opcodes, Format NVM, and Get Features /
Set Features.  These use the nvme_command building blocks added to
sys/dev/nvme/nvme.h, and are used by the new camcontrol(8) nvres,
nvformat and nvfeature subcommands that will be added separately.

sys/cam/nvme/nvme_all.c:
        Add NVMe CCB building functions for the four NVMe reservation
        opcodes: nvme_resv_report(), nvme_resv_register(),
        nvme_resv_acquire() and nvme_resv_release().  Data direction
        is set internally (CAM_DIR_IN or CAM_DIR_OUT as appropriate),
        so no flags parameter is needed.

        Add a new nvme_format() CCB building function.

        Add nvme_get_feature() and nvme_set_feature() CCB building
        functions, along with nvme_get_feature_hostid() and

    [16 lines not shown]
DeltaFile
+201-0sys/cam/nvme/nvme_all.c
+41-0sys/cam/nvme/nvme_all.h
+242-02 files

FreeBSD/src 7a9e437 — sbin/nvmecontrol resv.c, sys/dev/nvme nvme_util.c nvme_ctrlr.c

nvme: Add reservation, format and features command building support

Add command (struct nvme_command) building functions for the four
NVMe reservation opcodes (Report, Register, Acquire and Release),
Format NVM, and Get Features / Set Features, along with the
enumerations and data structures that go with them.  These are
shared between the kernel and userland, and are the underpinnings
for new camcontrol(8) subcommands (nvres, nvformat, nvfeature) that
will be added separately.

The reservation type names are intentionally similar to the SCSI
names for the same reservation types.

sys/dev/nvme/nvme.h:
  Add NVMe command building functions for the four NVMe
  reservation opcodes: nvme_ns_resv_report_cmd(),
  nvme_ns_resv_register_cmd(), nvme_ns_resv_acquire_cmd() and
  nvme_ns_resv_release_cmd().


    [68 lines not shown]
DeltaFile
+176-10sys/dev/nvme/nvme.h
+15-22sys/dev/nvme/nvme_ctrlr_cmd.c
+8-9sys/dev/nvme/nvme_ctrlr.c
+15-0sys/dev/nvme/nvme_util.c
+5-4sbin/nvmecontrol/resv.c
+219-455 files

FreeBSD/src 46198fb — sbin/nvmecontrol nvmecontrol.h nvmecontrol_ext.h

nvmecontrol: Factor out namespace Identify printing

Move print_namespace() from identify.c to identify_ext.c and rename
it to nvme_print_namespace(), to match nvme_print_controller().
This allows other consumers (notably camcontrol(8)) to print NVMe
namespace Identify data.

No functional changes intended.

sbin/nvmecontrol/identify.c:
        Remove print_namespace(), and call nvme_print_namespace()
        instead.

sbin/nvmecontrol/identify_ext.c:
        Add nvme_print_namespace(), moved here from identify.c.

sbin/nvmecontrol/nvmecontrol.h:
        Remove the print_namespace() prototype.


    [12 lines not shown]
DeltaFile
+1-128sbin/nvmecontrol/identify.c
+127-0sbin/nvmecontrol/identify_ext.c
+2-1sbin/nvmecontrol/ns.c
+0-1sbin/nvmecontrol/nvmecontrol.h
+1-0sbin/nvmecontrol/nvmecontrol_ext.h
+131-1305 files

FreeBSD/src 9dae9b3 — lib/libthr/thread thr_exit.c

libthr: require both _Unwind_ForcedUnwind and _Unwind_GetCFA for !PIC

Static linking must bring in both symbols for the unwind to work.

The landing pads added by 2734bbbcba3c reference _Unwind_Resume and
__gcc_personality_v0. In a static link, these pull UnwindLevel1.o
from libgcc_eh.a, which also defines _Unwind_ForcedUnwind, but
not UnwindLevel1-gcc-ext.o, which defines _Unwind_GetCFA. Unless
something else pulls that object in, as libcxxrt does for C++ programs,
thread_unwind_stop() calls a NULL _Unwind_GetCFA on every thread exit.

Reported and tested by: dch
Fixes:  2734bbbcba3c ("libthr: Create landing pad in thr_once in C++ exception")
Sponsored by:   The FreeBSD Foundation
DeltaFile
+1-1lib/libthr/thread/thr_exit.c
+1-11 files

FreeBSD/src 100f0e0 — include/sys vdev_raidz.h, module/zfs spa.c vdev_raidz.c

raidz: refuse too small replacements during expansion

While a raidz expansion is in progress, `zpool replace` of a raidz
child accepts a device that is too small.  The resilver or the reflow
then writes past the end of the new device, tripping this VERIFY in a
debug build (or writing past the end of the device otherwise):

  VERIFY3U(rc->rc_offset + rc->rc_size, <,
      cvd->vdev_psize - VDEV_LABEL_END_SIZE) failed
  PANIC at vdev_raidz.c:vdev_raidz_io_start_write()

Reproducer:

  truncate -s 1G /var/tmp/d{1..4}; truncate -s 800M /var/tmp/small
  zpool create tank raidz1 /var/tmp/d1 /var/tmp/d2 /var/tmp/d3
  zfs set compression=off tank
  dd if=/dev/urandom of=/tank/f bs=1M count=1200; zpool sync tank
  zpool replace tank /var/tmp/d1 /var/tmp/small  # "device is too small"
  echo 1 > /sys/module/zfs/parameters/raidz_expand_max_reflow_bytes

    [40 lines not shown]
DeltaFile
+30-0module/zfs/vdev_raidz.c
+10-0module/zfs/spa.c
+1-0include/sys/vdev_raidz.h
+41-03 files

FreeBSD/src 2ffb92b — tests/runfiles common.run, tests/zfs-tests/tests Makefile.am

ZTS: test too small raidz replacement during expansion

Add raidz_expand_012_neg, which pauses a raidz expansion and checks
that 'zpool replace' refuses a device too small for the not yet
reflowed, narrower part of the vdev, including after an export/import
with the expansion still paused.  It then checks that a device of the
original size is accepted, and that the pool scrubs clean once the
expansion completes.

This currently fails: the too small device is accepted, and the resilver
or reflow then writes past its end (a VERIFY panic in
vdev_raidz_io_start_write() on debug builds).  The fix follows in the
next commit.

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Signed-off-by: Will Rouesnel <wrouesnel at wrouesnel.com>
Closes #19279
DeltaFile
+119-0tests/zfs-tests/tests/functional/raidz/raidz_expand_012_neg.ksh
+1-1tests/runfiles/common.run
+1-0tests/zfs-tests/tests/Makefile.am
+121-13 files

FreeBSD/src e178ed8 — tests/zfs-tests/tests/functional/cli_root/zfs_copies zfs_copies.kshlib

ZTS: let udev settle before zfs_copies destroys the volume

zfs_copies_006_pos fails now and then in CI right after unmounting
the ext2 file system on its volume:

    cannot destroy 'testpool/testvol1': dataset is busy
    ERROR: zfs destroy testpool/testvol1 exited 1

new_fs writes the volume and closes it, so udev's watch on zd* makes
it rescan the volume, and blkid holds the device open while it does.
The test waits for udev before new_fs but not after it, and a destroy
issued while that scan still has the volume open gets EBUSY.  The
cleanup's destroy_dataset, which retries, succeeds a moment later.
do_vol_test() is shared with zfs_copies_003_pos, whose zpool create
also writes the volume.

Wait for udev with block_device_wait before the destroy and retry it
while it is busy, the way alloc_class_016_pos and destroy_dataset do.
The destroy must still succeed.

    [3 lines not shown]
DeltaFile
+7-1tests/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib
+7-11 files

FreeBSD/src 70cba46 — module/zfs zap_fat.c

zap: Fix zap_trunc() to account next ptrtbl blocks

In zap_trunc(), a case involving the expansion of ptrtbl was overlooked.
As a result, freeblk could end up pointing out to a block that had been
allocated for next ptrtbl. A next leaf allocation would lead to ptrtbl
corruption.

The fix checks whether ptrtbl is being expanded and accounts the blocks
allocated for it to compute freeblk.

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
Reviewed-by: Alexander Motin <alexander.motin at TrueNAS.com>
Signed-off-by: Alexander Stetsenko <alex.stetsenko at gmail.com>
Closes #19591
Closes #19693
DeltaFile
+10-7module/zfs/zap_fat.c
+10-71 files

FreeBSD/src b704cf4 — module/os/linux/zfs zfs_vfsops.c

Linux: unhash zero-link znodes when resuming after rollback

zfs_resume_fs() calls zfs_rezget() for every cached znode after a
rollback or a receive into a mounted filesystem.  If zfs_rezget()
fails, the inode is unhashed so that a new object created with the
same number does not collide with it.

zfs_rezget() can also succeed for an object that has zero links in
the new state: a file that was open-unlinked when the snapshot was
taken and is still held open.  It then sets z_unlinked and drops the
SA handle, but the inode stays hashed.  The unlinked drain that runs
after resume finds no znode attached to the object, so it allocates a
new unhashed one and frees the object.  When the object number is
reused, insert_inode_locked() finds the old inode and fails:

  VERIFY0(insert_inode_locked(ip)) failed (-16)
  PANIC at zfs_znode_os.c:641:zfs_znode_alloc()

The panicking thread holds an assigned transaction, so txg_quiesce

    [13 lines not shown]
DeltaFile
+7-7module/os/linux/zfs/zfs_vfsops.c
+7-71 files

FreeBSD/src 4b53052 — tests/runfiles linux.run, tests/zfs-tests/tests Makefile.am

ZTS: test rollback with held open-unlinked files

A file that is open-unlinked when a snapshot is taken is a zero-link
object in that snapshot's unlinked set.  If the file is still held
open when a mounted filesystem is rolled back to the snapshot,
zfs_rezget() succeeds for it, and the unlinked drain that runs after
resume frees the object while the old inode is still in use.

Add zfs_rollback_held_unlinked, which holds open-unlinked files across
a snapshot and a mounted rollback, then creates files until one reuses
a held object number.  It also checks that a write through a stale
descriptor fails and does not modify the new file.

This currently fails on Linux: the create that reuses the object
number fails VERIFY0(insert_inode_locked(ip)) in zfs_znode_alloc()
with EBUSY, because the old inode is still hashed.  The fix follows
in the next commit.

Co-Authored-By: Claude Opus 5.5 <noreply at anthropic.com>

    [3 lines not shown]
DeltaFile
+116-0tests/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_held_unlinked.ksh
+4-0tests/runfiles/linux.run
+1-0tests/zfs-tests/tests/Makefile.am
+121-03 files

FreeBSD/src fd5c1d4 — tests/zfs-tests/cmd dio_append_fallocate.c, tests/zfs-tests/tests/functional/fallocate fallocate_odirect_append.ksh

ZTS: Race fallocate against a buffered append too

zpl_iter_write() takes no inode lock for a buffered write either, so
a buffered write that extends the file races fallocate the same way an
O_DIRECT one does.

dio_append_fallocate gains -b, which makes the append a buffered write
instead of an O_DIRECT one. fallocate_odirect_append runs each of the
extend, punch and zero modes with both, and names the buffered ones
buffered-MODE when they lose a round. The buffered runs use 1000
rounds instead of 100: their window is shorter, and with 100 rounds
some runs on master lost none.

On a debug build of master the test failed 10 of 10 runs, and the
buffered runs lost 21 to 952 of 1000 rounds in every mode of every
run. With the fallocate change in this PR it passed 10 of 10, and no
round was lost.

Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>

    [5 lines not shown]
DeltaFile
+39-32tests/zfs-tests/tests/functional/fallocate/fallocate_odirect_append.ksh
+33-18tests/zfs-tests/cmd/dio_append_fallocate.c
+72-502 files

FreeBSD/src 94eb73b — include/os/linux/zfs/sys zfs_vnops_os.h, module/os/linux/zfs zpl_file.c zfs_znode_os.c

Linux: do not truncate a concurrent extending write in fallocate

zpl_iter_write() takes no inode lock, so a buffered or O_DIRECT write
that extends a file updates the file size without holding it. A
fallocate that extends the file reads the size into olen first. If
the write grows the file after that, the fallocate truncates it back
to offset + len, the written data is gone, and the application was
told its write succeeded.

The extend path set the new size with zfs_freesp(zp, offset + len, 0,
0, TRUE). With len 0, zfs_freesp() sets the size to off. It grows the
file when off is past z_size and truncates it otherwise. The write had
already moved z_size past offset + len, so this took the truncate
branch.

zfs_freesp() could also lose the write when it read z_size before the
write raised it. zfs_extend() then found the file long enough and did
nothing, but zfs_freesp() still logged TX_TRUNCATE at offset + len and
called truncate_setsize(), so i_size went short and replay would cut

    [23 lines not shown]
DeltaFile
+31-5module/os/linux/zfs/zfs_znode_os.c
+12-5module/os/linux/zfs/zpl_file.c
+1-0include/os/linux/zfs/sys/zfs_vnops_os.h
+44-103 files