+
+/*
+ * Remove a writeback request from a list
+ */
+static inline int
+obdfs_remove_from_page_cache(struct obdfs_wreq *wreq)
+{
+ struct inode *inode = wreq->wb_inode;
+ struct page *page = wreq->wb_page;
+ int rc;
+
+ ENTRY;
+ CDEBUG(D_INODE, "removing inode %ld page %p, wreq: %p\n",
+ inode->i_ino, page, wreq);
+ rc = iops(inode)->o_brw(WRITE, iid(inode), inode, page, 1);
+ /* XXX probably should handle error here somehow. I think that
+ * ext2 also does the same thing - discard write even if error?
+ */
+ put_page(page);
+ list_del(&wreq->wb_list);
+ kmem_cache_free(obdfs_wreq_cachep, wreq);
+
+ EXIT;
+ return rc;
+}
+
+/*
+ * Add a page to the write request cache list for later writing
+ */
+static int
+obdfs_add_to_page_cache(struct inode *inode, struct page *page)
+{
+ struct obdfs_wreq *wreq;
+
+ ENTRY;
+ wreq = kmem_cache_alloc(obdfs_wreq_cachep, SLAB_KERNEL);
+ CDEBUG(D_INODE, "adding inode %ld page %p, wreq: %p\n",
+ inode->i_ino, page, wreq);
+ if (!wreq) {
+ EXIT;
+ return -ENOMEM;
+ }
+ memset(wreq, 0, sizeof(*wreq));
+
+ wreq->wb_page = page;
+ wreq->wb_inode = inode;
+
+ get_page(wreq->wb_page);
+ list_add(&wreq->wb_list, &OBD_LIST(inode));
+
+ /* For testing purposes, we write out the page here.
+ * In the future, a flush daemon will write out the page.
+ */
+ wreq = obdfs_find_in_page_cache(inode, page);
+ if (!wreq) {
+ CDEBUG(D_INODE, "XXXX Can't find page after adding it!!!\n");
+ return -EINVAL;
+ } else
+ return obdfs_remove_from_page_cache(wreq);
+
+ return 0;
+}
+
+