diff options
author | Miao Xie <miaox@cn.fujitsu.com> | 2013-12-26 00:07:03 -0500 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-01-28 16:20:07 -0500 |
commit | 0353808cae35bc81c86e3510748a10f6bdff41b8 (patch) | |
tree | 1dc627f499542fad31043724671d941469ceb0c3 /fs/btrfs | |
parent | 4dd466d36a50d9c96cd990e2e0d472fe720a10aa (diff) |
Btrfs: cleanup code of btrfs_balance_delayed_items()
- move the condition check for wait into a function
- use wait_event_interruptible instead of prepare-schedule-finish process
Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/delayed-inode.c | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 10d149c1fde1..6b2013403f46 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
@@ -1349,52 +1349,40 @@ void btrfs_assert_delayed_root_empty(struct btrfs_root *root) | |||
1349 | WARN_ON(btrfs_first_delayed_node(delayed_root)); | 1349 | WARN_ON(btrfs_first_delayed_node(delayed_root)); |
1350 | } | 1350 | } |
1351 | 1351 | ||
1352 | static int refs_newer(struct btrfs_delayed_root *delayed_root, | 1352 | static int could_end_wait(struct btrfs_delayed_root *delayed_root, int seq) |
1353 | int seq, int count) | ||
1354 | { | 1353 | { |
1355 | int val = atomic_read(&delayed_root->items_seq); | 1354 | int val = atomic_read(&delayed_root->items_seq); |
1356 | 1355 | ||
1357 | if (val < seq || val >= seq + count) | 1356 | if (val < seq || val >= seq + BTRFS_DELAYED_BATCH) |
1358 | return 1; | 1357 | return 1; |
1358 | |||
1359 | if (atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND) | ||
1360 | return 1; | ||
1361 | |||
1359 | return 0; | 1362 | return 0; |
1360 | } | 1363 | } |
1361 | 1364 | ||
1362 | void btrfs_balance_delayed_items(struct btrfs_root *root) | 1365 | void btrfs_balance_delayed_items(struct btrfs_root *root) |
1363 | { | 1366 | { |
1364 | struct btrfs_delayed_root *delayed_root; | 1367 | struct btrfs_delayed_root *delayed_root; |
1365 | int seq; | ||
1366 | 1368 | ||
1367 | delayed_root = btrfs_get_delayed_root(root); | 1369 | delayed_root = btrfs_get_delayed_root(root); |
1368 | 1370 | ||
1369 | if (atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND) | 1371 | if (atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND) |
1370 | return; | 1372 | return; |
1371 | 1373 | ||
1372 | seq = atomic_read(&delayed_root->items_seq); | ||
1373 | |||
1374 | if (atomic_read(&delayed_root->items) >= BTRFS_DELAYED_WRITEBACK) { | 1374 | if (atomic_read(&delayed_root->items) >= BTRFS_DELAYED_WRITEBACK) { |
1375 | int seq; | ||
1375 | int ret; | 1376 | int ret; |
1376 | DEFINE_WAIT(__wait); | 1377 | |
1378 | seq = atomic_read(&delayed_root->items_seq); | ||
1377 | 1379 | ||
1378 | ret = btrfs_wq_run_delayed_node(delayed_root, root, 0); | 1380 | ret = btrfs_wq_run_delayed_node(delayed_root, root, 0); |
1379 | if (ret) | 1381 | if (ret) |
1380 | return; | 1382 | return; |
1381 | 1383 | ||
1382 | while (1) { | 1384 | wait_event_interruptible(delayed_root->wait, |
1383 | prepare_to_wait(&delayed_root->wait, &__wait, | 1385 | could_end_wait(delayed_root, seq)); |
1384 | TASK_INTERRUPTIBLE); | ||
1385 | |||
1386 | if (refs_newer(delayed_root, seq, | ||
1387 | BTRFS_DELAYED_BATCH) || | ||
1388 | atomic_read(&delayed_root->items) < | ||
1389 | BTRFS_DELAYED_BACKGROUND) { | ||
1390 | break; | ||
1391 | } | ||
1392 | if (!signal_pending(current)) | ||
1393 | schedule(); | ||
1394 | else | ||
1395 | break; | ||
1396 | } | ||
1397 | finish_wait(&delayed_root->wait, &__wait); | ||
1398 | return; | 1386 | return; |
1399 | } | 1387 | } |
1400 | 1388 | ||