|
@@ -764,6 +764,31 @@ void end_page_writeback(struct page *page)
|
|
|
}
|
|
|
EXPORT_SYMBOL(end_page_writeback);
|
|
|
|
|
|
+/*
|
|
|
+ * After completing I/O on a page, call this routine to update the page
|
|
|
+ * flags appropriately
|
|
|
+ */
|
|
|
+void page_endio(struct page *page, int rw, int err)
|
|
|
+{
|
|
|
+ if (rw == READ) {
|
|
|
+ if (!err) {
|
|
|
+ SetPageUptodate(page);
|
|
|
+ } else {
|
|
|
+ ClearPageUptodate(page);
|
|
|
+ SetPageError(page);
|
|
|
+ }
|
|
|
+ unlock_page(page);
|
|
|
+ } else { /* rw == WRITE */
|
|
|
+ if (err) {
|
|
|
+ SetPageError(page);
|
|
|
+ if (page->mapping)
|
|
|
+ mapping_set_error(page->mapping, err);
|
|
|
+ }
|
|
|
+ end_page_writeback(page);
|
|
|
+ }
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(page_endio);
|
|
|
+
|
|
|
/**
|
|
|
* __lock_page - get a lock on the page, assuming we need to sleep to get it
|
|
|
* @page: the page to lock
|