msm-4.14/fs/f2fs/node.c

2869 lines
68 KiB
C
Raw Normal View History

/*
* fs/f2fs/node.c
*
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
* http://www.samsung.com/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/fs.h>
#include <linux/f2fs_fs.h>
#include <linux/mpage.h>
#include <linux/backing-dev.h>
#include <linux/blkdev.h>
#include <linux/pagevec.h>
#include <linux/swap.h>
#include "f2fs.h"
#include "node.h"
#include "segment.h"
#include "xattr.h"
#include "trace.h"
#include <trace/events/f2fs.h>
#define on_build_free_nids(nmi) mutex_is_locked(&(nm_i)->build_lock)
static struct kmem_cache *nat_entry_slab;
static struct kmem_cache *free_nid_slab;
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
static struct kmem_cache *nat_entry_set_slab;
bool available_free_memory(struct f2fs_sb_info *sbi, int type)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct sysinfo val;
unsigned long avail_ram;
unsigned long mem_size = 0;
bool res = false;
si_meminfo(&val);
/* only uses low memory */
avail_ram = val.totalram - val.totalhigh;
/*
* give 25%, 25%, 50%, 50%, 50% memory for each components respectively
*/
if (type == FREE_NIDS) {
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
mem_size = (nm_i->nid_cnt[FREE_NID] *
sizeof(struct free_nid)) >> PAGE_SHIFT;
res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 2);
} else if (type == NAT_ENTRIES) {
mem_size = (nm_i->nat_cnt * sizeof(struct nat_entry)) >>
mm, fs: get rid of PAGE_CACHE_* and page_cache_{get,release} macros PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} macros were introduced *long* time ago with promise that one day it will be possible to implement page cache with bigger chunks than PAGE_SIZE. This promise never materialized. And unlikely will. We have many places where PAGE_CACHE_SIZE assumed to be equal to PAGE_SIZE. And it's constant source of confusion on whether PAGE_CACHE_* or PAGE_* constant should be used in a particular case, especially on the border between fs and mm. Global switching to PAGE_CACHE_SIZE != PAGE_SIZE would cause to much breakage to be doable. Let's stop pretending that pages in page cache are special. They are not. The changes are pretty straight-forward: - <foo> << (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>; - <foo> >> (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>; - PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} -> PAGE_{SIZE,SHIFT,MASK,ALIGN}; - page_cache_get() -> get_page(); - page_cache_release() -> put_page(); This patch contains automated changes generated with coccinelle using script below. For some reason, coccinelle doesn't patch header files. I've called spatch for them manually. The only adjustment after coccinelle is revert of changes to PAGE_CAHCE_ALIGN definition: we are going to drop it later. There are few places in the code where coccinelle didn't reach. I'll fix them manually in a separate patch. Comments and documentation also will be addressed with the separate patch. virtual patch @@ expression E; @@ - E << (PAGE_CACHE_SHIFT - PAGE_SHIFT) + E @@ expression E; @@ - E >> (PAGE_CACHE_SHIFT - PAGE_SHIFT) + E @@ @@ - PAGE_CACHE_SHIFT + PAGE_SHIFT @@ @@ - PAGE_CACHE_SIZE + PAGE_SIZE @@ @@ - PAGE_CACHE_MASK + PAGE_MASK @@ expression E; @@ - PAGE_CACHE_ALIGN(E) + PAGE_ALIGN(E) @@ expression E; @@ - page_cache_get(E) + get_page(E) @@ expression E; @@ - page_cache_release(E) + put_page(E) Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Acked-by: Michal Hocko <mhocko@suse.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-04-01 15:29:47 +03:00
PAGE_SHIFT;
res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 2);
if (excess_cached_nats(sbi))
res = false;
} else if (type == DIRTY_DENTS) {
if (sbi->sb->s_bdi->wb.dirty_exceeded)
return false;
mem_size = get_pages(sbi, F2FS_DIRTY_DENTS);
res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 1);
} else if (type == INO_ENTRIES) {
int i;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
for (i = 0; i < MAX_INO_ENTRY; i++)
mem_size += sbi->im[i].ino_num *
sizeof(struct ino_entry);
mem_size >>= PAGE_SHIFT;
res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 1);
} else if (type == EXTENT_CACHE) {
mem_size = (atomic_read(&sbi->total_ext_tree) *
sizeof(struct extent_tree) +
atomic_read(&sbi->total_ext_node) *
mm, fs: get rid of PAGE_CACHE_* and page_cache_{get,release} macros PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} macros were introduced *long* time ago with promise that one day it will be possible to implement page cache with bigger chunks than PAGE_SIZE. This promise never materialized. And unlikely will. We have many places where PAGE_CACHE_SIZE assumed to be equal to PAGE_SIZE. And it's constant source of confusion on whether PAGE_CACHE_* or PAGE_* constant should be used in a particular case, especially on the border between fs and mm. Global switching to PAGE_CACHE_SIZE != PAGE_SIZE would cause to much breakage to be doable. Let's stop pretending that pages in page cache are special. They are not. The changes are pretty straight-forward: - <foo> << (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>; - <foo> >> (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>; - PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} -> PAGE_{SIZE,SHIFT,MASK,ALIGN}; - page_cache_get() -> get_page(); - page_cache_release() -> put_page(); This patch contains automated changes generated with coccinelle using script below. For some reason, coccinelle doesn't patch header files. I've called spatch for them manually. The only adjustment after coccinelle is revert of changes to PAGE_CAHCE_ALIGN definition: we are going to drop it later. There are few places in the code where coccinelle didn't reach. I'll fix them manually in a separate patch. Comments and documentation also will be addressed with the separate patch. virtual patch @@ expression E; @@ - E << (PAGE_CACHE_SHIFT - PAGE_SHIFT) + E @@ expression E; @@ - E >> (PAGE_CACHE_SHIFT - PAGE_SHIFT) + E @@ @@ - PAGE_CACHE_SHIFT + PAGE_SHIFT @@ @@ - PAGE_CACHE_SIZE + PAGE_SIZE @@ @@ - PAGE_CACHE_MASK + PAGE_MASK @@ expression E; @@ - PAGE_CACHE_ALIGN(E) + PAGE_ALIGN(E) @@ expression E; @@ - page_cache_get(E) + get_page(E) @@ expression E; @@ - page_cache_release(E) + put_page(E) Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Acked-by: Michal Hocko <mhocko@suse.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-04-01 15:29:47 +03:00
sizeof(struct extent_node)) >> PAGE_SHIFT;
res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 1);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
} else if (type == INMEM_PAGES) {
/* it allows 20% / total_ram for inmemory pages */
mem_size = get_pages(sbi, F2FS_INMEM_PAGES);
res = mem_size < (val.totalram / 5);
} else {
if (!sbi->sb->s_bdi->wb.dirty_exceeded)
return true;
}
return res;
}
static void clear_node_page_dirty(struct page *page)
{
struct address_space *mapping = page->mapping;
unsigned int long flags;
if (PageDirty(page)) {
spin_lock_irqsave(&mapping->tree_lock, flags);
radix_tree_tag_clear(&mapping->page_tree,
page_index(page),
PAGECACHE_TAG_DIRTY);
spin_unlock_irqrestore(&mapping->tree_lock, flags);
clear_page_dirty_for_io(page);
dec_page_count(F2FS_M_SB(mapping), F2FS_DIRTY_NODES);
}
ClearPageUptodate(page);
}
static struct page *get_current_nat_page(struct f2fs_sb_info *sbi, nid_t nid)
{
pgoff_t index = current_nat_addr(sbi, nid);
return get_meta_page(sbi, index);
}
static struct page *get_next_nat_page(struct f2fs_sb_info *sbi, nid_t nid)
{
struct page *src_page;
struct page *dst_page;
pgoff_t src_off;
pgoff_t dst_off;
void *src_addr;
void *dst_addr;
struct f2fs_nm_info *nm_i = NM_I(sbi);
src_off = current_nat_addr(sbi, nid);
dst_off = next_nat_addr(sbi, src_off);
/* get current nat block page with lock */
src_page = get_meta_page(sbi, src_off);
dst_page = grab_meta_page(sbi, dst_off);
f2fs_bug_on(sbi, PageDirty(src_page));
src_addr = page_address(src_page);
dst_addr = page_address(dst_page);
mm, fs: get rid of PAGE_CACHE_* and page_cache_{get,release} macros PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} macros were introduced *long* time ago with promise that one day it will be possible to implement page cache with bigger chunks than PAGE_SIZE. This promise never materialized. And unlikely will. We have many places where PAGE_CACHE_SIZE assumed to be equal to PAGE_SIZE. And it's constant source of confusion on whether PAGE_CACHE_* or PAGE_* constant should be used in a particular case, especially on the border between fs and mm. Global switching to PAGE_CACHE_SIZE != PAGE_SIZE would cause to much breakage to be doable. Let's stop pretending that pages in page cache are special. They are not. The changes are pretty straight-forward: - <foo> << (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>; - <foo> >> (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>; - PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} -> PAGE_{SIZE,SHIFT,MASK,ALIGN}; - page_cache_get() -> get_page(); - page_cache_release() -> put_page(); This patch contains automated changes generated with coccinelle using script below. For some reason, coccinelle doesn't patch header files. I've called spatch for them manually. The only adjustment after coccinelle is revert of changes to PAGE_CAHCE_ALIGN definition: we are going to drop it later. There are few places in the code where coccinelle didn't reach. I'll fix them manually in a separate patch. Comments and documentation also will be addressed with the separate patch. virtual patch @@ expression E; @@ - E << (PAGE_CACHE_SHIFT - PAGE_SHIFT) + E @@ expression E; @@ - E >> (PAGE_CACHE_SHIFT - PAGE_SHIFT) + E @@ @@ - PAGE_CACHE_SHIFT + PAGE_SHIFT @@ @@ - PAGE_CACHE_SIZE + PAGE_SIZE @@ @@ - PAGE_CACHE_MASK + PAGE_MASK @@ expression E; @@ - PAGE_CACHE_ALIGN(E) + PAGE_ALIGN(E) @@ expression E; @@ - page_cache_get(E) + get_page(E) @@ expression E; @@ - page_cache_release(E) + put_page(E) Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Acked-by: Michal Hocko <mhocko@suse.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-04-01 15:29:47 +03:00
memcpy(dst_addr, src_addr, PAGE_SIZE);
set_page_dirty(dst_page);
f2fs_put_page(src_page, 1);
set_to_next_nat(nm_i, nid);
return dst_page;
}
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
static struct nat_entry *__alloc_nat_entry(nid_t nid, bool no_fail)
{
struct nat_entry *new;
if (no_fail)
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
new = f2fs_kmem_cache_alloc(nat_entry_slab, GFP_F2FS_ZERO);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
else
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
new = kmem_cache_alloc(nat_entry_slab, GFP_F2FS_ZERO);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (new) {
nat_set_nid(new, nid);
nat_reset_flag(new);
}
return new;
}
static void __free_nat_entry(struct nat_entry *e)
{
kmem_cache_free(nat_entry_slab, e);
}
/* must be locked by nat_tree_lock */
static struct nat_entry *__init_nat_entry(struct f2fs_nm_info *nm_i,
struct nat_entry *ne, struct f2fs_nat_entry *raw_ne, bool no_fail)
{
if (no_fail)
f2fs_radix_tree_insert(&nm_i->nat_root, nat_get_nid(ne), ne);
else if (radix_tree_insert(&nm_i->nat_root, nat_get_nid(ne), ne))
return NULL;
if (raw_ne)
node_info_from_raw_nat(&ne->ni, raw_ne);
list_add_tail(&ne->list, &nm_i->nat_entries);
nm_i->nat_cnt++;
return ne;
}
static struct nat_entry *__lookup_nat_cache(struct f2fs_nm_info *nm_i, nid_t n)
{
return radix_tree_lookup(&nm_i->nat_root, n);
}
static unsigned int __gang_lookup_nat_cache(struct f2fs_nm_info *nm_i,
nid_t start, unsigned int nr, struct nat_entry **ep)
{
return radix_tree_gang_lookup(&nm_i->nat_root, (void **)ep, start, nr);
}
static void __del_from_nat_cache(struct f2fs_nm_info *nm_i, struct nat_entry *e)
{
list_del(&e->list);
radix_tree_delete(&nm_i->nat_root, nat_get_nid(e));
nm_i->nat_cnt--;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
__free_nat_entry(e);
}
static void __set_nat_cache_dirty(struct f2fs_nm_info *nm_i,
struct nat_entry *ne)
{
nid_t set = NAT_BLOCK_OFFSET(ne->ni.nid);
struct nat_entry_set *head;
head = radix_tree_lookup(&nm_i->nat_set_root, set);
if (!head) {
head = f2fs_kmem_cache_alloc(nat_entry_set_slab, GFP_NOFS);
INIT_LIST_HEAD(&head->entry_list);
INIT_LIST_HEAD(&head->set_list);
head->set = set;
head->entry_cnt = 0;
f2fs_radix_tree_insert(&nm_i->nat_set_root, set, head);
}
if (get_nat_flag(ne, IS_DIRTY))
goto refresh_list;
nm_i->dirty_nat_cnt++;
head->entry_cnt++;
set_nat_flag(ne, IS_DIRTY, true);
refresh_list:
if (nat_get_blkaddr(ne) == NEW_ADDR)
list_del_init(&ne->list);
else
list_move_tail(&ne->list, &head->entry_list);
}
static void __clear_nat_cache_dirty(struct f2fs_nm_info *nm_i,
struct nat_entry_set *set, struct nat_entry *ne)
{
list_move_tail(&ne->list, &nm_i->nat_entries);
set_nat_flag(ne, IS_DIRTY, false);
set->entry_cnt--;
nm_i->dirty_nat_cnt--;
}
static unsigned int __gang_lookup_nat_set(struct f2fs_nm_info *nm_i,
nid_t start, unsigned int nr, struct nat_entry_set **ep)
{
return radix_tree_gang_lookup(&nm_i->nat_set_root, (void **)ep,
start, nr);
}
int need_dentry_mark(struct f2fs_sb_info *sbi, nid_t nid)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct nat_entry *e;
bool need = false;
down_read(&nm_i->nat_tree_lock);
e = __lookup_nat_cache(nm_i, nid);
if (e) {
if (!get_nat_flag(e, IS_CHECKPOINTED) &&
!get_nat_flag(e, HAS_FSYNCED_INODE))
need = true;
}
up_read(&nm_i->nat_tree_lock);
return need;
}
bool is_checkpointed_node(struct f2fs_sb_info *sbi, nid_t nid)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct nat_entry *e;
bool is_cp = true;
down_read(&nm_i->nat_tree_lock);
e = __lookup_nat_cache(nm_i, nid);
if (e && !get_nat_flag(e, IS_CHECKPOINTED))
is_cp = false;
up_read(&nm_i->nat_tree_lock);
return is_cp;
}
f2fs: fix conditions to remain recovery information in f2fs_sync_file This patch revisited whole the recovery information during the f2fs_sync_file. In this patch, there are three information to make a decision. a) IS_CHECKPOINTED, /* is it checkpointed before? */ b) HAS_FSYNCED_INODE, /* is the inode fsynced before? */ c) HAS_LAST_FSYNC, /* has the latest node fsync mark? */ And, the scenarios for our rule are based on: [Term] F: fsync_mark, D: dentry_mark 1. inode(x) | CP | inode(x) | dnode(F) 2. inode(x) | CP | inode(F) | dnode(F) 3. inode(x) | CP | dnode(F) | inode(x) | inode(F) 4. inode(x) | CP | dnode(F) | inode(F) 5. CP | inode(x) | dnode(F) | inode(DF) 6. CP | inode(DF) | dnode(F) 7. CP | dnode(F) | inode(DF) 8. CP | dnode(F) | inode(x) | inode(DF) For example, #3, the three conditions should be changed as follows. inode(x) | CP | dnode(F) | inode(x) | inode(F) a) x o o o o b) x x x x o c) x o o x o If f2fs_sync_file stops ------^, it should write inode(F) --------------^ So, the need_inode_block_update should return true, since c) get_nat_flag(e, HAS_LAST_FSYNC), is false. For example, #8, CP | alloc | dnode(F) | inode(x) | inode(DF) a) o x x x x b) x x x o c) o o x o If f2fs_sync_file stops -------^, it should write inode(DF) --------------^ Note that, the roll-forward policy should follow this rule, which means, if there are any missing blocks, we doesn't need to recover that inode. Signed-off-by: Huang Ying <ying.huang@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-09-15 14:50:48 -07:00
bool need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct nat_entry *e;
f2fs: fix conditions to remain recovery information in f2fs_sync_file This patch revisited whole the recovery information during the f2fs_sync_file. In this patch, there are three information to make a decision. a) IS_CHECKPOINTED, /* is it checkpointed before? */ b) HAS_FSYNCED_INODE, /* is the inode fsynced before? */ c) HAS_LAST_FSYNC, /* has the latest node fsync mark? */ And, the scenarios for our rule are based on: [Term] F: fsync_mark, D: dentry_mark 1. inode(x) | CP | inode(x) | dnode(F) 2. inode(x) | CP | inode(F) | dnode(F) 3. inode(x) | CP | dnode(F) | inode(x) | inode(F) 4. inode(x) | CP | dnode(F) | inode(F) 5. CP | inode(x) | dnode(F) | inode(DF) 6. CP | inode(DF) | dnode(F) 7. CP | dnode(F) | inode(DF) 8. CP | dnode(F) | inode(x) | inode(DF) For example, #3, the three conditions should be changed as follows. inode(x) | CP | dnode(F) | inode(x) | inode(F) a) x o o o o b) x x x x o c) x o o x o If f2fs_sync_file stops ------^, it should write inode(F) --------------^ So, the need_inode_block_update should return true, since c) get_nat_flag(e, HAS_LAST_FSYNC), is false. For example, #8, CP | alloc | dnode(F) | inode(x) | inode(DF) a) o x x x x b) x x x o c) o o x o If f2fs_sync_file stops -------^, it should write inode(DF) --------------^ Note that, the roll-forward policy should follow this rule, which means, if there are any missing blocks, we doesn't need to recover that inode. Signed-off-by: Huang Ying <ying.huang@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-09-15 14:50:48 -07:00
bool need_update = true;
down_read(&nm_i->nat_tree_lock);
f2fs: fix conditions to remain recovery information in f2fs_sync_file This patch revisited whole the recovery information during the f2fs_sync_file. In this patch, there are three information to make a decision. a) IS_CHECKPOINTED, /* is it checkpointed before? */ b) HAS_FSYNCED_INODE, /* is the inode fsynced before? */ c) HAS_LAST_FSYNC, /* has the latest node fsync mark? */ And, the scenarios for our rule are based on: [Term] F: fsync_mark, D: dentry_mark 1. inode(x) | CP | inode(x) | dnode(F) 2. inode(x) | CP | inode(F) | dnode(F) 3. inode(x) | CP | dnode(F) | inode(x) | inode(F) 4. inode(x) | CP | dnode(F) | inode(F) 5. CP | inode(x) | dnode(F) | inode(DF) 6. CP | inode(DF) | dnode(F) 7. CP | dnode(F) | inode(DF) 8. CP | dnode(F) | inode(x) | inode(DF) For example, #3, the three conditions should be changed as follows. inode(x) | CP | dnode(F) | inode(x) | inode(F) a) x o o o o b) x x x x o c) x o o x o If f2fs_sync_file stops ------^, it should write inode(F) --------------^ So, the need_inode_block_update should return true, since c) get_nat_flag(e, HAS_LAST_FSYNC), is false. For example, #8, CP | alloc | dnode(F) | inode(x) | inode(DF) a) o x x x x b) x x x o c) o o x o If f2fs_sync_file stops -------^, it should write inode(DF) --------------^ Note that, the roll-forward policy should follow this rule, which means, if there are any missing blocks, we doesn't need to recover that inode. Signed-off-by: Huang Ying <ying.huang@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-09-15 14:50:48 -07:00
e = __lookup_nat_cache(nm_i, ino);
if (e && get_nat_flag(e, HAS_LAST_FSYNC) &&
(get_nat_flag(e, IS_CHECKPOINTED) ||
get_nat_flag(e, HAS_FSYNCED_INODE)))
need_update = false;
up_read(&nm_i->nat_tree_lock);
f2fs: fix conditions to remain recovery information in f2fs_sync_file This patch revisited whole the recovery information during the f2fs_sync_file. In this patch, there are three information to make a decision. a) IS_CHECKPOINTED, /* is it checkpointed before? */ b) HAS_FSYNCED_INODE, /* is the inode fsynced before? */ c) HAS_LAST_FSYNC, /* has the latest node fsync mark? */ And, the scenarios for our rule are based on: [Term] F: fsync_mark, D: dentry_mark 1. inode(x) | CP | inode(x) | dnode(F) 2. inode(x) | CP | inode(F) | dnode(F) 3. inode(x) | CP | dnode(F) | inode(x) | inode(F) 4. inode(x) | CP | dnode(F) | inode(F) 5. CP | inode(x) | dnode(F) | inode(DF) 6. CP | inode(DF) | dnode(F) 7. CP | dnode(F) | inode(DF) 8. CP | dnode(F) | inode(x) | inode(DF) For example, #3, the three conditions should be changed as follows. inode(x) | CP | dnode(F) | inode(x) | inode(F) a) x o o o o b) x x x x o c) x o o x o If f2fs_sync_file stops ------^, it should write inode(F) --------------^ So, the need_inode_block_update should return true, since c) get_nat_flag(e, HAS_LAST_FSYNC), is false. For example, #8, CP | alloc | dnode(F) | inode(x) | inode(DF) a) o x x x x b) x x x o c) o o x o If f2fs_sync_file stops -------^, it should write inode(DF) --------------^ Note that, the roll-forward policy should follow this rule, which means, if there are any missing blocks, we doesn't need to recover that inode. Signed-off-by: Huang Ying <ying.huang@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-09-15 14:50:48 -07:00
return need_update;
}
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
/* must be locked by nat_tree_lock */
static void cache_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,
struct f2fs_nat_entry *ne)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
struct nat_entry *new, *e;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
new = __alloc_nat_entry(nid, false);
if (!new)
return;
down_write(&nm_i->nat_tree_lock);
e = __lookup_nat_cache(nm_i, nid);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (!e)
e = __init_nat_entry(nm_i, new, ne, false);
else
f2fs_bug_on(sbi, nat_get_ino(e) != le32_to_cpu(ne->ino) ||
nat_get_blkaddr(e) !=
le32_to_cpu(ne->block_addr) ||
nat_get_version(e) != ne->version);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
up_write(&nm_i->nat_tree_lock);
if (e != new)
__free_nat_entry(new);
}
static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
block_t new_blkaddr, bool fsync_done)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct nat_entry *e;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
struct nat_entry *new = __alloc_nat_entry(ni->nid, true);
down_write(&nm_i->nat_tree_lock);
e = __lookup_nat_cache(nm_i, ni->nid);
if (!e) {
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
e = __init_nat_entry(nm_i, new, NULL, true);
copy_node_info(&e->ni, ni);
f2fs_bug_on(sbi, ni->blk_addr == NEW_ADDR);
} else if (new_blkaddr == NEW_ADDR) {
/*
* when nid is reallocated,
* previous nat entry can be remained in nat cache.
* So, reinitialize it with new information.
*/
copy_node_info(&e->ni, ni);
f2fs_bug_on(sbi, ni->blk_addr != NULL_ADDR);
}
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
/* let's free early to reduce memory consumption */
if (e != new)
__free_nat_entry(new);
/* sanity check */
f2fs_bug_on(sbi, nat_get_blkaddr(e) != ni->blk_addr);
f2fs_bug_on(sbi, nat_get_blkaddr(e) == NULL_ADDR &&
new_blkaddr == NULL_ADDR);
f2fs_bug_on(sbi, nat_get_blkaddr(e) == NEW_ADDR &&
new_blkaddr == NEW_ADDR);
f2fs_bug_on(sbi, nat_get_blkaddr(e) != NEW_ADDR &&
nat_get_blkaddr(e) != NULL_ADDR &&
new_blkaddr == NEW_ADDR);
/* increment version no as node is removed */
if (nat_get_blkaddr(e) != NEW_ADDR && new_blkaddr == NULL_ADDR) {
unsigned char version = nat_get_version(e);
nat_set_version(e, inc_node_version(version));
}
/* change address */
nat_set_blkaddr(e, new_blkaddr);
f2fs: fix conditions to remain recovery information in f2fs_sync_file This patch revisited whole the recovery information during the f2fs_sync_file. In this patch, there are three information to make a decision. a) IS_CHECKPOINTED, /* is it checkpointed before? */ b) HAS_FSYNCED_INODE, /* is the inode fsynced before? */ c) HAS_LAST_FSYNC, /* has the latest node fsync mark? */ And, the scenarios for our rule are based on: [Term] F: fsync_mark, D: dentry_mark 1. inode(x) | CP | inode(x) | dnode(F) 2. inode(x) | CP | inode(F) | dnode(F) 3. inode(x) | CP | dnode(F) | inode(x) | inode(F) 4. inode(x) | CP | dnode(F) | inode(F) 5. CP | inode(x) | dnode(F) | inode(DF) 6. CP | inode(DF) | dnode(F) 7. CP | dnode(F) | inode(DF) 8. CP | dnode(F) | inode(x) | inode(DF) For example, #3, the three conditions should be changed as follows. inode(x) | CP | dnode(F) | inode(x) | inode(F) a) x o o o o b) x x x x o c) x o o x o If f2fs_sync_file stops ------^, it should write inode(F) --------------^ So, the need_inode_block_update should return true, since c) get_nat_flag(e, HAS_LAST_FSYNC), is false. For example, #8, CP | alloc | dnode(F) | inode(x) | inode(DF) a) o x x x x b) x x x o c) o o x o If f2fs_sync_file stops -------^, it should write inode(DF) --------------^ Note that, the roll-forward policy should follow this rule, which means, if there are any missing blocks, we doesn't need to recover that inode. Signed-off-by: Huang Ying <ying.huang@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-09-15 14:50:48 -07:00
if (new_blkaddr == NEW_ADDR || new_blkaddr == NULL_ADDR)
set_nat_flag(e, IS_CHECKPOINTED, false);
__set_nat_cache_dirty(nm_i, e);
/* update fsync_mark if its inode nat entry is still alive */
if (ni->nid != ni->ino)
e = __lookup_nat_cache(nm_i, ni->ino);
f2fs: fix conditions to remain recovery information in f2fs_sync_file This patch revisited whole the recovery information during the f2fs_sync_file. In this patch, there are three information to make a decision. a) IS_CHECKPOINTED, /* is it checkpointed before? */ b) HAS_FSYNCED_INODE, /* is the inode fsynced before? */ c) HAS_LAST_FSYNC, /* has the latest node fsync mark? */ And, the scenarios for our rule are based on: [Term] F: fsync_mark, D: dentry_mark 1. inode(x) | CP | inode(x) | dnode(F) 2. inode(x) | CP | inode(F) | dnode(F) 3. inode(x) | CP | dnode(F) | inode(x) | inode(F) 4. inode(x) | CP | dnode(F) | inode(F) 5. CP | inode(x) | dnode(F) | inode(DF) 6. CP | inode(DF) | dnode(F) 7. CP | dnode(F) | inode(DF) 8. CP | dnode(F) | inode(x) | inode(DF) For example, #3, the three conditions should be changed as follows. inode(x) | CP | dnode(F) | inode(x) | inode(F) a) x o o o o b) x x x x o c) x o o x o If f2fs_sync_file stops ------^, it should write inode(F) --------------^ So, the need_inode_block_update should return true, since c) get_nat_flag(e, HAS_LAST_FSYNC), is false. For example, #8, CP | alloc | dnode(F) | inode(x) | inode(DF) a) o x x x x b) x x x o c) o o x o If f2fs_sync_file stops -------^, it should write inode(DF) --------------^ Note that, the roll-forward policy should follow this rule, which means, if there are any missing blocks, we doesn't need to recover that inode. Signed-off-by: Huang Ying <ying.huang@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-09-15 14:50:48 -07:00
if (e) {
if (fsync_done && ni->nid == ni->ino)
set_nat_flag(e, HAS_FSYNCED_INODE, true);
set_nat_flag(e, HAS_LAST_FSYNC, fsync_done);
}
up_write(&nm_i->nat_tree_lock);
}
int try_to_free_nats(struct f2fs_sb_info *sbi, int nr_shrink)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
int nr = nr_shrink;
if (!down_write_trylock(&nm_i->nat_tree_lock))
return 0;
while (nr_shrink && !list_empty(&nm_i->nat_entries)) {
struct nat_entry *ne;
ne = list_first_entry(&nm_i->nat_entries,
struct nat_entry, list);
__del_from_nat_cache(nm_i, ne);
nr_shrink--;
}
up_write(&nm_i->nat_tree_lock);
return nr - nr_shrink;
}
/*
* This function always returns success
*/
void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
struct f2fs_journal *journal = curseg->journal;
nid_t start_nid = START_NID(nid);
struct f2fs_nat_block *nat_blk;
struct page *page = NULL;
struct f2fs_nat_entry ne;
struct nat_entry *e;
pgoff_t index;
int i;
ni->nid = nid;
/* Check nat cache */
down_read(&nm_i->nat_tree_lock);
e = __lookup_nat_cache(nm_i, nid);
if (e) {
ni->ino = nat_get_ino(e);
ni->blk_addr = nat_get_blkaddr(e);
ni->version = nat_get_version(e);
up_read(&nm_i->nat_tree_lock);
return;
}
memset(&ne, 0, sizeof(struct f2fs_nat_entry));
/* Check current segment summary */
down_read(&curseg->journal_rwsem);
i = lookup_journal_in_cursum(journal, NAT_JOURNAL, nid, 0);
if (i >= 0) {
ne = nat_in_journal(journal, i);
node_info_from_raw_nat(ni, &ne);
}
up_read(&curseg->journal_rwsem);
if (i >= 0) {
up_read(&nm_i->nat_tree_lock);
goto cache;
}
/* Fill node_info from nat page */
index = current_nat_addr(sbi, nid);
up_read(&nm_i->nat_tree_lock);
page = get_meta_page(sbi, index);
nat_blk = (struct f2fs_nat_block *)page_address(page);
ne = nat_blk->entries[nid - start_nid];
node_info_from_raw_nat(ni, &ne);
f2fs_put_page(page, 1);
cache:
/* cache nat entry */
cache_nat_entry(sbi, nid, &ne);
}
/*
* readahead MAX_RA_NODE number of node pages.
*/
static void ra_node_pages(struct page *parent, int start, int n)
{
struct f2fs_sb_info *sbi = F2FS_P_SB(parent);
struct blk_plug plug;
int i, end;
nid_t nid;
blk_start_plug(&plug);
/* Then, try readahead for siblings of the desired node */
end = start + n;
end = min(end, NIDS_PER_BLOCK);
for (i = start; i < end; i++) {
nid = get_nid(parent, i, false);
ra_node_page(sbi, nid);
}
blk_finish_plug(&plug);
}
pgoff_t get_next_page_offset(struct dnode_of_data *dn, pgoff_t pgofs)
{
const long direct_index = ADDRS_PER_INODE(dn->inode);
const long direct_blks = ADDRS_PER_BLOCK;
const long indirect_blks = ADDRS_PER_BLOCK * NIDS_PER_BLOCK;
unsigned int skipped_unit = ADDRS_PER_BLOCK;
int cur_level = dn->cur_level;
int max_level = dn->max_level;
pgoff_t base = 0;
if (!dn->max_level)
return pgofs + 1;
while (max_level-- > cur_level)
skipped_unit *= NIDS_PER_BLOCK;
switch (dn->max_level) {
case 3:
base += 2 * indirect_blks;
case 2:
base += 2 * direct_blks;
case 1:
base += direct_index;
break;
default:
f2fs_bug_on(F2FS_I_SB(dn->inode), 1);
}
return ((pgofs - base) / skipped_unit + 1) * skipped_unit + base;
}
/*
* The maximum depth is four.
* Offset[0] will have raw inode offset.
*/
static int get_node_path(struct inode *inode, long block,
int offset[4], unsigned int noffset[4])
{
const long direct_index = ADDRS_PER_INODE(inode);
const long direct_blks = ADDRS_PER_BLOCK;
const long dptrs_per_blk = NIDS_PER_BLOCK;
const long indirect_blks = ADDRS_PER_BLOCK * NIDS_PER_BLOCK;
const long dindirect_blks = indirect_blks * NIDS_PER_BLOCK;
int n = 0;
int level = 0;
noffset[0] = 0;
if (block < direct_index) {
offset[n] = block;
goto got;
}
block -= direct_index;
if (block < direct_blks) {
offset[n++] = NODE_DIR1_BLOCK;
noffset[n] = 1;
offset[n] = block;
level = 1;
goto got;
}
block -= direct_blks;
if (block < direct_blks) {
offset[n++] = NODE_DIR2_BLOCK;
noffset[n] = 2;
offset[n] = block;
level = 1;
goto got;
}
block -= direct_blks;
if (block < indirect_blks) {
offset[n++] = NODE_IND1_BLOCK;
noffset[n] = 3;
offset[n++] = block / direct_blks;
noffset[n] = 4 + offset[n - 1];
offset[n] = block % direct_blks;
level = 2;
goto got;
}
block -= indirect_blks;
if (block < indirect_blks) {
offset[n++] = NODE_IND2_BLOCK;
noffset[n] = 4 + dptrs_per_blk;
offset[n++] = block / direct_blks;
noffset[n] = 5 + dptrs_per_blk + offset[n - 1];
offset[n] = block % direct_blks;
level = 2;
goto got;
}
block -= indirect_blks;
if (block < dindirect_blks) {
offset[n++] = NODE_DIND_BLOCK;
noffset[n] = 5 + (dptrs_per_blk * 2);
offset[n++] = block / indirect_blks;
noffset[n] = 6 + (dptrs_per_blk * 2) +
offset[n - 1] * (dptrs_per_blk + 1);
offset[n++] = (block / direct_blks) % dptrs_per_blk;
noffset[n] = 7 + (dptrs_per_blk * 2) +
offset[n - 2] * (dptrs_per_blk + 1) +
offset[n - 1];
offset[n] = block % direct_blks;
level = 3;
goto got;
} else {
return -E2BIG;
}
got:
return level;
}
/*
* Caller should call f2fs_put_dnode(dn).
* Also, it should grab and release a rwsem by calling f2fs_lock_op() and
* f2fs_unlock_op() only if ro is not set RDONLY_NODE.
f2fs: introduce a new global lock scheme In the previous version, f2fs uses global locks according to the usage types, such as directory operations, block allocation, block write, and so on. Reference the following lock types in f2fs.h. enum lock_type { RENAME, /* for renaming operations */ DENTRY_OPS, /* for directory operations */ DATA_WRITE, /* for data write */ DATA_NEW, /* for data allocation */ DATA_TRUNC, /* for data truncate */ NODE_NEW, /* for node allocation */ NODE_TRUNC, /* for node truncate */ NODE_WRITE, /* for node write */ NR_LOCK_TYPE, }; In that case, we lose the performance under the multi-threading environment, since every types of operations must be conducted one at a time. In order to address the problem, let's share the locks globally with a mutex array regardless of any types. So, let users grab a mutex and perform their jobs in parallel as much as possbile. For this, I propose a new global lock scheme as follows. 0. Data structure - f2fs_sb_info -> mutex_lock[NR_GLOBAL_LOCKS] - f2fs_sb_info -> node_write 1. mutex_lock_op(sbi) - try to get an avaiable lock from the array. - returns the index of the gottern lock variable. 2. mutex_unlock_op(sbi, index of the lock) - unlock the given index of the lock. 3. mutex_lock_all(sbi) - grab all the locks in the array before the checkpoint. 4. mutex_unlock_all(sbi) - release all the locks in the array after checkpoint. 5. block_operations() - call mutex_lock_all() - sync_dirty_dir_inodes() - grab node_write - sync_node_pages() Note that, the pairs of mutex_lock_op()/mutex_unlock_op() and mutex_lock_all()/mutex_unlock_all() should be used together. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-22 16:21:29 +09:00
* In the case of RDONLY_NODE, we don't need to care about mutex.
*/
int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
struct page *npage[4];
struct page *parent = NULL;
int offset[4];
unsigned int noffset[4];
nid_t nids[4];
int level, i = 0;
int err = 0;
level = get_node_path(dn->inode, index, offset, noffset);
if (level < 0)
return level;
nids[0] = dn->inode->i_ino;
npage[0] = dn->inode_page;
if (!npage[0]) {
npage[0] = get_node_page(sbi, nids[0]);
if (IS_ERR(npage[0]))
return PTR_ERR(npage[0]);
}
/* if inline_data is set, should not report any block indices */
if (f2fs_has_inline_data(dn->inode) && index) {
err = -ENOENT;
f2fs_put_page(npage[0], 1);
goto release_out;
}
parent = npage[0];
if (level != 0)
nids[1] = get_nid(parent, offset[0], true);
dn->inode_page = npage[0];
dn->inode_page_locked = true;
/* get indirect or direct nodes */
for (i = 1; i <= level; i++) {
bool done = false;
if (!nids[i] && mode == ALLOC_NODE) {
/* alloc new node */
if (!alloc_nid(sbi, &(nids[i]))) {
err = -ENOSPC;
goto release_pages;
}
dn->nid = nids[i];
npage[i] = new_node_page(dn, noffset[i]);
if (IS_ERR(npage[i])) {
alloc_nid_failed(sbi, nids[i]);
err = PTR_ERR(npage[i]);
goto release_pages;
}
set_nid(parent, offset[i - 1], nids[i], i == 1);
alloc_nid_done(sbi, nids[i]);
done = true;
} else if (mode == LOOKUP_NODE_RA && i == level && level > 1) {
npage[i] = get_node_page_ra(parent, offset[i - 1]);
if (IS_ERR(npage[i])) {
err = PTR_ERR(npage[i]);
goto release_pages;
}
done = true;
}
if (i == 1) {
dn->inode_page_locked = false;
unlock_page(parent);
} else {
f2fs_put_page(parent, 1);
}
if (!done) {
npage[i] = get_node_page(sbi, nids[i]);
if (IS_ERR(npage[i])) {
err = PTR_ERR(npage[i]);
f2fs_put_page(npage[0], 0);
goto release_out;
}
}
if (i < level) {
parent = npage[i];
nids[i + 1] = get_nid(parent, offset[i], false);
}
}
dn->nid = nids[level];
dn->ofs_in_node = offset[level];
dn->node_page = npage[level];
f2fs: enhance on-disk inode structure scalability This patch add new flag F2FS_EXTRA_ATTR storing in inode.i_inline to indicate that on-disk structure of current inode is extended. In order to extend, we changed the inode structure a bit: Original one: struct f2fs_inode { ... struct f2fs_extent i_ext; __le32 i_addr[DEF_ADDRS_PER_INODE]; __le32 i_nid[DEF_NIDS_PER_INODE]; } Extended one: struct f2fs_inode { ... struct f2fs_extent i_ext; union { struct { __le16 i_extra_isize; __le16 i_padding; __le32 i_extra_end[0]; }; __le32 i_addr[DEF_ADDRS_PER_INODE]; }; __le32 i_nid[DEF_NIDS_PER_INODE]; } Once F2FS_EXTRA_ATTR is set, we will steal four bytes in the head of i_addr field for storing i_extra_isize and i_padding. with i_extra_isize, we can calculate actual size of reserved space in i_addr, available attribute fields included in total extra attribute fields for current inode can be described as below: +--------------------+ | .i_mode | | ... | | .i_ext | +--------------------+ | .i_extra_isize |-----+ | .i_padding | | | .i_prjid | | | .i_atime_extra | | | .i_ctime_extra | | | .i_mtime_extra |<----+ | .i_inode_cs |<----- store blkaddr/inline from here | .i_xattr_cs | | ... | +--------------------+ | | | block address | | | +--------------------+ | .i_nid | +--------------------+ | node_footer | | (nid, ino, offset) | +--------------------+ Hence, with this patch, we would enhance scalability of f2fs inode for storing more newly added attribute. Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2017-07-19 00:19:06 +08:00
dn->data_blkaddr = datablock_addr(dn->inode,
dn->node_page, dn->ofs_in_node);
return 0;
release_pages:
f2fs_put_page(parent, 1);
if (i > 1)
f2fs_put_page(npage[0], 0);
release_out:
dn->inode_page = NULL;
dn->node_page = NULL;
if (err == -ENOENT) {
dn->cur_level = i;
dn->max_level = level;
dn->ofs_in_node = offset[level];
}
return err;
}
static void truncate_node(struct dnode_of_data *dn)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
struct node_info ni;
get_node_info(sbi, dn->nid, &ni);
/* Deallocate node address */
invalidate_blocks(sbi, ni.blk_addr);
dec_valid_node_count(sbi, dn->inode, dn->nid == dn->inode->i_ino);
set_node_addr(sbi, &ni, NULL_ADDR, false);
if (dn->nid == dn->inode->i_ino) {
remove_orphan_inode(sbi, dn->nid);
dec_valid_inode_count(sbi);
f2fs_inode_synced(dn->inode);
}
clear_node_page_dirty(dn->node_page);
set_sbi_flag(sbi, SBI_IS_DIRTY);
f2fs_put_page(dn->node_page, 1);
invalidate_mapping_pages(NODE_MAPPING(sbi),
dn->node_page->index, dn->node_page->index);
dn->node_page = NULL;
trace_f2fs_truncate_node(dn->inode, dn->nid, ni.blk_addr);
}
static int truncate_dnode(struct dnode_of_data *dn)
{
struct page *page;
if (dn->nid == 0)
return 1;
/* get direct node */
page = get_node_page(F2FS_I_SB(dn->inode), dn->nid);
if (IS_ERR(page) && PTR_ERR(page) == -ENOENT)
return 1;
else if (IS_ERR(page))
return PTR_ERR(page);
/* Make dnode_of_data for parameter */
dn->node_page = page;
dn->ofs_in_node = 0;
truncate_data_blocks(dn);
truncate_node(dn);
return 1;
}
static int truncate_nodes(struct dnode_of_data *dn, unsigned int nofs,
int ofs, int depth)
{
struct dnode_of_data rdn = *dn;
struct page *page;
struct f2fs_node *rn;
nid_t child_nid;
unsigned int child_nofs;
int freed = 0;
int i, ret;
if (dn->nid == 0)
return NIDS_PER_BLOCK + 1;
trace_f2fs_truncate_nodes_enter(dn->inode, dn->nid, dn->data_blkaddr);
page = get_node_page(F2FS_I_SB(dn->inode), dn->nid);
if (IS_ERR(page)) {
trace_f2fs_truncate_nodes_exit(dn->inode, PTR_ERR(page));
return PTR_ERR(page);
}
ra_node_pages(page, ofs, NIDS_PER_BLOCK);
rn = F2FS_NODE(page);
if (depth < 3) {
for (i = ofs; i < NIDS_PER_BLOCK; i++, freed++) {
child_nid = le32_to_cpu(rn->in.nid[i]);
if (child_nid == 0)
continue;
rdn.nid = child_nid;
ret = truncate_dnode(&rdn);
if (ret < 0)
goto out_err;
if (set_nid(page, i, 0, false))
dn->node_changed = true;
}
} else {
child_nofs = nofs + ofs * (NIDS_PER_BLOCK + 1) + 1;
for (i = ofs; i < NIDS_PER_BLOCK; i++) {
child_nid = le32_to_cpu(rn->in.nid[i]);
if (child_nid == 0) {
child_nofs += NIDS_PER_BLOCK + 1;
continue;
}
rdn.nid = child_nid;
ret = truncate_nodes(&rdn, child_nofs, 0, depth - 1);
if (ret == (NIDS_PER_BLOCK + 1)) {
if (set_nid(page, i, 0, false))
dn->node_changed = true;
child_nofs += ret;
} else if (ret < 0 && ret != -ENOENT) {
goto out_err;
}
}
freed = child_nofs;
}
if (!ofs) {
/* remove current indirect node */
dn->node_page = page;
truncate_node(dn);
freed++;
} else {
f2fs_put_page(page, 1);
}
trace_f2fs_truncate_nodes_exit(dn->inode, freed);
return freed;
out_err:
f2fs_put_page(page, 1);
trace_f2fs_truncate_nodes_exit(dn->inode, ret);
return ret;
}
static int truncate_partial_nodes(struct dnode_of_data *dn,
struct f2fs_inode *ri, int *offset, int depth)
{
struct page *pages[2];
nid_t nid[3];
nid_t child_nid;
int err = 0;
int i;
int idx = depth - 2;
nid[0] = le32_to_cpu(ri->i_nid[offset[0] - NODE_DIR1_BLOCK]);
if (!nid[0])
return 0;
/* get indirect nodes in the path */
f2fs: fix truncate_partial_nodes bug The truncate_partial_nodes puts pages incorrectly in the following two cases. Note that the value for argc 'depth' can only be 2 or 3. Please see truncate_inode_blocks() and truncate_partial_nodes(). 1) An err is occurred in the first 'for' loop When err is occurred with depth = 2, pages[0] is invalid, so this page doesn't need to be put. There is no problem, however, when depth is 3, it doesn't put the pages correctly where pages[0] is valid and pages[1] is invalid. In this case, depth is set to 2 (ref to statemnt depth = i + 1), and then 'goto fail'. In label 'fail', for (i = depth - 3; i >= 0; i--) cannot meet the condition because i = -1, so pages[0] cann't be put. 2) An err happened in the second 'for' loop Now we've got pages[0] with depth = 2, or we've got pages[0] and pages[1] with depth = 3. When an err is detected, we need 'goto fail' to put such the pages. When depth is 2, in label 'fail', for (i = depth - 3; i >= 0; i--) cann't meet the condition because i = -1, so pages[0] cann't be put. When depth is 3, in label 'fail', for (i = depth - 3; i >= 0; i--) can only put pages[0], pages[1] also cann't be put. Note that 'depth' has been changed before first 'goto fail' (ref to statemnt depth = i + 1), so passing this modified 'depth' to the tracepoint, trace_f2fs_truncate_partial_nodes, is also incorrect. Signed-off-by: Shifei Ge <shifei10.ge@samsung.com> [Jaegeuk Kim: modify the description and fix one bug] Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2013-10-29 15:32:34 +08:00
for (i = 0; i < idx + 1; i++) {
/* reference count'll be increased */
pages[i] = get_node_page(F2FS_I_SB(dn->inode), nid[i]);
if (IS_ERR(pages[i])) {
err = PTR_ERR(pages[i]);
f2fs: fix truncate_partial_nodes bug The truncate_partial_nodes puts pages incorrectly in the following two cases. Note that the value for argc 'depth' can only be 2 or 3. Please see truncate_inode_blocks() and truncate_partial_nodes(). 1) An err is occurred in the first 'for' loop When err is occurred with depth = 2, pages[0] is invalid, so this page doesn't need to be put. There is no problem, however, when depth is 3, it doesn't put the pages correctly where pages[0] is valid and pages[1] is invalid. In this case, depth is set to 2 (ref to statemnt depth = i + 1), and then 'goto fail'. In label 'fail', for (i = depth - 3; i >= 0; i--) cannot meet the condition because i = -1, so pages[0] cann't be put. 2) An err happened in the second 'for' loop Now we've got pages[0] with depth = 2, or we've got pages[0] and pages[1] with depth = 3. When an err is detected, we need 'goto fail' to put such the pages. When depth is 2, in label 'fail', for (i = depth - 3; i >= 0; i--) cann't meet the condition because i = -1, so pages[0] cann't be put. When depth is 3, in label 'fail', for (i = depth - 3; i >= 0; i--) can only put pages[0], pages[1] also cann't be put. Note that 'depth' has been changed before first 'goto fail' (ref to statemnt depth = i + 1), so passing this modified 'depth' to the tracepoint, trace_f2fs_truncate_partial_nodes, is also incorrect. Signed-off-by: Shifei Ge <shifei10.ge@samsung.com> [Jaegeuk Kim: modify the description and fix one bug] Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2013-10-29 15:32:34 +08:00
idx = i - 1;
goto fail;
}
nid[i + 1] = get_nid(pages[i], offset[i + 1], false);
}
ra_node_pages(pages[idx], offset[idx + 1], NIDS_PER_BLOCK);
/* free direct nodes linked to a partial indirect node */
f2fs: fix truncate_partial_nodes bug The truncate_partial_nodes puts pages incorrectly in the following two cases. Note that the value for argc 'depth' can only be 2 or 3. Please see truncate_inode_blocks() and truncate_partial_nodes(). 1) An err is occurred in the first 'for' loop When err is occurred with depth = 2, pages[0] is invalid, so this page doesn't need to be put. There is no problem, however, when depth is 3, it doesn't put the pages correctly where pages[0] is valid and pages[1] is invalid. In this case, depth is set to 2 (ref to statemnt depth = i + 1), and then 'goto fail'. In label 'fail', for (i = depth - 3; i >= 0; i--) cannot meet the condition because i = -1, so pages[0] cann't be put. 2) An err happened in the second 'for' loop Now we've got pages[0] with depth = 2, or we've got pages[0] and pages[1] with depth = 3. When an err is detected, we need 'goto fail' to put such the pages. When depth is 2, in label 'fail', for (i = depth - 3; i >= 0; i--) cann't meet the condition because i = -1, so pages[0] cann't be put. When depth is 3, in label 'fail', for (i = depth - 3; i >= 0; i--) can only put pages[0], pages[1] also cann't be put. Note that 'depth' has been changed before first 'goto fail' (ref to statemnt depth = i + 1), so passing this modified 'depth' to the tracepoint, trace_f2fs_truncate_partial_nodes, is also incorrect. Signed-off-by: Shifei Ge <shifei10.ge@samsung.com> [Jaegeuk Kim: modify the description and fix one bug] Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2013-10-29 15:32:34 +08:00
for (i = offset[idx + 1]; i < NIDS_PER_BLOCK; i++) {
child_nid = get_nid(pages[idx], i, false);
if (!child_nid)
continue;
dn->nid = child_nid;
err = truncate_dnode(dn);
if (err < 0)
goto fail;
if (set_nid(pages[idx], i, 0, false))
dn->node_changed = true;
}
f2fs: fix truncate_partial_nodes bug The truncate_partial_nodes puts pages incorrectly in the following two cases. Note that the value for argc 'depth' can only be 2 or 3. Please see truncate_inode_blocks() and truncate_partial_nodes(). 1) An err is occurred in the first 'for' loop When err is occurred with depth = 2, pages[0] is invalid, so this page doesn't need to be put. There is no problem, however, when depth is 3, it doesn't put the pages correctly where pages[0] is valid and pages[1] is invalid. In this case, depth is set to 2 (ref to statemnt depth = i + 1), and then 'goto fail'. In label 'fail', for (i = depth - 3; i >= 0; i--) cannot meet the condition because i = -1, so pages[0] cann't be put. 2) An err happened in the second 'for' loop Now we've got pages[0] with depth = 2, or we've got pages[0] and pages[1] with depth = 3. When an err is detected, we need 'goto fail' to put such the pages. When depth is 2, in label 'fail', for (i = depth - 3; i >= 0; i--) cann't meet the condition because i = -1, so pages[0] cann't be put. When depth is 3, in label 'fail', for (i = depth - 3; i >= 0; i--) can only put pages[0], pages[1] also cann't be put. Note that 'depth' has been changed before first 'goto fail' (ref to statemnt depth = i + 1), so passing this modified 'depth' to the tracepoint, trace_f2fs_truncate_partial_nodes, is also incorrect. Signed-off-by: Shifei Ge <shifei10.ge@samsung.com> [Jaegeuk Kim: modify the description and fix one bug] Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2013-10-29 15:32:34 +08:00
if (offset[idx + 1] == 0) {
dn->node_page = pages[idx];
dn->nid = nid[idx];
truncate_node(dn);
} else {
f2fs_put_page(pages[idx], 1);
}
offset[idx]++;
f2fs: fix truncate_partial_nodes bug The truncate_partial_nodes puts pages incorrectly in the following two cases. Note that the value for argc 'depth' can only be 2 or 3. Please see truncate_inode_blocks() and truncate_partial_nodes(). 1) An err is occurred in the first 'for' loop When err is occurred with depth = 2, pages[0] is invalid, so this page doesn't need to be put. There is no problem, however, when depth is 3, it doesn't put the pages correctly where pages[0] is valid and pages[1] is invalid. In this case, depth is set to 2 (ref to statemnt depth = i + 1), and then 'goto fail'. In label 'fail', for (i = depth - 3; i >= 0; i--) cannot meet the condition because i = -1, so pages[0] cann't be put. 2) An err happened in the second 'for' loop Now we've got pages[0] with depth = 2, or we've got pages[0] and pages[1] with depth = 3. When an err is detected, we need 'goto fail' to put such the pages. When depth is 2, in label 'fail', for (i = depth - 3; i >= 0; i--) cann't meet the condition because i = -1, so pages[0] cann't be put. When depth is 3, in label 'fail', for (i = depth - 3; i >= 0; i--) can only put pages[0], pages[1] also cann't be put. Note that 'depth' has been changed before first 'goto fail' (ref to statemnt depth = i + 1), so passing this modified 'depth' to the tracepoint, trace_f2fs_truncate_partial_nodes, is also incorrect. Signed-off-by: Shifei Ge <shifei10.ge@samsung.com> [Jaegeuk Kim: modify the description and fix one bug] Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2013-10-29 15:32:34 +08:00
offset[idx + 1] = 0;
idx--;
fail:
f2fs: fix truncate_partial_nodes bug The truncate_partial_nodes puts pages incorrectly in the following two cases. Note that the value for argc 'depth' can only be 2 or 3. Please see truncate_inode_blocks() and truncate_partial_nodes(). 1) An err is occurred in the first 'for' loop When err is occurred with depth = 2, pages[0] is invalid, so this page doesn't need to be put. There is no problem, however, when depth is 3, it doesn't put the pages correctly where pages[0] is valid and pages[1] is invalid. In this case, depth is set to 2 (ref to statemnt depth = i + 1), and then 'goto fail'. In label 'fail', for (i = depth - 3; i >= 0; i--) cannot meet the condition because i = -1, so pages[0] cann't be put. 2) An err happened in the second 'for' loop Now we've got pages[0] with depth = 2, or we've got pages[0] and pages[1] with depth = 3. When an err is detected, we need 'goto fail' to put such the pages. When depth is 2, in label 'fail', for (i = depth - 3; i >= 0; i--) cann't meet the condition because i = -1, so pages[0] cann't be put. When depth is 3, in label 'fail', for (i = depth - 3; i >= 0; i--) can only put pages[0], pages[1] also cann't be put. Note that 'depth' has been changed before first 'goto fail' (ref to statemnt depth = i + 1), so passing this modified 'depth' to the tracepoint, trace_f2fs_truncate_partial_nodes, is also incorrect. Signed-off-by: Shifei Ge <shifei10.ge@samsung.com> [Jaegeuk Kim: modify the description and fix one bug] Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2013-10-29 15:32:34 +08:00
for (i = idx; i >= 0; i--)
f2fs_put_page(pages[i], 1);
trace_f2fs_truncate_partial_nodes(dn->inode, nid, depth, err);
return err;
}
/*
* All the block addresses of data and nodes should be nullified.
*/
int truncate_inode_blocks(struct inode *inode, pgoff_t from)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
int err = 0, cont = 1;
int level, offset[4], noffset[4];
unsigned int nofs = 0;
struct f2fs_inode *ri;
struct dnode_of_data dn;
struct page *page;
trace_f2fs_truncate_inode_blocks_enter(inode, from);
level = get_node_path(inode, from, offset, noffset);
if (level < 0)
return level;
page = get_node_page(sbi, inode->i_ino);
if (IS_ERR(page)) {
trace_f2fs_truncate_inode_blocks_exit(inode, PTR_ERR(page));
return PTR_ERR(page);
}
set_new_dnode(&dn, inode, page, NULL, 0);
unlock_page(page);
ri = F2FS_INODE(page);
switch (level) {
case 0:
case 1:
nofs = noffset[1];
break;
case 2:
nofs = noffset[1];
if (!offset[level - 1])
goto skip_partial;
err = truncate_partial_nodes(&dn, ri, offset, level);
if (err < 0 && err != -ENOENT)
goto fail;
nofs += 1 + NIDS_PER_BLOCK;
break;
case 3:
nofs = 5 + 2 * NIDS_PER_BLOCK;
if (!offset[level - 1])
goto skip_partial;
err = truncate_partial_nodes(&dn, ri, offset, level);
if (err < 0 && err != -ENOENT)
goto fail;
break;
default:
BUG();
}
skip_partial:
while (cont) {
dn.nid = le32_to_cpu(ri->i_nid[offset[0] - NODE_DIR1_BLOCK]);
switch (offset[0]) {
case NODE_DIR1_BLOCK:
case NODE_DIR2_BLOCK:
err = truncate_dnode(&dn);
break;
case NODE_IND1_BLOCK:
case NODE_IND2_BLOCK:
err = truncate_nodes(&dn, nofs, offset[1], 2);
break;
case NODE_DIND_BLOCK:
err = truncate_nodes(&dn, nofs, offset[1], 3);
cont = 0;
break;
default:
BUG();
}
if (err < 0 && err != -ENOENT)
goto fail;
if (offset[1] == 0 &&
ri->i_nid[offset[0] - NODE_DIR1_BLOCK]) {
lock_page(page);
BUG_ON(page->mapping != NODE_MAPPING(sbi));
f2fs_wait_on_page_writeback(page, NODE, true);
ri->i_nid[offset[0] - NODE_DIR1_BLOCK] = 0;
set_page_dirty(page);
unlock_page(page);
}
offset[1] = 0;
offset[0]++;
nofs += err;
}
fail:
f2fs_put_page(page, 0);
trace_f2fs_truncate_inode_blocks_exit(inode, err);
return err > 0 ? 0 : err;
}
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
/* caller must lock inode page */
int truncate_xattr_node(struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
nid_t nid = F2FS_I(inode)->i_xattr_nid;
struct dnode_of_data dn;
struct page *npage;
if (!nid)
return 0;
npage = get_node_page(sbi, nid);
if (IS_ERR(npage))
return PTR_ERR(npage);
f2fs_i_xnid_write(inode, 0);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
set_new_dnode(&dn, inode, NULL, npage, nid);
truncate_node(&dn);
return 0;
}
f2fs: introduce a new global lock scheme In the previous version, f2fs uses global locks according to the usage types, such as directory operations, block allocation, block write, and so on. Reference the following lock types in f2fs.h. enum lock_type { RENAME, /* for renaming operations */ DENTRY_OPS, /* for directory operations */ DATA_WRITE, /* for data write */ DATA_NEW, /* for data allocation */ DATA_TRUNC, /* for data truncate */ NODE_NEW, /* for node allocation */ NODE_TRUNC, /* for node truncate */ NODE_WRITE, /* for node write */ NR_LOCK_TYPE, }; In that case, we lose the performance under the multi-threading environment, since every types of operations must be conducted one at a time. In order to address the problem, let's share the locks globally with a mutex array regardless of any types. So, let users grab a mutex and perform their jobs in parallel as much as possbile. For this, I propose a new global lock scheme as follows. 0. Data structure - f2fs_sb_info -> mutex_lock[NR_GLOBAL_LOCKS] - f2fs_sb_info -> node_write 1. mutex_lock_op(sbi) - try to get an avaiable lock from the array. - returns the index of the gottern lock variable. 2. mutex_unlock_op(sbi, index of the lock) - unlock the given index of the lock. 3. mutex_lock_all(sbi) - grab all the locks in the array before the checkpoint. 4. mutex_unlock_all(sbi) - release all the locks in the array after checkpoint. 5. block_operations() - call mutex_lock_all() - sync_dirty_dir_inodes() - grab node_write - sync_node_pages() Note that, the pairs of mutex_lock_op()/mutex_unlock_op() and mutex_lock_all()/mutex_unlock_all() should be used together. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-22 16:21:29 +09:00
/*
* Caller should grab and release a rwsem by calling f2fs_lock_op() and
* f2fs_unlock_op().
f2fs: introduce a new global lock scheme In the previous version, f2fs uses global locks according to the usage types, such as directory operations, block allocation, block write, and so on. Reference the following lock types in f2fs.h. enum lock_type { RENAME, /* for renaming operations */ DENTRY_OPS, /* for directory operations */ DATA_WRITE, /* for data write */ DATA_NEW, /* for data allocation */ DATA_TRUNC, /* for data truncate */ NODE_NEW, /* for node allocation */ NODE_TRUNC, /* for node truncate */ NODE_WRITE, /* for node write */ NR_LOCK_TYPE, }; In that case, we lose the performance under the multi-threading environment, since every types of operations must be conducted one at a time. In order to address the problem, let's share the locks globally with a mutex array regardless of any types. So, let users grab a mutex and perform their jobs in parallel as much as possbile. For this, I propose a new global lock scheme as follows. 0. Data structure - f2fs_sb_info -> mutex_lock[NR_GLOBAL_LOCKS] - f2fs_sb_info -> node_write 1. mutex_lock_op(sbi) - try to get an avaiable lock from the array. - returns the index of the gottern lock variable. 2. mutex_unlock_op(sbi, index of the lock) - unlock the given index of the lock. 3. mutex_lock_all(sbi) - grab all the locks in the array before the checkpoint. 4. mutex_unlock_all(sbi) - release all the locks in the array after checkpoint. 5. block_operations() - call mutex_lock_all() - sync_dirty_dir_inodes() - grab node_write - sync_node_pages() Note that, the pairs of mutex_lock_op()/mutex_unlock_op() and mutex_lock_all()/mutex_unlock_all() should be used together. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2012-11-22 16:21:29 +09:00
*/
int remove_inode_page(struct inode *inode)
{
struct dnode_of_data dn;
int err;
set_new_dnode(&dn, inode, NULL, NULL, inode->i_ino);
err = get_dnode_of_data(&dn, 0, LOOKUP_NODE);
if (err)
return err;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
err = truncate_xattr_node(inode);
if (err) {
f2fs_put_dnode(&dn);
return err;
}
/* remove potential inline_data blocks */
if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
S_ISLNK(inode->i_mode))
truncate_data_blocks_range(&dn, 1);
/* 0 is possible, after f2fs_new_inode() has failed */
f2fs_bug_on(F2FS_I_SB(inode),
inode->i_blocks != 0 && inode->i_blocks != 8);
/* will put inode & node pages */
truncate_node(&dn);
return 0;
}
struct page *new_inode_page(struct inode *inode)
{
struct dnode_of_data dn;
/* allocate inode page for new inode */
set_new_dnode(&dn, inode, NULL, NULL, inode->i_ino);
/* caller should f2fs_put_page(page, 1); */
return new_node_page(&dn, 0);
}
struct page *new_node_page(struct dnode_of_data *dn, unsigned int ofs)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
struct node_info new_ni;
struct page *page;
int err;
if (unlikely(is_inode_flag_set(dn->inode, FI_NO_ALLOC)))
return ERR_PTR(-EPERM);
page = f2fs_grab_cache_page(NODE_MAPPING(sbi), dn->nid, false);
if (!page)
return ERR_PTR(-ENOMEM);
if (unlikely((err = inc_valid_node_count(sbi, dn->inode, !ofs))))
goto fail;
#ifdef CONFIG_F2FS_CHECK_FS
get_node_info(sbi, dn->nid, &new_ni);
f2fs_bug_on(sbi, new_ni.blk_addr != NULL_ADDR);
#endif
new_ni.nid = dn->nid;
new_ni.ino = dn->inode->i_ino;
new_ni.blk_addr = NULL_ADDR;
new_ni.flag = 0;
new_ni.version = 0;
set_node_addr(sbi, &new_ni, NEW_ADDR, false);
f2fs_wait_on_page_writeback(page, NODE, true);
fill_node_footer(page, dn->nid, dn->inode->i_ino, ofs, true);
set_cold_node(dn->inode, page);
if (!PageUptodate(page))
SetPageUptodate(page);
if (set_page_dirty(page))
dn->node_changed = true;
if (f2fs_has_xattr_block(ofs))
f2fs_i_xnid_write(dn->inode, dn->nid);
if (ofs == 0)
inc_valid_inode_count(sbi);
return page;
fail:
clear_node_page_dirty(page);
f2fs_put_page(page, 1);
return ERR_PTR(err);
}
/*
* Caller should do after getting the following values.
* 0: f2fs_put_page(page, 0)
* LOCKED_PAGE or error: f2fs_put_page(page, 1)
*/
static int read_node_page(struct page *page, int op_flags)
{
struct f2fs_sb_info *sbi = F2FS_P_SB(page);
struct node_info ni;
struct f2fs_io_info fio = {
.sbi = sbi,
.type = NODE,
.op = REQ_OP_READ,
.op_flags = op_flags,
.page = page,
.encrypted_page = NULL,
};
if (PageUptodate(page))
return LOCKED_PAGE;
get_node_info(sbi, page->index, &ni);
if (unlikely(ni.blk_addr == NULL_ADDR)) {
ClearPageUptodate(page);
return -ENOENT;
}
fio.new_blkaddr = fio.old_blkaddr = ni.blk_addr;
return f2fs_submit_page_bio(&fio);
}
/*
* Readahead a node page
*/
void ra_node_page(struct f2fs_sb_info *sbi, nid_t nid)
{
struct page *apage;
int err;
if (!nid)
return;
f2fs_bug_on(sbi, check_nid_range(sbi, nid));
rcu_read_lock();
apage = radix_tree_lookup(&NODE_MAPPING(sbi)->page_tree, nid);
rcu_read_unlock();
if (apage)
return;
apage = f2fs_grab_cache_page(NODE_MAPPING(sbi), nid, false);
if (!apage)
return;
err = read_node_page(apage, REQ_RAHEAD);
f2fs_put_page(apage, err ? 1 : 0);
}
static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid,
struct page *parent, int start)
{
struct page *page;
int err;
if (!nid)
return ERR_PTR(-ENOENT);
f2fs_bug_on(sbi, check_nid_range(sbi, nid));
repeat:
page = f2fs_grab_cache_page(NODE_MAPPING(sbi), nid, false);
if (!page)
return ERR_PTR(-ENOMEM);
err = read_node_page(page, 0);
if (err < 0) {
f2fs_put_page(page, 1);
return ERR_PTR(err);
} else if (err == LOCKED_PAGE) {
err = 0;
goto page_hit;
}
if (parent)
ra_node_pages(parent, start + 1, MAX_RA_NODE);
f2fs: give a chance to merge IOs by IO scheduler Previously, background GC submits many 4KB read requests to load victim blocks and/or its (i)node blocks. ... f2fs_gc : f2fs_readpage: ino = 1, page_index = 0xb61, blkaddr = 0x3b964ed f2fs_gc : block_rq_complete: 8,16 R () 499854968 + 8 [0] f2fs_gc : f2fs_readpage: ino = 1, page_index = 0xb6f, blkaddr = 0x3b964ee f2fs_gc : block_rq_complete: 8,16 R () 499854976 + 8 [0] f2fs_gc : f2fs_readpage: ino = 1, page_index = 0xb79, blkaddr = 0x3b964ef f2fs_gc : block_rq_complete: 8,16 R () 499854984 + 8 [0] ... However, by the fact that many IOs are sequential, we can give a chance to merge the IOs by IO scheduler. In order to do that, let's use blk_plug. ... f2fs_gc : f2fs_iget: ino = 143 f2fs_gc : f2fs_readpage: ino = 143, page_index = 0x1c6, blkaddr = 0x2e6ee f2fs_gc : f2fs_iget: ino = 143 f2fs_gc : f2fs_readpage: ino = 143, page_index = 0x1c7, blkaddr = 0x2e6ef <idle> : block_rq_complete: 8,16 R () 1519616 + 8 [0] <idle> : block_rq_complete: 8,16 R () 1519848 + 8 [0] <idle> : block_rq_complete: 8,16 R () 1520432 + 96 [0] <idle> : block_rq_complete: 8,16 R () 1520536 + 104 [0] <idle> : block_rq_complete: 8,16 R () 1521008 + 112 [0] <idle> : block_rq_complete: 8,16 R () 1521440 + 152 [0] <idle> : block_rq_complete: 8,16 R () 1521688 + 144 [0] <idle> : block_rq_complete: 8,16 R () 1522128 + 192 [0] <idle> : block_rq_complete: 8,16 R () 1523256 + 328 [0] ... Note that this issue should be addressed in checkpoint, and some readahead flows too. Reviewed-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
2013-04-24 13:19:56 +09:00
lock_page(page);
if (unlikely(page->mapping != NODE_MAPPING(sbi))) {
f2fs_put_page(page, 1);
goto repeat;
}
if (unlikely(!PageUptodate(page))) {
err = -EIO;
goto out_err;
}
if (!f2fs_inode_chksum_verify(sbi, page)) {
err = -EBADMSG;
goto out_err;
}
page_hit:
if(unlikely(nid != nid_of_node(page))) {
f2fs_msg(sbi->sb, KERN_WARNING, "inconsistent node block, "
"nid:%lu, node_footer[nid:%u,ino:%u,ofs:%u,cpver:%llu,blkaddr:%u]",
nid, nid_of_node(page), ino_of_node(page),
ofs_of_node(page), cpver_of_node(page),
next_blkaddr_of_node(page));
err = -EINVAL;
out_err:
ClearPageUptodate(page);
f2fs_put_page(page, 1);
return ERR_PTR(err);
}
return page;
}
struct page *get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid)
{
return __get_node_page(sbi, nid, NULL, 0);
}
struct page *get_node_page_ra(struct page *parent, int start)
{
struct f2fs_sb_info *sbi = F2FS_P_SB(parent);
nid_t nid = get_nid(parent, start, false);
return __get_node_page(sbi, nid, parent, start);
}
static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)
{
struct inode *inode;
struct page *page;
f2fs: fix to update dirty page count correctly Once we failed to merge inline data into inode page during flushing inline inode, we will skip invoking inode_dec_dirty_pages, which makes dirty page count incorrect, result in panic in ->evict_inode, Fix it. ------------[ cut here ]------------ kernel BUG at /home/yuchao/git/devf2fs/inode.c:336! invalid opcode: 0000 [#1] PREEMPT SMP CPU: 3 PID: 10004 Comm: umount Tainted: G O 4.6.0-rc5+ #17 Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 task: f0c33000 ti: c5212000 task.ti: c5212000 EIP: 0060:[<f89aacb5>] EFLAGS: 00010202 CPU: 3 EIP is at f2fs_evict_inode+0x85/0x490 [f2fs] EAX: 00000001 EBX: c4529ea0 ECX: 00000001 EDX: 00000000 ESI: c0131000 EDI: f89dd0a0 EBP: c5213e9c ESP: c5213e78 DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 CR0: 80050033 CR2: b75878c0 CR3: 1a36a700 CR4: 000406f0 Stack: c4529ea0 c4529ef4 c5213e8c c176d45c c4529ef4 00000000 c4529ea0 c4529fac f89dd0a0 c5213eb0 c1204a68 c5213ed8 c452a2b4 c6680930 c5213ec0 c1204b64 c6680d44 c6680620 c5213eec c120588d ee84b000 ee84b5c0 c5214000 ee84b5e0 Call Trace: [<c176d45c>] ? _raw_spin_unlock+0x2c/0x50 [<c1204a68>] evict+0xa8/0x170 [<c1204b64>] dispose_list+0x34/0x50 [<c120588d>] evict_inodes+0x10d/0x130 [<c11ea941>] generic_shutdown_super+0x41/0xe0 [<c1185190>] ? unregister_shrinker+0x40/0x50 [<c1185190>] ? unregister_shrinker+0x40/0x50 [<c11eac52>] kill_block_super+0x22/0x70 [<f89af23e>] kill_f2fs_super+0x1e/0x20 [f2fs] [<c11eae1d>] deactivate_locked_super+0x3d/0x70 [<c11eb383>] deactivate_super+0x43/0x60 [<c1208ec9>] cleanup_mnt+0x39/0x80 [<c1208f50>] __cleanup_mnt+0x10/0x20 [<c107d091>] task_work_run+0x71/0x90 [<c105725a>] exit_to_usermode_loop+0x72/0x9e [<c1001c7c>] do_fast_syscall_32+0x19c/0x1c0 [<c176dd48>] sysenter_past_esp+0x45/0x74 EIP: [<f89aacb5>] f2fs_evict_inode+0x85/0x490 [f2fs] SS:ESP 0068:c5213e78 ---[ end trace d30536330b7fdc58 ]--- Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2016-05-21 00:11:09 +08:00
int ret;
/* should flush inline_data before evict_inode */
inode = ilookup(sbi->sb, ino);
if (!inode)
return;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
page = f2fs_pagecache_get_page(inode->i_mapping, 0,
FGP_LOCK|FGP_NOWAIT, 0);
if (!page)
goto iput_out;
if (!PageUptodate(page))
goto page_out;
if (!PageDirty(page))
goto page_out;
if (!clear_page_dirty_for_io(page))
goto page_out;
f2fs: fix to update dirty page count correctly Once we failed to merge inline data into inode page during flushing inline inode, we will skip invoking inode_dec_dirty_pages, which makes dirty page count incorrect, result in panic in ->evict_inode, Fix it. ------------[ cut here ]------------ kernel BUG at /home/yuchao/git/devf2fs/inode.c:336! invalid opcode: 0000 [#1] PREEMPT SMP CPU: 3 PID: 10004 Comm: umount Tainted: G O 4.6.0-rc5+ #17 Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 task: f0c33000 ti: c5212000 task.ti: c5212000 EIP: 0060:[<f89aacb5>] EFLAGS: 00010202 CPU: 3 EIP is at f2fs_evict_inode+0x85/0x490 [f2fs] EAX: 00000001 EBX: c4529ea0 ECX: 00000001 EDX: 00000000 ESI: c0131000 EDI: f89dd0a0 EBP: c5213e9c ESP: c5213e78 DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 CR0: 80050033 CR2: b75878c0 CR3: 1a36a700 CR4: 000406f0 Stack: c4529ea0 c4529ef4 c5213e8c c176d45c c4529ef4 00000000 c4529ea0 c4529fac f89dd0a0 c5213eb0 c1204a68 c5213ed8 c452a2b4 c6680930 c5213ec0 c1204b64 c6680d44 c6680620 c5213eec c120588d ee84b000 ee84b5c0 c5214000 ee84b5e0 Call Trace: [<c176d45c>] ? _raw_spin_unlock+0x2c/0x50 [<c1204a68>] evict+0xa8/0x170 [<c1204b64>] dispose_list+0x34/0x50 [<c120588d>] evict_inodes+0x10d/0x130 [<c11ea941>] generic_shutdown_super+0x41/0xe0 [<c1185190>] ? unregister_shrinker+0x40/0x50 [<c1185190>] ? unregister_shrinker+0x40/0x50 [<c11eac52>] kill_block_super+0x22/0x70 [<f89af23e>] kill_f2fs_super+0x1e/0x20 [f2fs] [<c11eae1d>] deactivate_locked_super+0x3d/0x70 [<c11eb383>] deactivate_super+0x43/0x60 [<c1208ec9>] cleanup_mnt+0x39/0x80 [<c1208f50>] __cleanup_mnt+0x10/0x20 [<c107d091>] task_work_run+0x71/0x90 [<c105725a>] exit_to_usermode_loop+0x72/0x9e [<c1001c7c>] do_fast_syscall_32+0x19c/0x1c0 [<c176dd48>] sysenter_past_esp+0x45/0x74 EIP: [<f89aacb5>] f2fs_evict_inode+0x85/0x490 [f2fs] SS:ESP 0068:c5213e78 ---[ end trace d30536330b7fdc58 ]--- Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2016-05-21 00:11:09 +08:00
ret = f2fs_write_inline_data(inode, page);
inode_dec_dirty_pages(inode);
remove_dirty_inode(inode);
f2fs: fix to update dirty page count correctly Once we failed to merge inline data into inode page during flushing inline inode, we will skip invoking inode_dec_dirty_pages, which makes dirty page count incorrect, result in panic in ->evict_inode, Fix it. ------------[ cut here ]------------ kernel BUG at /home/yuchao/git/devf2fs/inode.c:336! invalid opcode: 0000 [#1] PREEMPT SMP CPU: 3 PID: 10004 Comm: umount Tainted: G O 4.6.0-rc5+ #17 Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 task: f0c33000 ti: c5212000 task.ti: c5212000 EIP: 0060:[<f89aacb5>] EFLAGS: 00010202 CPU: 3 EIP is at f2fs_evict_inode+0x85/0x490 [f2fs] EAX: 00000001 EBX: c4529ea0 ECX: 00000001 EDX: 00000000 ESI: c0131000 EDI: f89dd0a0 EBP: c5213e9c ESP: c5213e78 DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 CR0: 80050033 CR2: b75878c0 CR3: 1a36a700 CR4: 000406f0 Stack: c4529ea0 c4529ef4 c5213e8c c176d45c c4529ef4 00000000 c4529ea0 c4529fac f89dd0a0 c5213eb0 c1204a68 c5213ed8 c452a2b4 c6680930 c5213ec0 c1204b64 c6680d44 c6680620 c5213eec c120588d ee84b000 ee84b5c0 c5214000 ee84b5e0 Call Trace: [<c176d45c>] ? _raw_spin_unlock+0x2c/0x50 [<c1204a68>] evict+0xa8/0x170 [<c1204b64>] dispose_list+0x34/0x50 [<c120588d>] evict_inodes+0x10d/0x130 [<c11ea941>] generic_shutdown_super+0x41/0xe0 [<c1185190>] ? unregister_shrinker+0x40/0x50 [<c1185190>] ? unregister_shrinker+0x40/0x50 [<c11eac52>] kill_block_super+0x22/0x70 [<f89af23e>] kill_f2fs_super+0x1e/0x20 [f2fs] [<c11eae1d>] deactivate_locked_super+0x3d/0x70 [<c11eb383>] deactivate_super+0x43/0x60 [<c1208ec9>] cleanup_mnt+0x39/0x80 [<c1208f50>] __cleanup_mnt+0x10/0x20 [<c107d091>] task_work_run+0x71/0x90 [<c105725a>] exit_to_usermode_loop+0x72/0x9e [<c1001c7c>] do_fast_syscall_32+0x19c/0x1c0 [<c176dd48>] sysenter_past_esp+0x45/0x74 EIP: [<f89aacb5>] f2fs_evict_inode+0x85/0x490 [f2fs] SS:ESP 0068:c5213e78 ---[ end trace d30536330b7fdc58 ]--- Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2016-05-21 00:11:09 +08:00
if (ret)
set_page_dirty(page);
page_out:
f2fs_put_page(page, 1);
iput_out:
iput(inode);
}
static struct page *last_fsync_dnode(struct f2fs_sb_info *sbi, nid_t ino)
{
pgoff_t index, end;
struct pagevec pvec;
struct page *last_page = NULL;
pagevec_init(&pvec, 0);
index = 0;
end = ULONG_MAX;
while (index <= end) {
int i, nr_pages;
nr_pages = pagevec_lookup_tag(&pvec, NODE_MAPPING(sbi), &index,
PAGECACHE_TAG_DIRTY,
min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1);
if (nr_pages == 0)
break;
for (i = 0; i < nr_pages; i++) {
struct page *page = pvec.pages[i];
if (unlikely(f2fs_cp_error(sbi))) {
f2fs_put_page(last_page, 0);
pagevec_release(&pvec);
return ERR_PTR(-EIO);
}
if (!IS_DNODE(page) || !is_cold_node(page))
continue;
if (ino_of_node(page) != ino)
continue;
lock_page(page);
if (unlikely(page->mapping != NODE_MAPPING(sbi))) {
continue_unlock:
unlock_page(page);
continue;
}
if (ino_of_node(page) != ino)
goto continue_unlock;
if (!PageDirty(page)) {
/* someone wrote it for us */
goto continue_unlock;
}
if (last_page)
f2fs_put_page(last_page, 0);
get_page(page);
last_page = page;
unlock_page(page);
}
pagevec_release(&pvec);
cond_resched();
}
return last_page;
}
static int __write_node_page(struct page *page, bool atomic, bool *submitted,
struct writeback_control *wbc, bool do_balance,
enum iostat_type io_type)
{
struct f2fs_sb_info *sbi = F2FS_P_SB(page);
nid_t nid;
struct node_info ni;
struct f2fs_io_info fio = {
.sbi = sbi,
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
.ino = ino_of_node(page),
.type = NODE,
.op = REQ_OP_WRITE,
.op_flags = wbc_to_write_flags(wbc),
.page = page,
.encrypted_page = NULL,
.submitted = false,
.io_type = io_type,
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
.io_wbc = wbc,
};
trace_f2fs_writepage(page, NODE);
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
if (unlikely(f2fs_cp_error(sbi))) {
dec_page_count(sbi, F2FS_DIRTY_NODES);
unlock_page(page);
return 0;
}
if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
goto redirty_out;
/* get old block addr of this node page */
nid = nid_of_node(page);
f2fs_bug_on(sbi, page->index != nid);
if (wbc->for_reclaim) {
if (!down_read_trylock(&sbi->node_write))
goto redirty_out;
} else {
down_read(&sbi->node_write);
}
get_node_info(sbi, nid, &ni);
/* This page is already truncated */
if (unlikely(ni.blk_addr == NULL_ADDR)) {
ClearPageUptodate(page);
dec_page_count(sbi, F2FS_DIRTY_NODES);
up_read(&sbi->node_write);
unlock_page(page);
return 0;
}
if (atomic && !test_opt(sbi, NOBARRIER))
fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
set_page_writeback(page);
fio.old_blkaddr = ni.blk_addr;
write_node_page(nid, &fio);
set_node_addr(sbi, &ni, fio.new_blkaddr, is_fsync_dnode(page));
dec_page_count(sbi, F2FS_DIRTY_NODES);
up_read(&sbi->node_write);
if (wbc->for_reclaim) {
f2fs_submit_merged_write_cond(sbi, page->mapping->host, 0,
page->index, NODE);
submitted = NULL;
}
unlock_page(page);
if (unlikely(f2fs_cp_error(sbi))) {
f2fs_submit_merged_write(sbi, NODE);
submitted = NULL;
}
if (submitted)
*submitted = fio.submitted;
if (do_balance)
f2fs_balance_fs(sbi, false);
return 0;
redirty_out:
redirty_page_for_writepage(wbc, page);
return AOP_WRITEPAGE_ACTIVATE;
}
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
void move_node_page(struct page *node_page, int gc_type)
{
if (gc_type == FG_GC) {
struct writeback_control wbc = {
.sync_mode = WB_SYNC_ALL,
.nr_to_write = 1,
.for_reclaim = 0,
};
set_page_dirty(node_page);
f2fs_wait_on_page_writeback(node_page, NODE, true);
f2fs_bug_on(F2FS_P_SB(node_page), PageWriteback(node_page));
if (!clear_page_dirty_for_io(node_page))
goto out_page;
if (__write_node_page(node_page, false, NULL,
&wbc, false, FS_GC_NODE_IO))
unlock_page(node_page);
goto release_page;
} else {
/* set page dirty and write it */
if (!PageWriteback(node_page))
set_page_dirty(node_page);
}
out_page:
unlock_page(node_page);
release_page:
f2fs_put_page(node_page, 0);
}
static int f2fs_write_node_page(struct page *page,
struct writeback_control *wbc)
{
return __write_node_page(page, false, NULL, wbc, false, FS_NODE_IO);
}
int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
struct writeback_control *wbc, bool atomic)
{
pgoff_t index, end;
pgoff_t last_idx = ULONG_MAX;
struct pagevec pvec;
int ret = 0;
struct page *last_page = NULL;
bool marked = false;
nid_t ino = inode->i_ino;
if (atomic) {
last_page = last_fsync_dnode(sbi, ino);
if (IS_ERR_OR_NULL(last_page))
return PTR_ERR_OR_ZERO(last_page);
}
retry:
pagevec_init(&pvec, 0);
index = 0;
end = ULONG_MAX;
while (index <= end) {
int i, nr_pages;
nr_pages = pagevec_lookup_tag(&pvec, NODE_MAPPING(sbi), &index,
PAGECACHE_TAG_DIRTY,
min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1);
if (nr_pages == 0)
break;
for (i = 0; i < nr_pages; i++) {
struct page *page = pvec.pages[i];
bool submitted = false;
if (unlikely(f2fs_cp_error(sbi))) {
f2fs_put_page(last_page, 0);
pagevec_release(&pvec);
ret = -EIO;
goto out;
}
if (!IS_DNODE(page) || !is_cold_node(page))
continue;
if (ino_of_node(page) != ino)
continue;
lock_page(page);
if (unlikely(page->mapping != NODE_MAPPING(sbi))) {
continue_unlock:
unlock_page(page);
continue;
}
if (ino_of_node(page) != ino)
goto continue_unlock;
if (!PageDirty(page) && page != last_page) {
/* someone wrote it for us */
goto continue_unlock;
}
f2fs_wait_on_page_writeback(page, NODE, true);
BUG_ON(PageWriteback(page));
set_fsync_mark(page, 0);
set_dentry_mark(page, 0);
if (!atomic || page == last_page) {
set_fsync_mark(page, 1);
if (IS_INODE(page)) {
if (is_inode_flag_set(inode,
FI_DIRTY_INODE))
update_inode(inode, page);
set_dentry_mark(page,
need_dentry_mark(sbi, ino));
}
/* may be written by other thread */
if (!PageDirty(page))
set_page_dirty(page);
}
if (!clear_page_dirty_for_io(page))
goto continue_unlock;
ret = __write_node_page(page, atomic &&
page == last_page,
&submitted, wbc, true,
FS_NODE_IO);
if (ret) {
unlock_page(page);
f2fs_put_page(last_page, 0);
break;
} else if (submitted) {
last_idx = page->index;
}
if (page == last_page) {
f2fs_put_page(page, 0);
marked = true;
break;
}
}
pagevec_release(&pvec);
cond_resched();
if (ret || marked)
break;
}
if (!ret && atomic && !marked) {
f2fs_msg(sbi->sb, KERN_DEBUG,
"Retry to write fsync mark: ino=%u, idx=%lx",
ino, last_page->index);
lock_page(last_page);
f2fs_wait_on_page_writeback(last_page, NODE, true);
set_page_dirty(last_page);
unlock_page(last_page);
goto retry;
}
out:
if (last_idx != ULONG_MAX)
f2fs_submit_merged_write_cond(sbi, NULL, ino, last_idx, NODE);
return ret ? -EIO: 0;
}
int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc,
bool do_balance, enum iostat_type io_type)
{
pgoff_t index, end;
struct pagevec pvec;
int step = 0;
int nwritten = 0;
int ret = 0;
pagevec_init(&pvec, 0);
next_step:
index = 0;
end = ULONG_MAX;
while (index <= end) {
int i, nr_pages;
nr_pages = pagevec_lookup_tag(&pvec, NODE_MAPPING(sbi), &index,
PAGECACHE_TAG_DIRTY,
min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1);
if (nr_pages == 0)
break;
for (i = 0; i < nr_pages; i++) {
struct page *page = pvec.pages[i];
bool submitted = false;
/*
* flushing sequence with step:
* 0. indirect nodes
* 1. dentry dnodes
* 2. file dnodes
*/
if (step == 0 && IS_DNODE(page))
continue;
if (step == 1 && (!IS_DNODE(page) ||
is_cold_node(page)))
continue;
if (step == 2 && (!IS_DNODE(page) ||
!is_cold_node(page)))
continue;
lock_node:
if (!trylock_page(page))
continue;
if (unlikely(page->mapping != NODE_MAPPING(sbi))) {
continue_unlock:
unlock_page(page);
continue;
}
if (!PageDirty(page)) {
/* someone wrote it for us */
goto continue_unlock;
}
/* flush inline_data */
if (is_inline_node(page)) {
clear_inline_node(page);
unlock_page(page);
flush_inline_data(sbi, ino_of_node(page));
goto lock_node;
}
f2fs_wait_on_page_writeback(page, NODE, true);
BUG_ON(PageWriteback(page));
if (!clear_page_dirty_for_io(page))
goto continue_unlock;
set_fsync_mark(page, 0);
set_dentry_mark(page, 0);
ret = __write_node_page(page, false, &submitted,
wbc, do_balance, io_type);
if (ret)
unlock_page(page);
else if (submitted)
nwritten++;
if (--wbc->nr_to_write == 0)
break;
}
pagevec_release(&pvec);
cond_resched();
if (wbc->nr_to_write == 0) {
step = 2;
break;
}
}
if (step < 2) {
step++;
goto next_step;
}
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
if (nwritten)
f2fs_submit_merged_write(sbi, NODE);
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
if (unlikely(f2fs_cp_error(sbi)))
return -EIO;
return ret;
}
int wait_on_node_pages_writeback(struct f2fs_sb_info *sbi, nid_t ino)
{
pgoff_t index = 0, end = ULONG_MAX;
struct pagevec pvec;
int ret2, ret = 0;
pagevec_init(&pvec, 0);
while (index <= end) {
int i, nr_pages;
nr_pages = pagevec_lookup_tag(&pvec, NODE_MAPPING(sbi), &index,
PAGECACHE_TAG_WRITEBACK,
min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1);
if (nr_pages == 0)
break;
for (i = 0; i < nr_pages; i++) {
struct page *page = pvec.pages[i];
/* until radix tree lookup accepts end_index */
if (unlikely(page->index > end))
continue;
if (ino && ino_of_node(page) == ino) {
f2fs_wait_on_page_writeback(page, NODE, true);
if (TestClearPageError(page))
ret = -EIO;
}
}
pagevec_release(&pvec);
cond_resched();
}
ret2 = filemap_check_errors(NODE_MAPPING(sbi));
if (!ret)
ret = ret2;
return ret;
}
static int f2fs_write_node_pages(struct address_space *mapping,
struct writeback_control *wbc)
{
struct f2fs_sb_info *sbi = F2FS_M_SB(mapping);
struct blk_plug plug;
long diff;
if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
goto skip_write;
/* balancing f2fs's metadata in background */
f2fs_balance_fs_bg(sbi);
/* collect a number of dirty node pages and write together */
if (get_pages(sbi, F2FS_DIRTY_NODES) < nr_pages_to_skip(sbi, NODE))
goto skip_write;
trace_f2fs_writepages(mapping->host, wbc, NODE);
diff = nr_pages_to_write(sbi, NODE, wbc);
wbc->sync_mode = WB_SYNC_NONE;
blk_start_plug(&plug);
sync_node_pages(sbi, wbc, true, FS_NODE_IO);
blk_finish_plug(&plug);
wbc->nr_to_write = max((long)0, wbc->nr_to_write - diff);
return 0;
skip_write:
wbc->pages_skipped += get_pages(sbi, F2FS_DIRTY_NODES);
trace_f2fs_writepages(mapping->host, wbc, NODE);
return 0;
}
static int f2fs_set_node_page_dirty(struct page *page)
{
trace_f2fs_set_page_dirty(page, NODE);
if (!PageUptodate(page))
SetPageUptodate(page);
if (!PageDirty(page)) {
f2fs_set_page_dirty_nobuffers(page);
inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_NODES);
SetPagePrivate(page);
f2fs_trace_pid(page);
return 1;
}
return 0;
}
/*
* Structure of the f2fs node operations
*/
const struct address_space_operations f2fs_node_aops = {
.writepage = f2fs_write_node_page,
.writepages = f2fs_write_node_pages,
.set_page_dirty = f2fs_set_node_page_dirty,
.invalidatepage = f2fs_invalidate_page,
.releasepage = f2fs_release_page,
#ifdef CONFIG_MIGRATION
.migratepage = f2fs_migrate_page,
#endif
};
static struct free_nid *__lookup_free_nid_list(struct f2fs_nm_info *nm_i,
nid_t n)
{
return radix_tree_lookup(&nm_i->free_nid_root, n);
}
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
static int __insert_free_nid(struct f2fs_sb_info *sbi,
struct free_nid *i, enum nid_state state)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
int err = radix_tree_insert(&nm_i->free_nid_root, i->nid, i);
if (err)
return err;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
f2fs_bug_on(sbi, state != i->state);
nm_i->nid_cnt[state]++;
if (state == FREE_NID)
list_add_tail(&i->list, &nm_i->free_nid_list);
return 0;
}
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
static void __remove_free_nid(struct f2fs_sb_info *sbi,
struct free_nid *i, enum nid_state state)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
f2fs_bug_on(sbi, state != i->state);
nm_i->nid_cnt[state]--;
if (state == FREE_NID)
list_del(&i->list);
radix_tree_delete(&nm_i->free_nid_root, i->nid);
}
static void __move_free_nid(struct f2fs_sb_info *sbi, struct free_nid *i,
enum nid_state org_state, enum nid_state dst_state)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
f2fs_bug_on(sbi, org_state != i->state);
i->state = dst_state;
nm_i->nid_cnt[org_state]--;
nm_i->nid_cnt[dst_state]++;
switch (dst_state) {
case PREALLOC_NID:
list_del(&i->list);
break;
case FREE_NID:
list_add_tail(&i->list, &nm_i->free_nid_list);
break;
default:
BUG_ON(1);
}
}
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
static void update_free_nid_bitmap(struct f2fs_sb_info *sbi, nid_t nid,
bool set, bool build)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
unsigned int nat_ofs = NAT_BLOCK_OFFSET(nid);
unsigned int nid_ofs = nid - START_NID(nid);
if (!test_bit_le(nat_ofs, nm_i->nat_block_bitmap))
return;
if (set) {
if (test_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]))
return;
__set_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]);
nm_i->free_nid_count[nat_ofs]++;
} else {
if (!test_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]))
return;
__clear_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]);
if (!build)
nm_i->free_nid_count[nat_ofs]--;
}
}
/* return if the nid is recognized as free */
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
static bool add_free_nid(struct f2fs_sb_info *sbi,
nid_t nid, bool build, bool update)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct free_nid *i, *e;
struct nat_entry *ne;
int err = -EINVAL;
bool ret = false;
/* 0 nid should not be used */
if (unlikely(nid == 0))
return false;
i = f2fs_kmem_cache_alloc(free_nid_slab, GFP_NOFS);
i->nid = nid;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
i->state = FREE_NID;
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
radix_tree_preload(GFP_NOFS | __GFP_NOFAIL);
spin_lock(&nm_i->nid_list_lock);
if (build) {
/*
* Thread A Thread B
* - f2fs_create
* - f2fs_new_inode
* - alloc_nid
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
* - __insert_nid_to_list(PREALLOC_NID)
* - f2fs_balance_fs_bg
* - build_free_nids
* - __build_free_nids
* - scan_nat_page
* - add_free_nid
* - __lookup_nat_cache
* - f2fs_add_link
* - init_inode_metadata
* - new_inode_page
* - new_node_page
* - set_node_addr
* - alloc_nid_done
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
* - __remove_nid_from_list(PREALLOC_NID)
* - __insert_nid_to_list(FREE_NID)
*/
ne = __lookup_nat_cache(nm_i, nid);
if (ne && (!get_nat_flag(ne, IS_CHECKPOINTED) ||
nat_get_blkaddr(ne) != NULL_ADDR))
goto err_out;
e = __lookup_free_nid_list(nm_i, nid);
if (e) {
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (e->state == FREE_NID)
ret = true;
goto err_out;
}
}
ret = true;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
err = __insert_free_nid(sbi, i, FREE_NID);
err_out:
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
if (update) {
update_free_nid_bitmap(sbi, nid, ret, build);
if (!build)
nm_i->available_nids++;
}
spin_unlock(&nm_i->nid_list_lock);
radix_tree_preload_end();
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
if (err)
kmem_cache_free(free_nid_slab, i);
return ret;
}
static void remove_free_nid(struct f2fs_sb_info *sbi, nid_t nid)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct free_nid *i;
bool need_free = false;
spin_lock(&nm_i->nid_list_lock);
i = __lookup_free_nid_list(nm_i, nid);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (i && i->state == FREE_NID) {
__remove_free_nid(sbi, i, FREE_NID);
need_free = true;
}
spin_unlock(&nm_i->nid_list_lock);
if (need_free)
kmem_cache_free(free_nid_slab, i);
}
static void scan_nat_page(struct f2fs_sb_info *sbi,
struct page *nat_page, nid_t start_nid)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct f2fs_nat_block *nat_blk = page_address(nat_page);
block_t blk_addr;
unsigned int nat_ofs = NAT_BLOCK_OFFSET(start_nid);
int i;
__set_bit_le(nat_ofs, nm_i->nat_block_bitmap);
i = start_nid % NAT_ENTRY_PER_BLOCK;
for (; i < NAT_ENTRY_PER_BLOCK; i++, start_nid++) {
if (unlikely(start_nid >= nm_i->max_nid))
break;
blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr);
f2fs_bug_on(sbi, blk_addr == NEW_ADDR);
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
if (blk_addr == NULL_ADDR) {
add_free_nid(sbi, start_nid, true, true);
} else {
spin_lock(&NM_I(sbi)->nid_list_lock);
update_free_nid_bitmap(sbi, start_nid, false, true);
spin_unlock(&NM_I(sbi)->nid_list_lock);
}
}
}
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
static void scan_curseg_cache(struct f2fs_sb_info *sbi)
{
struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
struct f2fs_journal *journal = curseg->journal;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
int i;
down_read(&curseg->journal_rwsem);
for (i = 0; i < nats_in_cursum(journal); i++) {
block_t addr;
nid_t nid;
addr = le32_to_cpu(nat_in_journal(journal, i).block_addr);
nid = le32_to_cpu(nid_in_journal(journal, i));
if (addr == NULL_ADDR)
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
add_free_nid(sbi, nid, true, false);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
else
remove_free_nid(sbi, nid);
}
up_read(&curseg->journal_rwsem);
}
static void scan_free_nid_bits(struct f2fs_sb_info *sbi)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
unsigned int i, idx;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
nid_t nid;
down_read(&nm_i->nat_tree_lock);
for (i = 0; i < nm_i->nat_blocks; i++) {
if (!test_bit_le(i, nm_i->nat_block_bitmap))
continue;
if (!nm_i->free_nid_count[i])
continue;
for (idx = 0; idx < NAT_ENTRY_PER_BLOCK; idx++) {
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
idx = find_next_bit_le(nm_i->free_nid_bitmap[i],
NAT_ENTRY_PER_BLOCK, idx);
if (idx >= NAT_ENTRY_PER_BLOCK)
break;
nid = i * NAT_ENTRY_PER_BLOCK + idx;
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
add_free_nid(sbi, nid, true, false);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (nm_i->nid_cnt[FREE_NID] >= MAX_FREE_NIDS)
goto out;
}
}
out:
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
scan_curseg_cache(sbi);
up_read(&nm_i->nat_tree_lock);
}
static void __build_free_nids(struct f2fs_sb_info *sbi, bool sync, bool mount)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
int i = 0;
nid_t nid = nm_i->next_scan_nid;
if (unlikely(nid >= nm_i->max_nid))
nid = 0;
/* Enough entries */
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (nm_i->nid_cnt[FREE_NID] >= NAT_ENTRY_PER_BLOCK)
return;
if (!sync && !available_free_memory(sbi, FREE_NIDS))
return;
if (!mount) {
/* try to find free nids in free_nid_bitmap */
scan_free_nid_bits(sbi);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (nm_i->nid_cnt[FREE_NID] >= NAT_ENTRY_PER_BLOCK)
return;
}
/* readahead nat pages to be scanned */
ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nid), FREE_NID_PAGES,
META_NAT, true);
down_read(&nm_i->nat_tree_lock);
while (1) {
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
if (!test_bit_le(NAT_BLOCK_OFFSET(nid),
nm_i->nat_block_bitmap)) {
struct page *page = get_current_nat_page(sbi, nid);
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
scan_nat_page(sbi, page, nid);
f2fs_put_page(page, 1);
}
nid += (NAT_ENTRY_PER_BLOCK - (nid % NAT_ENTRY_PER_BLOCK));
if (unlikely(nid >= nm_i->max_nid))
nid = 0;
if (++i >= FREE_NID_PAGES)
break;
}
/* go to the next free nat pages to find free nids abundantly */
nm_i->next_scan_nid = nid;
/* find free nids from current sum_pages */
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
scan_curseg_cache(sbi);
up_read(&nm_i->nat_tree_lock);
ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nm_i->next_scan_nid),
nm_i->ra_nid_pages, META_NAT, false);
}
void build_free_nids(struct f2fs_sb_info *sbi, bool sync, bool mount)
{
mutex_lock(&NM_I(sbi)->build_lock);
__build_free_nids(sbi, sync, mount);
mutex_unlock(&NM_I(sbi)->build_lock);
}
/*
* If this function returns success, caller can obtain a new nid
* from second parameter of this function.
* The returned nid could be used ino as well as nid when inode is created.
*/
bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct free_nid *i = NULL;
retry:
#ifdef CONFIG_F2FS_FAULT_INJECTION
if (time_to_inject(sbi, FAULT_ALLOC_NID)) {
f2fs_show_injection_info(FAULT_ALLOC_NID);
return false;
}
#endif
spin_lock(&nm_i->nid_list_lock);
if (unlikely(nm_i->available_nids == 0)) {
spin_unlock(&nm_i->nid_list_lock);
return false;
}
/* We should not use stale free nids created by build_free_nids */
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (nm_i->nid_cnt[FREE_NID] && !on_build_free_nids(nm_i)) {
f2fs_bug_on(sbi, list_empty(&nm_i->free_nid_list));
i = list_first_entry(&nm_i->free_nid_list,
struct free_nid, list);
*nid = i->nid;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
__move_free_nid(sbi, i, FREE_NID, PREALLOC_NID);
nm_i->available_nids--;
update_free_nid_bitmap(sbi, *nid, false, false);
spin_unlock(&nm_i->nid_list_lock);
return true;
}
spin_unlock(&nm_i->nid_list_lock);
/* Let's scan nat pages and its caches to get free nids */
build_free_nids(sbi, true, false);
goto retry;
}
/*
* alloc_nid() should be called prior to this function.
*/
void alloc_nid_done(struct f2fs_sb_info *sbi, nid_t nid)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct free_nid *i;
spin_lock(&nm_i->nid_list_lock);
i = __lookup_free_nid_list(nm_i, nid);
f2fs_bug_on(sbi, !i);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
__remove_free_nid(sbi, i, PREALLOC_NID);
spin_unlock(&nm_i->nid_list_lock);
kmem_cache_free(free_nid_slab, i);
}
/*
* alloc_nid() should be called prior to this function.
*/
void alloc_nid_failed(struct f2fs_sb_info *sbi, nid_t nid)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct free_nid *i;
bool need_free = false;
if (!nid)
return;
spin_lock(&nm_i->nid_list_lock);
i = __lookup_free_nid_list(nm_i, nid);
f2fs_bug_on(sbi, !i);
if (!available_free_memory(sbi, FREE_NIDS)) {
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
__remove_free_nid(sbi, i, PREALLOC_NID);
need_free = true;
} else {
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
__move_free_nid(sbi, i, PREALLOC_NID, FREE_NID);
}
nm_i->available_nids++;
update_free_nid_bitmap(sbi, nid, true, false);
spin_unlock(&nm_i->nid_list_lock);
if (need_free)
kmem_cache_free(free_nid_slab, i);
}
int try_to_free_nids(struct f2fs_sb_info *sbi, int nr_shrink)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct free_nid *i, *next;
int nr = nr_shrink;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (nm_i->nid_cnt[FREE_NID] <= MAX_FREE_NIDS)
return 0;
if (!mutex_trylock(&nm_i->build_lock))
return 0;
spin_lock(&nm_i->nid_list_lock);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
list_for_each_entry_safe(i, next, &nm_i->free_nid_list, list) {
if (nr_shrink <= 0 ||
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
nm_i->nid_cnt[FREE_NID] <= MAX_FREE_NIDS)
break;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
__remove_free_nid(sbi, i, FREE_NID);
kmem_cache_free(free_nid_slab, i);
nr_shrink--;
}
spin_unlock(&nm_i->nid_list_lock);
mutex_unlock(&nm_i->build_lock);
return nr - nr_shrink;
}
void recover_inline_xattr(struct inode *inode, struct page *page)
{
void *src_addr, *dst_addr;
size_t inline_size;
struct page *ipage;
struct f2fs_inode *ri;
ipage = get_node_page(F2FS_I_SB(inode), inode->i_ino);
f2fs_bug_on(F2FS_I_SB(inode), IS_ERR(ipage));
ri = F2FS_INODE(page);
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
if (ri->i_inline & F2FS_INLINE_XATTR) {
set_inode_flag(inode, FI_INLINE_XATTR);
} else {
clear_inode_flag(inode, FI_INLINE_XATTR);
goto update_inode;
}
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
dst_addr = inline_xattr_addr(inode, ipage);
src_addr = inline_xattr_addr(inode, page);
inline_size = inline_xattr_size(inode);
f2fs_wait_on_page_writeback(ipage, NODE, true);
memcpy(dst_addr, src_addr, inline_size);
update_inode:
update_inode(inode, ipage);
f2fs_put_page(ipage, 1);
}
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
int recover_xattr_data(struct inode *inode, struct page *page)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
nid_t prev_xnid = F2FS_I(inode)->i_xattr_nid;
nid_t new_xnid;
struct dnode_of_data dn;
struct node_info ni;
struct page *xpage;
if (!prev_xnid)
goto recover_xnid;
/* 1: invalidate the previous xattr nid */
get_node_info(sbi, prev_xnid, &ni);
invalidate_blocks(sbi, ni.blk_addr);
dec_valid_node_count(sbi, inode, false);
set_node_addr(sbi, &ni, NULL_ADDR, false);
recover_xnid:
/* 2: update xattr nid in inode */
if (!alloc_nid(sbi, &new_xnid))
return -ENOSPC;
set_new_dnode(&dn, inode, NULL, NULL, new_xnid);
xpage = new_node_page(&dn, XATTR_NODE_OFFSET);
if (IS_ERR(xpage)) {
alloc_nid_failed(sbi, new_xnid);
return PTR_ERR(xpage);
}
alloc_nid_done(sbi, new_xnid);
update_inode_page(inode);
/* 3: update and set xattr node page dirty */
memcpy(F2FS_NODE(xpage), F2FS_NODE(page), VALID_XATTR_BLOCK_SIZE);
set_page_dirty(xpage);
f2fs_put_page(xpage, 1);
return 0;
}
int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page)
{
struct f2fs_inode *src, *dst;
nid_t ino = ino_of_node(page);
struct node_info old_ni, new_ni;
struct page *ipage;
get_node_info(sbi, ino, &old_ni);
if (unlikely(old_ni.blk_addr != NULL_ADDR))
return -EINVAL;
retry:
ipage = f2fs_grab_cache_page(NODE_MAPPING(sbi), ino, false);
if (!ipage) {
congestion_wait(BLK_RW_ASYNC, HZ/50);
goto retry;
}
/* Should not use this inode from free nid list */
remove_free_nid(sbi, ino);
if (!PageUptodate(ipage))
SetPageUptodate(ipage);
fill_node_footer(ipage, ino, ino, 0, true);
src = F2FS_INODE(page);
dst = F2FS_INODE(ipage);
memcpy(dst, src, (unsigned long)&src->i_ext - (unsigned long)src);
dst->i_size = 0;
dst->i_blocks = cpu_to_le64(1);
dst->i_links = cpu_to_le32(1);
dst->i_xattr_nid = 0;
f2fs: enhance on-disk inode structure scalability This patch add new flag F2FS_EXTRA_ATTR storing in inode.i_inline to indicate that on-disk structure of current inode is extended. In order to extend, we changed the inode structure a bit: Original one: struct f2fs_inode { ... struct f2fs_extent i_ext; __le32 i_addr[DEF_ADDRS_PER_INODE]; __le32 i_nid[DEF_NIDS_PER_INODE]; } Extended one: struct f2fs_inode { ... struct f2fs_extent i_ext; union { struct { __le16 i_extra_isize; __le16 i_padding; __le32 i_extra_end[0]; }; __le32 i_addr[DEF_ADDRS_PER_INODE]; }; __le32 i_nid[DEF_NIDS_PER_INODE]; } Once F2FS_EXTRA_ATTR is set, we will steal four bytes in the head of i_addr field for storing i_extra_isize and i_padding. with i_extra_isize, we can calculate actual size of reserved space in i_addr, available attribute fields included in total extra attribute fields for current inode can be described as below: +--------------------+ | .i_mode | | ... | | .i_ext | +--------------------+ | .i_extra_isize |-----+ | .i_padding | | | .i_prjid | | | .i_atime_extra | | | .i_ctime_extra | | | .i_mtime_extra |<----+ | .i_inode_cs |<----- store blkaddr/inline from here | .i_xattr_cs | | ... | +--------------------+ | | | block address | | | +--------------------+ | .i_nid | +--------------------+ | node_footer | | (nid, ino, offset) | +--------------------+ Hence, with this patch, we would enhance scalability of f2fs inode for storing more newly added attribute. Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2017-07-19 00:19:06 +08:00
dst->i_inline = src->i_inline & (F2FS_INLINE_XATTR | F2FS_EXTRA_ATTR);
if (dst->i_inline & F2FS_EXTRA_ATTR) {
f2fs: enhance on-disk inode structure scalability This patch add new flag F2FS_EXTRA_ATTR storing in inode.i_inline to indicate that on-disk structure of current inode is extended. In order to extend, we changed the inode structure a bit: Original one: struct f2fs_inode { ... struct f2fs_extent i_ext; __le32 i_addr[DEF_ADDRS_PER_INODE]; __le32 i_nid[DEF_NIDS_PER_INODE]; } Extended one: struct f2fs_inode { ... struct f2fs_extent i_ext; union { struct { __le16 i_extra_isize; __le16 i_padding; __le32 i_extra_end[0]; }; __le32 i_addr[DEF_ADDRS_PER_INODE]; }; __le32 i_nid[DEF_NIDS_PER_INODE]; } Once F2FS_EXTRA_ATTR is set, we will steal four bytes in the head of i_addr field for storing i_extra_isize and i_padding. with i_extra_isize, we can calculate actual size of reserved space in i_addr, available attribute fields included in total extra attribute fields for current inode can be described as below: +--------------------+ | .i_mode | | ... | | .i_ext | +--------------------+ | .i_extra_isize |-----+ | .i_padding | | | .i_prjid | | | .i_atime_extra | | | .i_ctime_extra | | | .i_mtime_extra |<----+ | .i_inode_cs |<----- store blkaddr/inline from here | .i_xattr_cs | | ... | +--------------------+ | | | block address | | | +--------------------+ | .i_nid | +--------------------+ | node_footer | | (nid, ino, offset) | +--------------------+ Hence, with this patch, we would enhance scalability of f2fs inode for storing more newly added attribute. Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2017-07-19 00:19:06 +08:00
dst->i_extra_isize = src->i_extra_isize;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (f2fs_sb_has_flexible_inline_xattr(sbi->sb) &&
F2FS_FITS_IN_INODE(src, le16_to_cpu(src->i_extra_isize),
i_inline_xattr_size))
dst->i_inline_xattr_size = src->i_inline_xattr_size;
if (f2fs_sb_has_project_quota(sbi->sb) &&
F2FS_FITS_IN_INODE(src, le16_to_cpu(src->i_extra_isize),
i_projid))
dst->i_projid = src->i_projid;
}
new_ni = old_ni;
new_ni.ino = ino;
if (unlikely(inc_valid_node_count(sbi, NULL, true)))
WARN_ON(1);
set_node_addr(sbi, &new_ni, NEW_ADDR, false);
inc_valid_inode_count(sbi);
set_page_dirty(ipage);
f2fs_put_page(ipage, 1);
return 0;
}
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
void restore_node_summary(struct f2fs_sb_info *sbi,
unsigned int segno, struct f2fs_summary_block *sum)
{
struct f2fs_node *rn;
struct f2fs_summary *sum_entry;
block_t addr;
int i, idx, last_offset, nrpages;
/* scan the node segment */
last_offset = sbi->blocks_per_seg;
addr = START_BLOCK(sbi, segno);
sum_entry = &sum->entries[0];
for (i = 0; i < last_offset; i += nrpages, addr += nrpages) {
nrpages = min(last_offset - i, BIO_MAX_PAGES);
/* readahead node pages */
ra_meta_pages(sbi, addr, nrpages, META_POR, true);
for (idx = addr; idx < addr + nrpages; idx++) {
struct page *page = get_tmp_page(sbi, idx);
rn = F2FS_NODE(page);
sum_entry->nid = rn->footer.nid;
sum_entry->version = 0;
sum_entry->ofs_in_node = 0;
sum_entry++;
f2fs_put_page(page, 1);
}
invalidate_mapping_pages(META_MAPPING(sbi), addr,
addr + nrpages);
}
}
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
struct f2fs_journal *journal = curseg->journal;
int i;
down_write(&curseg->journal_rwsem);
for (i = 0; i < nats_in_cursum(journal); i++) {
struct nat_entry *ne;
struct f2fs_nat_entry raw_ne;
nid_t nid = le32_to_cpu(nid_in_journal(journal, i));
raw_ne = nat_in_journal(journal, i);
ne = __lookup_nat_cache(nm_i, nid);
if (!ne) {
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
ne = __alloc_nat_entry(nid, true);
__init_nat_entry(nm_i, ne, &raw_ne, true);
}
/*
* if a free nat in journal has not been used after last
* checkpoint, we should remove it from available nids,
* since later we will add it again.
*/
if (!get_nat_flag(ne, IS_DIRTY) &&
le32_to_cpu(raw_ne.block_addr) == NULL_ADDR) {
spin_lock(&nm_i->nid_list_lock);
nm_i->available_nids--;
spin_unlock(&nm_i->nid_list_lock);
}
__set_nat_cache_dirty(nm_i, ne);
}
update_nats_in_cursum(journal, -i);
up_write(&curseg->journal_rwsem);
}
static void __adjust_nat_entry_set(struct nat_entry_set *nes,
struct list_head *head, int max)
{
struct nat_entry_set *cur;
if (nes->entry_cnt >= max)
goto add_out;
list_for_each_entry(cur, head, set_list) {
if (cur->entry_cnt >= nes->entry_cnt) {
list_add(&nes->set_list, cur->set_list.prev);
return;
}
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
}
add_out:
list_add_tail(&nes->set_list, head);
}
static void __update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid,
struct page *page)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
unsigned int nat_index = start_nid / NAT_ENTRY_PER_BLOCK;
struct f2fs_nat_block *nat_blk = page_address(page);
int valid = 0;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
int i = 0;
if (!enabled_nat_bits(sbi, NULL))
return;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
if (nat_index == 0) {
valid = 1;
i = 1;
}
for (; i < NAT_ENTRY_PER_BLOCK; i++) {
if (nat_blk->entries[i].block_addr != NULL_ADDR)
valid++;
}
if (valid == 0) {
__set_bit_le(nat_index, nm_i->empty_nat_bits);
__clear_bit_le(nat_index, nm_i->full_nat_bits);
return;
}
__clear_bit_le(nat_index, nm_i->empty_nat_bits);
if (valid == NAT_ENTRY_PER_BLOCK)
__set_bit_le(nat_index, nm_i->full_nat_bits);
else
__clear_bit_le(nat_index, nm_i->full_nat_bits);
}
static void __flush_nat_entry_set(struct f2fs_sb_info *sbi,
struct nat_entry_set *set, struct cp_control *cpc)
{
struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
struct f2fs_journal *journal = curseg->journal;
nid_t start_nid = set->set * NAT_ENTRY_PER_BLOCK;
bool to_journal = true;
struct f2fs_nat_block *nat_blk;
struct nat_entry *ne, *cur;
struct page *page = NULL;
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
/*
* there are two steps to flush nat entries:
* #1, flush nat entries to journal in current hot data summary block.
* #2, flush nat entries to nat page.
*/
if (enabled_nat_bits(sbi, cpc) ||
!__has_cursum_space(journal, set->entry_cnt, NAT_JOURNAL))
to_journal = false;
if (to_journal) {
down_write(&curseg->journal_rwsem);
} else {
page = get_next_nat_page(sbi, start_nid);
nat_blk = page_address(page);
f2fs_bug_on(sbi, !nat_blk);
}
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
/* flush dirty nats in nat entry set */
list_for_each_entry_safe(ne, cur, &set->entry_list, list) {
struct f2fs_nat_entry *raw_ne;
nid_t nid = nat_get_nid(ne);
int offset;
f2fs_bug_on(sbi, nat_get_blkaddr(ne) == NEW_ADDR);
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
if (to_journal) {
offset = lookup_journal_in_cursum(journal,
NAT_JOURNAL, nid, 1);
f2fs_bug_on(sbi, offset < 0);
raw_ne = &nat_in_journal(journal, offset);
nid_in_journal(journal, offset) = cpu_to_le32(nid);
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
} else {
raw_ne = &nat_blk->entries[nid - start_nid];
}
raw_nat_from_node_info(raw_ne, &ne->ni);
nat_reset_flag(ne);
__clear_nat_cache_dirty(NM_I(sbi), set, ne);
if (nat_get_blkaddr(ne) == NULL_ADDR) {
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
add_free_nid(sbi, nid, false, true);
} else {
spin_lock(&NM_I(sbi)->nid_list_lock);
update_free_nid_bitmap(sbi, nid, false, false);
spin_unlock(&NM_I(sbi)->nid_list_lock);
}
}
if (to_journal) {
up_write(&curseg->journal_rwsem);
} else {
__update_nat_bits(sbi, start_nid, page);
f2fs_put_page(page, 1);
}
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
/* Allow dirty nats by node block allocation in write_begin */
if (!set->entry_cnt) {
radix_tree_delete(&NM_I(sbi)->nat_set_root, set->set);
kmem_cache_free(nat_entry_set_slab, set);
}
}
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
/*
* This function is called during the checkpointing process.
*/
void flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
struct f2fs_journal *journal = curseg->journal;
struct nat_entry_set *setvec[SETVEC_SIZE];
struct nat_entry_set *set, *tmp;
unsigned int found;
nid_t set_idx = 0;
LIST_HEAD(sets);
if (!nm_i->dirty_nat_cnt)
return;
down_write(&nm_i->nat_tree_lock);
/*
* if there are no enough space in journal to store dirty nat
* entries, remove all entries from journal and merge them
* into nat entry set.
*/
if (enabled_nat_bits(sbi, cpc) ||
!__has_cursum_space(journal, nm_i->dirty_nat_cnt, NAT_JOURNAL))
remove_nats_in_journal(sbi);
while ((found = __gang_lookup_nat_set(nm_i,
set_idx, SETVEC_SIZE, setvec))) {
unsigned idx;
set_idx = setvec[found - 1]->set + 1;
for (idx = 0; idx < found; idx++)
__adjust_nat_entry_set(setvec[idx], &sets,
MAX_NAT_JENTRIES(journal));
}
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
/* flush dirty nats in nat entry set */
list_for_each_entry_safe(set, tmp, &sets, set_list)
__flush_nat_entry_set(sbi, set, cpc);
up_write(&nm_i->nat_tree_lock);
/* Allow dirty nats by node block allocation in write_begin */
}
static int __get_nat_bitmaps(struct f2fs_sb_info *sbi)
{
struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
struct f2fs_nm_info *nm_i = NM_I(sbi);
unsigned int nat_bits_bytes = nm_i->nat_blocks / BITS_PER_BYTE;
unsigned int i;
__u64 cp_ver = cur_cp_version(ckpt);
block_t nat_bits_addr;
if (!enabled_nat_bits(sbi, NULL))
return 0;
nm_i->nat_bits_blocks = F2FS_BYTES_TO_BLK((nat_bits_bytes << 1) + 8 +
F2FS_BLKSIZE - 1);
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
nm_i->nat_bits = f2fs_kzalloc(sbi,
nm_i->nat_bits_blocks << F2FS_BLKSIZE_BITS, GFP_KERNEL);
if (!nm_i->nat_bits)
return -ENOMEM;
nat_bits_addr = __start_cp_addr(sbi) + sbi->blocks_per_seg -
nm_i->nat_bits_blocks;
for (i = 0; i < nm_i->nat_bits_blocks; i++) {
struct page *page = get_meta_page(sbi, nat_bits_addr++);
memcpy(nm_i->nat_bits + (i << F2FS_BLKSIZE_BITS),
page_address(page), F2FS_BLKSIZE);
f2fs_put_page(page, 1);
}
cp_ver |= (cur_cp_crc(ckpt) << 32);
if (cpu_to_le64(cp_ver) != *(__le64 *)nm_i->nat_bits) {
disable_nat_bits(sbi, true);
return 0;
}
nm_i->full_nat_bits = nm_i->nat_bits + 8;
nm_i->empty_nat_bits = nm_i->full_nat_bits + nat_bits_bytes;
f2fs_msg(sbi->sb, KERN_NOTICE, "Found nat_bits in checkpoint");
return 0;
}
static inline void load_free_nid_bitmap(struct f2fs_sb_info *sbi)
f2fs: combine nat_bits and free_nid_bitmap cache Both nat_bits cache and free_nid_bitmap cache provide same functionality as a intermediate cache between free nid cache and disk, but with different granularity of indicating free nid range, and different persistence policy. nat_bits cache provides better persistence ability, and free_nid_bitmap provides better granularity. In this patch we combine advantage of both caches, so finally policy of the intermediate cache would be: - init: load free nid status from nat_bits into free_nid_bitmap - lookup: scan free_nid_bitmap before load NAT blocks - update: update free_nid_bitmap in real-time - persistence: udpate and persist nat_bits in checkpoint This patch also resolves performance regression reported by lkp-robot. commit: 4ac912427c4214d8031d9ad6fbc3bc75e71512df ("f2fs: introduce free nid bitmap") d00030cf9cd0bb96fdccc41e33d3c91dcbb672ba ("f2fs: use __set{__clear}_bit_le") 1382c0f3f9d3f936c8bc42ed1591cf7a593ef9f7 ("f2fs: combine nat_bits and free_nid_bitmap cache") 4ac912427c4214d8 d00030cf9cd0bb96fdccc41e33 1382c0f3f9d3f936c8bc42ed15 ---------------- -------------------------- -------------------------- %stddev %change %stddev %change %stddev \ | \ | \ 77863 ± 0% +2.1% 79485 ± 1% +50.8% 117404 ± 0% aim7.jobs-per-min 231.63 ± 0% -2.0% 227.01 ± 1% -33.6% 153.80 ± 0% aim7.time.elapsed_time 231.63 ± 0% -2.0% 227.01 ± 1% -33.6% 153.80 ± 0% aim7.time.elapsed_time.max 896604 ± 0% -0.8% 889221 ± 3% -20.2% 715260 ± 1% aim7.time.involuntary_context_switches 2394 ± 1% +4.6% 2503 ± 1% +3.7% 2481 ± 2% aim7.time.maximum_resident_set_size 6240 ± 0% -1.5% 6145 ± 1% -14.1% 5360 ± 1% aim7.time.system_time 1111357 ± 3% +1.9% 1132509 ± 2% -6.2% 1041932 ± 2% aim7.time.voluntary_context_switches ... Signed-off-by: Chao Yu <yuchao0@huawei.com> Tested-by: Xiaolong Ye <xiaolong.ye@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2017-03-08 20:07:49 +08:00
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
unsigned int i = 0;
nid_t nid, last_nid;
if (!enabled_nat_bits(sbi, NULL))
return;
for (i = 0; i < nm_i->nat_blocks; i++) {
i = find_next_bit_le(nm_i->empty_nat_bits, nm_i->nat_blocks, i);
if (i >= nm_i->nat_blocks)
break;
__set_bit_le(i, nm_i->nat_block_bitmap);
nid = i * NAT_ENTRY_PER_BLOCK;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
last_nid = nid + NAT_ENTRY_PER_BLOCK;
f2fs: combine nat_bits and free_nid_bitmap cache Both nat_bits cache and free_nid_bitmap cache provide same functionality as a intermediate cache between free nid cache and disk, but with different granularity of indicating free nid range, and different persistence policy. nat_bits cache provides better persistence ability, and free_nid_bitmap provides better granularity. In this patch we combine advantage of both caches, so finally policy of the intermediate cache would be: - init: load free nid status from nat_bits into free_nid_bitmap - lookup: scan free_nid_bitmap before load NAT blocks - update: update free_nid_bitmap in real-time - persistence: udpate and persist nat_bits in checkpoint This patch also resolves performance regression reported by lkp-robot. commit: 4ac912427c4214d8031d9ad6fbc3bc75e71512df ("f2fs: introduce free nid bitmap") d00030cf9cd0bb96fdccc41e33d3c91dcbb672ba ("f2fs: use __set{__clear}_bit_le") 1382c0f3f9d3f936c8bc42ed1591cf7a593ef9f7 ("f2fs: combine nat_bits and free_nid_bitmap cache") 4ac912427c4214d8 d00030cf9cd0bb96fdccc41e33 1382c0f3f9d3f936c8bc42ed15 ---------------- -------------------------- -------------------------- %stddev %change %stddev %change %stddev \ | \ | \ 77863 ± 0% +2.1% 79485 ± 1% +50.8% 117404 ± 0% aim7.jobs-per-min 231.63 ± 0% -2.0% 227.01 ± 1% -33.6% 153.80 ± 0% aim7.time.elapsed_time 231.63 ± 0% -2.0% 227.01 ± 1% -33.6% 153.80 ± 0% aim7.time.elapsed_time.max 896604 ± 0% -0.8% 889221 ± 3% -20.2% 715260 ± 1% aim7.time.involuntary_context_switches 2394 ± 1% +4.6% 2503 ± 1% +3.7% 2481 ± 2% aim7.time.maximum_resident_set_size 6240 ± 0% -1.5% 6145 ± 1% -14.1% 5360 ± 1% aim7.time.system_time 1111357 ± 3% +1.9% 1132509 ± 2% -6.2% 1041932 ± 2% aim7.time.voluntary_context_switches ... Signed-off-by: Chao Yu <yuchao0@huawei.com> Tested-by: Xiaolong Ye <xiaolong.ye@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2017-03-08 20:07:49 +08:00
spin_lock(&NM_I(sbi)->nid_list_lock);
f2fs: combine nat_bits and free_nid_bitmap cache Both nat_bits cache and free_nid_bitmap cache provide same functionality as a intermediate cache between free nid cache and disk, but with different granularity of indicating free nid range, and different persistence policy. nat_bits cache provides better persistence ability, and free_nid_bitmap provides better granularity. In this patch we combine advantage of both caches, so finally policy of the intermediate cache would be: - init: load free nid status from nat_bits into free_nid_bitmap - lookup: scan free_nid_bitmap before load NAT blocks - update: update free_nid_bitmap in real-time - persistence: udpate and persist nat_bits in checkpoint This patch also resolves performance regression reported by lkp-robot. commit: 4ac912427c4214d8031d9ad6fbc3bc75e71512df ("f2fs: introduce free nid bitmap") d00030cf9cd0bb96fdccc41e33d3c91dcbb672ba ("f2fs: use __set{__clear}_bit_le") 1382c0f3f9d3f936c8bc42ed1591cf7a593ef9f7 ("f2fs: combine nat_bits and free_nid_bitmap cache") 4ac912427c4214d8 d00030cf9cd0bb96fdccc41e33 1382c0f3f9d3f936c8bc42ed15 ---------------- -------------------------- -------------------------- %stddev %change %stddev %change %stddev \ | \ | \ 77863 ± 0% +2.1% 79485 ± 1% +50.8% 117404 ± 0% aim7.jobs-per-min 231.63 ± 0% -2.0% 227.01 ± 1% -33.6% 153.80 ± 0% aim7.time.elapsed_time 231.63 ± 0% -2.0% 227.01 ± 1% -33.6% 153.80 ± 0% aim7.time.elapsed_time.max 896604 ± 0% -0.8% 889221 ± 3% -20.2% 715260 ± 1% aim7.time.involuntary_context_switches 2394 ± 1% +4.6% 2503 ± 1% +3.7% 2481 ± 2% aim7.time.maximum_resident_set_size 6240 ± 0% -1.5% 6145 ± 1% -14.1% 5360 ± 1% aim7.time.system_time 1111357 ± 3% +1.9% 1132509 ± 2% -6.2% 1041932 ± 2% aim7.time.voluntary_context_switches ... Signed-off-by: Chao Yu <yuchao0@huawei.com> Tested-by: Xiaolong Ye <xiaolong.ye@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2017-03-08 20:07:49 +08:00
for (; nid < last_nid; nid++)
update_free_nid_bitmap(sbi, nid, true, true);
spin_unlock(&NM_I(sbi)->nid_list_lock);
f2fs: combine nat_bits and free_nid_bitmap cache Both nat_bits cache and free_nid_bitmap cache provide same functionality as a intermediate cache between free nid cache and disk, but with different granularity of indicating free nid range, and different persistence policy. nat_bits cache provides better persistence ability, and free_nid_bitmap provides better granularity. In this patch we combine advantage of both caches, so finally policy of the intermediate cache would be: - init: load free nid status from nat_bits into free_nid_bitmap - lookup: scan free_nid_bitmap before load NAT blocks - update: update free_nid_bitmap in real-time - persistence: udpate and persist nat_bits in checkpoint This patch also resolves performance regression reported by lkp-robot. commit: 4ac912427c4214d8031d9ad6fbc3bc75e71512df ("f2fs: introduce free nid bitmap") d00030cf9cd0bb96fdccc41e33d3c91dcbb672ba ("f2fs: use __set{__clear}_bit_le") 1382c0f3f9d3f936c8bc42ed1591cf7a593ef9f7 ("f2fs: combine nat_bits and free_nid_bitmap cache") 4ac912427c4214d8 d00030cf9cd0bb96fdccc41e33 1382c0f3f9d3f936c8bc42ed15 ---------------- -------------------------- -------------------------- %stddev %change %stddev %change %stddev \ | \ | \ 77863 ± 0% +2.1% 79485 ± 1% +50.8% 117404 ± 0% aim7.jobs-per-min 231.63 ± 0% -2.0% 227.01 ± 1% -33.6% 153.80 ± 0% aim7.time.elapsed_time 231.63 ± 0% -2.0% 227.01 ± 1% -33.6% 153.80 ± 0% aim7.time.elapsed_time.max 896604 ± 0% -0.8% 889221 ± 3% -20.2% 715260 ± 1% aim7.time.involuntary_context_switches 2394 ± 1% +4.6% 2503 ± 1% +3.7% 2481 ± 2% aim7.time.maximum_resident_set_size 6240 ± 0% -1.5% 6145 ± 1% -14.1% 5360 ± 1% aim7.time.system_time 1111357 ± 3% +1.9% 1132509 ± 2% -6.2% 1041932 ± 2% aim7.time.voluntary_context_switches ... Signed-off-by: Chao Yu <yuchao0@huawei.com> Tested-by: Xiaolong Ye <xiaolong.ye@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2017-03-08 20:07:49 +08:00
}
for (i = 0; i < nm_i->nat_blocks; i++) {
i = find_next_bit_le(nm_i->full_nat_bits, nm_i->nat_blocks, i);
if (i >= nm_i->nat_blocks)
break;
__set_bit_le(i, nm_i->nat_block_bitmap);
}
}
static int init_node_manager(struct f2fs_sb_info *sbi)
{
struct f2fs_super_block *sb_raw = F2FS_RAW_SUPER(sbi);
struct f2fs_nm_info *nm_i = NM_I(sbi);
unsigned char *version_bitmap;
unsigned int nat_segs;
int err;
nm_i->nat_blkaddr = le32_to_cpu(sb_raw->nat_blkaddr);
/* segment_count_nat includes pair segment so divide to 2. */
nat_segs = le32_to_cpu(sb_raw->segment_count_nat) >> 1;
nm_i->nat_blocks = nat_segs << le32_to_cpu(sb_raw->log_blocks_per_seg);
nm_i->max_nid = NAT_ENTRY_PER_BLOCK * nm_i->nat_blocks;
/* not used nids: 0, node, meta, (and root counted as valid node) */
nm_i->available_nids = nm_i->max_nid - sbi->total_valid_node_count -
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
sbi->nquota_files - F2FS_RESERVED_NODE_NUM;
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
nm_i->nid_cnt[FREE_NID] = 0;
nm_i->nid_cnt[PREALLOC_NID] = 0;
nm_i->nat_cnt = 0;
nm_i->ram_thresh = DEF_RAM_THRESHOLD;
nm_i->ra_nid_pages = DEF_RA_NID_PAGES;
nm_i->dirty_nats_ratio = DEF_DIRTY_NAT_RATIO_THRESHOLD;
INIT_RADIX_TREE(&nm_i->free_nid_root, GFP_ATOMIC);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
INIT_LIST_HEAD(&nm_i->free_nid_list);
INIT_RADIX_TREE(&nm_i->nat_root, GFP_NOIO);
INIT_RADIX_TREE(&nm_i->nat_set_root, GFP_NOIO);
INIT_LIST_HEAD(&nm_i->nat_entries);
mutex_init(&nm_i->build_lock);
spin_lock_init(&nm_i->nid_list_lock);
init_rwsem(&nm_i->nat_tree_lock);
nm_i->next_scan_nid = le32_to_cpu(sbi->ckpt->next_free_nid);
nm_i->bitmap_size = __bitmap_size(sbi, NAT_BITMAP);
version_bitmap = __bitmap_ptr(sbi, NAT_BITMAP);
if (!version_bitmap)
return -EFAULT;
nm_i->nat_bitmap = kmemdup(version_bitmap, nm_i->bitmap_size,
GFP_KERNEL);
if (!nm_i->nat_bitmap)
return -ENOMEM;
err = __get_nat_bitmaps(sbi);
if (err)
return err;
#ifdef CONFIG_F2FS_CHECK_FS
nm_i->nat_bitmap_mir = kmemdup(version_bitmap, nm_i->bitmap_size,
GFP_KERNEL);
if (!nm_i->nat_bitmap_mir)
return -ENOMEM;
#endif
return 0;
}
static int init_free_nid_cache(struct f2fs_sb_info *sbi)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
nm_i->free_nid_bitmap = f2fs_kvzalloc(sbi, nm_i->nat_blocks *
NAT_ENTRY_BITMAP_SIZE, GFP_KERNEL);
if (!nm_i->free_nid_bitmap)
return -ENOMEM;
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
nm_i->nat_block_bitmap = f2fs_kvzalloc(sbi, nm_i->nat_blocks / 8,
GFP_KERNEL);
if (!nm_i->nat_block_bitmap)
return -ENOMEM;
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
nm_i->free_nid_count = f2fs_kvzalloc(sbi, nm_i->nat_blocks *
sizeof(unsigned short), GFP_KERNEL);
if (!nm_i->free_nid_count)
return -ENOMEM;
return 0;
}
int build_node_manager(struct f2fs_sb_info *sbi)
{
int err;
f2fs: updates on v4.16-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we've followed up to support some generic features such as cgroup, block reservation, linking fscrypt_ops, delivering write_hints, and some ioctls. And, we could fix some corner cases in terms of power-cut recovery and subtle deadlocks. Enhancements: - bitmap operations to handle NAT blocks - readahead to improve readdir speed - switch to use fscrypt_* - apply write hints for direct IO - add reserve_root=%u,resuid=%u,resgid=%u to reserve blocks for root/uid/gid - modify b_avail and b_free to consider root reserved blocks - support cgroup writeback - support FIEMAP_FLAG_XATTR for fibmap - add F2FS_IOC_PRECACHE_EXTENTS to pre-cache extents - add F2FS_IOC_{GET/SET}_PIN_FILE to pin LBAs for data blocks - support inode creation time Bug fixs: - sysfile-based quota operations - memory footprint accounting - allow to write data on partial preallocation case - fix deadlock case on fallocate - fix to handle fill_super errors - fix missing inode updates of fsync'ed file - recover renamed file which was fsycn'ed before - drop inmemory pages in corner error case - keep last_disk_size correctly - recover missing i_inline flags during roll-forward Various clean-up patches were added as well" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: 00f0eaaadfe0 f2fs: support inode creation time 3e7444adf953 f2fs: rebuild sit page from sit info in mem 76688790c3bf f2fs: stop issuing discard if fs is readonly ae93dca26413 f2fs: clean up duplicated assignment in init_discard_policy 0052bba1313e f2fs: use GFP_F2FS_ZERO for cleanup 6271336cfa80 f2fs: allow to recover node blocks given updated checkpoint e003a2d15352 f2fs: recover some i_inline flags 3cafae53f3ef f2fs: correct removexattr behavior for null valued extended attribute 78d7fa9ac21f f2fs: drop page cache after fs shutdown 150b61cee574 f2fs: stop gc/discard thread after fs shutdown cf27ccc41e86 f2fs: hanlde error case in f2fs_ioc_shutdown 1526117cdaa6 f2fs: split need_inplace_update cd576d7b7a95 f2fs: fix to update last_disk_size correctly 7a57bd3313c2 f2fs: kill F2FS_INLINE_XATTR_ADDRS for cleanup 95eb6a6ceb04 f2fs: clean up error path of fill_super 63c949c97384 f2fs: avoid hungtask when GC encrypted block if io_bits is set 583d13d10c8a f2fs: allow quota to use reserved blocks fbe371d3cdb2 f2fs: fix to drop all inmem pages correctly 7e08ce43562d f2fs: speed up defragment on sparse file 0f914cab8ce3 f2fs: support F2FS_IOC_PRECACHE_EXTENTS ed1311e58555 f2fs: add an ioctl to disable GC for specific file b08974ab5e0a f2fs: prevent newly created inode from being dirtied incorrectly e8a8acf602a3 f2fs: support FIEMAP_FLAG_XATTR 042aeed690a3 f2fs: fix to cover f2fs_inline_data_fiemap with inode_lock 9cf9c37ebe90 f2fs: check node page again in write end io b9eedb48132e f2fs: fix to caclulate required free section correctly 75ae50cf1539 f2fs: handle newly created page when revoking inmem pages 871b97493627 f2fs: add resgid and resuid to reserve root blocks 0cf361acdb47 f2fs: implement cgroup writeback support 196d52cf4ebe f2fs: remove unused pend_list_tag 6e899a83f5e0 f2fs: avoid high cpu usage in discard thread bb1af976c2a2 f2fs: make local functions static ad658936ea9d f2fs: add reserved blocks for root user c6e64f1ff11c f2fs: check segment type in __f2fs_replace_block 88cdc60b7308 f2fs: update inode info to inode page for new file 4203e9fbd857 f2fs: show precise # of blocks that user/root can use 47dc137291e3 f2fs: clean up unneeded declaration 27f9e55195b1 f2fs: continue to do direct IO if we only preallocate partial blocks f2f137831464 f2fs: enable quota at remount from r to w d507f30065b3 f2fs: skip stop_checkpoint for user data writes 4b242ffcdb1f f2fs: fix missing error number for xattr operation c6c76a0e6154 f2fs: recover directory operations by fsync 5943e3992eed f2fs: return error during fill_super 93579c97259b f2fs: fix an error case of missing update inode page 3d753c15af04 f2fs: fix potential hangtask in f2fs_trace_pid 625f066c5d18 f2fs: no need return value in restore summary process f76c831abdd7 f2fs: use unlikely for release case 0408ad5efb28 f2fs: don't return value in truncate_data_blocks_range 62e507cd2b91 f2fs: clean up f2fs_map_blocks 233b197757c0 f2fs: clean up hash codes 58d550e5da7c f2fs: fix error handling in fill_super 35d78e6fc851 f2fs: spread f2fs_k{m,z}alloc fecf31ce115a f2fs: inject fault to kvmalloc 41af39db9fd0 f2fs: inject fault to kzalloc 9fecb4159dc1 f2fs: remove a redundant conditional expression 8e56c02ee9fa f2fs: apply write hints to select the type of segment for direct write a4015f91473e f2fs: switch to fscrypt_prepare_setattr() 56351ec774b8 f2fs: switch to fscrypt_prepare_lookup() 51f2caabf9a8 f2fs: switch to fscrypt_prepare_rename() f9a35b22b914 f2fs: switch to fscrypt_prepare_link() 787bd2632d66 f2fs: switch to fscrypt_file_open() eb9d8ee0fdb8 posix_acl: convert posix_acl.a_refcount from atomic_t to refcount_t bd0bb8ab0c90 f2fs: remove repeated f2fs_bug_on d1c0441c02cb f2fs: remove an excess variable 3f12c94d1b3c f2fs: fix lock dependency in between dio_rwsem & i_mmap_sem 39685b35e80a f2fs: remove unused parameter b83577043a48 f2fs: still write data if preallocate only partial blocks b61cf217182b f2fs: introduce sysfs readdir_ra to readahead inode block in readdir 44ed9b2d125c f2fs: fix concurrent problem for updating free bitmap 08be3792ef4b f2fs: remove unneeded memory footprint accounting 33362399b3fc f2fs: no need to read nat block if nat_block_bitmap is set 01bb5c8b1f32 f2fs: reserve nid resource for quota sysfile Change-Id: Ie0beb18a04fc300d1591d64c7ae542a478644e26 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-11-16 16:59:14 +08:00
sbi->nm_info = f2fs_kzalloc(sbi, sizeof(struct f2fs_nm_info),
GFP_KERNEL);
if (!sbi->nm_info)
return -ENOMEM;
err = init_node_manager(sbi);
if (err)
return err;
err = init_free_nid_cache(sbi);
if (err)
return err;
f2fs: combine nat_bits and free_nid_bitmap cache Both nat_bits cache and free_nid_bitmap cache provide same functionality as a intermediate cache between free nid cache and disk, but with different granularity of indicating free nid range, and different persistence policy. nat_bits cache provides better persistence ability, and free_nid_bitmap provides better granularity. In this patch we combine advantage of both caches, so finally policy of the intermediate cache would be: - init: load free nid status from nat_bits into free_nid_bitmap - lookup: scan free_nid_bitmap before load NAT blocks - update: update free_nid_bitmap in real-time - persistence: udpate and persist nat_bits in checkpoint This patch also resolves performance regression reported by lkp-robot. commit: 4ac912427c4214d8031d9ad6fbc3bc75e71512df ("f2fs: introduce free nid bitmap") d00030cf9cd0bb96fdccc41e33d3c91dcbb672ba ("f2fs: use __set{__clear}_bit_le") 1382c0f3f9d3f936c8bc42ed1591cf7a593ef9f7 ("f2fs: combine nat_bits and free_nid_bitmap cache") 4ac912427c4214d8 d00030cf9cd0bb96fdccc41e33 1382c0f3f9d3f936c8bc42ed15 ---------------- -------------------------- -------------------------- %stddev %change %stddev %change %stddev \ | \ | \ 77863 ± 0% +2.1% 79485 ± 1% +50.8% 117404 ± 0% aim7.jobs-per-min 231.63 ± 0% -2.0% 227.01 ± 1% -33.6% 153.80 ± 0% aim7.time.elapsed_time 231.63 ± 0% -2.0% 227.01 ± 1% -33.6% 153.80 ± 0% aim7.time.elapsed_time.max 896604 ± 0% -0.8% 889221 ± 3% -20.2% 715260 ± 1% aim7.time.involuntary_context_switches 2394 ± 1% +4.6% 2503 ± 1% +3.7% 2481 ± 2% aim7.time.maximum_resident_set_size 6240 ± 0% -1.5% 6145 ± 1% -14.1% 5360 ± 1% aim7.time.system_time 1111357 ± 3% +1.9% 1132509 ± 2% -6.2% 1041932 ± 2% aim7.time.voluntary_context_switches ... Signed-off-by: Chao Yu <yuchao0@huawei.com> Tested-by: Xiaolong Ye <xiaolong.ye@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2017-03-08 20:07:49 +08:00
/* load free nid status from nat_bits table */
load_free_nid_bitmap(sbi);
build_free_nids(sbi, true, true);
return 0;
}
void destroy_node_manager(struct f2fs_sb_info *sbi)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct free_nid *i, *next_i;
struct nat_entry *natvec[NATVEC_SIZE];
struct nat_entry_set *setvec[SETVEC_SIZE];
nid_t nid = 0;
unsigned int found;
if (!nm_i)
return;
/* destroy free nid list */
spin_lock(&nm_i->nid_list_lock);
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
list_for_each_entry_safe(i, next_i, &nm_i->free_nid_list, list) {
__remove_free_nid(sbi, i, FREE_NID);
spin_unlock(&nm_i->nid_list_lock);
kmem_cache_free(free_nid_slab, i);
spin_lock(&nm_i->nid_list_lock);
}
f2fs: updates on 4.15-rc1 Pull f2fs updates from Jaegeuk Kim: "In this round, we introduce sysfile-based quota support which is required for Android by default. In addition, we allow that users are able to reserve some blocks in runtime to mitigate performance drops in low free space. Enhancements: - assign proper data segments according to write_hints given by user - issue cache_flush on dirty devices only among multiple devices - exploit cp_error flag and add more faults to enhance fault injection test - conduct more readaheads during f2fs_readdir - add a range for discard commands Bug fixes: - fix zero stat->st_blocks when inline_data is set - drop crypto key and free stale memory pointer while evict_inode is failing - fix some corner cases in free space and segment management - fix wrong last_disk_size This series includes lots of clean-ups and code enhancement in terms of xattr operations, discard/flush command control. In addition, it adds versatile debugfs entries to monitor f2fs status" Cherry-picked from origin/upstream-f2fs-stable-linux-4.14.y: 7b538c1c32e1 f2fs: deny accessing encryption policy if encryption is off c43ffa1881bc f2fs: inject fault in inc_valid_node_count fa73e8745557 f2fs: expose quota information in debugfs eb538327e573 f2fs: separate nat entry mem alloc from nat_tree_lock a7c6829c1c38 f2fs: validate before set/clear free nat bitmap eb84a567f686 f2fs: avoid opened loop codes in __add_ino_entry 793cdb935708 f2fs: apply write hints to select the type of segments for buffered write 75a69567eefc f2fs: introduce scan_curseg_cache for cleanup 6180b68c28c0 f2fs: optimize the way of traversing free_nid_bitmap 221656e4b864 f2fs: keep scanning until enough free nids are acquired 0b0a1e72b5d5 f2fs: trace checkpoint reason in fsync() af75a621ef34 f2fs: keep isize once block is reserved cross EOF 3b96799dba53 f2fs: avoid race in between GC and block exchange c33a70d7192d f2fs: save a multiplication for last_nid calculation 4c8fdcd5d79e f2fs: fix summary info corruption ff95a94dd04c f2fs: remove dead code in update_meta_page c7f08b508dc6 f2fs: remove unneeded semicolon 91d560341eab f2fs: don't bother with inode->i_version 270e78cfc169 f2fs: check curseg space before foreground GC d3ad907d7caa f2fs: use rw_semaphore to protect SIT cache d9e1a6b6966b f2fs: support quota sys files 3aec74eb20fe f2fs: add quota_ino feature infra cf9435582aae f2fs: optimize __update_nat_bits e56a876fd562 f2fs: modify for accurate fggc node io stat a39d96b9a10c Revert "f2fs: handle dirty segments inside refresh_sit_entry" 0ccccb3839f5 f2fs: add a function to move nid cd3b86fce8dd f2fs: export SSR allocation threshold ca50229b7ef5 f2fs: give correct trimmed blocks in fstrim 73b8db889f80 f2fs: support bio allocation error injection b8a938e4f875 f2fs: support get_page error injection f2b91f22a9a2 f2fs: add missing sysfs description 6cef55704e9e f2fs: support soft block reservation cef5e7165c08 f2fs: handle error case when adding xattr entry a7848c0dee2c f2fs: support flexible inline xattr size c63143060c45 f2fs: show current cp state 032d140917f9 f2fs: add missing quota_initialize f241f66c3aee f2fs: show # of dirty segments via sysfs 1687d9f07bc3 f2fs: stop all the operations by cp_error flag f793a2c291f9 f2fs: remove several redundant assignments fb000836b122 f2fs: avoid using timespec a4b9ed205158 f2fs: fix to correct no_fggc_candidate bc69d5602412 Revert "f2fs: return wrong error number on f2fs_quota_write" f49f4124b02e f2fs: remove obsolete pointer for truncate_xattr_node c6bfa17c9fc4 f2fs: retry ENOMEM for quota_read|write 5e14327f2573 f2fs: limit # of inmemory pages a064458a6d7d f2fs: update ctx->pos correctly when hitting hole in directory 372b93f94f7e f2fs: relocate readahead codes in readdir() 457e9c032c4a f2fs: allow readdir() to be interrupted 2d1af27c57f9 f2fs: trace f2fs_readdir 7bbdc74b724a f2fs: trace f2fs_lookup 76e8f60644aa f2fs: skip searching non-exist range in truncate_hole 2f18884d3c65 f2fs: avoid stale fi->gdirty_list pointer 0dbf4fd41748 f2fs/crypto: drop crypto key at evict_inode only 8c5827634ad6 f2fs: fix to avoid race when accessing last_disk_size c2e2eec698e2 f2fs: Fix bool initialization/comparison ab0a7977c988 f2fs: give up CP_TRIMMED_FLAG if it drops discards 001cc0b0c526 f2fs: trace f2fs_remove_discard c72699d2320d f2fs: reduce cmd_lock coverage in __issue_discard_cmd 0eeceeb20671 f2fs: split discard policy 775d0e58bb72 f2fs: wrap discard policy 77b5bf3aaf14 f2fs: support issuing/waiting discard in range 6b50d3ec7d11 f2fs: fix to flush multiple device in checkpoint 5483b178450e f2fs: enhance multiple device flush 06800576e497 f2fs: fix to show ino management cache size correctly a815ce9938f4 f2fs: drop FI_UPDATE_WRITE tag after f2fs_issue_flush 3257c6570745 f2fs: obsolete ALLOC_NID_LIST list d54bf9da4f50 f2fs: convert inline data for direct I/O & FI_NO_PREALLOC 32c57300f669 f2fs: allow readpages with NULL file pointer dba2b4548cf9 f2fs: show flush list status in sysfs fae7dc47bdda f2fs: introduce read_xattr_block 148edd027e9c f2fs: introduce read_inline_xattr b735df5e29d1 Revert "f2fs: reuse nids more aggressively" 13e34cbab66f Revert "f2fs: node segment is prior to data segment selected victim" a76d81af17ce f2fs: fix to clear FI_NO_PREALLOC Bug: 70801385 Change-Id: I3b8e0c21f4f8d52b669776fce41df77a4363d473 Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2017-09-23 17:02:18 +08:00
f2fs_bug_on(sbi, nm_i->nid_cnt[FREE_NID]);
f2fs_bug_on(sbi, nm_i->nid_cnt[PREALLOC_NID]);
f2fs_bug_on(sbi, !list_empty(&nm_i->free_nid_list));
spin_unlock(&nm_i->nid_list_lock);
/* destroy nat cache */
down_write(&nm_i->nat_tree_lock);
while ((found = __gang_lookup_nat_cache(nm_i,
nid, NATVEC_SIZE, natvec))) {
unsigned idx;
nid = nat_get_nid(natvec[found - 1]) + 1;
for (idx = 0; idx < found; idx++)
__del_from_nat_cache(nm_i, natvec[idx]);
}
f2fs_bug_on(sbi, nm_i->nat_cnt);
/* destroy nat set cache */
nid = 0;
while ((found = __gang_lookup_nat_set(nm_i,
nid, SETVEC_SIZE, setvec))) {
unsigned idx;
nid = setvec[found - 1]->set + 1;
for (idx = 0; idx < found; idx++) {
/* entry_cnt is not zero, when cp_error was occurred */
f2fs_bug_on(sbi, !list_empty(&setvec[idx]->entry_list));
radix_tree_delete(&nm_i->nat_set_root, setvec[idx]->set);
kmem_cache_free(nat_entry_set_slab, setvec[idx]);
}
}
up_write(&nm_i->nat_tree_lock);
kvfree(nm_i->nat_block_bitmap);
kvfree(nm_i->free_nid_bitmap);
kvfree(nm_i->free_nid_count);
kfree(nm_i->nat_bitmap);
kfree(nm_i->nat_bits);
#ifdef CONFIG_F2FS_CHECK_FS
kfree(nm_i->nat_bitmap_mir);
#endif
sbi->nm_info = NULL;
kfree(nm_i);
}
int __init create_node_manager_caches(void)
{
nat_entry_slab = f2fs_kmem_cache_create("nat_entry",
sizeof(struct nat_entry));
if (!nat_entry_slab)
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
goto fail;
free_nid_slab = f2fs_kmem_cache_create("free_nid",
sizeof(struct free_nid));
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
if (!free_nid_slab)
goto destroy_nat_entry;
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
nat_entry_set_slab = f2fs_kmem_cache_create("nat_entry_set",
sizeof(struct nat_entry_set));
if (!nat_entry_set_slab)
goto destroy_free_nid;
return 0;
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
destroy_free_nid:
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
kmem_cache_destroy(free_nid_slab);
destroy_nat_entry:
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
kmem_cache_destroy(nat_entry_slab);
fail:
return -ENOMEM;
}
void destroy_node_manager_caches(void)
{
f2fs: refactor flush_nat_entries codes for reducing NAT writes Although building NAT journal in cursum reduce the read/write work for NAT block, but previous design leave us lower performance when write checkpoint frequently for these cases: 1. if journal in cursum has already full, it's a bit of waste that we flush all nat entries to page for persistence, but not to cache any entries. 2. if journal in cursum is not full, we fill nat entries to journal util journal is full, then flush the left dirty entries to disk without merge journaled entries, so these journaled entries may be flushed to disk at next checkpoint but lost chance to flushed last time. In this patch we merge dirty entries located in same NAT block to nat entry set, and linked all set to list, sorted ascending order by entries' count of set. Later we flush entries in sparse set into journal as many as we can, and then flush merged entries to disk. In this way we can not only gain in performance, but also save lifetime of flash device. In my testing environment, it shows this patch can help to reduce NAT block writes obviously. In hard disk test case: cost time of fsstress is stablely reduced by about 5%. 1. virtual machine + hard disk: fsstress -p 20 -n 200 -l 5 node num cp count nodes/cp based 4599.6 1803.0 2.551 patched 2714.6 1829.6 1.483 2. virtual machine + 32g micro SD card: fsstress -p 20 -n 200 -l 1 -w -f chown=0 -f creat=4 -f dwrite=0 -f fdatasync=4 -f fsync=4 -f link=0 -f mkdir=4 -f mknod=4 -f rename=5 -f rmdir=5 -f symlink=0 -f truncate=4 -f unlink=5 -f write=0 -S node num cp count nodes/cp based 84.5 43.7 1.933 patched 49.2 40.0 1.23 Our latency of merging op shows not bad when handling extreme case like: merging a great number of dirty nats: latency(ns) dirty nat count 3089219 24922 5129423 27422 4000250 24523 change log from v1: o fix wrong logic in add_nat_entry when grab a new nat entry set. o swith to create slab cache in create_node_manager_caches. o use GFP_ATOMIC instead of GFP_NOFS to avoid potential long latency. change log from v2: o make comment position more appropriate suggested by Jaegeuk Kim. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
2014-06-24 09:18:20 +08:00
kmem_cache_destroy(nat_entry_set_slab);
kmem_cache_destroy(free_nid_slab);
kmem_cache_destroy(nat_entry_slab);
}