aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/cifs/file.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 0f05cab5d24a..8a49b2e77d37 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -1245,14 +1245,21 @@ retry:
1245 wait_on_page_writeback(page); 1245 wait_on_page_writeback(page);
1246 1246
1247 if (PageWriteback(page) || 1247 if (PageWriteback(page) ||
1248 !test_clear_page_dirty(page)) { 1248 !clear_page_dirty_for_io(page)) {
1249 unlock_page(page); 1249 unlock_page(page);
1250 break; 1250 break;
1251 } 1251 }
1252 1252
1253 /*
1254 * This actually clears the dirty bit in the radix tree.
1255 * See cifs_writepage() for more commentary.
1256 */
1257 set_page_writeback(page);
1258
1253 if (page_offset(page) >= mapping->host->i_size) { 1259 if (page_offset(page) >= mapping->host->i_size) {
1254 done = 1; 1260 done = 1;
1255 unlock_page(page); 1261 unlock_page(page);
1262 end_page_writeback(page);
1256 break; 1263 break;
1257 } 1264 }
1258 1265
@@ -1316,6 +1323,7 @@ retry:
1316 SetPageError(page); 1323 SetPageError(page);
1317 kunmap(page); 1324 kunmap(page);
1318 unlock_page(page); 1325 unlock_page(page);
1326 end_page_writeback(page);
1319 page_cache_release(page); 1327 page_cache_release(page);
1320 } 1328 }
1321 if ((wbc->nr_to_write -= n_iov) <= 0) 1329 if ((wbc->nr_to_write -= n_iov) <= 0)
@@ -1352,11 +1360,23 @@ static int cifs_writepage(struct page* page, struct writeback_control *wbc)
1352 if (!PageUptodate(page)) { 1360 if (!PageUptodate(page)) {
1353 cFYI(1, ("ppw - page not up to date")); 1361 cFYI(1, ("ppw - page not up to date"));
1354 } 1362 }
1355 1363
1364 /*
1365 * Set the "writeback" flag, and clear "dirty" in the radix tree.
1366 *
1367 * A writepage() implementation always needs to do either this,
1368 * or re-dirty the page with "redirty_page_for_writepage()" in
1369 * the case of a failure.
1370 *
1371 * Just unlocking the page will cause the radix tree tag-bits
1372 * to fail to update with the state of the page correctly.
1373 */
1374 set_page_writeback(page);
1356 rc = cifs_partialpagewrite(page, 0, PAGE_CACHE_SIZE); 1375 rc = cifs_partialpagewrite(page, 0, PAGE_CACHE_SIZE);
1357 SetPageUptodate(page); /* BB add check for error and Clearuptodate? */ 1376 SetPageUptodate(page); /* BB add check for error and Clearuptodate? */
1358 unlock_page(page); 1377 unlock_page(page);
1359 page_cache_release(page); 1378 end_page_writeback(page);
1379 page_cache_release(page);
1360 FreeXid(xid); 1380 FreeXid(xid);
1361 return rc; 1381 return rc;
1362} 1382}