summaryrefslogtreecommitdiffstats
path: root/fs/nfs/write.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1999-06-17 13:25:08 +0000
committerRalf Baechle <ralf@linux-mips.org>1999-06-17 13:25:08 +0000
commit59223edaa18759982db0a8aced0e77457d10c68e (patch)
tree89354903b01fa0a447bffeefe00df3044495db2e /fs/nfs/write.c
parentdb7d4daea91e105e3859cf461d7e53b9b77454b2 (diff)
Merge with Linux 2.3.6. Sorry, this isn't tested on silicon, I don't
have a MIPS box at hand.
Diffstat (limited to 'fs/nfs/write.c')
-rw-r--r--fs/nfs/write.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 276064c5e..8da08f06b 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -250,11 +250,24 @@ update_write_request(struct nfs_wreq *req, unsigned int first,
return 1;
}
+static kmem_cache_t *nfs_wreq_cachep;
+
+int nfs_init_wreqcache(void)
+{
+ nfs_wreq_cachep = kmem_cache_create("nfs_wreq",
+ sizeof(struct nfs_wreq),
+ 0, SLAB_HWCACHE_ALIGN,
+ NULL, NULL);
+ if (nfs_wreq_cachep == NULL)
+ return -ENOMEM;
+ return 0;
+}
+
static inline void
free_write_request(struct nfs_wreq * req)
{
if (!--req->wb_count)
- kfree(req);
+ kmem_cache_free(nfs_wreq_cachep, req);
}
/*
@@ -274,7 +287,7 @@ create_write_request(struct file * file, struct page *page, unsigned int offset,
page->offset + offset, bytes);
/* FIXME: Enforce hard limit on number of concurrent writes? */
- wreq = (struct nfs_wreq *) kmalloc(sizeof(*wreq), GFP_KERNEL);
+ wreq = kmem_cache_alloc(nfs_wreq_cachep, SLAB_KERNEL);
if (!wreq)
goto out_fail;
memset(wreq, 0, sizeof(*wreq));
@@ -292,6 +305,7 @@ create_write_request(struct file * file, struct page *page, unsigned int offset,
wreq->wb_file = file;
wreq->wb_pid = current->pid;
wreq->wb_page = page;
+ init_waitqueue_head(&wreq->wb_wait);
wreq->wb_offset = offset;
wreq->wb_bytes = bytes;
wreq->wb_count = 2; /* One for the IO, one for us */
@@ -305,7 +319,7 @@ create_write_request(struct file * file, struct page *page, unsigned int offset,
out_req:
rpc_release_task(task);
- kfree(wreq);
+ kmem_cache_free(nfs_wreq_cachep, wreq);
out_fail:
return NULL;
}
@@ -363,7 +377,7 @@ wait_on_write_request(struct nfs_wreq *req)
struct dentry *dentry = file->f_dentry;
struct inode *inode = dentry->d_inode;
struct rpc_clnt *clnt = NFS_CLIENT(inode);
- struct wait_queue wait = { current, NULL };
+ DECLARE_WAITQUEUE(wait, current);
sigset_t oldmask;
int retval;
@@ -407,17 +421,17 @@ nfs_writepage(struct file * file, struct page *page)
* things with a page scheduled for an RPC call (e.g. invalidate it).
*/
int
-nfs_updatepage(struct file *file, struct page *page, unsigned long offset, unsigned int count, int sync)
+nfs_updatepage(struct file *file, struct page *page, unsigned long offset, unsigned int count)
{
struct dentry *dentry = file->f_dentry;
struct inode *inode = dentry->d_inode;
struct nfs_wreq *req;
- int synchronous = sync;
+ int synchronous = file->f_flags & O_SYNC;
int retval;
- dprintk("NFS: nfs_updatepage(%s/%s %d@%ld, sync=%d)\n",
+ dprintk("NFS: nfs_updatepage(%s/%s %d@%ld)\n",
dentry->d_parent->d_name.name, dentry->d_name.name,
- count, page->offset+offset, sync);
+ count, page->offset+offset);
/*
* Try to find a corresponding request on the writeback queue.
@@ -453,7 +467,7 @@ nfs_updatepage(struct file *file, struct page *page, unsigned long offset, unsig
file->f_count++;
/* Schedule request */
- synchronous = schedule_write_request(req, sync);
+ synchronous = schedule_write_request(req, synchronous);
updated:
if (req->wb_bytes == PAGE_SIZE)