|
@@ -1291,7 +1291,8 @@ out:
|
|
|
* on error we return an unlocked page and the error value
|
|
|
* on success we return a locked page and 0
|
|
|
*/
|
|
|
-static int prepare_uptodate_page(struct page *page, u64 pos,
|
|
|
+static int prepare_uptodate_page(struct inode *inode,
|
|
|
+ struct page *page, u64 pos,
|
|
|
bool force_uptodate)
|
|
|
{
|
|
|
int ret = 0;
|
|
@@ -1306,6 +1307,10 @@ static int prepare_uptodate_page(struct page *page, u64 pos,
|
|
|
unlock_page(page);
|
|
|
return -EIO;
|
|
|
}
|
|
|
+ if (page->mapping != inode->i_mapping) {
|
|
|
+ unlock_page(page);
|
|
|
+ return -EAGAIN;
|
|
|
+ }
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
@@ -1324,6 +1329,7 @@ static noinline int prepare_pages(struct inode *inode, struct page **pages,
|
|
|
int faili;
|
|
|
|
|
|
for (i = 0; i < num_pages; i++) {
|
|
|
+again:
|
|
|
pages[i] = find_or_create_page(inode->i_mapping, index + i,
|
|
|
mask | __GFP_WRITE);
|
|
|
if (!pages[i]) {
|
|
@@ -1333,13 +1339,17 @@ static noinline int prepare_pages(struct inode *inode, struct page **pages,
|
|
|
}
|
|
|
|
|
|
if (i == 0)
|
|
|
- err = prepare_uptodate_page(pages[i], pos,
|
|
|
+ err = prepare_uptodate_page(inode, pages[i], pos,
|
|
|
force_uptodate);
|
|
|
- if (i == num_pages - 1)
|
|
|
- err = prepare_uptodate_page(pages[i],
|
|
|
+ if (!err && i == num_pages - 1)
|
|
|
+ err = prepare_uptodate_page(inode, pages[i],
|
|
|
pos + write_bytes, false);
|
|
|
if (err) {
|
|
|
page_cache_release(pages[i]);
|
|
|
+ if (err == -EAGAIN) {
|
|
|
+ err = 0;
|
|
|
+ goto again;
|
|
|
+ }
|
|
|
faili = i - 1;
|
|
|
goto fail;
|
|
|
}
|