diff --git a/NEWS b/NEWS
index d5f8944117..e5118b244e 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,11 @@
                        User-Visible OpenAFS Changes
 
+OpenAFS 1.8.12.1
+
+  Linux clients
+
+    * Add support for Linux 6.10 (15796, 15797, 15798, 15799, 15800)
+
 OpenAFS 1.8.12
 
   All client platforms
diff --git a/configure-libafs.ac b/configure-libafs.ac
index 74eb75a8a2..c0a121f0ea 100644
--- a/configure-libafs.ac
+++ b/configure-libafs.ac
@@ -4,7 +4,7 @@ AC_CONFIG_AUX_DIR([build-tools])
 AC_CONFIG_SRCDIR([src/libafs/Makefile.common.in])
 
 AC_CONFIG_HEADERS([src/config/afsconfig.h])
-MACOS_VERSION=1.8.12
+MACOS_VERSION=1.8.13d1
 
 AC_SUBST([MACOS_VERSION])
 
diff --git a/configure.ac b/configure.ac
index 51ae6b0a1c..21663b0636 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,7 @@ AC_CONFIG_MACRO_DIR([src/cf])
 AC_CONFIG_SRCDIR([src/config/stds.h])
 
 AC_CONFIG_HEADERS([src/config/afsconfig.h])
-MACOS_VERSION=1.8.12
+MACOS_VERSION=1.8.13d1
 
 AC_SUBST([MACOS_VERSION])
 
diff --git a/src/afs/LINUX/osi_alloc.c b/src/afs/LINUX/osi_alloc.c
index e33306278a..0c7489940f 100644
--- a/src/afs/LINUX/osi_alloc.c
+++ b/src/afs/LINUX/osi_alloc.c
@@ -196,6 +196,15 @@ local_free(void *p, size_t n)
     vfree(p);
 }
 
+/*
+ * wrapper for vmalloc(), since vmalloc() may be a macro
+ */
+static void *
+local_vmalloc(size_t size)
+{
+    return vmalloc(size);
+}
+
 /* linux_alloc_init(): Initializes the kernel memory allocator. As part
  *    of this process, it also initializes a pool of osi_linux_mem
  *    structures as well as the hash table itself.
@@ -209,14 +218,14 @@ linux_alloc_init(void)
     /* initiate our pool of osi_linux_mem structs */
     al_mem_pool =
 	afs_atomlist_create(sizeof(struct osi_linux_mem), sizeof(long) * 1024,
-			    (void *)vmalloc, local_free);
+			    local_vmalloc, local_free);
     if (!al_mem_pool) {
 	printf("afs_osi_Alloc: Error in initialization(atomlist_create)\n");
 	return 0;
     }
 
     /* initialize the hash table to hold references to alloc'ed chunks */
-    lh_mem_htab = afs_lhash_create(hash_equal, (void *)vmalloc, local_free);
+    lh_mem_htab = afs_lhash_create(hash_equal, local_vmalloc, local_free);
     if (!lh_mem_htab) {
 	printf("afs_osi_Alloc: Error in initialization(lhash_create)\n");
 	return 0;
diff --git a/src/afs/LINUX/osi_ioctl.c b/src/afs/LINUX/osi_ioctl.c
index 3e797745cc..d964d8103b 100644
--- a/src/afs/LINUX/osi_ioctl.c
+++ b/src/afs/LINUX/osi_ioctl.c
@@ -21,10 +21,6 @@
 #include <linux/unistd.h>		/* For syscall numbers. */
 #include <linux/mm.h>
 
-#ifdef AFS_AMD64_LINUX_ENV
-#include <asm/ia32_unistd.h>
-#endif
-
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/sched.h>
diff --git a/src/afs/LINUX/osi_module.c b/src/afs/LINUX/osi_module.c
index 30ac048d32..0fc9beba06 100644
--- a/src/afs/LINUX/osi_module.c
+++ b/src/afs/LINUX/osi_module.c
@@ -21,10 +21,6 @@
 #include <linux/unistd.h>		/* For syscall numbers. */
 #include <linux/mm.h>
 
-#ifdef AFS_AMD64_LINUX_ENV
-#include <asm/ia32_unistd.h>
-#endif
-
 #include <linux/proc_fs.h>
 #include <linux/slab.h>
 #include <linux/init.h>
diff --git a/src/afs/LINUX/osi_pag_module.c b/src/afs/LINUX/osi_pag_module.c
index 24b938f0ee..7e8e4f15bc 100644
--- a/src/afs/LINUX/osi_pag_module.c
+++ b/src/afs/LINUX/osi_pag_module.c
@@ -20,10 +20,6 @@
 #include <linux/unistd.h>		/* For syscall numbers. */
 #include <linux/mm.h>
 
-#ifdef AFS_AMD64_LINUX_ENV
-#include <asm/ia32_unistd.h>
-#endif
-
 #include <linux/proc_fs.h>
 #include <linux/slab.h>
 #include <linux/init.h>
diff --git a/src/afs/LINUX/osi_proc.c b/src/afs/LINUX/osi_proc.c
index 9c5a080f0b..ad7c695b91 100644
--- a/src/afs/LINUX/osi_proc.c
+++ b/src/afs/LINUX/osi_proc.c
@@ -25,10 +25,6 @@
 #include <linux/unistd.h>		/* For syscall numbers. */
 #include <linux/mm.h>
 
-#ifdef AFS_AMD64_LINUX_ENV
-# include <asm/ia32_unistd.h>
-#endif
-
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/sched.h>
diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
index b709ad1a5e..ba0d9bceb8 100644
--- a/src/afs/LINUX/osi_vnodeops.c
+++ b/src/afs/LINUX/osi_vnodeops.c
@@ -2331,6 +2331,24 @@ mapping_read_page(struct address_space *mapping, struct page *page)
 #endif
 }
 
+/*
+ * small compat wrapper for filemap_alloc_folio/page_cache_alloc
+ */
+static struct page *
+afs_page_cache_alloc(struct address_space *cachemapping)
+{
+#if defined(HAVE_LINUX_FILEMAP_ALLOC_FOLIO)
+    struct folio *folio;
+    folio = filemap_alloc_folio(mapping_gfp_mask(cachemapping), 0);
+    if (folio == NULL) {
+	return NULL;
+    }
+    return &folio->page;
+#else
+    return page_cache_alloc(cachemapping);
+#endif
+}
+
 /* Populate a page by filling it from the cache file pointed at by cachefp
  * (which contains indicated chunk)
  * If task is NULL, the page copy occurs syncronously, and the routine
@@ -2369,11 +2387,12 @@ afs_linux_read_cache(struct file *cachefp, struct page *page,
     pageindex = (offset - AFS_CHUNKTOBASE(chunk)) >> PAGE_SHIFT;
 
     while (cachepage == NULL) {
-        cachepage = find_get_page(cachemapping, pageindex);
+	cachepage = find_get_page(cachemapping, pageindex);
 	if (!cachepage) {
-	    if (!newpage)
-		newpage = page_cache_alloc(cachemapping);
-	    if (!newpage) {
+	    if (newpage == NULL) {
+		newpage = afs_page_cache_alloc(cachemapping);
+	    }
+	    if (newpage == NULL) {
 		code = -ENOMEM;
 		goto out;
 	    }
@@ -2435,7 +2454,7 @@ afs_linux_read_cache(struct file *cachefp, struct page *page,
 /*
  * Return true if the file has a mapping that can read pages
  */
-static int inline
+static inline int
 file_can_read_pages(struct file *fp)
 {
 #if defined(STRUCT_ADDRESS_SPACE_OPERATIONS_HAS_READ_FOLIO)
@@ -2448,7 +2467,7 @@ file_can_read_pages(struct file *fp)
     return 0;
 }
 
-static int inline
+static inline int
 afs_linux_readpage_fastpath(struct file *fp, struct page *pp, int *codep)
 {
     loff_t offset = page_offset(pp);
diff --git a/src/afs/afs.h b/src/afs/afs.h
index 7872412dff..345cecb91c 100644
--- a/src/afs/afs.h
+++ b/src/afs/afs.h
@@ -348,7 +348,8 @@ struct cell_alias {
     char *cell;
 };
 
-#define	afs_PutCell(cellp, locktype)
+/* In case someday a counterpart for afs_GetCell is needed */
+#define afs_PutCell(cellp, locktype) do {} while(0)
 
 /* the unixuser flag bit definitions */
 #define	UHasTokens	1	/* are the st and ct fields valid (ever set)? */
@@ -536,7 +537,8 @@ struct server {
     afs_int32 capabilities;
 };
 
-#define	afs_PutServer(servp, locktype)
+/* In case someday a counterpart for afs_GetServer is needed */
+#define afs_PutServer(servp, locktype) do {} while(0)
 
 /* structs for some pioctls  - these are (or should be)
  * also in venus.h
diff --git a/src/afs/afs_cbqueue.c b/src/afs/afs_cbqueue.c
index 2dd6335880..11e3aa3f11 100644
--- a/src/afs/afs_cbqueue.c
+++ b/src/afs/afs_cbqueue.c
@@ -139,7 +139,9 @@ afs_DequeueCallback(struct vcache *avc)
     debugvc = avc;
     if (avc->callsort.prev) {
 	QRemove(&(avc->callsort));
-    } else;			/* must have got dequeued in a race */
+    } else {
+	/* must have got dequeued in a race */
+    }
 
     return;
 }				/* afs_DequeueCallback */
diff --git a/src/cf/linux-kernel-func.m4 b/src/cf/linux-kernel-func.m4
index 6f9d350227..54fc6786ce 100644
--- a/src/cf/linux-kernel-func.m4
+++ b/src/cf/linux-kernel-func.m4
@@ -263,6 +263,16 @@ AC_CHECK_LINUX_FUNC([no_strlcpy],
 		     size_t s;
 		     s = strlcpy(buff);]])
 
+dnl Linux 5.15 introduced filemap_alloc_folio() as a replacement for
+dnl page_cache_alloc().  page_cache_alloc() was updated to become just a
+dnl wrapper for filemap_alloc_folio().
+dnl Linux 6.10 removed page_cache_alloc().
+AC_CHECK_LINUX_FUNC([filemap_alloc_folio],
+		    [#include <linux/kernel.h>
+		     #include <linux/pagemap.h>],
+		    [[static struct folio *folio;
+		      folio = filemap_alloc_folio(0, 0);]])
+
 dnl Consequences - things which get set as a result of the
 dnl                above tests
 AS_IF([test "x$ac_cv_linux_func_d_alloc_anon" = "xno"],
diff --git a/src/config/NTMakefile.amd64_w2k b/src/config/NTMakefile.amd64_w2k
index 6ac2f38f07..6f64e19bb5 100644
--- a/src/config/NTMakefile.amd64_w2k
+++ b/src/config/NTMakefile.amd64_w2k
@@ -88,7 +88,7 @@ AFSPRODUCT_VER_MAJOR=1
 AFSPRODUCT_VER_MINOR=8
 !ENDIF
 !IF !DEFINED(AFSPRODUCT_VER_PATCH)
-AFSPRODUCT_VER_PATCH=1201
+AFSPRODUCT_VER_PATCH=1202
 !ENDIF
 !IF !DEFINED(AFSPRODUCT_VER_BUILD)
 AFSPRODUCT_VER_BUILD=0
diff --git a/src/config/NTMakefile.i386_nt40 b/src/config/NTMakefile.i386_nt40
index 3cc9b263c4..e6420a6317 100644
--- a/src/config/NTMakefile.i386_nt40
+++ b/src/config/NTMakefile.i386_nt40
@@ -88,7 +88,7 @@ AFSPRODUCT_VER_MAJOR=1
 AFSPRODUCT_VER_MINOR=8
 !ENDIF
 !IF !DEFINED(AFSPRODUCT_VER_PATCH)
-AFSPRODUCT_VER_PATCH=1201
+AFSPRODUCT_VER_PATCH=1202
 !ENDIF
 !IF !DEFINED(AFSPRODUCT_VER_BUILD)
 AFSPRODUCT_VER_BUILD=0
diff --git a/src/config/NTMakefile.i386_w2k b/src/config/NTMakefile.i386_w2k
index 3c8b0a693f..8db928814d 100644
--- a/src/config/NTMakefile.i386_w2k
+++ b/src/config/NTMakefile.i386_w2k
@@ -92,7 +92,7 @@ AFSPRODUCT_VER_MAJOR=1
 AFSPRODUCT_VER_MINOR=8
 !ENDIF
 !IF !DEFINED(AFSPRODUCT_VER_PATCH)
-AFSPRODUCT_VER_PATCH=1201
+AFSPRODUCT_VER_PATCH=1202
 !ENDIF
 !IF !DEFINED(AFSPRODUCT_VER_BUILD)
 AFSPRODUCT_VER_BUILD=0
