Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 129002
b: refs/heads/master
c: 5f2cc08
h: refs/heads/master
v: v3
  • Loading branch information
Chris Mason committed Nov 7, 2008
1 parent fde1dbf commit 2c82bcf
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 42e70e7a2f9d96fd843723fa46d5121cb3e551d0
refs/heads/master: 5f2cc086ccab27ac5252b3883ac004347860b4c7
30 changes: 29 additions & 1 deletion trunk/fs/btrfs/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <linux/sched.h>
#include <linux/writeback.h>
#include <linux/pagemap.h>
#include <linux/blkdev.h>
#include "ctree.h"
#include "disk-io.h"
#include "transaction.h"
Expand Down Expand Up @@ -331,6 +332,7 @@ int btrfs_write_and_wait_marked_extents(struct btrfs_root *root,
int werr = 0;
struct page *page;
struct inode *btree_inode = root->fs_info->btree_inode;
struct extent_io_tree *io_tree = &BTRFS_I(btree_inode)->io_tree;
u64 start = 0;
u64 end;
unsigned long index;
Expand Down Expand Up @@ -371,6 +373,11 @@ int btrfs_write_and_wait_marked_extents(struct btrfs_root *root,
page_cache_release(page);
}
}
/*
* we unplug once and then use the wait_on_extent_bit for
* everything else
*/
blk_run_address_space(btree_inode->i_mapping);
while(1) {
ret = find_first_extent_bit(dirty_pages, 0, &start, &end,
EXTENT_DIRTY);
Expand All @@ -391,7 +398,28 @@ int btrfs_write_and_wait_marked_extents(struct btrfs_root *root,
if (err)
werr = err;
}
wait_on_page_writeback(page);
if (PageWriteback(page)) {
/*
* we don't wait on the page writeback bit
* because that triggers a lot of unplugs.
* The extent bits are much nicer to
* the disks, but come with a slightly
* higher latency because we aren't forcing
* unplugs.
*/
wait_on_extent_writeback(io_tree,
page_offset(page),
page_offset(page) +
PAGE_CACHE_SIZE - 1);
}
if (PageWriteback(page)) {
/*
* the state bits get cleared before the
* page bits, lets add some extra
* paranoia here
*/
wait_on_page_writeback(page);
}
page_cache_release(page);
cond_resched();
}
Expand Down
3 changes: 2 additions & 1 deletion trunk/fs/btrfs/volumes.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,8 @@ static int noinline run_scheduled_bios(struct btrfs_device *device)
* is now congested. Back off and let other work structs
* run instead
*/
if (pending && bdi_write_congested(bdi)) {
if (pending && bdi_write_congested(bdi) &&
fs_info->fs_devices->open_devices > 1) {
struct bio *old_head;

spin_lock(&device->io_lock);
Expand Down

0 comments on commit 2c82bcf

Please sign in to comment.