splice: move balance_dirty_pages_ratelimited() outside of splice actor
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>
This commit is contained in:
@@ -652,7 +652,6 @@ find_page:
|
|||||||
* accessed, we are now done!
|
* accessed, we are now done!
|
||||||
*/
|
*/
|
||||||
mark_page_accessed(page);
|
mark_page_accessed(page);
|
||||||
balance_dirty_pages_ratelimited(mapping);
|
|
||||||
out:
|
out:
|
||||||
page_cache_release(page);
|
page_cache_release(page);
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
@@ -823,6 +822,7 @@ generic_file_splice_write_nolock(struct pipe_inode_info *pipe, struct file *out,
|
|||||||
if (err)
|
if (err)
|
||||||
ret = err;
|
ret = err;
|
||||||
}
|
}
|
||||||
|
balance_dirty_pages_ratelimited(mapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -876,6 +876,7 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
|
|||||||
if (err)
|
if (err)
|
||||||
ret = err;
|
ret = err;
|
||||||
}
|
}
|
||||||
|
balance_dirty_pages_ratelimited(mapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user