opnsense-src/sys
Kirk McKusick 35a301555b Increase UFS/FFS maximum link count from 32767 to 65530.
The link count for a UFS/FFS inode is stored in a signed 16-bit
integer. Thus the maximum link count has been 32767.

This limit has been recently hit by the poudriere build system when
doing a ports build as it needs one directory per port and the
number of ports recently passed 32767.

A long-term solution would be to use one of the spare 32-bit fields
in the inode to store the link count. However, the UFS1 format does
not have a spare and adding the spare in UFS2 would make it hard
to make it compatible when running on older kernels that use the
original link count field. So this patch uses the much simpler
approach of changing the existing link count field from a signed
16-bit value to an unsigned 16-bit value. It has the fewest lines
of code changes. The only thing that changes is the type in the
dinode and inode structures and the definition of UFS_LINK_MAX. It
has the added benefit that it works with both UFS1 and UFS2.

It allows easy backward compatibility. Indeed it is backward
compatibility that is the primary reason to go with this approach.
If a filesystem with the new organization is mounted on an older
kernel, it still needs to work. Thus if we move the new link count
to a new field, we still need to maintain the old link count as
best as possible even when running on a kernel that knows about the
larger link counts. And we would have to carry this overhead for
the indefinite future.

If we have a new link-count field, we will have to add a new
filesystem flag to indicate that we are running with larger link
counts. We will also need to add of one of the new-feature flags
to say that we have larger link counts. Older kernels clear the
new-feature flags that they do not know about, so when a filesystem
is used on an older kernel and then moved back to a newer one, the
newer one will know that the new link counts have not been maintained
and that it will be necessary to run a full fsck on the filesystem
to correct the link counts before it can be mounted.

With this change, older kernels will generally work with the bigger
counts. While it will not itself allow the link count to exceed
32767, it will have no problem working with inodes that have a link
count greater than 32767. Since it tests that i_nlink <= UFS_LINK_MAX,
counts that are bigger than 32767 will appear negative, so will
still pass the test. Of course, if they ever drop below 32767, they
will no longer be able to exceed 32767. The one issue is if the
link count ever exceeds 65535 then it will wrap to zero and the
older kernel will be none the wiser. But this corner case is likely
to be very rare since these kernels and the applications running
on them do not expect to be able to get link counts over 32767. And
over time, the use of new filesystems on older kernels will become
rarer and rarer.

Reported-by: Mark Millard running poudriere on the ports tree
Reviewed-by: kib, olce.freebsd_certner.fr
Tested-by:   Peter Holm, Mark Millard
MFC-after:   2 weeks
Differential Revision: https://reviews.freebsd.org/D42767
2023-12-03 12:40:29 -08:00
..
amd64 x86: Support multiple PCI MCFG regions 2023-11-29 10:32:39 -08:00
arm sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
arm64 armv8rng: Don't require toolchain to support FEAT_RNG 2023-12-01 23:59:07 +00:00
bsm timerfd: Move implementation from linux compat to sys/kern 2023-08-24 14:28:56 -06:00
cam cam: Make cam.h self-contained for userland 2023-11-30 18:32:39 -07:00
cddl sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
compat LinuxKPI: 802.11: bring in some HT code 2023-12-01 22:26:28 +00:00
conf ossl: Add AES-GCM support for NEON-enabled armv7 2023-11-30 12:49:48 -05:00
contrib zfs: merge openzfs/zfs@a03ebd9be 2023-11-29 23:08:25 +01:00
crypto ossl: Add AES-GCM support for NEON-enabled armv7 2023-11-30 12:49:48 -05:00
ddb sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
dev usbdevs: add quirk for WD MyPassport Ultra External HDD 2023-12-03 23:50:40 +07:00
dts sys: Remove $FreeBSD$: one-line bare tag 2023-08-16 11:55:17 -06:00
fs nullfs: do not allow bypass on copy_file_range() 2023-11-28 19:32:53 +02:00
gdb sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
geom sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
gnu sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
i386 x86: Support multiple PCI MCFG regions 2023-11-29 10:32:39 -08:00
isa sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
kern unix/dgram: bump maximum datagram size limit to 8k 2023-12-01 15:37:29 -08:00
kgssapi sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
libkern sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
modules ossl: Add AES-GCM support for NEON-enabled armv7 2023-11-30 12:49:48 -05:00
net sockets: don't malloc/free sockaddr memory on getpeername/getsockname 2023-11-30 08:31:10 -08:00
net80211 net80211: move net_epoch into net80211 2023-12-01 00:46:10 +00:00
netgraph sockets: don't malloc/free sockaddr memory on getpeername/getsockname 2023-11-30 08:31:10 -08:00
netinet tcp: properly initialize LRD while accepting session in syncache 2023-12-02 12:17:01 +01:00
netinet6 sockets: don't malloc/free sockaddr memory on getpeername/getsockname 2023-11-30 08:31:10 -08:00
netipsec sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
netlink sockets: don't malloc/free sockaddr memory on getpeername/getsockname 2023-11-30 08:31:10 -08:00
netpfil pf: fix mem leaks upon vnet destroy 2023-11-29 17:59:28 +01:00
netsmb sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
nfs sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
nfsclient sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
nfsserver sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
nlm sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
ofed ofed: garbage collect now unused sdp_sockaddr() 2023-11-30 21:50:16 -08:00
opencrypto sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
powerpc sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
riscv sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
rpc sockets: don't malloc/free sockaddr memory on getpeername/getsockname 2023-11-30 08:31:10 -08:00
security sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
sys sysproto.h: regen after c1c8afd04e 2023-12-01 21:45:42 +00:00
teken teken: fix style in teken_wcwidth.h 2023-10-13 08:14:57 +03:00
tests sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
tools makesyscalls: add COMPAT14 support 2023-12-01 20:00:39 +00:00
ufs Increase UFS/FFS maximum link count from 32767 to 65530. 2023-12-03 12:40:29 -08:00
vm vm: Add kva_alloc_aligned 2023-11-30 10:50:03 +00:00
x86 x86: Support multiple PCI MCFG regions 2023-11-29 10:32:39 -08:00
xdr sys: Automated cleanup of cdefs and other formatting 2023-11-26 22:24:00 -07:00
xen xen: remove xen_domain_type enum/variable 2023-11-28 13:40:19 +01:00
Makefile sys: Remove $FreeBSD$: one-line sh pattern 2023-08-16 11:54:58 -06:00
README.md sys/README.md: Add a section for documentation 2023-08-03 11:07:41 -03:00

FreeBSD Kernel Source:

This directory contains the source files and build glue that make up the FreeBSD kernel and its modules, including both original and contributed software.

Kernel configuration files are located in the conf/ subdirectory of each architecture. GENERIC is the configuration used in release builds. NOTES contains documentation of all possible entries. LINT is a compile-only configuration used to maximize build coverage and detect regressions.

Documentation:

Source code documentation is maintained in a set of man pages, under section 9. These pages are located in share/man/man9, from the top-level of the src tree. Consult intro(9) for an overview of existing pages.

Some additional high-level documentation of the kernel is maintained in the Architecture Handbook.

Source Roadmap:

Directory Description
amd64 AMD64 (64-bit x86) architecture support
arm 32-bit ARM architecture support
arm64 64-bit ARM (AArch64) architecture support
cam Common Access Method storage subsystem - cam(4) and ctl(4)
cddl CDDL-licensed optional sources such as DTrace
conf kernel build glue
compat Linux compatibility layer, FreeBSD 32-bit compatibility
contrib 3rd-party imported software such as OpenZFS
crypto crypto drivers
ddb interactive kernel debugger - ddb(4)
fs most filesystems, excluding UFS, NFS, and ZFS
dev device drivers and other arch independent code
gdb kernel remote GDB stub - gdb(4)
geom GEOM framework - geom(4)
i386 i386 (32-bit x86) architecture support
kern main part of the kernel
libkern libc-like and other support functions for kernel use
modules kernel module infrastructure
net core networking code
net80211 wireless networking (IEEE 802.11) - net80211(4)
netgraph graph-based networking subsystem - netgraph(4)
netinet IPv4 protocol implementation - inet(4)
netinet6 IPv6 protocol implementation - inet6(4)
netipsec IPsec protocol implementation - ipsec(4)
netpfil packet filters - ipfw(4), pf(4), and ipfilter(4)
opencrypto OpenCrypto framework - crypto(7)
powerpc PowerPC/POWER (32 and 64-bit) architecture support
riscv 64-bit RISC-V architecture support
security security facilities - audit(4) and mac(4)
sys kernel headers
tests kernel unit tests
ufs Unix File System - ffs(7)
vm virtual memory system
x86 code shared by AMD64 and i386 architectures