From: Trond Myklebust Date: Sun, 15 Apr 2007 19:02:47 -0400 NFS: Debugging code. Do not merge... Adds consistency checks for nfs_page list operations Signed-off-by: Trond Myklebust --- fs/nfs/write.c | 8 ++++++-- include/linux/nfs_page.h | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/nfs/write.c b/fs/nfs/write.c index b853959..2ac7335 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -191,6 +191,7 @@ static int nfs_writepage_setup(struct nfs_open_context *ctx, struct page *page, } /* Update file length */ nfs_grow_file(page, offset, count); + WARN_ON(test_bit(PG_NEED_COMMIT,&(req)->wb_flags)); nfs_unlock_request(req); return 0; } @@ -458,6 +459,7 @@ nfs_mark_request_commit(struct nfs_page *req) struct inode *inode = req->wb_context->dentry->d_inode; struct nfs_inode *nfsi = NFS_I(inode); + WARN_ON(nfs_dirty_request(req)); spin_lock(&nfsi->req_lock); nfs_list_add_request(req, &nfsi->commit); nfsi->ncommit++; @@ -551,7 +553,7 @@ static void nfs_cancel_commit_list(struct list_head *head) req = nfs_list_entry(head->next); dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS); nfs_list_remove_request(req); - clear_bit(PG_NEED_COMMIT, &(req)->wb_flags); + WARN_ON(!test_and_clear_bit(PG_NEED_COMMIT,&(req)->wb_flags)); nfs_inode_remove_request(req); nfs_unlock_request(req); } @@ -1037,6 +1039,7 @@ static void nfs_writeback_done_full(struct rpc_task *task, void *calldata) if (nfs_write_need_commit(data)) { memcpy(&req->wb_verf, &data->verf, sizeof(req->wb_verf)); + set_bit(PG_NEED_COMMIT,&(req)->wb_flags); nfs_mark_request_commit(req); nfs_end_page_writeback(page); dprintk(" marked for commit\n"); @@ -1212,6 +1215,7 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how) nfs_list_remove_request(req); nfs_mark_request_commit(req); dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS); + WARN_ON(!test_and_clear_bit(PG_NEED_COMMIT,&(req)->wb_flags)); nfs_clear_page_writeback(req); } return -ENOMEM; @@ -1235,7 +1239,7 @@ static void nfs_commit_done(struct rpc_task *task, void *calldata) while (!list_empty(&data->pages)) { req = nfs_list_entry(data->pages.next); nfs_list_remove_request(req); - clear_bit(PG_NEED_COMMIT, &(req)->wb_flags); + WARN_ON(!test_and_clear_bit(PG_NEED_COMMIT,&(req)->wb_flags)); dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS); dprintk("NFS: commit (%s/%Ld %d@%Ld)", diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index bd193af..862cc72 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h @@ -117,6 +117,9 @@ nfs_lock_request(struct nfs_page *req) static inline void nfs_list_add_request(struct nfs_page *req, struct list_head *head) { + BUG_ON(!list_empty(&req->wb_list)); + BUG_ON(req->wb_list_head != NULL); + list_add_tail(&req->wb_list, head); req->wb_list_head = head; }