diff --git a/NEWS b/NEWS
index eb75f6dc83..7e738624d2 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,16 @@
                        User-Visible OpenAFS Changes
 
+OpenAFS 1.8.13.1
+
+  AIX
+
+    * Fix build error introduced with 1.8.13 (15955)
+
+  Linux clients
+
+    * Add support for Linux 6.12 (15964, 15965, 15966)
+
+
 OpenAFS 1.8.13
 
   All client platforms
diff --git a/configure-libafs.ac b/configure-libafs.ac
index 9f4cb976c3..559344ff8b 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.13
+MACOS_VERSION=1.8.14d1
 
 AC_SUBST([MACOS_VERSION])
 
diff --git a/configure.ac b/configure.ac
index 212f8d544c..403f233dc3 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.13
+MACOS_VERSION=1.8.14d1
 
 AC_SUBST([MACOS_VERSION])
 
diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h
index 44bcb440ef..e8b8f100ed 100644
--- a/src/afs/LINUX/osi_compat.h
+++ b/src/afs/LINUX/osi_compat.h
@@ -31,6 +31,19 @@
 # endif
 #endif
 
+#if defined(HAVE_LINUX_NO_SETPAGEERROR)
+static inline void
+ClearPageError(struct page *p)
+{
+    return;
+}
+static inline void
+SetPageError(struct page *p)
+{
+    return;
+}
+#endif
+
 #if !defined(HAVE_LINUX_KTHREAD_COMPLETE_AND_EXIT)
 # define kthread_complete_and_exit complete_and_exit
 #endif
diff --git a/src/afs/LINUX/osi_pagecopy.c b/src/afs/LINUX/osi_pagecopy.c
index 42f5e38e03..061d8c640f 100644
--- a/src/afs/LINUX/osi_pagecopy.c
+++ b/src/afs/LINUX/osi_pagecopy.c
@@ -56,12 +56,16 @@
 #include <afsconfig.h>
 #include "afs/param.h"
 
+#include "afs/sysincludes.h"
+#include "afsincludes.h"
+
 #include <linux/pagemap.h>
 #include <linux/kthread.h>
 #include <linux/wait.h>
 #include <linux/workqueue.h>
 #include <linux/slab.h>
 #include "osi_pagecopy.h"
+#include "osi_compat.h"
 
 static DECLARE_WAIT_QUEUE_HEAD (afs_pagecopy_wq);
 static spinlock_t afs_pagecopy_lock;
diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
index f60d79a198..519c5da150 100644
--- a/src/afs/LINUX/osi_vnodeops.c
+++ b/src/afs/LINUX/osi_vnodeops.c
@@ -3598,13 +3598,23 @@ afs_linux_prepare_write(struct file *file, struct page *page, unsigned from,
 }
 
 #if defined(STRUCT_ADDRESS_SPACE_OPERATIONS_HAS_WRITE_BEGIN)
+# if defined(HAVE_LINUX_WRITE_BEGIN_END_FOLIO)
 static int
 afs_linux_write_end(struct file *file, struct address_space *mapping,
-                                loff_t pos, unsigned len, unsigned copied,
-                                struct page *page, void *fsdata)
+		    loff_t pos, unsigned len, unsigned copied,
+		    struct folio *folio, void *fsdata)
+# else
+static int
+afs_linux_write_end(struct file *file, struct address_space *mapping,
+		    loff_t pos, unsigned len, unsigned copied,
+		    struct page *page, void *fsdata)
+# endif
 {
     int code;
     unsigned int from = pos & (PAGE_SIZE - 1);
+# if defined(HAVE_LINUX_WRITE_BEGIN_END_FOLIO)
+    struct page *page = &folio->page;
+# endif
 
     code = afs_linux_commit_write(file, page, from, from + copied);
 
@@ -3613,49 +3623,42 @@ afs_linux_write_end(struct file *file, struct address_space *mapping,
     return code;
 }
 
-# if defined(HAVE_LINUX_GRAB_CACHE_PAGE_WRITE_BEGIN_NOFLAGS)
+# if defined(HAVE_LINUX_WRITE_BEGIN_END_FOLIO)
+static int
+afs_linux_write_begin(struct file *file, struct address_space *mapping,
+		      loff_t pos, unsigned len,
+		      struct folio **foliop, void **fsdata)
+# elif defined(HAVE_LINUX_GRAB_CACHE_PAGE_WRITE_BEGIN_NOFLAGS)
 static int
 afs_linux_write_begin(struct file *file, struct address_space *mapping,
 		      loff_t pos, unsigned len,
 		      struct page **pagep, void **fsdata)
-{
-    struct page *page;
-    pgoff_t index = pos >> PAGE_SHIFT;
-    unsigned int from = pos & (PAGE_SIZE - 1);
-    int code;
-
-    page = grab_cache_page_write_begin(mapping, index);
-    if (!page) {
-	return -ENOMEM;
-    }
-
-    *pagep = page;
-
-    code = afs_linux_prepare_write(file, page, from, from + len);
-    if (code) {
-	unlock_page(page);
-	put_page(page);
-    }
-
-    return code;
-}
 # else
 static int
 afs_linux_write_begin(struct file *file, struct address_space *mapping,
-                                loff_t pos, unsigned len, unsigned flags,
-                                struct page **pagep, void **fsdata)
+		      loff_t pos, unsigned len, unsigned flags,
+		      struct page **pagep, void **fsdata)
+# endif
 {
     struct page *page;
     pgoff_t index = pos >> PAGE_SHIFT;
     unsigned int from = pos & (PAGE_SIZE - 1);
     int code;
 
+# if defined(HAVE_LINUX_GRAB_CACHE_PAGE_WRITE_BEGIN_NOFLAGS)
+    page = grab_cache_page_write_begin(mapping, index);
+# else
     page = grab_cache_page_write_begin(mapping, index, flags);
+# endif
     if (!page) {
-        return -ENOMEM;
+	return -ENOMEM;
     }
 
+# if defined(HAVE_LINUX_WRITE_BEGIN_END_FOLIO)
+    *foliop = page_folio(page);
+# else
     *pagep = page;
+# endif
 
     code = afs_linux_prepare_write(file, page, from, from + len);
     if (code) {
@@ -3665,7 +3668,6 @@ afs_linux_write_begin(struct file *file, struct address_space *mapping,
 
     return code;
 }
-# endif /* HAVE_LINUX_GRAB_CACHE_PAGE_WRITE_BEGIN_NOFLAGS */
 #endif /* STRUCT_ADDRESS_SPACE_OPERATIONS_HAS_WRITE_BEGIN */
 
 #ifndef STRUCT_DENTRY_OPERATIONS_HAS_D_AUTOMOUNT
diff --git a/src/cf/linux-kernel-func.m4 b/src/cf/linux-kernel-func.m4
index 69b79c5cf6..598114671e 100644
--- a/src/cf/linux-kernel-func.m4
+++ b/src/cf/linux-kernel-func.m4
@@ -300,6 +300,34 @@ AC_CHECK_LINUX_FUNC([no_generic_file_splice_read],
 		    [[static char buff[10], *ap;
 		      ap = generic_file_splice_read(buff); ]])
 
+dnl Linux 6.12 removed the PG_error flag from the page flags along with the
+dnl associated functions ClearPageError() and SetPageError().  Check to see if
+dnl these functions are present in the kernel.
+dnl
+dnl To check if ClearPageError() and SetPageError() are missing, define our own
+dnl functions with the same name but with a conflicting signature. If we can
+dnl define them, the real functions must be missing.
+AC_CHECK_LINUX_FUNC([no_setpageerror],
+		    [[#include <asm/page.h>
+		      #include <linux/page-flags.h>
+		      static inline char ClearPageError(char c) { return c;}
+		      static inline char SetPageError(char c) { return c;}]],
+		    [[static char r;
+		      r = ClearPageError('x');
+		      r = SetPageError('x');]])
+
+dnl Linux 6.12 changed the signatgure for the address_space_operations members
+dnl write_begin and write_end to use a folio instead of a page.
+AC_CHECK_LINUX_FUNC([write_begin_end_folio],
+		    [[#include <linux/fs.h>
+		      static struct file *file;
+		      static struct address_space *mapping;
+		      static struct folio *foliop;
+		      static void *fsdata;
+		      static struct address_space_operations *aops;]],
+		    [[aops->write_begin(file, mapping, 0, 0, &foliop, fsdata);
+		      aops->write_end(file, mapping, 0, 0, 0, foliop, fsdata);]])
+
 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 5e1b3b00cc..ab034c6d06 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=1300
+AFSPRODUCT_VER_PATCH=1301
 !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 915ce17e01..5502f74764 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=1300
+AFSPRODUCT_VER_PATCH=1301
 !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 e6f62e7ca0..b8cc40e397 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=1300
+AFSPRODUCT_VER_PATCH=1301
 !ENDIF
 !IF !DEFINED(AFSPRODUCT_VER_BUILD)
 AFSPRODUCT_VER_BUILD=0
diff --git a/src/ptserver/liboafs_prot.la.sym b/src/ptserver/liboafs_prot.la.sym
index 8e43fe7224..9c880ef512 100644
--- a/src/ptserver/liboafs_prot.la.sym
+++ b/src/ptserver/liboafs_prot.la.sym
@@ -54,3 +54,4 @@ ubik_PR_SetFieldsEntry
 ubik_PR_SetMax
 ubik_PR_UpdateEntry
 ubik_PR_WhereIsIt
+xdr_namelist
