splice: move balance_dirty_pages_ratelimited() outside of splice actor
authorJens Axboe <jens.axboe@oracle.com>
Tue, 5 Jun 2007 09:05:11 +0000 (11:05 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Fri, 8 Jun 2007 06:33:59 +0000 (08:33 +0200)
I've seen inode related deadlocks, so move this call outside of the
actor itself, which may hold the inode lock.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
fs/splice.c

index b78a7f057be150d63906fe7fd875104206de548f..6349d3189e3f8b02b04331e6c0dea6af1ace70aa 100644 (file)
@@ -652,7 +652,6 @@ find_page:
         * accessed, we are now done!
         */
        mark_page_accessed(page);
-       balance_dirty_pages_ratelimited(mapping);
 out:
        page_cache_release(page);
        unlock_page(page);
@@ -823,6 +822,7 @@ generic_file_splice_write_nolock(struct pipe_inode_info *pipe, struct file *out,
                        if (err)
                                ret = err;
                }
+               balance_dirty_pages_ratelimited(mapping);
        }
 
        return ret;
@@ -876,6 +876,7 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
                        if (err)
                                ret = err;
                }
+               balance_dirty_pages_ratelimited(mapping);
        }
 
        return ret;