diff --git a/config/kernel-rw.m4 b/config/kernel-rw.m4
deleted file mode 100644
index 85b47d5c6..000000000
--- a/config/kernel-rw.m4
+++ /dev/null
@@ -1,69 +0,0 @@
-dnl #
-dnl # 4.14 API change
-dnl # kernel_write() which was introduced in 3.9 was updated to take
-dnl # the offset as a pointer which is needed by vn_rdwr().
-dnl #
-AC_DEFUN([ZFS_AC_KERNEL_SRC_WRITE], [
-	ZFS_LINUX_TEST_SRC([kernel_write], [
-		#include <linux/fs.h>
-	],[
-		struct file *file = NULL;
-		const void *buf = NULL;
-		size_t count = 0;
-		loff_t *pos = NULL;
-		ssize_t ret;
-
-		ret = kernel_write(file, buf, count, pos);
-	])
-])
-
-AC_DEFUN([ZFS_AC_KERNEL_WRITE], [
-	AC_MSG_CHECKING([whether kernel_write() takes loff_t pointer])
-	ZFS_LINUX_TEST_RESULT([kernel_write], [
-		AC_MSG_RESULT(yes)
-		AC_DEFINE(HAVE_KERNEL_WRITE_PPOS, 1,
-		    [kernel_write() take loff_t pointer])
-	],[
-		AC_MSG_RESULT(no)
-	])
-])
-
-dnl #
-dnl # 4.14 API change
-dnl # kernel_read() which has existed for forever was updated to take
-dnl # the offset as a pointer which is needed by vn_rdwr().
-dnl #
-AC_DEFUN([ZFS_AC_KERNEL_SRC_READ], [
-	ZFS_LINUX_TEST_SRC([kernel_read], [
-		#include <linux/fs.h>
-	],[
-		struct file *file = NULL;
-		void *buf = NULL;
-		size_t count = 0;
-		loff_t *pos = NULL;
-		ssize_t ret;
-
-		ret = kernel_read(file, buf, count, pos);
-	])
-])
-
-AC_DEFUN([ZFS_AC_KERNEL_READ], [
-	AC_MSG_CHECKING([whether kernel_read() takes loff_t pointer])
-	ZFS_LINUX_TEST_RESULT([kernel_read], [
-		AC_MSG_RESULT(yes)
-		AC_DEFINE(HAVE_KERNEL_READ_PPOS, 1,
-		    [kernel_read() take loff_t pointer])
-	],[
-		AC_MSG_RESULT(no)
-	])
-])
-
-AC_DEFUN([ZFS_AC_KERNEL_SRC_RW], [
-	ZFS_AC_KERNEL_SRC_WRITE
-	ZFS_AC_KERNEL_SRC_READ
-])
-
-AC_DEFUN([ZFS_AC_KERNEL_RW], [
-	ZFS_AC_KERNEL_WRITE
-	ZFS_AC_KERNEL_READ
-])
diff --git a/config/kernel.m4 b/config/kernel.m4
index e8f140f57..1ac218583 100644
--- a/config/kernel.m4
+++ b/config/kernel.m4
@@ -50,7 +50,6 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
 	ZFS_AC_KERNEL_SRC_VMALLOC_PAGE_KERNEL
 	ZFS_AC_KERNEL_SRC_WAIT
 	ZFS_AC_KERNEL_SRC_INODE_TIMES
-	ZFS_AC_KERNEL_SRC_RW
 	ZFS_AC_KERNEL_SRC_TIMER_SETUP
 	ZFS_AC_KERNEL_SRC_PROC_OPERATIONS
 	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS
@@ -170,7 +169,6 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
 	ZFS_AC_KERNEL_VMALLOC_PAGE_KERNEL
 	ZFS_AC_KERNEL_WAIT
 	ZFS_AC_KERNEL_INODE_TIMES
-	ZFS_AC_KERNEL_RW
 	ZFS_AC_KERNEL_TIMER_SETUP
 	ZFS_AC_KERNEL_PROC_OPERATIONS
 	ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS
diff --git a/module/os/linux/spl/spl-generic.c b/module/os/linux/spl/spl-generic.c
index 38af322d4..7c3b96589 100644
--- a/module/os/linux/spl/spl-generic.c
+++ b/module/os/linux/spl/spl-generic.c
@@ -623,26 +623,6 @@ ddi_copyout(const void *from, void *to, size_t len, int flags)
 }
 EXPORT_SYMBOL(ddi_copyout);
 
-static ssize_t
-spl_kernel_read(struct file *file, void *buf, size_t count, loff_t *pos)
-{
-#if defined(HAVE_KERNEL_READ_PPOS)
-	return (kernel_read(file, buf, count, pos));
-#else
-	mm_segment_t saved_fs;
-	ssize_t ret;
-
-	saved_fs = get_fs();
-	set_fs(KERNEL_DS);
-
-	ret = vfs_read(file, (void __user *)buf, count, pos);
-
-	set_fs(saved_fs);
-
-	return (ret);
-#endif
-}
-
 static int
 spl_getattr(struct file *filp, struct kstat *stat)
 {
@@ -730,7 +710,7 @@ hostid_read(uint32_t *hostid)
 	 * Read directly into the variable like eglibc does.
 	 * Short reads are okay; native behavior is preserved.
 	 */
-	error = spl_kernel_read(filp, &value, sizeof (value), &off);
+	error = kernel_read(filp, &value, sizeof (value), &off);
 	if (error < 0) {
 		filp_close(filp, 0);
 		return (EIO);
diff --git a/module/os/linux/zfs/zfs_file_os.c b/module/os/linux/zfs/zfs_file_os.c
index 1a0bb5056..1b52dbe4f 100644
--- a/module/os/linux/zfs/zfs_file_os.c
+++ b/module/os/linux/zfs/zfs_file_os.c
@@ -69,26 +69,6 @@ zfs_file_close(zfs_file_t *fp)
 	filp_close(fp, 0);
 }
 
-static ssize_t
-zfs_file_write_impl(zfs_file_t *fp, const void *buf, size_t count, loff_t *off)
-{
-#if defined(HAVE_KERNEL_WRITE_PPOS)
-	return (kernel_write(fp, buf, count, off));
-#else
-	mm_segment_t saved_fs;
-	ssize_t rc;
-
-	saved_fs = get_fs();
-	set_fs(KERNEL_DS);
-
-	rc = vfs_write(fp, (__force const char __user __user *)buf, count, off);
-
-	set_fs(saved_fs);
-
-	return (rc);
-#endif
-}
-
 /*
  * Stateful write - use os internal file pointer to determine where to
  * write and update on successful completion.
@@ -106,7 +86,7 @@ zfs_file_write(zfs_file_t *fp, const void *buf, size_t count, ssize_t *resid)
 	loff_t off = fp->f_pos;
 	ssize_t rc;
 
-	rc = zfs_file_write_impl(fp, buf, count, &off);
+	rc = kernel_write(fp, buf, count, &off);
 	if (rc < 0)
 		return (-rc);
 
@@ -138,7 +118,7 @@ zfs_file_pwrite(zfs_file_t *fp, const void *buf, size_t count, loff_t off,
 {
 	ssize_t rc;
 
-	rc  = zfs_file_write_impl(fp, buf, count, &off);
+	rc  = kernel_write(fp, buf, count, &off);
 	if (rc < 0)
 		return (-rc);
 
@@ -151,25 +131,6 @@ zfs_file_pwrite(zfs_file_t *fp, const void *buf, size_t count, loff_t off,
 	return (0);
 }
 
-static ssize_t
-zfs_file_read_impl(zfs_file_t *fp, void *buf, size_t count, loff_t *off)
-{
-#if defined(HAVE_KERNEL_READ_PPOS)
-	return (kernel_read(fp, buf, count, off));
-#else
-	mm_segment_t saved_fs;
-	ssize_t rc;
-
-	saved_fs = get_fs();
-	set_fs(KERNEL_DS);
-
-	rc = vfs_read(fp, (void __user *)buf, count, off);
-	set_fs(saved_fs);
-
-	return (rc);
-#endif
-}
-
 /*
  * Stateful read - use os internal file pointer to determine where to
  * read and update on successful completion.
@@ -187,7 +148,7 @@ zfs_file_read(zfs_file_t *fp, void *buf, size_t count, ssize_t *resid)
 	loff_t off = fp->f_pos;
 	ssize_t rc;
 
-	rc = zfs_file_read_impl(fp, buf, count, &off);
+	rc = kernel_read(fp, buf, count, &off);
 	if (rc < 0)
 		return (-rc);
 
@@ -219,7 +180,7 @@ zfs_file_pread(zfs_file_t *fp, void *buf, size_t count, loff_t off,
 {
 	ssize_t rc;
 
-	rc = zfs_file_read_impl(fp, buf, count, &off);
+	rc = kernel_read(fp, buf, count, &off);
 	if (rc < 0)
 		return (-rc);