commit 90c47304b61886c8ab7197da11073b02d1ca84bb Author: Michael Meffie Date: Fri Oct 30 11:07:14 2026 -0400 Make OpenAFS 1.8.17pre2 Update version strings for the 1.8.17pre2 release. Change-Id: I7162749cfd14793fc0d722e150639440c31b2f05 Reviewed-on: https://gerrit.openafs.org/17139 Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Mark Vitale Reviewed-by: Cheyenne Wills Reviewed-by: Benjamin Kaduk commit f9289c2be54ae939c69b723c9bed2f20eda6f033 Author: Michael Meffie Date: Thu Oct 29 13:03:19 2026 -0400 Update NEWS for OpenAFS 1.8.17pre2 Change-Id: I3000cd4a610e21654dd7f05c988f1415c0307082 Reviewed-on: https://gerrit.openafs.org/17128 Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Mark Vitale Reviewed-by: Benjamin Kaduk commit 8fdd4f1f7b155600b101285023552e07d28d30c8 Author: Andrew Deason Date: Sun Oct 25 16:54:50 2026 -0500 DARWIN: Set front of lwp stack to 0 for ucontext When using ucontext for lwp on macOS arm64, currently our stack-overflow check will frequently trigger, indicating at the front of the check changed from some initial value to 0. For example: $ ./src/bozo/bos status fs.example.com -noauth stackcheck = 50462976: stack = 0 topstack = 0x781740bc20: stackptr = 0x7817400000: stacksize = 0xc000 Fri Oct 23 16:46:09 2026 LWP: stack overflow in process IO MANAGER! This happens because makecontext() on macOS 27 blanks the provided stack buffer. When Initialize_PCB() is run for an lwp, we record ->stackcheck as the first integer at the "front" of the unused stack (for example, 50462976) [1]. Then when we call savecontext() using that stack, makecontext() clears the entire stack buffer, including the first integer. Then when we actually dispatch the lwp, Dispatcher() sees that the first integer in the stack is 0, which doesn't match ->stackcheck (50462976), and so it prints an error and aborts. To avoid this, always set the first int in the stack to 0 in Initialize_PCB(), so we record ->stackcheck to be 0. This way, when makecontext() clears the stack later on, it doesn't change what the front of the stack "should" be, so our stack-overflow check doesn't accidentally trigger. This does increase the chances of us not detecting a stack-overflow condition (if someone sets that area of the stack to 0, which may be a more common value), but this seems unavoidable unless we manually re-write the first integer of the stack buffer. Since makecontext() may be doing this for a reason, don't try to avoid this behavior and just deal with it instead. [1] The front of the stack is currently always 50462976 (0x03020100), because Initialize_Stack() consistently initializes the buffer. We could also fix this issue by changing Initialize_Stack(), but this would be more indirect and possibly confusing; setting the front of the stack to 0 in Initialize_PCB() where we set ->stackcheck is hopefully more clear, and works even if Initialize_Stack() changes or isn't used for any reason. Reviewed-on: https://gerrit.openafs.org/17097 Reviewed-by: Mark Vitale Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Benjamin Kaduk (cherry picked from commit 4d9be646f2e68f04df228fe78805f6dd6bac90c1) Change-Id: Ia7f7de89b93163f9c84d9e805a2e8cb22950a91d Reviewed-on: https://gerrit.openafs.org/17127 Reviewed-by: Michael Meffie Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk commit 64d0234f1b167cf14e3c5d451f41b35b01172e01 Author: Andrew Deason Date: Sat Oct 24 22:23:28 2026 -0500 DARWIN: Use ucontext for arm64 on macOS 27+ Currently, in lwp we use our setjmp/longjmp-based implementation of savecontext() and returnto() for arm64, including on macOS. On macOS, this does not work, and causes segfaults and bus errors any time we actually try to switch LWPs. For example, when using the non-pthreaded version of 'bos': $ ./src/bozo/bos status fs.example.com -noauth Bus error: 10 This may simply be because we are reaching into the relevant jmp_buf incorrectly (LWP_SP may be wrong), or the use of pointer authentication codes (PAC) may be preventing our approach of setting pointers in the jmp_buf directly. Either way, change to using the ucontext-based implementation of savecontext() and returnto(), which uses a much more well-defined interface, and seems to actually work. To use ucontext on macOS, we must define _XOPEN_SOURCE (otherwise the ucontext.h header throws an error). Define this using AC_DEFINE() early on in configure, so this is set before any headers are included, and so _XOPEN_SOURCE is defined when AC_CHECK_HEADERS() checks for ucontext.h. We only set _XOPEN_SOURCE to 500 for now (which indicates support for the very old SUSv2); setting it to anything larger/newer removes some interfaces that some source files still use (such as getpagesize()). To try to make sure we don't accidentally keep building a broken lwp, add an #elif section in process.c to throw an error if we are building on arm64 macOS. To try to avoid unintended changes on earlier versions, only do any of this for macOS 27 and newer. Reviewed-on: https://gerrit.openafs.org/17096 Tested-by: BuildBot Reviewed-by: Mark Vitale Tested-by: Mark Vitale Reviewed-by: Cheyenne Wills Reviewed-by: Benjamin Kaduk (cherry picked from commit 62f8a39d485680c76c51b34b402f58a03bf9deed) Change-Id: I2ffaca1258c02989ed3d962015d242d0e79ce6f1 Reviewed-on: https://gerrit.openafs.org/17126 Reviewed-by: Michael Meffie Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk commit ad35217669ec30365c63fdc177071e86bd0f4d60 Author: Mark Vitale Date: Wed Oct 21 13:48:59 2026 -0400 macos: Add amd64 build support for macOS 27 Commit e78d6fb06ed8 (macos: Add support for macOS 27 (Golden Gate)) intentionally omitted the ability to build "Universal" (multiple-architecture) OpenAFS binaries. This is because macOS 27 itself is not supported on Intel (x86_64) hardware, and Apple's Rosetta 2 x86_64 emulation is absent by default on macOS 27. However, it is still possible to run x86_64 binaries on arm64 (Apple Silicon) hardware with macOS 27, and there may be cases where it is desirable to do so. Modify the OpenAFS parameter file for macOS 27 to support Universal builds and packages when specified via: export ARCHFLAGS="-arch x86_64 -arch arm64" Notes for 1.8.x branch: Commit 3f4168147dd3 (macOS: Package some LWP binaries as x86_64 only) provides a 1.8.x-only workaround for certain macOS LWP-only binaries, since LWP does not currently work on arm64. This workaround distributes the affected LWP binaries as x86_64, and relies on Apple's Rosetta 2 x86_64 emulation to run these on arm64. This works well for both macOS 15 (Sequoia) and macOS 26 (Tahoe), but is no longer viable for macOS 27 (Golden Gate) for the reasons expressed in the first paragraph. In this case, the affected LWP binaries are arm64 only, so they fail: $ fs mkmount testmp user.work Segmentation fault: 11 $ bos listhosts afsdb1.example.com Bus error: 10 After this fix is applied, the user must also manually install Rosetta 2. Without Rosetta 2, the x86_64 binaries are not executable: $ bos listhosts afsdb1.example.com bos: Bad CPU type in executable To install Rosetta 2: $ softwareupdate --install-rosetta --agree-to-license (restart required to enable Rosetta 2) After this, the affected LWP binaries are finally working again: $ bos listhosts afsdb1.example.com afsdb1.example.com afsdb2.example.com afsdb3.example.com Reviewed-on: https://gerrit.openafs.org/17083 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Marcio Brito Barbosa Reviewed-by: Andrew Deason (cherry picked from commit ef9f2dcce2e8c6a070da5861c6eb9ae07c167ca1) Change-Id: I9a6e1683823ce2afdd5285ed0e48b665eee1180b Reviewed-on: https://gerrit.openafs.org/17074 Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk Reviewed-by: Cheyenne Wills Reviewed-by: Michael Meffie commit 351fed7f821b4474f0f0bc4cbcbb60da4b9c4222 Author: Daniel JB Clark Date: Fri Oct 23 07:36:23 2026 -0400 Revert "ukernel: Fix AFS_GUNLOCK panic in rx_ServerProc" This reverts commit f900670194a356cb7cc3adb43bbde2c044a6e06d. Since OpenAFS 1.8.11 every libuafs client (afsd.fuse, AFS::ukernel) deadlocks on the first inbound callback RPC from a fileserver. afs_RXCallBackServer() is entered from the AFSOP_START_RXCALLBACK syscall with the AFS global lock held and donates the thread to Rx by calling rx_ServerProc(). On the 1.8.x branch it does not release the global lock first, so the UKERNEL rx_ServerProc() used to begin with AFS_GUNLOCK() and end with AFS_GLOCK(). Commit f900670194 "ukernel: Fix AFS_GUNLOCK panic in rx_ServerProc" (gerrit 15539, 1.8.11; cherry-picked from master 07076d63ed, gerrit 14963) removed those two calls. On master that was correct, because d5e1428a3b "afs: Drop GLOCK for various Rx calls" had moved the unlock into afs_RXCallBackServer(). That commit was deliberately not brought to 1.8.x (gerrit 15707 was abandoned as too large a change to Rx locking for a stable branch), so 1.8.x ended up with neither unlock: the Rx server thread now runs executeRequestProc with the global lock held, and the first SRXAFSCB_* handler (in practice the fileserver's TellMeAboutYourself, issued while the client waits in RXAFS_GetCapabilities) blocks forever in its own RX_AFS_GLOCK() on the non-recursive afs_global_lock. afs_Daemon, afs_CheckServerDaemon and every FUSE request then queue up behind it. Observed with 1.8.16.1 afsd.fuse against the athena.mit.edu fileservers: gdb shows the Rx server thread in pthread_mutex_lock inside SRXAFSCB_TellMeAboutYourself, with afs_global_owner and afs_global_lock.__owner both naming that same thread. Revert f900670194 to restore the two calls in the UKERNEL rx_ServerProc(). The "afs global lock not held" panic that commit fixed cannot occur on 1.8.x, where the caller does hold the lock. This is an openafs-1.8.x specific commit; master is correct as is. Change-Id: I78b0be1088166a21c9451d977571c9328068a0c9 Reviewed-on: https://gerrit.openafs.org/17048 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Benjamin Kaduk commit 43cad7816ae5aa5b9f4f4d4a3e9516387d263fb2 Author: Cheyenne Wills Date: Fri May 15 09:01:07 2026 -0600 cf: Ensure BTF info is created in tests for Linux The OpenAFS configure build step fails on an ArchLinux system with a 7.0.5-arch1-1 Linux kernel. The configure test to determine how CFLAGS are passed to the Linux build process is failing in a post-compile step: build/tools/bpf/resolve_btfids/resolve_btfids with the following messages: Cannot find .BTF_ids or symbols sections, skip symbols resolution FAILED: btf permute: Invalid argument FAILED to sort BTF: Invalid argument The failure is during a step that is translating the dwarf debugging information into BTF. BTF is the BPF Type Format that holds metadata used by the eBPF facility. Investigating the cause shows that the gcc compiler (16.1.1) with the default ArchLinux kernel build -O2 option results in optimizing out the debugging information related to the formal parameter (DW_TAG_formal_parameter) for the conftest function. The failure within resolve_btfids can be resolved by simply adding a function that references its parameter in a fashion that the compiler doesn't strip out the debugging information. It's sufficient to simply have any DW_TAG_formal_parameter present in the compiler output. Add a dummy function, conftest_dummy() to the template that is used to create the C code used by configure when testing for Linux kernel features. Adding the separate function to the template avoids altering the function body used by the existing Linux kernel feature checks. The build failure was reported to the OpenAFS-devel mailing list by Michael Dressel with the following information dkms install --no-depmod openafs/1.8.16pre1 -k 7.0.5-arch1-1 Error! Bad return status for module build on kernel: 7.0.5-arch1-1 (x86_64) Consult /var/lib/dkms/openafs/1.8.16pre1/build/make.log for more information. Reviewed-on: https://gerrit.openafs.org/16792 Reviewed-by: Andrew Deason Reviewed-by: Marcio Brito Barbosa Tested-by: BuildBot Reviewed-by: Michael Meffie (cherry picked from commit 499baf4fd7e6e780190f77a56ccd07d5257a7719) Change-Id: I1eb207ef5411ad26bd8ee76dd51e07470cfbf5ba Signed-off-by: Anders Kaseorg Reviewed-on: https://gerrit.openafs.org/17051 Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk commit 6a8057c02db34a78f7581ad873ea563e43e0d539 Author: Cheyenne Wills Date: Fri Sep 25 09:55:40 2026 -0600 Linux: Remove excl arg from inode_ops->create() The Linux 7.3 commit: "Remove excl arg to ->create inode_operation" (b2f1e6301efa4) removed the unused excl argument for the inode_operations create() method. Add a new autoconf test for the inode_operations create() method to match the Linux 7.3 signature. If successful, this test also implies IOP_TAKES_MNT_IDMAP. Add a new function definition for afs_linux_create() that drops the unused excl argument. Note: Update the autoconf test defining the IOP_TAKES_MNT_IDMAP, to remove the use of the AC_VAR_GET() macro and just reference the variables directly. Reviewed-on: https://gerrit.openafs.org/16962 Tested-by: BuildBot Reviewed-by: Mark Vitale Reviewed-by: Marcio Brito Barbosa Reviewed-by: Andrew Deason (cherry picked from commit d42e48a6482b1aaeae6d90b948a2805ad5451ede) Change-Id: I9aa2a3773d92eb47e617b71baff1312d6578f2b3 Reviewed-on: https://gerrit.openafs.org/17049 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk commit ebb5484a77eaecb1f7ccf59f4f44726f7b4c49a4 Author: Mark Vitale Date: Thu Oct 15 12:01:03 2026 -0400 macOS: Document 'afscell' installer issue and workaround Starting with macOS 27 beta 6 (Golden Gate) and continuing through current GA releases, the Apple-provided Installer program fails to validate third-party installer plugins correctly. Specifically, when installing a pkg file that includes a third-party installer plugin, codesign validation will fail with "UNIX error exception: 62" (ELOOP). This only seems to arise when the .pkg file is being run from within a mounted .dmg file. https://developer.apple.com/forums/thread/844283 https://mjtsai.com/blog/2026/10/02/mac-installer-plug-ins-bug According to the sources above, this installer regression has also been inadvertently backported to recent stable versions of macOS: - 26.7 Tahoe - 15.8 Sequoia This installer bug prevents our 'afscell' plugin from loading during OpenAFS.pkg installation. Instead of prompting the user for their home cell and alias, OpenAFS will be installed with default home cell 'grand.central.org'. As a workaround, you may manually edit the configuration after installation (/var/db/openafs/etc/ThisCell and CellAlias). Document the issue and workaround in the ReadMe.rtf for all potentially affected versions of macOS. The contents of this file are displayed in the first dialog pane during installation. Reviewed-on: https://gerrit.openafs.org/17046 Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk Reviewed-by: Michael Meffie Reviewed-by: Marcio Brito Barbosa (cherry picked from commit 9b0619541a75e1cb75642060a45708daa2c8cc15) Change-Id: I73f5248a405fe0b742f6ee5fa6f1847683eb5445 Reviewed-on: https://gerrit.openafs.org/17050 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Ganesh G. Chaudhari Tested-by: Ganesh G. Chaudhari Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk commit 31aeb0e547deee430b352b9cc9e8c939b43a6e57 Author: Mark Vitale Date: Thu Mar 12 13:42:41 2026 -0400 macOS: Generate checksum files during 'make packages' Automatically generate md5 and sha512 checksum files after the final .dmg file is written by pkgbuild.sh ('make packages'). Reviewed-on: https://gerrit.openafs.org/16714 Reviewed-by: Cheyenne Wills Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Marcio Brito Barbosa Reviewed-by: Andrew Deason (cherry picked from commit 2960569c818c220f6eda5ee5c5d770167ace625d) Change-Id: I0e067fb286501f274eab81e871946da117ae2e88 Reviewed-on: https://gerrit.openafs.org/17042 Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk commit a95ea79ed40bd1f7a8c6e244c584f76783ac498e Author: Mark Vitale Date: Wed Mar 11 16:17:46 2026 -0400 macOS: Consolidate redundant paths in pkgbuild.sh.in In preparation for a future commit, clean up some duplication by defining new variables for the paths to the temporary and distribution .dmg files. Reviewed-on: https://gerrit.openafs.org/16713 Reviewed-by: Cheyenne Wills Reviewed-by: Marcio Brito Barbosa Reviewed-by: Andrew Deason Reviewed-by: Michael Meffie Tested-by: BuildBot (cherry picked from commit 07450be5991cb5875f813f8813c8898262f6b945) Change-Id: Ib6cb6293fdde7386ceb7bfed4b6c24501fe1e756 Reviewed-on: https://gerrit.openafs.org/17041 Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk commit e93cc9adb2c223841b11358867f95c4729221e4e Author: Michael Meffie Date: Fri Sep 11 09:54:58 2026 -0400 Make OpenAFS 1.8.17pre1 Update version strings for the 1.8.17pre1 release. Change-Id: If4dc36cc3142fa42c2846e89724806d79f6c648e Reviewed-on: https://gerrit.openafs.org/16965 Reviewed-by: Mark Vitale Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason Reviewed-by: Michael Meffie Tested-by: BuildBot Reviewed-by: Benjamin Kaduk commit c45883b49afa844bc64523ba05c0d2f89b6b9d82 Author: Michael Meffie Date: Thu Sep 10 14:56:21 2026 -0400 Update NEWS for OpenAFS 1.8.17pre1 Change-Id: I0b48fb54e7d9b9cc9f3164ed6be350fd9a98df78 Reviewed-on: https://gerrit.openafs.org/16964 Reviewed-by: Michael Meffie Reviewed-by: Cheyenne Wills Reviewed-by: Mark Vitale Reviewed-by: Benjamin Kaduk Tested-by: Benjamin Kaduk commit b52839f04d91d79b5716c2690ba7f76de990453e Author: Andrew Deason Date: Tue May 19 15:45:49 2026 -0500 LINUX: Grab unixuser refs in osi_proc.c In order to implement the 'unixusers' /proc pseudo-file, osi_proc.c contains code to iterate over unixusers. The uu_*() functions are seq_operations callbacks that are called approximately like this pseudocode: p = uu_start(); while (p != NULL) { uu_show(p); p = uu_next(p); } uu_stop(p); Since commit 89b22dfe86 (libafs: Implement unixuser RW locks) in OpenAFS 1.7.1, uu_show() drops the ref for the current unixuser 'tu' before acquiring afs_xuser. If 'tu' is freed while we're waiting for afs_xuser, we'll dereference freed memory when uu_next() examines tu->next to get the next unixuser. Change osi_proc.c to grab and release unixuser refs while traversing unixusers, like we did for other files in change I849132fc08 (afs: Introduce and use afs_UserScan()). In uu_start(), this simply involves using afs_UserScan(), but in other callers, grab the refs manually, since we iterate over unixusers one at a time instead of directly via a for() loop. In uu_next(), also acquire AFS_GLOCK(), since we are now manipulating tu->refCount for various users. FIXES 135623 Reviewed-on: https://gerrit.openafs.org/16833 Reviewed-by: Michael Meffie Reviewed-by: Mark Vitale Reviewed-by: Cheyenne Wills Reviewed-by: Marcio Brito Barbosa Tested-by: BuildBot Reviewed-by: Benjamin Kaduk (cherry picked from commit 6db6df90e3827f751a3507f73a22b838a741511f) Change-Id: I97397b25337231d2ec7afa5d2c17d4b441c5d396 Reviewed-on: https://gerrit.openafs.org/17008 Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason Reviewed-by: Mark Vitale Reviewed-by: Marcio Brito Barbosa Reviewed-by: Benjamin Kaduk commit f8469c5694f297b4361520144611f4c8c37fd99f Author: Andrew Deason Date: Tue May 19 15:37:13 2026 -0500 afs: Introduce and use afs_UserScan() Since before OpenAFS 1.0, PUnlog() drops and reacquires the afs_xuser lock while looping through the unixuser list. It obtains a reference to the current unixuser, but drops the reference before reacquiring afs_xuser. If afs_GCUserData() runs while we are waiting for afs_xuser, the current unixuser may have been freed. We then dereference tu->next for the next iteration of the loop, possibly using freed memory. In addition, since commit dde2a200a3 (userland-cachemgr-zero-token-times-on-unlog-to-trigger-gc-20010605) included in OpenAFS 1.1.0, we clear tu->tokenTime for UKERNEL potentially after 'tu' has been freed. To fix both of these issues, grab and release a reference to the current unixuser as the very first and last things we do for each iteration of the loop. To make this easier to do consistently, introduce a new macro, afs_UserScan(), to implement the for() loop, similar to using opr_queue_Scan() to iterate over a queue. Convert all unixuser-iterating code to use afs_UserScan(), except for two exceptions: - This commit does not convert the code in LINUX/osi_proc.c; that will be handled in a separate commit, since structure of code in there looks very different. - This commit does not convert code in afs_user.c itself to use afs_UserScan(), since some of those functions involve more complex loops or need special handling for unixuser refcounts. This commit treats afs_UserScan() as an interface that code outside of afs_user.c should use, and afs_user.c itself is allowed to do its own scanning logic manually. Besides those two exceptions, this commit updates all unixuser-iterating code to use afs_UserScan(). Many converted for() loops don't have the same problem as PUnlog() since they don't drop/acquire locks during the loop; convert them anyway just in case, and to keep the code paths more consistent. FIXES 135623 Reviewed-on: https://gerrit.openafs.org/16832 Tested-by: BuildBot Reviewed-by: Marcio Brito Barbosa Reviewed-by: Michael Meffie Reviewed-by: Benjamin Kaduk (cherry picked from commit 52647e10a2e4e47ef4b4ce3a92e86316efe01afc) Change-Id: I5af08a31708ce5b99f65a16d6b2caad9f19ca715 Reviewed-on: https://gerrit.openafs.org/17007 Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason Reviewed-by: Mark Vitale Reviewed-by: Marcio Brito Barbosa Reviewed-by: Benjamin Kaduk commit 4680045b6149cf1d71d529c9be05d29a75a47009 Author: Andrew Deason Date: Tue Sep 15 14:47:50 2026 -0500 WINNT: Remove strcpy() in ktc_ForgetTokensByCell() Since OpenAFS 1.0, ktc_ForgetTokensByCell() (then ktc_ForgetToken()) has strcpy()d the cell from the provided arguments into the stack-local "tbuffer" before passing the cell to the VIOCDELTOK pioctl. There's no reason to use an intermediate stack buffer; just pass the given string pointer directly to the pioctl, so we don't risk overrunning the "tbuffer" with an unsafe strcpy() call. Reviewed-on: https://gerrit.openafs.org/16976 Tested-by: BuildBot Reviewed-by: Mark Vitale Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk (cherry picked from commit 151ed20e14eb0a22140190c2ad0c4548c6927a5d) Change-Id: I10ae0ad24d19e1f8c7c3043de199878e02fee630 Reviewed-on: https://gerrit.openafs.org/17006 Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Cheyenne Wills Reviewed-by: Mark Vitale Reviewed-by: Marcio Brito Barbosa Reviewed-by: Benjamin Kaduk commit f74beebfeb318ac7ba48d44528b13dcd19dc17b2 Author: Andrew Deason Date: Fri Sep 4 13:58:15 2026 -0500 WINNT: Implement ktc_ForgetTokensByCell() Commit ab9bc6c57a (log: Add ktc_ForgetTokensByCell()) added the new ktc_ForgetTokensByCell() function to ktc.c and relevant libtool symbol files, but did not implement the function in ktc_nt.c for WINNT. To allow the function to exist and be usable on WINNT, implement ktc_ForgetTokensByCell() in ktc_nt.c, using existing logic from ktc_ForgetToken(). Also change ktc_ForgetToken() to be implemented in terms of ktc_ForgetTokensByCell(). Add ktc_ForgetTokensByCell() to afsauthent.def, so it's usable via libafsauthent on WINNT. Also add ktc_ForgetTokensByCell() to afsauthent.exp, to make sure it's usable on all platforms (although afsauthent.exp is possibly unused at this point and will be removed in future commits). Reviewed-on: https://gerrit.openafs.org/16958 Reviewed-by: Michael Meffie Tested-by: BuildBot Reviewed-by: Gaurav Saxena Reviewed-by: Cheyenne Wills Reviewed-by: Mark Vitale Reviewed-by: Benjamin Kaduk (cherry picked from commit e14f3b607dee98fccb408079c93668650f46127d) Change-Id: I9b0539e9ebaf818c5784181e2525758aa7e65e1c Reviewed-on: https://gerrit.openafs.org/16988 Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason Reviewed-by: Mark Vitale Reviewed-by: Marcio Brito Barbosa Reviewed-by: Benjamin Kaduk commit d2d7287ec6abcc8c48157901832b4bf87c42102d Author: Michael Meffie Date: Tue Jan 28 18:50:24 2025 +0100 DARWIN: ANSIfy functions Convert the remaining K&R style function declarations to ANSI in the DARWIN source and and clean up nearby whitespace errors. [1.8: This fixes build errors on macOS 27 Golden Gate and Xcode beta 5, such as: /Users/devlab/src/openafs/src/afs/DARWIN/osi_inode.c:31:10: error: unknown type name 'fs' 31 | getinode(fs, dev, inode, vpp, perror) | ^ /Users/devlab/src/openafs/src/afs/DARWIN/osi_inode.c:31:14: error: unknown type name 'dev' 31 | getinode(fs, dev, inode, vpp, perror) | ^ /Users/devlab/src/openafs/src/afs/DARWIN/osi_inode.c:31:19: error: unknown type name 'inode' 31 | getinode(fs, dev, inode, vpp, perror) | ^ /Users/devlab/src/openafs/src/afs/DARWIN/osi_inode.c:31:26: error: unknown type name 'vpp' 31 | getinode(fs, dev, inode, vpp, perror) | ^ /Users/devlab/src/openafs/src/afs/DARWIN/osi_inode.c:31:31: error: unknown type name 'perror' 31 | getinode(fs, dev, inode, vpp, perror) | ^ /Users/devlab/src/openafs/src/afs/DARWIN/osi_inode.c:31:38: error: expected ';' after top level declarator 31 | getinode(fs, dev, inode, vpp, perror) | ^ | ; ] Reviewed-on: https://gerrit.openafs.org/16152 Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason (cherry picked from commit 2da2d6d09556585246c6190ac6365ebd0386174c) Change-Id: Iaf748be665553c03daf984aa195a67e656c2fd9a Reviewed-on: https://gerrit.openafs.org/16955 Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason Reviewed-by: Michael Meffie Reviewed-by: Ganesh G. Chaudhari Tested-by: Ganesh G. Chaudhari Reviewed-by: Benjamin Kaduk Reviewed-by: Kailas Zadbuke commit 364003e22d16d1171d6f1068ba84afe1b83810de Author: Mark Vitale Date: Mon Aug 17 17:24:07 2026 -0400 DARWIN: Eliminate "incompatible function pointer" build error When building OpenAFS under macos 27 beta (Golden Gate) with Xcode 27 beta 5, the following build error occurs: /Users/devlab/src/openafs/src/afs/DARWIN/osi_file.c:202:17: error: incompatible function pointer types assigning to 'int (*)(struct osi_file *, afs_int32)' (aka 'int (*)(struct osi_file *, int)') from 'int (*)(void)' [-Wincompatible-function-pointer-types] 202 | afile->proc = (int (*)())0; | ^ ~~~~~~~~~~~~ Change the assignment to a simple NULL. Reviewed-on: https://gerrit.openafs.org/16948 Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Reviewed-by: Marcio Brito Barbosa Tested-by: BuildBot (cherry picked from commit 2f8b7da15ff15d7def18af4feff7950ecab3e9cc) Change-Id: I42ffc679acff8ec4bad25efdfb6b7629ba49a617 Reviewed-on: https://gerrit.openafs.org/16954 Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason Reviewed-by: Michael Meffie Reviewed-by: Ganesh G. Chaudhari Tested-by: Ganesh G. Chaudhari Reviewed-by: Benjamin Kaduk Reviewed-by: Kailas Zadbuke commit 5866be780c5fef276081b9a66ecd4e4e68388f5a Author: GANESH CHAUDHARI Date: Wed Jul 15 15:35:58 2026 +0530 macos: Add support for macOS 27 (Golden Gate) Added the required configuration changes and new files to enable building and packaging OpenAFS on macOS 27 (Golden Gate). MacOS Tahoe used Darwin kernel version 25.x, which corresponds to the Darwin version suffix 250 in the configuration files. MacOS Golden Gate beta showcase Darwin kernel version 27.x (skips 26.x), so the corresponding configuration suffix is 270. As a result, there is no Darwin 260 configuration. This version numbering change is driven by Apple's kernel versioning and we expect no impact on OpenAFS functionality. Since macOS 27 no longer supports Intel-based Macs, no x86-specific configuration changes are introduced. Reviewed-on: https://gerrit.openafs.org/16883 Reviewed-by: Michael Meffie Reviewed-by: Marcio Brito Barbosa Reviewed-by: Mark Vitale Tested-by: BuildBot Reviewed-by: Andrew Deason (cherry picked from commit e78d6fb06ed85ed591b8d76ed8589a8753b261b3) Change-Id: I2d21a00415e30ab69853494139963f418f041866 Reviewed-on: https://gerrit.openafs.org/16953 Tested-by: BuildBot Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason Reviewed-by: Michael Meffie Reviewed-by: Ganesh G. Chaudhari Reviewed-by: Benjamin Kaduk commit 9a8b359c3ee4dd813279650f6018a38e01acec89 Author: Andrew Deason Date: Thu Jun 2 12:22:06 2022 -0500 rx: Check rxi_AddRpcStat currentFunc bounds Our rxgen-generated server and client RPC stubs contain some code for recording call statistics that looks like this (for BOZO_GetStatus, for example; the 4th function in the BOZO_ package): if (rx_enable_stats) { rx_RecordCallStatistics(z_call, BOZO_STATINDEX, 3, BOZO_NO_OF_STAT_FUNCS, 0); } This eventually calls rxi_AddRpcStat with similar arguments. If a stat struct doesn't exist for the given package (BOZO_STATINDEX), rxi_AddRpcStat allocates a new struct rx_interface_stat, which can accomodate up to 'totalFunc' different functions (BOZO_NO_OF_STAT_FUNCS in the above example). If a struct already exists for the given package, we'll use the existing struct. When we update the stats for the current call, we update 'rpc_stat->stats[currentFunc]' (were 'currentFunc' is 3 in the above example). We assume rpc_stats->stats has enough entries allocated for this to be okay, but we never actually check. We just assume that 'currentFunc' is always less than 'totalFunc', and we assume that the caller always provides the same 'totalFunc' for that package. Normally this is true, but this is not checked or verified anywhere. If two packages accidentally use the same statindex, this may not always be true. For example, say someone defines a new service under package FOO_, with 2 functions, and specifies 'statindex 1' in the .xg file. This means that FOO_STATINDEX will be 1, and FOO_NO_OF_STAT_FUNCS will be 2. If someone calls one of the FOO_ RPCs, rxi_AddRpcStat will allocate a struct that can accommodate stats for 2 functions. Later on, say that someone calls a BOZO_ RPC. rxi_AddRpcStat will look for a struct for BOZO_STATINDEX (which is also 1), and it finds one, since we just created one for the FOO_ call before (since FOO_STATINDEX is also 1). If the BOZO_ RPC is BOZO_GetStatus, 'currentFunc' will be 3, which means 'rpc_stat->stats[currentFunc]' will go beyond the end of the array allocated for rpc_stat->stats, since space has only been allocated for 2 functions. This will silently corrupt whatever memory follows the original allocation for 'rpc_stats', every time someone calls BOZO_GetStatus (or any other BOZO_ RPC beyond the first 2 RPCs). If someone calls BOZO_CreateBnode instead, this won't corrupt memory, since the 'currentFunc' given is 0, which will fit into the allocated 'rpc_stat->stats' array. But the stats will be meaningless, since it will contain data for a FOO_ function and some other unrelated BOZO_ function. This never happens in the current tree, and should never happen normally since different services shouldn't use the same statindex. But it can happen by accident, even if no 'statindex' is defined (without a defined statindex, the default value is derived from the service ID and port; someone could define different services on the same port/service). And if it does happen, it can silently corrupt memory. So, to make sure this doesn't corrupt memory by mistake, check that 'currentFunc' actually fits in the 'rpc_stats->stats' array before updating the stats. If it doesn't, just don't update the stats. We could assert instead, since this situation should never happen, but failing to update our stats is a rather minor side effect, and so asserting doesn't seem worth it (especially if we're running in the kernel). Also ignore the stats if the given 'totalFunc' doesn't match what's in an existing stats struct. This avoids the case with the BOZO_CreateBnode example mentioned above, where there is no memory corruption, but the resulting stats are meaningless. Reviewed-on: https://gerrit.openafs.org/15026 Reviewed-by: Cheyenne Wills Reviewed-by: Mark Vitale Reviewed-by: Michael Meffie Tested-by: BuildBot Reviewed-by: Andrew Deason (cherry picked from commit 34a46993434d046a8831c513c84cf1024ef1de16) Change-Id: I65879b47b70d2d29f1f84fa9a322e6eb06f04468 Reviewed-on: https://gerrit.openafs.org/16229 Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason Reviewed-by: Michael Meffie Reviewed-by: Kailas Zadbuke Tested-by: BuildBot Reviewed-by: Benjamin Kaduk commit dd1dc35068587ac88bc24199a35878d83fa4113c Author: Cheyenne Wills Date: Tue Jul 7 15:53:16 2026 -0600 linux: replace strncpy with strscpy The Linux 7.2 commit: 'string: Remove strncpy() from the kernel' (079a028d6327e) removed the strncpy() function. As a replacement, we can use the strscpy() function that was introduced by the Linux 4.3 commit: 'string: provide strscpy()' (30035e45753b7) strncpy() is only used on LINUX in the macro osi_procname(), and osi_procname() is only used to log the process name with afs_warn(). We don't need the NUL-padding behavior or the return value of strncpy(), so using strscpy() as a drop-in replacement for strncpy() is fine. Add a configure test to verify that strscpy is available in the Linux kernel headers and update the 'osi_procname' macro to use strscpy() instead of strncpy() when it is available. Note, since strscpy() was introduced in Linux 4.3, this commit is retroactive. Reviewed-on: https://gerrit.openafs.org/16872 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Reviewed-by: Marcio Brito Barbosa (cherry picked from commit c4387834c5e5a33847c68be9564a5d5535523cf8) Change-Id: I544cc248e2a248d1d3d6ebd167266e9ef680aa6a Reviewed-on: https://gerrit.openafs.org/16928 Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Tested-by: BuildBot Reviewed-by: Benjamin Kaduk commit de32db0b657cf95ab65d5ae5b5ac639eb3caa7ab Author: Andrew Deason Date: Thu Dec 1 22:55:41 2022 -0600 LINUX: Disable osi_dnlc The DNLC ("directory name lookup cache") is our cross-platform way of caching lookups of directory items, so we can sometimes avoid hitting the (disk) cache when running afs_lookup(). The Linux kernel has its own (much more sophisticated) directory name caching layer: the dcache, represented by 'struct dentry's (unrelated to our data cache / 'struct dcache'). Maintaining our own cache is rather pointless, and just adds overhead and creates more possibilities to make mistakes (as can be seen by the number of special cases in afs_lookup() to avoid the DNLC). So, just disable the DNLC on LINUX by default by setting the existing afs_usednlc global to 0. At least for now, still build the DNLC code to avoid bitrot if we want to turn it back on. Add a sysctl for afs_usednlc so developers can turn it back on for benchmarking or other testing. Declare afs_usednlc in afs_prototypes.h next to the other osi_dnlc routines. Reviewed-on: https://gerrit.openafs.org/15213 Reviewed-by: Michael Meffie Reviewed-by: Mark Vitale Tested-by: BuildBot Reviewed-by: Andrew Deason (cherry picked from commit b7f4d36241e143a855ead90bd133cc0664fb9ff6) Change-Id: I22277d71baac7862a3dedce091c9ad4d98b33183 Reviewed-on: https://gerrit.openafs.org/16927 Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Tested-by: BuildBot Reviewed-by: Benjamin Kaduk commit e5e639568946a10ca256a645417c3f9c69b095dd Author: Koustubh Mattikalli Date: Sun May 24 08:54:00 2026 +0530 log: Optimize token unlogging by cell name Use new API function ktc_ForgetTokensByCell() introduced in Change-Id "Ia3f3767adeb52ee357b19aec337870d99cb2e33b". This function allows forgetting tokens for a specific cell without affecting tokens for other cells. This simplifies the unlog implementation by eliminating the need of listing all tokens, forget them all, and then re-register all except those specified by the -cell option. However, the old implementation of forgetting and re-registering tokens is still run if the kernel does not support the ktc_ForgetTokensByCell() operation. The old code path will be removed later in a future commit. This change reduces code complexity and improves performance by avoiding unnecessary token listing and re-registration operations. Co-authored-by: Kailas S Zadbuke Co-authored-by: Amar Bhandari Reviewed-on: https://gerrit.openafs.org/16802 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Cheyenne Wills Reviewed-by: Marcio Brito Barbosa Reviewed-by: Andrew Deason (cherry picked from commit 98e433d736437a36e66a765d12b4968d0b5c9e60) Change-Id: Ib0bf2bdcb52db08f343d65398311d4d40a02bf9f Reviewed-on: https://gerrit.openafs.org/16898 Reviewed-by: Michael Meffie Reviewed-by: Kailas Zadbuke Reviewed-by: Koustubh Mattikalli Reviewed-by: Andrew Deason Tested-by: BuildBot Reviewed-by: Benjamin Kaduk commit 581d5f4bc3f36ab7471950f1cda36a40e2186eda Author: Koustubh Mattikalli Date: Tue Aug 25 14:48:29 2026 -0600 log: Add ktc_ForgetTokensByCell() In I23ee8bde66e1e743febe22ae7e4ec822ff2ae7e0 commit (afs: Add new pioctl PUnlogCell), new pioctl call has been introduced which provide a mechanism to remove tokens for a specific cell. To use this new pioctl call, introduce new functions ktc_ForgetTokensByCell() and ForgetTokensByCell() that allows forgetting tokens for a specific cell without affecting tokens of other cells. Co-authored-by: Kailas S Zadbuke Co-authored-by: Amar Bhandari Reviewed-on: https://gerrit.openafs.org/16621 Reviewed-by: Andrew Deason Reviewed-by: Marcio Brito Barbosa Reviewed-by: Cheyenne Wills Reviewed-by: Michael Meffie Tested-by: BuildBot (cherry picked from commit ab9bc6c57af509488efa4dd28bfb4be67f57924c) Conflicts: src/auth/liboafs_auth_krb.la.sym - N/A for 1.8.x Change-Id: If180bb0d404c0a26293934f1a9c16199067f27ac Reviewed-on: https://gerrit.openafs.org/16897 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk commit f780844bf86d4ce1a1b08e6b5f7101444d33625e Author: Koustubh Mattikalli Date: Fri Aug 29 16:37:49 2025 +0530 log: Keep rxgk tokens for unlog -cell The current implementation of unlog removes all rxgk tokens regardless of the "-cell" option provided, leading to unintended token deletions. This happens because "unlog -cell" currently works by discarding all tokens and then re-adding all tokens that don't match the given -cell. But it is using the old ktc_GetToken() interface, which only works for rxkad tokens, so any non-rxkad tokens (including rxgk tokens) get discarded, regardless of cell. To fix this, replace calls to ktc_ListTokens(), ktc_GetToken(), and ktc_SetToken() with their newer counterparts ktc_ListTokensEx(), ktc_GetTokenEx(), and ktc_SetTokenEx(), which work with all tokens. Change struct tokenInfo to use a struct ktc_setTokenData for use with these new functions, instead of the old struct ktc_token/ktc_principal fields. Also change unlog_CheckUnlogList() to take a cell name directly, instead of a ktc_principal, since we no longer have a struct ktc_principal to give it. Co-authored-by: Kailas Zadbuke Co-authored-by: Amar Bhandari Reviewed-on: https://gerrit.openafs.org/16531 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Cheyenne Wills Reviewed-by: Andrew Deason (cherry picked from commit d3087641058a8fe982a7280401f07f7c2ce72499) Change-Id: I4d30e3deaacaf9736b2d694a80d993df89a437fa Reviewed-on: https://gerrit.openafs.org/16896 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Koustubh Mattikalli Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk commit 8f4a1b03dfbdc663e0537adf11bf5c3e1cee2a87 Author: Kailas S Zadbuke Date: Thu Nov 13 12:50:29 2025 +0530 afs: Add new pioctl PUnlogCell The current implementation of PUnlog removes all tokens and it does not provide a mechanism to remove tokens for a specific cell. In a multi-cell environment, this behavior is inefficient because it removes tokens for all cells, even when only a single cell’s tokens need to be invalidated. To address this limitation, introduce a new pioctl, PUnlogCell (pioctl code O.3), which removes tokens only for the specified cell. This avoids unintended token removal for other cells and eliminates the need for additional pioctl calls to re-acquire tokens that are unnecessarily revoked by PUnlog. Co-authored-by: Koustubh Mattikalli Co-authored-by: Amar Bhandari Reviewed-on: https://gerrit.openafs.org/16620 Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Cheyenne Wills Reviewed-by: Marcio Brito Barbosa Reviewed-by: Benjamin Kaduk Reviewed-by: Michael Meffie (cherry picked from commit e9de8ffd492dcf03a268596bdef56e41552230ff) Change-Id: I1a4da9abbd8a0b260c636a07eed9de8e864d3081 Reviewed-on: https://gerrit.openafs.org/16910 Reviewed-by: Michael Meffie Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Benjamin Kaduk commit 3ec6d84001cc5769cea0fb31298599bc064d5520 Author: Jeffrey Altman Date: Thu Oct 5 13:38:56 2023 -0400 config: move VIOC_SETBYPASS_THRESH define to vioc.h 9d63160cccf88d554e47e4bed8e3bbe26f14f8c2 ("bypasscache-20080922") allocated the _OVICEIOCTL(2) code point and added the definition to venus.h instead of src/config/vioc.h. Reviewed-on: https://gerrit.openafs.org/15588 Reviewed-by: Benjamin Kaduk Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Tested-by: BuildBot (cherry picked from commit 20272f0cddb3b3bce84305f914796b5e9dbc774d) Change-Id: I8de86ba58d9caf06841bf935d99ef3a76ac269c9 Reviewed-on: https://gerrit.openafs.org/16909 Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Tested-by: BuildBot Reviewed-by: Benjamin Kaduk commit fdc55ca791e8da97fd0098428cd57120bf0a4c24 Author: Jeffrey Altman Date: Sun Sep 24 21:48:36 2023 -0400 config: remove VIOC_STATISTICS _VICEIOCTL(68) Added to OpenAFS declarations by 405cd3e8e0b8f72244fda6cbdb1a9ba9b9ad150c ("add-new-arla-pioctl-20010710") but the assignment made by the registrar was Group Code Name Purpose / Usage ===== ==== ========================= ============================ A 1 AIOC_STATISTICS arla: fetch statistics as it is an Arla specific pioctl. This change removes the unused declaration from OpenAFS src/config/vioc.h. Reviewed-on: https://gerrit.openafs.org/15583 Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Reviewed-by: Cheyenne Wills Tested-by: BuildBot (cherry picked from commit 882de5b105472af2e1798083c5ef1779abc296dc) Change-Id: Ie5225e552d0e1a084c90c0c0fa3e594e395f6e82 Reviewed-on: https://gerrit.openafs.org/16918 Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Tested-by: BuildBot Reviewed-by: Benjamin Kaduk commit 11467ce5efbc9c028173373fd76c69d144228a95 Author: Jeffrey Altman Date: Sun Sep 24 17:35:43 2023 -0400 config: Document ioctl/pioctl namespace management The ioctl and pioctl namespaces are separated into multiple code groups with distinct management rules for each code group. This commit documents the code groups used by OpenAFS. New OpenAFS ioctl and pioctl codes should be introduced into the 'O' (OpenAFS) code group unless the ioctl or pioctl is being coordinated with another implementation. Link: https://registrar.central.org/pioctls.txt Reviewed-on: https://gerrit.openafs.org/15581 Reviewed-by: Andrew Deason Reviewed-by: Mark Vitale Reviewed-by: Michael Meffie Tested-by: BuildBot (cherry picked from commit 7c22b918835e4d2b24546048df921f61e4454f4a) Change-Id: I4b39f38bce10e49ee663bd7ec6e89c7f2a0b761f Reviewed-on: https://gerrit.openafs.org/16907 Reviewed-by: Andrew Deason Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Benjamin Kaduk commit aab796d55f2ee1b3b02746a09e29580aff2c30d8 Author: Marcio Barbosa Date: Mon Aug 31 19:56:56 2020 +0000 Revert "vos: take RO volume offline during convertROtoRW" This reverts commit 32d35db64061e4102281c235cf693341f9de9271. While that commit did fix the mentioned problem, depending on "vos" to set the volume to be converted as "out of service" is not ideal. Instead, this volume should be set as offline by the SAFSVolConvertROtoRWvolume RPC, executed on the volume server. The proper fix for this problem will be introduced by another commit. Reviewed-on: https://gerrit.openafs.org/14339 Reviewed-by: Cheyenne Wills Reviewed-by: Michael Meffie Reviewed-by: Andrew Deason Tested-by: BuildBot Reviewed-by: Benjamin Kaduk (cherry picked from commit 85893ac3df0c2cb48776cf1203ec200507b6ce7d) [cwills@sinenomine.net] For 1.8.x, this commit reverts the commit: 9d217903f0c7f6b260f166fad6dbf77c67df7c2d (gerrit 15233) Note The pullup to 1.8.x (15233) and this revert are duplicates of an earlier pullup and revert (gerrits 14310/14361). Change-Id: I48f83a0f43b61b5195929bf33e737615f30fae20 Reviewed-on: https://gerrit.openafs.org/16895 Tested-by: BuildBot Reviewed-by: Michael Meffie Reviewed-by: Benjamin Kaduk Reviewed-by: Andrew Deason