freebsd-skq/sys/compat/linux
bde 8bff5fd956 Fix the encoding of major and minor numbers in 64-bit dev_t by restoring
the old encodings for the lower 16 and 32 bits and only using the
higher 32 bits for unusually large major and minor numbers.  This
change breaks compatibility with the previous encoding (which was only
used in -current).

Fix truncation to (essentially) 16-bit dev_t in newnfs v3.

Any encoding of device numbers gives an ABI, so it can't be changed
without translations for compatibility.  Extra bits give the much
larger complication that the translations need to compress into fewer
bits.  Fortunately, more than 32 bits are rarely needed, so
compression is rarely needed except for 16-bit linux dev_t where it
was always needed but never done.

The previous encoding moved the major number into the top 32 bits.
Almost no translation code handled this, so the major number was blindly
truncated away in most 32-bit encodings.  E.g., for ffs, mknod(8) with
major = 1 and minor = 2 gave dev_t = 0x10000002; ffs cannot represent
this and blindly truncated it to 2.  But if this mknod was run on any
released version of FreeBSD, it gives dev_t = 0x102.  ffs can represent
this, but in the previous encoding it was not decoded, giving major = 0,
minor = 0x102.

The presence of bugs was most obvious for exporting dev_t's from an
old system to -current, since bugs in newnfs augment them.  I fixed
oldnfs to support 32-bit dev_t in 1996 (r16634), but this regressed
to 16-bit dev_t in newnfs, first to the old 16-bit encoding and then
further in -current.  E.g., old ad0 with major = 234, minor = 0x10002
had the correct (major, minor) number on the wire, but newnfs truncated
this to (234, 2) and then the previous encoding shifted the major
number into oblivion as seen by ffs or old applications.

I first tried to fix this by translating on every ABI/API boundary, but
there are too many boundaries and too many sloppy translations by blind
truncation.  So use the old encoding for the low 32 bits so that sloppy
translations work no worse than before provided the high 32 bits are
not set.  Add some error checking for when bits are lost.  Keep not
doing any error checking for translations for almost everything in
compat/linux.

compat/freebsd32/freebsd32_misc.c:
Optionally check for losing bits after possibly-truncating assignments as
before.

compat/linux/linux_stats.c:
Depend on the representation being compatible with Linux's (or just with
itself for local use) and spell some of the translations as assignments in
a macro that hides the details.

fs/nfsclient/nfs_clcomsubs.c:
Essentially the same fix as in 1996, except there is now no possible
truncation in makedev() itself.  Also fix nearby style bugs.

kern/vfs_syscalls.c:
As for freebsd32.  Also update the sysctl description to include file
numbers, and change it to describe device ids as device numbers.

sys/types.h:
Use inline functions (wrapped by macros) since the expressions are now
a bit too complicated for plain macros.  Describe the encoding and
some of the reasons for it.  16-bit compatibility didn't leave many
reasonable choices for the 32-bit encoding, and 32-bit compatibility
doesn't leave many reasonable choices for the 64-bit encoding.  My
choice is to put the 8 new minor bits in the low 8 bits of the top 32
bits.  This minimizes discontiguities.

Reviewed by:	kib (except for rewrite of the comment in linux_stats.c)
2018-06-13 12:22:00 +00:00
..
check_error.d
check_internal_locks.d Linuxolator whitespace cleanup 2018-02-05 17:29:12 +00:00
linux_common.c
linux_dtrace.h sys/compat: further adoption of SPDX licensing ID tags. 2017-11-27 15:13:23 +00:00
linux_emul.c linuxulator: deduplicate linux_exec_imgact_try 2018-04-09 17:24:01 +00:00
linux_emul.h linuxulator: deduplicate linux_exec_imgact_try 2018-04-09 17:24:01 +00:00
linux_errno.c Share Linux errno table with libsysdecode 2018-03-22 12:58:49 +00:00
linux_errno.inc Map FreeBSD EDOOFUS to Linux EINVAL 2018-04-23 18:33:26 +00:00
linux_event.c Eliminate the overhead of gratuitous repeated reinitialization of cap_rights 2018-05-09 18:47:24 +00:00
linux_event.h Implement timerfd family syscalls. 2017-02-26 09:48:18 +00:00
linux_file.c Eliminate the overhead of gratuitous repeated reinitialization of cap_rights 2018-05-09 18:47:24 +00:00
linux_file.h Linuxolator whitespace cleanup 2018-02-05 17:29:12 +00:00
linux_fork.c Linuxolator whitespace cleanup 2018-02-05 17:29:12 +00:00
linux_futex.c Fix futexes on i386 after the 4/4G split. 2018-04-24 12:50:21 +00:00
linux_futex.h Fix futexes on i386 after the 4/4G split. 2018-04-24 12:50:21 +00:00
linux_getcwd.c sys/compat: further adoption of SPDX licensing ID tags. 2017-11-27 15:13:23 +00:00
linux_ioctl.c UDP: further performance improvements on tx 2018-05-23 21:02:14 +00:00
linux_ioctl.h Rationalize license text on Linuxolator files 2018-03-23 14:39:34 +00:00
linux_ipc64.h Linuxolator whitespace cleanup 2018-02-05 17:29:12 +00:00
linux_ipc.c sys/linux: Fix a few potential infoleaks in Linux IPC 2018-03-03 21:14:55 +00:00
linux_ipc.h Rationalize license text on Linuxolator files 2018-03-23 14:39:34 +00:00
linux_mib.c Correct proper nouns in the Linuxulator 2018-02-22 02:24:17 +00:00
linux_mib.h Rationalize license text on Linuxolator files 2018-03-23 14:39:34 +00:00
linux_misc.c Correct proper nouns in the Linuxulator 2018-02-22 02:24:17 +00:00
linux_misc.h Rationalize license text on Linuxolator files 2018-03-23 14:39:34 +00:00
linux_mmap.c Eliminate the overhead of gratuitous repeated reinitialization of cap_rights 2018-05-09 18:47:24 +00:00
linux_mmap.h Fix a copy/paste bug introduced during X86_64 Linuxulator work. 2016-07-10 08:22:04 +00:00
linux_persona.h Linuxolator whitespace cleanup 2018-02-05 17:29:12 +00:00
linux_signal.c Linuxulator: apply style(9) to return 2018-03-12 15:35:24 +00:00
linux_signal.h Rationalize license text on Linuxolator files 2018-03-23 14:39:34 +00:00
linux_socket.c Eliminate the overhead of gratuitous repeated reinitialization of cap_rights 2018-05-09 18:47:24 +00:00
linux_socket.h Linuxolator whitespace cleanup 2018-02-05 17:29:12 +00:00
linux_stats.c Fix the encoding of major and minor numbers in 64-bit dev_t by restoring 2018-06-13 12:22:00 +00:00
linux_sysctl.c Rationalize license text on Linuxolator files 2018-02-16 15:00:14 +00:00
linux_sysproto.h sys/compat: further adoption of SPDX licensing ID tags. 2017-11-27 15:13:23 +00:00
linux_time.c Linuxolator whitespace cleanup 2018-02-05 17:29:12 +00:00
linux_timer.c Return EINVAL in case of incorrect sigev_signo value specified instead of panicing. 2015-12-26 09:09:49 +00:00
linux_timer.h Use the kern_clock_nanosleep() to implement Linux clock_nanosleep() with 2017-04-02 18:16:00 +00:00
linux_uid16.c sys/compat: further adoption of SPDX licensing ID tags. 2017-11-27 15:13:23 +00:00
linux_util.c Move most of the contents of opt_compat.h to opt_global.h. 2018-04-06 17:35:35 +00:00
linux_util.h Linuxolator whitespace cleanup 2018-02-05 17:29:12 +00:00
linux_vdso.c Avoid using [LINUX_]SHAREDPAGE constant directly in the vdso code. 2017-07-30 21:24:20 +00:00
linux_vdso.h Avoid using [LINUX_]SHAREDPAGE constant directly in the vdso code. 2017-07-30 21:24:20 +00:00
linux_videodev2_compat.h
linux_videodev_compat.h
linux.c Improve debugging output. 2017-02-16 10:36:00 +00:00
linux.h
stats_timing.d Linuxolator whitespace cleanup 2018-02-05 17:29:12 +00:00
trace_futexes.d Linuxolator whitespace cleanup 2018-02-05 17:29:12 +00:00