Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 29200
b: refs/heads/master
c: 9e94cd4
h: refs/heads/master
v: v3
  • Loading branch information
Jens Axboe authored and Jens Axboe committed Jun 23, 2006
1 parent b6d3b3a commit 3617769
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: fd61af0384014ca29428ace7c17a978b755aeddd
refs/heads/master: 9e94cd4fd1812bab45237f998b3c6fa1b24023fd
46 changes: 29 additions & 17 deletions trunk/fs/splice.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,31 +55,43 @@ static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe,
struct pipe_buffer *buf)
{
struct page *page = buf->page;
struct address_space *mapping = page_mapping(page);
struct address_space *mapping;

lock_page(page);

WARN_ON(!PageUptodate(page));
mapping = page_mapping(page);
if (mapping) {
WARN_ON(!PageUptodate(page));

/*
* At least for ext2 with nobh option, we need to wait on writeback
* completing on this page, since we'll remove it from the pagecache.
* Otherwise truncate wont wait on the page, allowing the disk
* blocks to be reused by someone else before we actually wrote our
* data to them. fs corruption ensues.
*/
wait_on_page_writeback(page);
/*
* At least for ext2 with nobh option, we need to wait on
* writeback completing on this page, since we'll remove it
* from the pagecache. Otherwise truncate wont wait on the
* page, allowing the disk blocks to be reused by someone else
* before we actually wrote our data to them. fs corruption
* ensues.
*/
wait_on_page_writeback(page);

if (PagePrivate(page))
try_to_release_page(page, mapping_gfp_mask(mapping));
if (PagePrivate(page))
try_to_release_page(page, mapping_gfp_mask(mapping));

if (!remove_mapping(mapping, page)) {
unlock_page(page);
return 1;
/*
* If we succeeded in removing the mapping, set LRU flag
* and return good.
*/
if (remove_mapping(mapping, page)) {
buf->flags |= PIPE_BUF_FLAG_LRU;
return 0;
}
}

buf->flags |= PIPE_BUF_FLAG_LRU;
return 0;
/*
* Raced with truncate or failed to remove page from current
* address space, unlock and return failure.
*/
unlock_page(page);
return 1;
}

static void page_cache_pipe_buf_release(struct pipe_inode_info *pipe,
Expand Down

0 comments on commit 3617769

Please sign in to comment.