diff options
| -rw-r--r-- | fs/ubifs/file.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index 93b6de51f261..4e7f0aca9ebc 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c | |||
| @@ -430,6 +430,7 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping, | |||
| 430 | struct ubifs_inode *ui = ubifs_inode(inode); | 430 | struct ubifs_inode *ui = ubifs_inode(inode); |
| 431 | pgoff_t index = pos >> PAGE_CACHE_SHIFT; | 431 | pgoff_t index = pos >> PAGE_CACHE_SHIFT; |
| 432 | int uninitialized_var(err), appending = !!(pos + len > inode->i_size); | 432 | int uninitialized_var(err), appending = !!(pos + len > inode->i_size); |
| 433 | int skipped_read = 0; | ||
| 433 | struct page *page; | 434 | struct page *page; |
| 434 | 435 | ||
| 435 | ubifs_assert(ubifs_inode(inode)->ui_size == inode->i_size); | 436 | ubifs_assert(ubifs_inode(inode)->ui_size == inode->i_size); |
| @@ -444,7 +445,7 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping, | |||
| 444 | 445 | ||
| 445 | if (!PageUptodate(page)) { | 446 | if (!PageUptodate(page)) { |
| 446 | /* The page is not loaded from the flash */ | 447 | /* The page is not loaded from the flash */ |
| 447 | if (!(pos & ~PAGE_CACHE_MASK) && len == PAGE_CACHE_SIZE) | 448 | if (!(pos & ~PAGE_CACHE_MASK) && len == PAGE_CACHE_SIZE) { |
| 448 | /* | 449 | /* |
| 449 | * We change whole page so no need to load it. But we | 450 | * We change whole page so no need to load it. But we |
| 450 | * have to set the @PG_checked flag to make the further | 451 | * have to set the @PG_checked flag to make the further |
| @@ -453,7 +454,8 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping, | |||
| 453 | * the media. | 454 | * the media. |
| 454 | */ | 455 | */ |
| 455 | SetPageChecked(page); | 456 | SetPageChecked(page); |
| 456 | else { | 457 | skipped_read = 1; |
| 458 | } else { | ||
| 457 | err = do_readpage(page); | 459 | err = do_readpage(page); |
| 458 | if (err) { | 460 | if (err) { |
| 459 | unlock_page(page); | 461 | unlock_page(page); |
| @@ -470,6 +472,14 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping, | |||
| 470 | if (unlikely(err)) { | 472 | if (unlikely(err)) { |
| 471 | ubifs_assert(err == -ENOSPC); | 473 | ubifs_assert(err == -ENOSPC); |
| 472 | /* | 474 | /* |
| 475 | * If we skipped reading the page because we were going to | ||
| 476 | * write all of it, then it is not up to date. | ||
| 477 | */ | ||
| 478 | if (skipped_read) { | ||
| 479 | ClearPageChecked(page); | ||
| 480 | ClearPageUptodate(page); | ||
| 481 | } | ||
| 482 | /* | ||
| 473 | * Budgeting failed which means it would have to force | 483 | * Budgeting failed which means it would have to force |
| 474 | * write-back but didn't, because we set the @fast flag in the | 484 | * write-back but didn't, because we set the @fast flag in the |
| 475 | * request. Write-back cannot be done now, while we have the | 485 | * request. Write-back cannot be done now, while we have the |
