|
@@ -1245,14 +1245,21 @@ retry:
|
|
wait_on_page_writeback(page);
|
|
wait_on_page_writeback(page);
|
|
|
|
|
|
if (PageWriteback(page) ||
|
|
if (PageWriteback(page) ||
|
|
- !test_clear_page_dirty(page)) {
|
|
|
|
|
|
+ !clear_page_dirty_for_io(page)) {
|
|
unlock_page(page);
|
|
unlock_page(page);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * This actually clears the dirty bit in the radix tree.
|
|
|
|
+ * See cifs_writepage() for more commentary.
|
|
|
|
+ */
|
|
|
|
+ set_page_writeback(page);
|
|
|
|
+
|
|
if (page_offset(page) >= mapping->host->i_size) {
|
|
if (page_offset(page) >= mapping->host->i_size) {
|
|
done = 1;
|
|
done = 1;
|
|
unlock_page(page);
|
|
unlock_page(page);
|
|
|
|
+ end_page_writeback(page);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1316,6 +1323,7 @@ retry:
|
|
SetPageError(page);
|
|
SetPageError(page);
|
|
kunmap(page);
|
|
kunmap(page);
|
|
unlock_page(page);
|
|
unlock_page(page);
|
|
|
|
+ end_page_writeback(page);
|
|
page_cache_release(page);
|
|
page_cache_release(page);
|
|
}
|
|
}
|
|
if ((wbc->nr_to_write -= n_iov) <= 0)
|
|
if ((wbc->nr_to_write -= n_iov) <= 0)
|
|
@@ -1352,11 +1360,23 @@ static int cifs_writepage(struct page* page, struct writeback_control *wbc)
|
|
if (!PageUptodate(page)) {
|
|
if (!PageUptodate(page)) {
|
|
cFYI(1, ("ppw - page not up to date"));
|
|
cFYI(1, ("ppw - page not up to date"));
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Set the "writeback" flag, and clear "dirty" in the radix tree.
|
|
|
|
+ *
|
|
|
|
+ * A writepage() implementation always needs to do either this,
|
|
|
|
+ * or re-dirty the page with "redirty_page_for_writepage()" in
|
|
|
|
+ * the case of a failure.
|
|
|
|
+ *
|
|
|
|
+ * Just unlocking the page will cause the radix tree tag-bits
|
|
|
|
+ * to fail to update with the state of the page correctly.
|
|
|
|
+ */
|
|
|
|
+ set_page_writeback(page);
|
|
rc = cifs_partialpagewrite(page, 0, PAGE_CACHE_SIZE);
|
|
rc = cifs_partialpagewrite(page, 0, PAGE_CACHE_SIZE);
|
|
SetPageUptodate(page); /* BB add check for error and Clearuptodate? */
|
|
SetPageUptodate(page); /* BB add check for error and Clearuptodate? */
|
|
unlock_page(page);
|
|
unlock_page(page);
|
|
- page_cache_release(page);
|
|
|
|
|
|
+ end_page_writeback(page);
|
|
|
|
+ page_cache_release(page);
|
|
FreeXid(xid);
|
|
FreeXid(xid);
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|