Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / fs / splice.c
index 4eed2f6..8fef667 100644 (file)
@@ -55,43 +55,31 @@ 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;
+       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,
@@ -607,7 +595,7 @@ find_page:
                        ret = -ENOMEM;
                        page = page_cache_alloc_cold(mapping);
                        if (unlikely(!page))
-                               goto out_ret;
+                               goto out_nomem;
 
                        /*
                         * This will also lock the page
@@ -666,7 +654,7 @@ find_page:
                if (sd->pos + this_len > isize)
                        vmtruncate(mapping->host, isize);
 
-               goto out_ret;
+               goto out;
        }
 
        if (buf->page != page) {
@@ -698,7 +686,7 @@ find_page:
 out:
        page_cache_release(page);
        unlock_page(page);
-out_ret:
+out_nomem:
        return ret;
 }
 
@@ -1401,11 +1389,11 @@ static int link_pipe(struct pipe_inode_info *ipipe,
         * 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 {