The linux 5.18 commit 'fs: Remove ->readpages address space
operation' (704528d8) removes the address_space_operations operation
"readpages", which is replaced with the "readahead" operation
that was introduced with the 5.8 commit 'mm: add readahead address
space operation' (8151b4c8).
When readahead is called, the pages in 'rac' have already been added to
the lru caches and are locked. For each page that we get from the 'rac'
(i.e. from 'readahead_page(rac)'), we must unlock and put_page the page;
if we successfully populated the page with data, we also set
PageUpToDate. If we don't process all the pages in 'rac', the caller
will handle cleaning up any remaining pages; we don't need to unlock/put
them or touch them at all.
(See Linux Documentation/filesystems/vfs.rst)
Add an autoconf test to detect the presence of 'readahead' in the
address_space_operations structure.
For the implementation of readahead (which is contained in Linux's
osi_vnodeops.c):
Add new functions 'afs_linux_bypass_readahead' and 'afs_linux_readahead'
as replacements for 'afs_bypass_readpages' and 'afs_linux_readpages'
when the linux kernel supports the readahead operation.
Notes:
In afs_linux_bypass_readahead, the pages are already locked and are
already in the page cache, we just need to place the page into the
iovecp. The page's refcount will be decremented and will be unlocked
when processing the read request.
In afs_linux_readahead, the lrupages is needed in case a page is added
to the cachefp's mapping in afs_linux_read_cache (which also handles
unlocking the page).
In afs_linux_readahead, if there is no tdc, we must still unlock the
page otherwise the read process will wait on that page.
Change-Id: I6960a2fc14df85869c373f3e3afbf3ee5eb7228f
Reviewed-on: https://gerrit.openafs.org/14953
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Change the klog.krb5 -lifetime help description to show this option is
ignored. This option name was copied from the krb4 command but is not
implemented for the krb5 version. It is retained for command line syntax
compatibility.
Change-Id: I7f4e81609cf3613a7173e2b6f2e6b1bfb8cd4dc8
Reviewed-on: https://gerrit.openafs.org/15045
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
The GetInstanceParm and GetStatus bosserver RPCs return output strings
by first allocating a 256 byte buffer then calling the bnode operations
bnode_GetParm() and bnode_GetString() to fill those buffers. The RPC
output strings are automatically freed by XDR.
In order to support large output strings in the future, change these
bnode operations to allocate the output strings and to use safe string
functions to duplicate and format strings.
Update the ez, cron, fs, and dafs getstring and getparm operations to
allocate the output string or return an error.
Return BZIO over the wire when a string cannot be allocated, since
ENOMEM is not a portable wire error code. (Use BZIO to be consistent
existing code added in commit fda2bc874751ca479365dc6389c0eebb41a0bda1
(Allocate pathname buffers dynamically).
Commit ea276e83e3 (OPENAFS-SA-2019-001: Skip server OUT args on
error) is a prerequisite for this change.
Change-Id: Id16184efc95d614846b912177b220c8e87b7a88b
Reviewed-on: https://gerrit.openafs.org/14766
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
The simple (ez) bnodes have only one parameter, which is accessed as
index 0. A check is made for values greater than 0, however the index
argument is a signed type, and a check for negative indices is missing.
Explicitly check for non-zero index values when retrieving simple bnode
parameters, and if not zero return BZDOM.
The other bnode types already check for specific (positive) index
values, so only the simple bnode type needs to be updated.
Change-Id: I8764af6c975431caf26c25a371cf6db10e6e7fec
Reviewed-on: https://gerrit.openafs.org/15043
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
cppcheck noted these instances of sscanf could wipe out the ending null
terminator. Length is now macro expanded rather than hard coded and the
array itself is one unit longer to avoid the overrun.
Change-Id: Ic76e1b74701d7fb7b722ba1f8eae3a4d16e91f65
Reviewed-on: https://gerrit.openafs.org/13136
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
To avoid adding new includes for afs/afsutil.h in order to use
'AFS_STRINGIZE', create a replacement, 'opr_stringize', in afs/opr.h.
Replace the usage of 'AFS_STRINGIZE' with opr_stringize and remove the
definition of 'AFS_STRINGIZE'
Change-Id: I6d12ed101b6f9246a59c46024c216c7fe25bc1c8
Reviewed-on: https://gerrit.openafs.org/15029
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
In lwp/process.c the address of a stack variable is saved as part of
creating a new context. GCC-12 is flagging the statement with a
diagnostic:
./process.c:46:24: error: storing the address of local variable
‘stackvar’ in ‘*savearea.topstack’ [-Werror=dangling-pointer=]
46 | savearea->topstack = (char *)&stackvar;
| ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
In this particular case, the code is meaning to save the address of the
stack in preparation of setting up a new context, which requires knowing
the address the current stack.
The diagnostic is changed from a warning to an error when configured
with --enable-checking.
Set the env variable CFLAGS_NODANGLING_POINTER to
'-Wno-dangling-pointer' if the compiler supports the option and update
the src/lwp/Makefile.in to use the flag when compiling process.c
Change-Id: Ibec956b505c0edad9b74d63b9bb7805f6f0cba01
Reviewed-on: https://gerrit.openafs.org/14957
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
GCC-12 is flagging a comparison with the following diagnostic:
src/afs/afs_vcache.c:3161:25: error: the comparison will always
evaluate as ‘false’ for the address of ‘v’ will never be NULL
[-Werror=address]
3161 | AFSTOV(avc) == NULL || vType(avc) == VDIR ||
| ^~
When the vcache structure does not have the vnode embedded the expansion
of the AFSTOV macro results in:
((avc)->v)
which tests contents of a 'v'.
When the vcache structure does have the vnode embedded, the expansion of
the macro results in:
(&(avc)->v)
which tests the address of 'v', which will never be NULL in this case.
Update afs.h to add a new define 'AFS_VCACHE_EMBEDDED_VNODE' when the
vcache structure contains an embedded vnode structure. Restructure the
preprocessor statements for the AFSTOV definition
Avoid testing AFSTOV(x) against NULL when AFS_VCACHE_EMBEDDED_VNODE is
defined.
The diagnostic is changed from a warning to an error when configured
with --enable-checking.
Change-Id: Ib72647fa23e5a7ecd96772b04c6ef76540f44535
Reviewed-on: https://gerrit.openafs.org/14956
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
The BOZO_EnumerateInstance looks up a bnode instance with a zero-based
index (anum) and returns BZDOM when the index is out of range for the
current list of bosserver bnode instances.
The index is defined as a signed integer by the RPC, but the implementation
does not check for a negative index. Currently, the implementation
returns an empty string when a negative (out of range) index is given.
Instead, return a BZDOM error to indicate the index is out of range.
Commit ea276e83e37e5bd27285a3d639f2158639172786 (OPENAFS-SA-2019-001:
Skip server OUT args on error) is a prerequisite for this change.
Change-Id: I4df5d35aaccdbfcbe8e8dcc4fa1aa45ee06b06ab
Reviewed-on: https://gerrit.openafs.org/15031
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Return a BZ error code over the wire when memory cannot be allocated,
since ENOMEM is not a portable wire error code.
Use BZIO for these errors to be consistent with the existing bosserver
code added in commit fda2bc874751ca479365dc6389c0eebb41a0bda1 (Allocate
pathname buffers dynamically).
The incorrect error codes were added in:
fda2bc874751ca479365dc6389c0eebb41a0bda1 Allocate pathname buffers dynamically
381597851b659f00747b22efc24240073c4403ce bozo: Fix problems found by static analysis
Change-Id: I6e19aba226441159ba9e7d4173d2145f5d6745c2
Reviewed-on: https://gerrit.openafs.org/15030
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Relocate the block of code that obtains the dcache for a readahead
operation from the afs_linux_readpages function into its own static
function.
Change-Id: Iaaf9523532e292a1f2426d5ced65ddfbceb5d060
Reviewed-on: https://gerrit.openafs.org/14962
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
There is duplicated code for initializing a nocache_read_request
and also freeing the associated storage in certain cases. Create a set
of helper functions that allocates and frees a nocache_read_request and
its associated structures.
afs_alloc_ncr allocates a nocache_read_request structure and if not
UKERNEL, will allocate and initialize the associated uio and iovec
structures.
afs_free_ncr releases a noncache_read_request structure and the
associated uio and iovec structures if not UKERNEL.
Update locations that allocate/free nocache_read_request structures to
use the new functions.
Change-Id: I80c0b4eb036bcb1223b73f4c1de2c12be362de42
Reviewed-on: https://gerrit.openafs.org/14954
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
The clang compiler complains that this function pointer cast is not a
prototype.
.../osi_file.c:141:27: error: this function declaration is not a
prototype [-Werror,-Wstrict-prototypes]
afile->proc = (int (*)())0;
^
void
Just use NULL instead of trying to create a cast to 0.
Change-Id: I3adb22cb38db8c854d9313ec9eb2b008a4e9a9db
Reviewed-on: https://gerrit.openafs.org/14902
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Currently, two of the Linux-related autoconf macros try to compile code
containing nested C functions (AC_CHECK_LINUX_OPERATION and
LINUX_KMEM_CACHE_CREATE_CTOR_TAKES_VOID). For example, the
AC_CHECK_LINUX_OPERATION check for 'follow_link' generates this code
where 'op' is a nested function inside 'conftest':
#include <linux/module.h>
#include <linux/fs.h>
void conftest(void)
{
struct inode_operations ops;
const char *op(struct dentry *dentry, void **link_date) {
return (const char *)0;
};
ops.follow_link = op;
}
Nested functions are a gcc-specific feature, and are not supported by
other compilers (e.g. clang), causing these checks to always fail when
using clang, leading to incorrect configure results.
To fix this, change AC_CHECK_LINUX_OPERATION and
LINUX_KMEM_CACHE_CREATE_CTOR_TAKES_VOID macros to just define the
relevant function as a proper top-level function.
(these were discovered by forcing a clang build of both the Linux kernel
and the openafs kernel module)
Change-Id: I1f5410d6702025d228b6ed80e7b86b9745ffe3dc
Reviewed-on: https://gerrit.openafs.org/14901
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
When detecting valid compiler flags clang behaves differently than gcc
for certain types of flags. Specifically, gcc will ignore an unknown
"-Wno-someflag" while clang will issue a warning. If using clang and
--enable-checking is specified, this difference causes a build failure
because the warning for the unknown flag is turned into an error.
The autoconf macro AX_APPEND_COMPILE_FLAGS (via the underlying macro
AX_CHECK_COMPILE_FLAGS) looks specifically for errors and not warnings
to determine if the flag is valid. In order to properly catch the above
type of unknown compiler flags, a '-Werror' must be passed as an
extra-flag.
Update the autoconf functions that use AX_APPEND_COMPILE_FLAGS to use
'-Werror' as an extra flag when testing for "-Wno-..." flags.
Note, for gcc, the test may (incorrectly) think that the compiler
supports the given flag, but that is okay, since the flag will be
ignored by gcc during the build without raising any warnings or errors.
Change-Id: I9e4dabf04a3b019cb1ea58a4b2ac1cf0fc8d1e71
Reviewed-on: https://gerrit.openafs.org/14900
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Commit bffc354ff7 (finale: translate_et (Unix) support for UAE) added
a dependency on unified_afs.o, but it uses a srcdir path. For objdir
builds, this will only exist in objdir and not srcdir, so make cannot
find the file and the build fails.
Use an objdir path instead.
Change-Id: Ie581ad9cf587dfccd73bcb41b942ea727a683e1f
Reviewed-on: https://gerrit.openafs.org/15025
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Commit a5c3dfe99f (afs: Move osi_GetTime out of param.h) moved all
osi_GetTime definitions from param files into osi_machdep.h for the
given platform. But while it added an osi_GetTime for the DFBSD
osi_machdep.h, it forgot to remove the osi_GetTime definition from the
only DFBSD param file we have, param.i386_dfbsd_23.h.
Get rid of the lingering extra definition.
Change-Id: Ic391922e9fe2551065342b4f9ef3b148402d70b6
Reviewed-on: https://gerrit.openafs.org/14992
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: Benjamin Kaduk <kaduk@mit.edu>
clang-14 is producing the following diagnostic:
afsd.c:581:44: error: 'fscanf' may overflow; destination buffer in
argument 3 has size 1024, but the corresponding specifier may
require size 1025 [-Werror,-Wfortify-source]
fscanf(cachefd, "%1024[^:]:%1024[^:]:%d", tCacheMountDir,
fscanf is being used to parse the contents of a file and the buffer
sizes are hardcoded. Simply increase the size of the 2 buffers by 1.
The diagnostic warning is changed to an error when configured with
--enable-checking.
Change-Id: Iefbc4e87242232531a266e876fe779476b42fb62
Reviewed-on: https://gerrit.openafs.org/14958
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
GCC-12 is flagging an snprintf statement with a format truncation
warning:
namei_ops.c: In function ‘namei_ListAFSSubDirs’:
namei_ops.c:2029:22: error: ‘%s’ directive output may be truncated
writing up to 255 bytes into a region of size between 0 and 511
[-Werror=format-truncation=]
Change code to use asprintf instead of snprintf. Return an error if a
memory allocation fails.
Change-Id: I1f617ab22dbec4c2497ec482115cd20c9af0ecfa
Reviewed-on: https://gerrit.openafs.org/14955
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
At the beginning of UKERNEL's rx_ServerProc a call to AFS_GUNLOCK
panics with 'afs global lock not held'.
The commit 'afs: Drop GLOCK for various Rx calls' (d5e1428a3b) altered
afs_RXCallBackServer so the global lock is released prior to calling
rx_ServerProc, and to reacquire the lock after rx_ServerProc returns.
Remove the AFS_GUNLOCK at the start and the AFS_GLOCK at the end of
UKERNEL's rx_ServerProc.
Change-Id: Id0e2fef574e4d3473e83f77615d194448f55ab47
Reviewed-on: https://gerrit.openafs.org/14963
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
The current value of NUSERS (16) is very small when the client has a
large number of PAGs. When we have a few thousand (or even just a few
hundred), the length of the unixuser hash chains can be come long
enough to cause noticeable differences in performance. Looking up
unixuser structs is a very common code path, since we need to do this
for pretty much any file access that's not already cached at the VFS
layer.
To alleviate this, increase NUSERS to 2k. This is certainly not
necessary on all systems (such as those that never use authentication,
or only have a few PAGs), but the overhead is a very small constant
amount of memory.
Change-Id: I17b32f192656db9ffc97ac47b0923a02803977a3
Reviewed-on: https://gerrit.openafs.org/14959
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Currently, /afs is mounted/unmounted by a LaunchDaemon. In order to
unmount /afs on restart/shutdown, this daemon runs umount -force /afs.
Unfortunately, SIP (System Integrity Protection) is not allowing the
LaunchDaemon in question to run this command successfully on macOS 12
(exclusively on restart/shutdown):
umount: Operation not permitted
In this situation, afs can't be turned off correctly, leaving many
unkillable afsd processes lingering around. As a result, the
restart/shutdown process gets stuck indefinitely.
Fortunately, this problem doesn't happen if /afs is mounted on an user's
directory. That said, avoid this issue by mounting /afs on the current
user's directory (/Users/$USER/OpenAFS/afs). Notice that afs is still
accessible (including for other users) through a synthetic link added in
the root directory (/afs -> /Users/$USER/OpenAFS/afs).
Change-Id: Id05d811e785057a82b73d0946154d9be8b5d772a
Reviewed-on: https://gerrit.openafs.org/14925
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
This commit introduces the new set of changes / files required to
successfully create the dmg installer on OS X 12.0 "Monterey".
Change-Id: I365aecabf12e88bbe7eabd22c8727a5c446656b8
Reviewed-on: https://gerrit.openafs.org/14924
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
This commit introduces the new set of changes / files required to
successfully build the OpenAFS source code on OS X 12.0 "Monterey".
Change-Id: Iada9cab596747122c1973654ae4f78d52957c8a6
Reviewed-on: https://gerrit.openafs.org/14923
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Building the current version of OpenAFS on macOS Monterey arm64 results
in the following error:
error: globals with authenticated null values are currently unsupported
afs_ucred_t afs_osi_cred;
To avoid this problem, replace the global in question by a pointer to a
dynamically allocated afs_osi_cred (afs_osi_credp). Ideally we would
create a new credential with kauth_cred_create(), but this function is
not well documented and using it results in crashes. Moreover, if the
kauth_cred_dup() function were still available (private since XNU
1456.1.26 - macOS 10.6), we could also duplicate the current user's
credential during startup (like commit f40f466c7f did for BSD).
Change-Id: Ied2df7590e4e671ce2643669c83ee0e4b2a97cd1
Reviewed-on: https://gerrit.openafs.org/14922
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
This commit introduces the new set of changes / files required to
successfully build the OpenAFS source code on Apple M1 (macOS 11+).
Notice that kexts on Apple silicon must support the arm64e architecture,
since they run in kernel space and must support the same architecture
and restrictions as other kernel code. On the other hand, the utilities
that run on user space, like vos, fs, and others, have to be built for
arm64 (currently).
Change-Id: Ib005215ae9bfb0b9dda94b2e194f05c0ce92fa1e
Reviewed-on: https://gerrit.openafs.org/14746
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: Andrew Deason <adeason@sinenomine.net>
In preparation for a future commit, try to make param.x86_darwin_200.h
more readable. Also, rename this file to param.darwin_200.h so code from
other architectures can be included in this header.
Change-Id: I1617e3ca93b7e9a4eee4ba121aa20d993302eb84
Reviewed-on: https://gerrit.openafs.org/14934
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Currently, the way the file that will be used as param.h is selected
doesn't allow us to choose headers from other architectures, making
cross-compiling difficult. In an effort to facilitate this process,
select the header that will be used as param.h in sysname.m4. By doing
this, we will have more flexibility to select which header should be
used (in future commits).
Change-Id: I5c77e9e061b847e770bf25f454fe891b5ead9429
Reviewed-on: https://gerrit.openafs.org/14914
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Given that i386 is no longer supported, trying to build the current
version of afscell on macOS 11 (Big Sur) results in the following error:
error: The i386 architecture is deprecated. You should update your ARCHS
build setting to remove the i386 architecture.
To fix this problem, build afscell for all architectures listed in
ARCHS_STANDARD.
For the macosx11.0 sdk:
$ xcodebuild -showBuildSettings -scheme afscell -sdk macosx | grep ARCHS
ARCHS = arm64 x86_64
ARCHS_STANDARD = arm64 x86_64
ARCHS_STANDARD_32_64_BIT = arm64 x86_64 i386
ARCHS_STANDARD_32_BIT = i386
ARCHS_STANDARD_64_BIT = arm64 x86_64
ARCHS_STANDARD_INCLUDING_64_BIT = arm64 x86_64
VALID_ARCHS = arm64 arm64e i386 x86_64
While here, add arm64 to the list of valid architectures.
Change-Id: I37230e49ff5884234b8195bc49ce8b8938580c9e
Reviewed-on: https://gerrit.openafs.org/14745
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Every function should be explicitly declared before it can be called.
Since -Wimplicit-function-declaration is usually a warning and not an
error, calling undeclared functions does not prevent us from building
the code.
However, apple-clang 12 makes this an error by default, prohibiting the
build of the current version on macOS 11 (Big Sur).
To fix this problem, declare functions before calling them. Also,
include mach/thread_act.h into afs_call.c so the declaration of
thread_terminate() can be found on macOS. Last, given that the third
argument of PIOCTL() (if UKERNEL is defined) is a pointer, cast it to
'long'. Doing so, we can avoid another inhibited warning. Notice that
this PIOCTL definition is scoped to a single file (src/auth/ktc.c).
Change-Id: I6d796c10ea4dd81b13ae5feb9f42608aa445560d
Reviewed-on: https://gerrit.openafs.org/14744
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
In an effort to avoid the usage of undeclared functions, add wrappers
for ubik_Call_SingleServer() (_BUDB_GetVolumes(), _BUDB_DumpDB()) and
adjust its callers accordingly.
Also, make sure that ubik_Call_SingleServer() uses the same signature as
ubik_Call(). This change helps us to get rid of casting errors.
Change-Id: I431360f7a42a81b1f20005ebaf0c703bab73a963
Reviewed-on: https://gerrit.openafs.org/14886
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Currently, the afs_dynroot_addDirEnt() function assumes that the caller
has allocated the directory to be large enough to hold the necessary
entry. In order to make sure that memory isn't being accidentally
stomped, use strlcpy to truncate instead of stomping on other memory.
That way, if the caller makes a mistake we don't silently corrupt memory.
We specifically do not assert that there is no truncation or panic if
truncation occurs, since the effect of a truncated entry in the
dynamic AFS root volume is limited and does not justify bringing down
the entire client.
Change-Id: I9c9b0ee6bc32ae7751005dd9b21a75e878e59fe3
Reviewed-on: https://gerrit.openafs.org/14938
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Marcio Brito Barbosa <mbarbosa@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
In addition to being unsafe, these functions (strcpy, strncpy, strcat,
and sprintf) are deprecated on macOS. Replace these functions by safer
alternatives (strlcpy, strlcat, snprintf, and afs_strdup).
Notice that, in order to use afs_strdup(), this commit adds the afs_util
library to the AFSPAGOBJS list. Given that afs_strcasecmp() is also
implemented in afs_util.c, src/crypto/hcrypto/kernel/strcasecmp.c can be
removed from the tree.
No functional change should be incurred by this commit.
This commit is a continuation of a patch initially developed by
cwills@sinenomine.net.
Change-Id: Id11d8bca133e44f96913f7959d87bc82dbebce29
Reviewed-on: https://gerrit.openafs.org/14743
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
In order to replace 'struck flock' with 'struct usr_flock' and 'flock()'
with 'usr_flock()', the current version of src/afs/UKERNEL/sysincludes.h
defines flock to usr_flock. This can cause problems when trying to use
libroken in UKERNEL code, because roken.h redefines flock.
To avoid conflicts with libroken (included in a future commit), add a
new UKERNEL specific AFS_FLOCK -> usr_flock redirection. Doing so, the
flock -> usr_flock redirection can be removed. While here, also remove
'usr_flock()' as it shouldn't be called and is not defined in any header
file.
Change-Id: Ia71811513ab6655f60d8b63fc18b26be663ab4dc
Reviewed-on: https://gerrit.openafs.org/14913
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
After our Linux checks were converted to AFS_LINUX_ENV in commit
6329a523 (Change AFS*_LINUXnn_ENV to AFS*_LINUX_ENV), the extra
AFS_LINUX_ENV check in this line doesn't make any sense. Get rid of
it.
Change-Id: I4196744b1a6674469efef04aa487a50743084656
Reviewed-on: https://gerrit.openafs.org/14935
Reviewed-by: Marcio Brito Barbosa <mbarbosa@sinenomine.net>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
In preparation for a future commit, save the size of sysname_info->name
by adding a new field (name_size) into the sysname_info struct. Also,
remove the sysname_info->allocked field, since now we can find out if
memory has been allocated by checking if sysname_info->name_size is
different than zero.
No functional change should be incurred by this commit.
Change-Id: Id0f5a646b2d82fda5344d53c9fc8b3407f2ea805
Reviewed-on: https://gerrit.openafs.org/14912
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Currently, AFSFid fields are printed as signed integers. As a result,
large numbers can be erroneously printed as negative numbers.
To fix this problem, print AFSFid fields as unsigned integers.
Change-Id: Ic8c39bc90303e35bd982f6a850330d623047e0ec
Reviewed-on: https://gerrit.openafs.org/14950
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
On macOS arm64, a lock (lck_mtx_t) must be released (lck_mtx_unlock)
before it can be destroyed/freed (lck_mtx_free -> lck_mtx_destroy). If
this rules isn't respected, the operating system in question will panic
with the following message:
panic("lck_mtx_assert(): mutex (%p) not owned", lock);
Unfortunately, the current shutdown process of the osi_sleep module
doesn't respect this rule. As a result, macOS arm64 panics when the
OpenAFS client is shut down/restarted. To fix this problem, release
afs_event->lck (EVTLOCK_UNLOCK) before destroying it (EVTLOCK_DESTROY).
Change-Id: Ifd39fd99c237c783ed98079573fd4043ebab363b
Reviewed-on: https://gerrit.openafs.org/14933
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Tested-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
If we're reporting an error, we should be printing to stderr. If we're
printing informational data, we should be using diag() to try to avoid
interfering with the TAP data. Change all printf() calls into one of
those two options.
Change-Id: I2e0d577e0c32efa539ed486190dbaca23bd0487f
Reviewed-on: https://gerrit.openafs.org/14866
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
A couple of places in our test code aren't handling errors from fork()
or waitpid() properly. We don't expect to ever hit errors for these,
but sysbail() in this case, so they don't fail silently.
Change-Id: I1c548f93f4d4ac4344032d7847470b04319386f2
Reviewed-on: https://gerrit.openafs.org/14865
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Currently, all tests that use afstest_mkdtemp() generate a temporary
dir in /tmp, which is removed when the test is done (unless MAKECHECK
isn't set, or the test prematurely exits/crashes). The /tmp dir on a
system may not be the best choice; it may be limited in size, and it's
visible to other users, which is annoying if we are littering the dir
with afs_XXXXXX dirs if broken tests are running during development.
Instead, use a tmp dir in the objdir of the current build
(specifically, tests/tmp/). Since this is the same dir we're building
the tree in, we must be able to write to it and it should have plenty
of space. And it will almost certainly get cleaned up eventually, even
with broken tests, since it will get removed when the build tree is
inevitably removed.
While we're doing this, run the paths from afstest_src_path and
afstest_obj_path through realpath(), so our tmp paths (and other
paths) look a little cleaner, and don't look like
/home/user/openafs/tests/../tests/tmp/foo.
Change-Id: I6633f58ac1f6ef34e33b51cc19d3bff7a4f3fdb0
Reviewed-on: https://gerrit.openafs.org/14864
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
The commits going into Linux 5.18:
fs: Add aops->dirty_folio (6f31a5a261db)
fs: Convert __set_page_dirty_buffers to block_dirty_folio (e621900ad2)
fs: Remove aops ->set_page_dirty (3a3bae50af)
replaces the address_space_operations structure member set_page_dirty
which with dirty_folio. The linux function __set_page_dirty_buffers is
replaced by block_dirty_folio.
Nothing within afs uses or implements the set_page_dirty function,
however the structure member is required to be initialized.
Add an autoconf test for the dirty_folio member and if present, set the
address_space_operations member dirty_folio to block_dirty_folio
instead of setting the set_page_dirty member.
Change-Id: Iad6783308989f4a1390c1c94d2c571048bd4e771
Reviewed-on: https://gerrit.openafs.org/14939
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Routine util_AdminErrorCodeTranslate() provides the support for error
translation that is used by the libadmin package and several Windows utilities,
including the Windows implementation of translate_et (translate_et_nt.c).
Enhance it so the Windows translate_et can translate UAE errors.
No changes are required for translate_et_nt.c.
Note: this may be unit-tested under Unix via a libadmin test:
$ src/libadmin/test/afscp UtilErrorTranslate -error 49733388
49733388 -> Permission denied
Change-Id: Iee85e09813e3488558c0f1c6682d0049b912abc7
Reviewed-on: https://gerrit.openafs.org/14648
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
The PrintInode() prototypes do not match the function definitions.
When AFS_64BIT_IOPS_ENV is defined (which is the common case and is
required for namei), the buffer parameter is declared as a bounded
character array (afs_ino_str_t) in the prototype, but is defined as an
unbounded character pointer. When AFS_64BIT_IOPS_ENV is not defined
(for legacy 32-bit inode vice partitions), PrintInode() is declared with
no specified parameters.
A static buffer is used to hold the formatted string when a NULL is
passed as the first argument to PrintInode(). However, this method is
only used by the volinfo and iopen utility programs.
Fix the mismatch function prototypes and definitions to use the bounded
char array (afs_ino_str_t) in all cases. Remove the deprecated function
declaration with no specified parameters. Update vol-info and iopen to
pass an afs_ino_str_t buffer and remove the now unused static buffer.
Update the duplicated PrintInode() function definition in namei_ops.c.
(This duplicated code could be removed in a future commit.)
Change-Id: I5c0128bb0d572dab0df637289daad0e648ad8a8f
Reviewed-on: https://gerrit.openafs.org/14770
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
The doDispatch() prototype does not match the function definition. The
targv parameter is declared as an unbounded array in the prototype, but
is defined as a bounded array. As of GCC 12, a warning is issued for the
mismatch.
main.c:346:18: error: argument 2 of type ‘char *[100]’ with
mismatched bound [-Werror=array-parameter=]
bucoord_internal.h:123:40: note: previously declared as ‘char *[]’
Within doDispatch(), the targv argument is just passed to cmd_Dispatch()
(this is the only use of targv). Since cmd_Displatch() expects an
unbounded array, update the doDispatch() definition to match the
prototype.
Change-Id: I50a170b3490d0d4e5d971b9ccb483cccb6833686
Reviewed-on: https://gerrit.openafs.org/14771
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
The BosConfig.5 man page shows the incorrect path to the BosConfig file
when modern installation paths are used. For example, BosConfig.5 man
page distributed by Debian contains the text:
The file must reside in the /var/lib/openafs/local directory ...
which should read:
The file must reside in the /etc/openafs directory ...
The man page files contain Transarc-style paths which are translated to
the configured paths by the install target. The path /usr/afs/local in
the BosConfig pod file is interpreted as @afslocaldir@, not the correct
@afsbosconfigdir@.
Change the BosConfig POD text to trigger a special substitution case in
the install-man script. This case is is already in use to correctly
translate paths of the BosConfig.new and BosConfig files the bosserver
man page.
/usr/afs/local/BosConfig -> @afsbosconfigdir@/BosConfig
Using this rule requires a change to the text to show the fully
qualified path to the BosConfig file, instead of just the directory
name.
Change-Id: If1c5872dd86c7c1a5de98fb37daef903cd10b26b
Reviewed-on: https://gerrit.openafs.org/14908
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
A couple of places in the code check if a vnode is locked by the
current thread by simply checking 'if (VOP_ISLOCKED(vp))'. But
VOP_ISLOCKED() doesn't just return a simple 1 or 0, it returns LK_*
constants (or 0). LK_EXCLUSIVE indicates that the calling thread holds
an exclusive lock on the vnode, but LK_SHARED means someone holds a
shared lock (possibly not the current thread), and LK_EXCLOTHER
indicates that a different thread holds an exclusive lock.
Because of this, it's possible for us to skip grabbing the vnode lock
for certain operations, if someone else holds the lock at the same
time. For example, this can happen when we call vinvalbuf() inside
afs_GetVCache(), and FreeBSD will warn us that we didn't lock the
vnode:
#0 0xffffffff80bf6557 at kdb_backtrace+0x67
#1 0xffffffff80c7a337 at assert_vop_locked+0x77
#2 0xffffffff80c7a273 at vinvalbuf+0x23
#3 0xffffffff8285aa2d at afs_GetVCache+0x25d
#4 0xffffffff828d3325 at afs_root+0x145
#5 0xffffffff80c70296 at lookup+0x8c6
#6 0xffffffff80c6f599 at namei+0x4a9
#7 0xffffffff80c872e4 at sys_lpathconf+0x54
#8 0xffffffff81074581 at amd64_syscall+0x291
#9 0xffffffff8104cde0 at fast_syscall_common+0x101
vnode 0xfffff8012a62bc58: tag afs, type VDIR
usecount 2, writecount 0, refcount 2 mountedhere 0
flags (VV_ROOT|VI_ACTIVE)
lock type afs: UNLOCKED
#0 0xffffffff80b81fc2 at lockmgr_lock_fast_path+0x1e2
#1 0xffffffff811fa9f6 at VOP_LOCK1_APV+0x96
#2 0xffffffff80c8c705 at _vn_lock+0x65
#3 0xffffffff80c7c066 at vget+0xa6
#4 0xffffffff828d3437 at afs_root+0x257
#5 0xffffffff80c70296 at lookup+0x8c6
#6 0xffffffff80c6f599 at namei+0x4a9
#7 0xffffffff80c872e4 at sys_lpathconf+0x54
#8 0xffffffff81074581 at amd64_syscall+0x291
#9 0xffffffff8104cde0 at fast_syscall_common+0x101
vc 0xfffffe002be00000 vp 0xfffff8012a62bc58 tag afs, fid: 1.536870924.1.1, opens 0, writers 0
To fix this, change our "islocked"-style checks to check if
VOP_ISLOCKED() returns LK_EXCLUSIVE specifically.
Change-Id: If322f62dc443ee9acc2349a23c6c618afd3e29d4
Reviewed-on: https://gerrit.openafs.org/14204
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
src/libadmin/test/afscp is a testbed with subcommands to test many
libadmin functions. Almost all of these subcommands call
SetupCommonArgs to add authentication specification arguments (e.g.
-noauth, -cell <cell>, etc). These common args are checked in
MyBeforeProc to obtain authentication before processing the actual test
command.
There are a few afscp subcommands which should not require any
authentication setup:
UtilErrorTranslate -error <code>
UtilNameToAddress -host <hostname>
Yet these will segfault in MyBeforeProc unless a valid authentication
argument is specified.
Instead, do not call SetupCommonArgs for these subcommands; this will
cause MyBeforeProcs to skip authentication setup.
Change-Id: Iea5067b11e9ad0086acd8f2007e08ed92b45021f
Reviewed-on: https://gerrit.openafs.org/14647
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
src/libadmin/test/afscp is a testbed with subcommands to test many
libadmin functions. Almost all of these subcommands call
SetupCommonArgs to add authentication specification arguments (e.g.
-noauth, -cell <cell>, etc). These common args are checked in
MyBeforeProc to obtain authentication before processing the actual test
subcommand.
However, some afscp subcommands shouldn't need any authentication setup,
for example:
UtilErrorTranslate -error <code>
UtilNameToAddress -host <hostname>
In preparation for a future commit, modify MyBeforeProc to skip
authentication setup for subcommands that haven't called SetupCommonArgs
to define authentication options.
Change-Id: I3d6be062c8264ece8eb27c3b2b72c8c45aacae56
Reviewed-on: https://gerrit.openafs.org/14646
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>