--- /dev/null
+--- rpm/build/kernel-2.4.9/linux/include/linux/fs.h Mon Nov 5 22:20:00 2001
++++ linux/include/linux/fs.h Mon Nov 5 22:17:50 2001
+@@ -1049,6 +1049,7 @@
+ extern int register_filesystem(struct file_system_type *);
+ extern int unregister_filesystem(struct file_system_type *);
+ extern struct vfsmount *kern_mount(struct file_system_type *);
++struct vfsmount *do_kern_mount(char *type, int flags, char *name, void *data);
+ extern int may_umount(struct vfsmount *);
+ extern long do_mount(char *, char *, char *, unsigned long, void *);
+
+@@ -1474,6 +1475,7 @@
+ extern ssize_t generic_file_read(struct file *, char *, size_t, loff_t *);
+ extern ssize_t generic_file_write(struct file *, const char *, size_t, loff_t *);
+ extern void do_generic_file_read(struct file *, loff_t *, read_descriptor_t *, read_actor_t, int);
++ssize_t do_generic_file_write(struct file *file,const char *buf,size_t count,loff_t *ppos, int (*actor)(char *, char *, size_t ));
+
+ extern ssize_t generic_read_dir(struct file *, char *, size_t, loff_t *);
+ extern loff_t generic_file_llseek(struct file *, loff_t, int);
+--- rpm/build/kernel-2.4.9/linux/kernel/ksyms.c Mon Nov 5 22:20:00 2001
++++ linux/kernel/ksyms.c Mon Nov 5 22:14:08 2001
+@@ -246,6 +246,7 @@
+ EXPORT_SYMBOL(do_generic_file_read);
+ EXPORT_SYMBOL(flush_inode_pages);
+ EXPORT_SYMBOL(generic_file_write);
++EXPORT_SYMBOL(do_generic_file_write);
+ EXPORT_SYMBOL(generic_file_mmap);
+ EXPORT_SYMBOL(generic_ro_fops);
+ EXPORT_SYMBOL(generic_buffer_fdatasync);
+@@ -286,6 +287,7 @@
+ EXPORT_SYMBOL(__pollwait);
+ EXPORT_SYMBOL(poll_freewait);
+ EXPORT_SYMBOL(ROOT_DEV);
++EXPORT_SYMBOL(page_cache_lock);
+ EXPORT_SYMBOL(__find_get_page);
+ EXPORT_SYMBOL(__find_lock_page);
+ EXPORT_SYMBOL(find_get_page_simple);
+@@ -371,6 +373,7 @@
+ EXPORT_SYMBOL(register_filesystem);
+ EXPORT_SYMBOL(unregister_filesystem);
+ EXPORT_SYMBOL(kern_mount);
++EXPORT_SYMBOL(do_kern_mount);
+ EXPORT_SYMBOL(__mntput);
+ EXPORT_SYMBOL(may_umount);
+
+--- rpm/build/kernel-2.4.9/linux/mm/filemap.c Mon Nov 5 22:20:00 2001
++++ linux/mm/filemap.c Mon Nov 5 22:16:57 2001
+@@ -2672,7 +2672,7 @@
+ * okir@monad.swb.de
+ */
+ ssize_t
+-generic_file_write(struct file *file,const char *buf,size_t count,loff_t *ppos)
++do_generic_file_write(struct file *file,const char *buf,size_t count,loff_t *ppos, int (*actor)(char *, char *, size_t ))
+ {
+ struct inode *inode = file->f_dentry->d_inode;
+ struct address_space *mapping = inode->i_mapping;
+@@ -2686,8 +2686,10 @@
+
+ cached_page = NULL;
+
++#if 0
+ if (!access_ok(VERIFY_READ, buf, count))
+ return -EFAULT;
++#endif
+
+ down(&inode->i_sem);
+
+@@ -2794,10 +2796,12 @@
+ * same page as we're writing to, without it being marked
+ * up-to-date.
+ */
++#if 0
+ { volatile unsigned char dummy;
+ __get_user(dummy, buf);
+ __get_user(dummy, buf+bytes-1);
+ }
++#endif
+
+ status = -ENOMEM; /* we'll assign it later anyway */
+ page = __grab_cache_page(mapping, index, &cached_page);
+@@ -2813,7 +2817,7 @@
+ if (status)
+ goto sync_failure;
+ kaddr = page_address(page);
+- page_fault = __copy_from_user(kaddr+offset, buf, bytes);
++ page_fault = actor(kaddr+offset, buf, bytes);
+ flush_dcache_page(page);
+ status = mapping->a_ops->commit_write(file, page, offset, offset+bytes);
+ if (page_fault)
+@@ -2870,6 +2874,21 @@
+ vmtruncate(inode, inode->i_size);
+ goto done;
+ }
++
++static inline int actor_from_user(char *dst, char *src, size_t len)
++{
++ if (!access_ok(VERIFY_READ, src, len))
++ return -EFAULT;
++
++ return __copy_from_user(dst, src, len);
++}
++
++ssize_t
++generic_file_write(struct file *file,const char *buf,size_t count,loff_t *ppos)
++{
++ return do_generic_file_write(file, buf, count, ppos, &actor_from_user);
++}
++
+
+ void __init page_cache_init(unsigned long mempages)
+ {