Commit 38d715f4 authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba

btrfs: use btrfs_start_delalloc_roots in shrink_delalloc

The original iteration of flushing had us flushing delalloc and then
checking to see if we could make our reservation, thus we were very
careful about how many pages we would flush at once.

But now that everything is async and we satisfy tickets as the space
becomes available we don't have to keep track of any of this, simply
try and flush the number of dirty inodes we may have in order to
reclaim space to make our reservation.  This cleans up our delalloc
flushing significantly.

The async_pages stuff is dropped because btrfs_start_delalloc_roots()
handles the case that we generate async extents for us, so we no longer
require this extra logic.
Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
Tested-by: default avatarNikolay Borisov <nborisov@suse.com>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 39753e4a
...@@ -476,28 +476,6 @@ void btrfs_dump_space_info(struct btrfs_fs_info *fs_info, ...@@ -476,28 +476,6 @@ void btrfs_dump_space_info(struct btrfs_fs_info *fs_info,
up_read(&info->groups_sem); up_read(&info->groups_sem);
} }
static void btrfs_writeback_inodes_sb_nr(struct btrfs_fs_info *fs_info,
unsigned long nr_pages, u64 nr_items)
{
struct super_block *sb = fs_info->sb;
if (down_read_trylock(&sb->s_umount)) {
writeback_inodes_sb_nr(sb, nr_pages, WB_REASON_FS_FREE_SPACE);
up_read(&sb->s_umount);
} else {
/*
* We needn't worry the filesystem going from r/w to r/o though
* we don't acquire ->s_umount mutex, because the filesystem
* should guarantee the delalloc inodes list be empty after
* the filesystem is readonly(all dirty pages are written to
* the disk).
*/
btrfs_start_delalloc_roots(fs_info, nr_items);
if (!current->journal_info)
btrfs_wait_ordered_roots(fs_info, nr_items, 0, (u64)-1);
}
}
static inline u64 calc_reclaim_items_nr(struct btrfs_fs_info *fs_info, static inline u64 calc_reclaim_items_nr(struct btrfs_fs_info *fs_info,
u64 to_reclaim) u64 to_reclaim)
{ {
...@@ -523,10 +501,8 @@ static void shrink_delalloc(struct btrfs_fs_info *fs_info, ...@@ -523,10 +501,8 @@ static void shrink_delalloc(struct btrfs_fs_info *fs_info,
struct btrfs_trans_handle *trans; struct btrfs_trans_handle *trans;
u64 delalloc_bytes; u64 delalloc_bytes;
u64 dio_bytes; u64 dio_bytes;
u64 async_pages;
u64 items; u64 items;
long time_left; long time_left;
unsigned long nr_pages;
int loops; int loops;
/* Calc the number of the pages we need flush for space reservation */ /* Calc the number of the pages we need flush for space reservation */
...@@ -567,37 +543,8 @@ static void shrink_delalloc(struct btrfs_fs_info *fs_info, ...@@ -567,37 +543,8 @@ static void shrink_delalloc(struct btrfs_fs_info *fs_info,
loops = 0; loops = 0;
while ((delalloc_bytes || dio_bytes) && loops < 3) { while ((delalloc_bytes || dio_bytes) && loops < 3) {
nr_pages = min(delalloc_bytes, to_reclaim) >> PAGE_SHIFT; btrfs_start_delalloc_roots(fs_info, items);
/*
* Triggers inode writeback for up to nr_pages. This will invoke
* ->writepages callback and trigger delalloc filling
* (btrfs_run_delalloc_range()).
*/
btrfs_writeback_inodes_sb_nr(fs_info, nr_pages, items);
/*
* We need to wait for the compressed pages to start before
* we continue.
*/
async_pages = atomic_read(&fs_info->async_delalloc_pages);
if (!async_pages)
goto skip_async;
/*
* Calculate how many compressed pages we want to be written
* before we continue. I.e if there are more async pages than we
* require wait_event will wait until nr_pages are written.
*/
if (async_pages <= nr_pages)
async_pages = 0;
else
async_pages -= nr_pages;
wait_event(fs_info->async_submit_wait,
atomic_read(&fs_info->async_delalloc_pages) <=
(int)async_pages);
skip_async:
spin_lock(&space_info->lock); spin_lock(&space_info->lock);
if (list_empty(&space_info->tickets) && if (list_empty(&space_info->tickets) &&
list_empty(&space_info->priority_tickets)) { list_empty(&space_info->priority_tickets)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment