diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c
index 9b5656d..ae2924c 100644
--- a/sound/core/memalloc.c
+++ b/sound/core/memalloc.c
@@ -642,6 +642,61 @@ module_init(snd_mem_init)
 module_exit(snd_mem_exit)
 
 
+#include <ksplice-patch.h>
+#include <linux/file.h>
+#include <linux/sched.h>
+#include <linux/version.h>
+
+static const struct file_operations *ksplice_old_snd_mem_proc_fops;
+
+static int ksplice_memalloc_check_pde(void)
+{
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
+	struct task_struct *g, *tsk;
+	do_each_thread(g, tsk) {
+		struct fdtable *fdt = files_fdtable(tsk->files);
+		int fd;
+		for (fd = find_first_bit(fdt->open_fds->fds_bits, fdt->max_fds);
+		     fd < fdt->max_fds;
+		     fd = find_next_bit(fdt->open_fds->fds_bits, fdt->max_fds,
+					fd + 1)) {
+			if (PDE(fcheck_files(tsk->files, fd)->f_dentry->d_inode)
+			    == snd_mem_proc)
+				return 1;
+		}
+	} while_each_thread(g, tsk);
+#endif
+	return 0;
+}
+
+static int ksplice_memalloc_check_apply(void)
+{
+	return ksplice_memalloc_check_pde();
+}
+ksplice_check_apply(ksplice_memalloc_check_apply);
+
+static void ksplice_memalloc_apply(void)
+{
+	ksplice_old_snd_mem_proc_fops = snd_mem_proc->proc_fops;
+	snd_mem_proc->proc_fops = &snd_mem_proc_fops;
+}
+ksplice_apply(ksplice_memalloc_apply);
+
+static int ksplice_memalloc_check_reverse(void)
+{
+	if (snd_mem_proc->proc_fops != &snd_mem_proc_fops)
+		return 1;
+	return ksplice_memalloc_check_pde();
+}
+ksplice_check_reverse(ksplice_memalloc_check_reverse);
+
+static void ksplice_memalloc_reverse(void)
+{
+	snd_mem_proc->proc_fops = ksplice_old_snd_mem_proc_fops;
+}
+ksplice_reverse(ksplice_memalloc_reverse);
+
+
 /*
  * exports
  */

