--- 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:24:09 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:29:41 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(pagecache_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) {