From: NeilBrown We currently serialize all writes to these caches with queue_io_sem, so we only needed one buffer. There is some need for larger-than-one-page writes, so we can just statically allocate a buffer. --- 25-akpm/net/sunrpc/cache.c | 20 ++++++-------------- 1 files changed, 6 insertions(+), 14 deletions(-) diff -puN net/sunrpc/cache.c~knfsd-3-of-10-allow-larger-writes-to-sunrpc-svc-caches net/sunrpc/cache.c --- 25/net/sunrpc/cache.c~knfsd-3-of-10-allow-larger-writes-to-sunrpc-svc-caches Tue May 18 15:27:40 2004 +++ 25-akpm/net/sunrpc/cache.c Tue May 18 15:27:40 2004 @@ -652,12 +652,13 @@ cache_read(struct file *filp, char *buf, return err ? err : count; } +static char write_buf[8192]; /* protected by queue_io_sem */ + static ssize_t cache_write(struct file *filp, const char *buf, size_t count, loff_t *ppos) { int err; - char *page; struct cache_detail *cd = PDE(filp->f_dentry->d_inode)->data; if (ppos != &filp->f_pos) @@ -665,31 +666,22 @@ cache_write(struct file *filp, const cha if (count == 0) return 0; - if (count > PAGE_SIZE) + if (count >= sizeof(write_buf)) return -EINVAL; down(&queue_io_sem); - page = kmalloc(PAGE_SIZE, GFP_KERNEL); - if (page == NULL) { - up(&queue_io_sem); - return -ENOMEM; - } - - if (copy_from_user(page, buf, count)) { + if (copy_from_user(write_buf, buf, count)) { up(&queue_io_sem); - kfree(page); return -EFAULT; } - if (count < PAGE_SIZE) - page[count] = '\0'; + write_buf[count] = '\0'; if (cd->cache_parse) - err = cd->cache_parse(cd, page, count); + err = cd->cache_parse(cd, write_buf, count); else err = -EINVAL; up(&queue_io_sem); - kfree(page); return err ? err : count; } _