NFS: Clean up write code...

The addition of nfs_page_mkwrite means that We should no longer need to
create requests inside nfs_writepage()

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Trond Myklebust 2007-07-22 17:09:05 -04:00
parent 94387fb1aa
commit 9cccef9505
4 changed files with 5 additions and 67 deletions

View file

@ -339,7 +339,7 @@ static int nfs_launder_page(struct page *page)
const struct address_space_operations nfs_file_aops = { const struct address_space_operations nfs_file_aops = {
.readpage = nfs_readpage, .readpage = nfs_readpage,
.readpages = nfs_readpages, .readpages = nfs_readpages,
.set_page_dirty = nfs_set_page_dirty, .set_page_dirty = __set_page_dirty_nobuffers,
.writepage = nfs_writepage, .writepage = nfs_writepage,
.writepages = nfs_writepages, .writepages = nfs_writepages,
.prepare_write = nfs_prepare_write, .prepare_write = nfs_prepare_write,

View file

@ -243,10 +243,7 @@ static void nfs_end_page_writeback(struct page *page)
/* /*
* Find an associated nfs write request, and prepare to flush it out * Find an associated nfs write request, and prepare to flush it out
* Returns 1 if there was no write request, or if the request was * May return an error if the user signalled nfs_wait_on_request().
* already tagged by nfs_set_page_dirty.Returns 0 if the request
* was not tagged.
* May also return an error if the user signalled nfs_wait_on_request().
*/ */
static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio, static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
struct page *page) struct page *page)
@ -261,7 +258,7 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
req = nfs_page_find_request_locked(page); req = nfs_page_find_request_locked(page);
if (req == NULL) { if (req == NULL) {
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
return 1; return 0;
} }
if (nfs_lock_request_dontget(req)) if (nfs_lock_request_dontget(req))
break; break;
@ -282,7 +279,7 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
nfs_unlock_request(req); nfs_unlock_request(req);
nfs_pageio_complete(pgio); nfs_pageio_complete(pgio);
return 1; return 0;
} }
if (nfs_set_page_writeback(page) != 0) { if (nfs_set_page_writeback(page) != 0) {
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
@ -290,10 +287,9 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
} }
radix_tree_tag_set(&nfsi->nfs_page_tree, req->wb_index, radix_tree_tag_set(&nfsi->nfs_page_tree, req->wb_index,
NFS_PAGE_TAG_LOCKED); NFS_PAGE_TAG_LOCKED);
ret = test_bit(PG_NEED_FLUSH, &req->wb_flags);
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
nfs_pageio_add_request(pgio, req); nfs_pageio_add_request(pgio, req);
return ret; return 0;
} }
/* /*
@ -302,9 +298,7 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
static int nfs_writepage_locked(struct page *page, struct writeback_control *wbc) static int nfs_writepage_locked(struct page *page, struct writeback_control *wbc)
{ {
struct nfs_pageio_descriptor mypgio, *pgio; struct nfs_pageio_descriptor mypgio, *pgio;
struct nfs_open_context *ctx;
struct inode *inode = page->mapping->host; struct inode *inode = page->mapping->host;
unsigned offset;
int err; int err;
nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGE); nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGE);
@ -320,28 +314,7 @@ static int nfs_writepage_locked(struct page *page, struct writeback_control *wbc
nfs_pageio_cond_complete(pgio, page->index); nfs_pageio_cond_complete(pgio, page->index);
err = nfs_page_async_flush(pgio, page); err = nfs_page_async_flush(pgio, page);
if (err <= 0)
goto out;
err = 0;
offset = nfs_page_length(page);
if (!offset)
goto out;
nfs_pageio_cond_complete(pgio, page->index);
ctx = nfs_find_open_context(inode, NULL, FMODE_WRITE);
if (ctx == NULL) {
err = -EBADF;
goto out;
}
err = nfs_writepage_setup(ctx, page, 0, offset);
put_nfs_open_context(ctx);
if (err != 0)
goto out;
err = nfs_page_async_flush(pgio, page);
if (err > 0)
err = 0;
out:
if (!wbc->for_writepages) if (!wbc->for_writepages)
nfs_pageio_complete(pgio); nfs_pageio_complete(pgio);
return err; return err;
@ -395,8 +368,6 @@ static int nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
} }
SetPagePrivate(req->wb_page); SetPagePrivate(req->wb_page);
set_page_private(req->wb_page, (unsigned long)req); set_page_private(req->wb_page, (unsigned long)req);
if (PageDirty(req->wb_page))
set_bit(PG_NEED_FLUSH, &req->wb_flags);
nfsi->npages++; nfsi->npages++;
kref_get(&req->wb_kref); kref_get(&req->wb_kref);
return 0; return 0;
@ -416,8 +387,6 @@ static void nfs_inode_remove_request(struct nfs_page *req)
set_page_private(req->wb_page, 0); set_page_private(req->wb_page, 0);
ClearPagePrivate(req->wb_page); ClearPagePrivate(req->wb_page);
radix_tree_delete(&nfsi->nfs_page_tree, req->wb_index); radix_tree_delete(&nfsi->nfs_page_tree, req->wb_index);
if (test_and_clear_bit(PG_NEED_FLUSH, &req->wb_flags))
__set_page_dirty_nobuffers(req->wb_page);
nfsi->npages--; nfsi->npages--;
if (!nfsi->npages) { if (!nfsi->npages) {
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
@ -1477,35 +1446,6 @@ int nfs_wb_page(struct inode *inode, struct page* page)
return nfs_wb_page_priority(inode, page, FLUSH_STABLE); return nfs_wb_page_priority(inode, page, FLUSH_STABLE);
} }
int nfs_set_page_dirty(struct page *page)
{
struct address_space *mapping = page->mapping;
struct inode *inode;
struct nfs_page *req;
int ret;
if (!mapping)
goto out_raced;
inode = mapping->host;
if (!inode)
goto out_raced;
spin_lock(&inode->i_lock);
req = nfs_page_find_request_locked(page);
if (req != NULL) {
/* Mark any existing write requests for flushing */
ret = !test_and_set_bit(PG_NEED_FLUSH, &req->wb_flags);
spin_unlock(&inode->i_lock);
nfs_release_request(req);
return ret;
}
ret = __set_page_dirty_nobuffers(page);
spin_unlock(&inode->i_lock);
return ret;
out_raced:
return !TestSetPageDirty(page);
}
int __init nfs_init_writepagecache(void) int __init nfs_init_writepagecache(void)
{ {
nfs_wdata_cachep = kmem_cache_create("nfs_write_data", nfs_wdata_cachep = kmem_cache_create("nfs_write_data",

View file

@ -420,7 +420,6 @@ extern int nfs_flush_incompatible(struct file *file, struct page *page);
extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int);
extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *); extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *);
extern void nfs_writedata_release(void *); extern void nfs_writedata_release(void *);
extern int nfs_set_page_dirty(struct page *);
/* /*
* Try to write back everything synchronously (but check the * Try to write back everything synchronously (but check the

View file

@ -30,7 +30,6 @@
#define PG_BUSY 0 #define PG_BUSY 0
#define PG_NEED_COMMIT 1 #define PG_NEED_COMMIT 1
#define PG_NEED_RESCHED 2 #define PG_NEED_RESCHED 2
#define PG_NEED_FLUSH 3
struct nfs_inode; struct nfs_inode;
struct nfs_page { struct nfs_page {