Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb876f45 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Fix up CIFS for "test_clear_page_dirty()" removal



This also adds he required page "writeback" flag handling, that cifs
hasn't been doing and that the page dirty flag changes made obvious.

Acked-by: default avatarSteve French <smfltc@us.ibm.com>
Acked-by: default avatarDave Kleikamp <shaggy@linux.vnet.ibm.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 8d1c4819
Loading
Loading
Loading
Loading
+23 −3
Original line number Diff line number Diff line
@@ -1245,14 +1245,21 @@ retry:
				wait_on_page_writeback(page);

			if (PageWriteback(page) ||
					!test_clear_page_dirty(page)) {
					!clear_page_dirty_for_io(page)) {
				unlock_page(page);
				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) {
				done = 1;
				unlock_page(page);
				end_page_writeback(page);
				break;
			}

@@ -1316,6 +1323,7 @@ retry:
					SetPageError(page);
				kunmap(page);
				unlock_page(page);
				end_page_writeback(page);
				page_cache_release(page);
			}
			if ((wbc->nr_to_write -= n_iov) <= 0)
@@ -1353,9 +1361,21 @@ static int cifs_writepage(struct page* page, struct writeback_control *wbc)
		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);
	SetPageUptodate(page); /* BB add check for error and Clearuptodate? */
	unlock_page(page);
	end_page_writeback(page);
	page_cache_release(page);
	FreeXid(xid);
	return rc;