struct pipe_buffer *buf)
{
struct page *page = buf->page;
- struct address_space *mapping;
+ struct address_space *mapping = page_mapping(page);
lock_page(page);
- mapping = page_mapping(page);
- if (mapping) {
- WARN_ON(!PageUptodate(page));
+ 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 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;
- }
+ if (!remove_mapping(mapping, page)) {
+ unlock_page(page);
+ return 1;
}
- /*
- * Raced with truncate or failed to remove page from current
- * address space, unlock and return failure.
- */
- unlock_page(page);
- return 1;
+ buf->flags |= PIPE_BUF_FLAG_LRU;
+ return 0;
}
static void page_cache_pipe_buf_release(struct pipe_inode_info *pipe,
ret = -ENOMEM;
page = page_cache_alloc_cold(mapping);
if (unlikely(!page))
- goto out_ret;
+ goto out_nomem;
/*
* This will also lock the page
if (sd->pos + this_len > isize)
vmtruncate(mapping->host, isize);
- goto out_ret;
+ goto out;
}
if (buf->page != page) {
out:
page_cache_release(page);
unlock_page(page);
-out_ret:
+out_nomem:
return ret;
}
* could deadlock (one doing tee from A -> B, the other from B -> A).
*/
if (ipipe->inode < opipe->inode) {
- mutex_lock_nested(&ipipe->inode->i_mutex, I_MUTEX_PARENT);
- mutex_lock_nested(&opipe->inode->i_mutex, I_MUTEX_CHILD);
+ mutex_lock(&ipipe->inode->i_mutex);
+ mutex_lock(&opipe->inode->i_mutex);
} else {
- mutex_lock_nested(&opipe->inode->i_mutex, I_MUTEX_PARENT);
- mutex_lock_nested(&ipipe->inode->i_mutex, I_MUTEX_CHILD);
+ mutex_lock(&opipe->inode->i_mutex);
+ mutex_lock(&ipipe->inode->i_mutex);
}
do {