diff options
-rw-r--r-- | Documentation/filesystems/vfs.txt | 5 | ||||
-rw-r--r-- | fs/libfs.c | 5 |
2 files changed, 8 insertions, 2 deletions
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 7737bfd03cf8..ea271f2d3954 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt | |||
@@ -617,6 +617,11 @@ struct address_space_operations { | |||
617 | In this case the prepare_write will be retried one the lock is | 617 | In this case the prepare_write will be retried one the lock is |
618 | regained. | 618 | regained. |
619 | 619 | ||
620 | Note: the page _must not_ be marked uptodate in this function | ||
621 | (or anywhere else) unless it actually is uptodate right now. As | ||
622 | soon as a page is marked uptodate, it is possible for a concurrent | ||
623 | read(2) to copy it to userspace. | ||
624 | |||
620 | commit_write: If prepare_write succeeds, new data will be copied | 625 | commit_write: If prepare_write succeeds, new data will be copied |
621 | into the page and then commit_write will be called. It will | 626 | into the page and then commit_write will be called. It will |
622 | typically update the size of the file (if appropriate) and | 627 | typically update the size of the file (if appropriate) and |
diff --git a/fs/libfs.c b/fs/libfs.c index 7d487047dbb8..cf79196535ec 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
@@ -335,17 +335,18 @@ int simple_prepare_write(struct file *file, struct page *page, | |||
335 | flush_dcache_page(page); | 335 | flush_dcache_page(page); |
336 | kunmap_atomic(kaddr, KM_USER0); | 336 | kunmap_atomic(kaddr, KM_USER0); |
337 | } | 337 | } |
338 | SetPageUptodate(page); | ||
339 | } | 338 | } |
340 | return 0; | 339 | return 0; |
341 | } | 340 | } |
342 | 341 | ||
343 | int simple_commit_write(struct file *file, struct page *page, | 342 | int simple_commit_write(struct file *file, struct page *page, |
344 | unsigned offset, unsigned to) | 343 | unsigned from, unsigned to) |
345 | { | 344 | { |
346 | struct inode *inode = page->mapping->host; | 345 | struct inode *inode = page->mapping->host; |
347 | loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to; | 346 | loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to; |
348 | 347 | ||
348 | if (!PageUptodate(page)) | ||
349 | SetPageUptodate(page); | ||
349 | /* | 350 | /* |
350 | * No need to use i_size_read() here, the i_size | 351 | * No need to use i_size_read() here, the i_size |
351 | * cannot change under us because we hold the i_mutex. | 352 | * cannot change under us because we hold the i_mutex. |