diff options
| author | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-12-22 16:23:35 -0500 |
|---|---|---|
| committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-12-30 13:14:09 -0500 |
| commit | 2a3407607028f7c780f1c20faa4e922bf631d340 (patch) | |
| tree | 77385c73948461f554fcc71e831e1bf81bb5295f /fs/f2fs | |
| parent | 3104af35eb6a2452ccc9912997e7728777100de2 (diff) | |
f2fs: call f2fs_balance_fs only when node was changed
If user tries to update or read data, we don't need to call f2fs_balance_fs
which triggers f2fs_gc, which increases unnecessary long latency.
Reviewed-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
| -rw-r--r-- | fs/f2fs/data.c | 26 | ||||
| -rw-r--r-- | fs/f2fs/file.c | 26 | ||||
| -rw-r--r-- | fs/f2fs/inline.c | 4 |
3 files changed, 35 insertions, 21 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 82ecaa30fd77..958d8261b258 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
| @@ -509,7 +509,6 @@ static void __allocate_data_blocks(struct inode *inode, loff_t offset, | |||
| 509 | u64 end_offset; | 509 | u64 end_offset; |
| 510 | 510 | ||
| 511 | while (len) { | 511 | while (len) { |
| 512 | f2fs_balance_fs(sbi); | ||
| 513 | f2fs_lock_op(sbi); | 512 | f2fs_lock_op(sbi); |
| 514 | 513 | ||
| 515 | /* When reading holes, we need its node page */ | 514 | /* When reading holes, we need its node page */ |
| @@ -542,6 +541,9 @@ static void __allocate_data_blocks(struct inode *inode, loff_t offset, | |||
| 542 | 541 | ||
| 543 | f2fs_put_dnode(&dn); | 542 | f2fs_put_dnode(&dn); |
| 544 | f2fs_unlock_op(sbi); | 543 | f2fs_unlock_op(sbi); |
| 544 | |||
| 545 | if (dn.node_changed) | ||
| 546 | f2fs_balance_fs(sbi); | ||
| 545 | } | 547 | } |
| 546 | return; | 548 | return; |
| 547 | 549 | ||
| @@ -551,6 +553,8 @@ sync_out: | |||
| 551 | f2fs_put_dnode(&dn); | 553 | f2fs_put_dnode(&dn); |
| 552 | out: | 554 | out: |
| 553 | f2fs_unlock_op(sbi); | 555 | f2fs_unlock_op(sbi); |
| 556 | if (dn.node_changed) | ||
| 557 | f2fs_balance_fs(sbi); | ||
| 554 | return; | 558 | return; |
| 555 | } | 559 | } |
| 556 | 560 | ||
| @@ -649,6 +653,8 @@ get_next: | |||
| 649 | 653 | ||
| 650 | if (create) { | 654 | if (create) { |
| 651 | f2fs_unlock_op(sbi); | 655 | f2fs_unlock_op(sbi); |
| 656 | if (dn.node_changed) | ||
| 657 | f2fs_balance_fs(sbi); | ||
| 652 | f2fs_lock_op(sbi); | 658 | f2fs_lock_op(sbi); |
| 653 | } | 659 | } |
| 654 | 660 | ||
| @@ -706,8 +712,11 @@ sync_out: | |||
| 706 | put_out: | 712 | put_out: |
| 707 | f2fs_put_dnode(&dn); | 713 | f2fs_put_dnode(&dn); |
| 708 | unlock_out: | 714 | unlock_out: |
| 709 | if (create) | 715 | if (create) { |
| 710 | f2fs_unlock_op(sbi); | 716 | f2fs_unlock_op(sbi); |
| 717 | if (dn.node_changed) | ||
| 718 | f2fs_balance_fs(sbi); | ||
| 719 | } | ||
| 711 | out: | 720 | out: |
| 712 | trace_f2fs_map_blocks(inode, map, err); | 721 | trace_f2fs_map_blocks(inode, map, err); |
| 713 | return err; | 722 | return err; |
| @@ -1415,8 +1424,6 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping, | |||
| 1415 | 1424 | ||
| 1416 | trace_f2fs_write_begin(inode, pos, len, flags); | 1425 | trace_f2fs_write_begin(inode, pos, len, flags); |
| 1417 | 1426 | ||
| 1418 | f2fs_balance_fs(sbi); | ||
| 1419 | |||
| 1420 | /* | 1427 | /* |
| 1421 | * We should check this at this moment to avoid deadlock on inode page | 1428 | * We should check this at this moment to avoid deadlock on inode page |
| 1422 | * and #0 page. The locking rule for inline_data conversion should be: | 1429 | * and #0 page. The locking rule for inline_data conversion should be: |
| @@ -1466,6 +1473,17 @@ put_next: | |||
| 1466 | f2fs_put_dnode(&dn); | 1473 | f2fs_put_dnode(&dn); |
| 1467 | f2fs_unlock_op(sbi); | 1474 | f2fs_unlock_op(sbi); |
| 1468 | 1475 | ||
| 1476 | if (dn.node_changed && has_not_enough_free_secs(sbi, 0)) { | ||
| 1477 | unlock_page(page); | ||
| 1478 | f2fs_balance_fs(sbi); | ||
| 1479 | lock_page(page); | ||
| 1480 | if (page->mapping != mapping) { | ||
| 1481 | /* The page got truncated from under us */ | ||
| 1482 | f2fs_put_page(page, 1); | ||
| 1483 | goto repeat; | ||
| 1484 | } | ||
| 1485 | } | ||
| 1486 | |||
| 1469 | f2fs_wait_on_page_writeback(page, DATA); | 1487 | f2fs_wait_on_page_writeback(page, DATA); |
| 1470 | 1488 | ||
| 1471 | /* wait for GCed encrypted page writeback */ | 1489 | /* wait for GCed encrypted page writeback */ |
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index f2effe18d3c5..888ce4765779 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
| @@ -40,8 +40,6 @@ static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma, | |||
| 40 | struct dnode_of_data dn; | 40 | struct dnode_of_data dn; |
| 41 | int err; | 41 | int err; |
| 42 | 42 | ||
| 43 | f2fs_balance_fs(sbi); | ||
| 44 | |||
| 45 | sb_start_pagefault(inode->i_sb); | 43 | sb_start_pagefault(inode->i_sb); |
| 46 | 44 | ||
| 47 | f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); | 45 | f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); |
| @@ -57,6 +55,9 @@ static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma, | |||
| 57 | f2fs_put_dnode(&dn); | 55 | f2fs_put_dnode(&dn); |
| 58 | f2fs_unlock_op(sbi); | 56 | f2fs_unlock_op(sbi); |
| 59 | 57 | ||
| 58 | if (dn.node_changed) | ||
| 59 | f2fs_balance_fs(sbi); | ||
| 60 | |||
| 60 | file_update_time(vma->vm_file); | 61 | file_update_time(vma->vm_file); |
| 61 | lock_page(page); | 62 | lock_page(page); |
| 62 | if (unlikely(page->mapping != inode->i_mapping || | 63 | if (unlikely(page->mapping != inode->i_mapping || |
| @@ -233,9 +234,6 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
| 233 | goto out; | 234 | goto out; |
| 234 | } | 235 | } |
| 235 | go_write: | 236 | go_write: |
| 236 | /* guarantee free sections for fsync */ | ||
| 237 | f2fs_balance_fs(sbi); | ||
| 238 | |||
| 239 | /* | 237 | /* |
| 240 | * Both of fdatasync() and fsync() are able to be recovered from | 238 | * Both of fdatasync() and fsync() are able to be recovered from |
| 241 | * sudden-power-off. | 239 | * sudden-power-off. |
| @@ -267,6 +265,8 @@ sync_nodes: | |||
| 267 | if (need_inode_block_update(sbi, ino)) { | 265 | if (need_inode_block_update(sbi, ino)) { |
| 268 | mark_inode_dirty_sync(inode); | 266 | mark_inode_dirty_sync(inode); |
| 269 | f2fs_write_inode(inode, NULL); | 267 | f2fs_write_inode(inode, NULL); |
| 268 | |||
| 269 | f2fs_balance_fs(sbi); | ||
| 270 | goto sync_nodes; | 270 | goto sync_nodes; |
| 271 | } | 271 | } |
| 272 | 272 | ||
| @@ -945,8 +945,6 @@ static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len) | |||
| 945 | if (offset & (F2FS_BLKSIZE - 1) || len & (F2FS_BLKSIZE - 1)) | 945 | if (offset & (F2FS_BLKSIZE - 1) || len & (F2FS_BLKSIZE - 1)) |
| 946 | return -EINVAL; | 946 | return -EINVAL; |
| 947 | 947 | ||
| 948 | f2fs_balance_fs(F2FS_I_SB(inode)); | ||
| 949 | |||
| 950 | ret = f2fs_convert_inline_inode(inode); | 948 | ret = f2fs_convert_inline_inode(inode); |
| 951 | if (ret) | 949 | if (ret) |
| 952 | return ret; | 950 | return ret; |
| @@ -993,8 +991,6 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len, | |||
| 993 | if (ret) | 991 | if (ret) |
| 994 | return ret; | 992 | return ret; |
| 995 | 993 | ||
| 996 | f2fs_balance_fs(sbi); | ||
| 997 | |||
| 998 | ret = f2fs_convert_inline_inode(inode); | 994 | ret = f2fs_convert_inline_inode(inode); |
| 999 | if (ret) | 995 | if (ret) |
| 1000 | return ret; | 996 | return ret; |
| @@ -1104,12 +1100,12 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) | |||
| 1104 | if (offset & (F2FS_BLKSIZE - 1) || len & (F2FS_BLKSIZE - 1)) | 1100 | if (offset & (F2FS_BLKSIZE - 1) || len & (F2FS_BLKSIZE - 1)) |
| 1105 | return -EINVAL; | 1101 | return -EINVAL; |
| 1106 | 1102 | ||
| 1107 | f2fs_balance_fs(sbi); | ||
| 1108 | |||
| 1109 | ret = f2fs_convert_inline_inode(inode); | 1103 | ret = f2fs_convert_inline_inode(inode); |
| 1110 | if (ret) | 1104 | if (ret) |
| 1111 | return ret; | 1105 | return ret; |
| 1112 | 1106 | ||
| 1107 | f2fs_balance_fs(sbi); | ||
| 1108 | |||
| 1113 | ret = truncate_blocks(inode, i_size_read(inode), true); | 1109 | ret = truncate_blocks(inode, i_size_read(inode), true); |
| 1114 | if (ret) | 1110 | if (ret) |
| 1115 | return ret; | 1111 | return ret; |
| @@ -1152,8 +1148,6 @@ static int expand_inode_data(struct inode *inode, loff_t offset, | |||
| 1152 | loff_t off_start, off_end; | 1148 | loff_t off_start, off_end; |
| 1153 | int ret = 0; | 1149 | int ret = 0; |
| 1154 | 1150 | ||
| 1155 | f2fs_balance_fs(sbi); | ||
| 1156 | |||
| 1157 | ret = inode_newsize_ok(inode, (len + offset)); | 1151 | ret = inode_newsize_ok(inode, (len + offset)); |
| 1158 | if (ret) | 1152 | if (ret) |
| 1159 | return ret; | 1153 | return ret; |
| @@ -1162,6 +1156,8 @@ static int expand_inode_data(struct inode *inode, loff_t offset, | |||
| 1162 | if (ret) | 1156 | if (ret) |
| 1163 | return ret; | 1157 | return ret; |
| 1164 | 1158 | ||
| 1159 | f2fs_balance_fs(sbi); | ||
| 1160 | |||
| 1165 | pg_start = ((unsigned long long) offset) >> PAGE_CACHE_SHIFT; | 1161 | pg_start = ((unsigned long long) offset) >> PAGE_CACHE_SHIFT; |
| 1166 | pg_end = ((unsigned long long) offset + len) >> PAGE_CACHE_SHIFT; | 1162 | pg_end = ((unsigned long long) offset + len) >> PAGE_CACHE_SHIFT; |
| 1167 | 1163 | ||
| @@ -1349,8 +1345,6 @@ static int f2fs_ioc_start_atomic_write(struct file *filp) | |||
| 1349 | if (!inode_owner_or_capable(inode)) | 1345 | if (!inode_owner_or_capable(inode)) |
| 1350 | return -EACCES; | 1346 | return -EACCES; |
| 1351 | 1347 | ||
| 1352 | f2fs_balance_fs(F2FS_I_SB(inode)); | ||
| 1353 | |||
| 1354 | if (f2fs_is_atomic_file(inode)) | 1348 | if (f2fs_is_atomic_file(inode)) |
| 1355 | return 0; | 1349 | return 0; |
| 1356 | 1350 | ||
| @@ -1437,8 +1431,6 @@ static int f2fs_ioc_abort_volatile_write(struct file *filp) | |||
| 1437 | if (ret) | 1431 | if (ret) |
| 1438 | return ret; | 1432 | return ret; |
| 1439 | 1433 | ||
| 1440 | f2fs_balance_fs(F2FS_I_SB(inode)); | ||
| 1441 | |||
| 1442 | clear_inode_flag(F2FS_I(inode), FI_ATOMIC_FILE); | 1434 | clear_inode_flag(F2FS_I(inode), FI_ATOMIC_FILE); |
| 1443 | clear_inode_flag(F2FS_I(inode), FI_VOLATILE_FILE); | 1435 | clear_inode_flag(F2FS_I(inode), FI_VOLATILE_FILE); |
| 1444 | commit_inmem_pages(inode, true); | 1436 | commit_inmem_pages(inode, true); |
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 8090854dd29c..c24e5d93720d 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c | |||
| @@ -202,6 +202,10 @@ out: | |||
| 202 | f2fs_unlock_op(sbi); | 202 | f2fs_unlock_op(sbi); |
| 203 | 203 | ||
| 204 | f2fs_put_page(page, 1); | 204 | f2fs_put_page(page, 1); |
| 205 | |||
| 206 | if (dn.node_changed) | ||
| 207 | f2fs_balance_fs(sbi); | ||
| 208 | |||
| 205 | return err; | 209 | return err; |
| 206 | } | 210 | } |
| 207 | 211 | ||
