msm-4.14/fs/f2fs/node.h

450 lines
12 KiB
C
Raw Normal View History

/*
* fs/f2fs/node.h
*
* 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.
*/
/* start node id of a node block dedicated to the given node id */
#define START_NID(nid) (((nid) / NAT_ENTRY_PER_BLOCK) * NAT_ENTRY_PER_BLOCK)
/* node block offset on the NAT area dedicated to the given start node id */
#define NAT_BLOCK_OFFSET(start_nid) ((start_nid) / NAT_ENTRY_PER_BLOCK)
/* # of pages to perform synchronous readahead before building free nids */
#define FREE_NID_PAGES 8
#define MAX_FREE_NIDS (NAT_ENTRY_PER_BLOCK * FREE_NID_PAGES)
#define DEF_RA_NID_PAGES 0 /* # of nid pages to be readaheaded */
/* maximum readahead size for node during getting data blocks */
#define MAX_RA_NODE 128
/* control the memory footprint threshold (10MB per 1GB ram) */
#define DEF_RAM_THRESHOLD 1
/* control dirty nats ratio threshold (default: 10% over max nid count) */
#define DEF_DIRTY_NAT_RATIO_THRESHOLD 10
/* control total # of nats */
#define DEF_NAT_CACHE_THRESHOLD 100000
/* vector size for gang look-up from nat cache that consists of radix tree */
#define NATVEC_SIZE 64
#define SETVEC_SIZE 32
/* return value for read_node_page */
#define LOCKED_PAGE 1
/* For flag in struct node_info */
enum {
IS_CHECKPOINTED, /* is it checkpointed before? */
HAS_FSYNCED_INODE, /* is the inode fsynced before? */
HAS_LAST_FSYNC, /* has the latest node fsync mark? */
IS_DIRTY, /* this nat entry is dirty? */
f2fs/fscrypt: updates to v4.17-rc1 Pull f2fs update from Jaegeuk Kim: "In this round, we've mainly focused on performance tuning and critical bug fixes occurred in low-end devices. Sheng Yong introduced lost_found feature to keep missing files during recovery instead of thrashing them. We're preparing coming fsverity implementation. And, we've got more features to communicate with users for better performance. In low-end devices, some memory-related issues were fixed, and subtle race condtions and corner cases were addressed as well. Enhancements: - large nat bitmaps for more free node ids - add three block allocation policies to pass down write hints given by user - expose extension list to user and introduce hot file extension - tune small devices seamlessly for low-end devices - set readdir_ra by default - give more resources under gc_urgent mode regarding to discard and cleaning - introduce fsync_mode to enforce posix or not - nowait aio support - add lost_found feature to keep dangling inodes - reserve bits for future fsverity feature - add test_dummy_encryption for FBE Bug fixes: - don't use highmem for dentry pages - align memory boundary for bitops - truncate preallocated blocks in write errors - guarantee i_times on fsync call - clear CP_TRIMMED_FLAG correctly - prevent node chain loop during recovery - avoid data race between atomic write and background cleaning - avoid unnecessary selinux violation warnings on resgid option - GFP_NOFS to avoid deadlock in quota and read paths - fix f2fs_skip_inode_update to allow i_size recovery In addition to the above, there are several minor bug fixes and clean-ups" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: de465aa57271 f2fs: remain written times to update inode during fsync d0ebaf0b37b2 f2fs: make assignment of t->dentry_bitmap more readable 7f05fb451696 f2fs: truncate preallocated blocks in error case a0a9a51ecdd1 f2fs: fix a wrong condition in f2fs_skip_inode_update 5dc89047c9e8 f2fs: reserve bits for fs-verity 0751f01376d5 f2fs: Add a segment type check in inplace write 27d9598d4d38 f2fs: no need to initialize zero value for GFP_F2FS_ZERO 42a34ff76240 f2fs: don't track new nat entry in nat set 14040505a620 f2fs: clean up with F2FS_BLK_ALIGN fcea9e00a0ea f2fs: check blkaddr more accuratly before issue a bio 2c217b078fee f2fs: Set GF_NOFS in read_cache_page_gfp while doing f2fs_quota_read 0a8cedc2cea3 f2fs: introduce a new mount option test_dummy_encryption 5786b414a719 f2fs: introduce F2FS_FEATURE_LOST_FOUND feature 9813cae680f0 f2fs: release locks before return in f2fs_ioc_gc_range() cee6482cd12c f2fs: align memory boundary for bitops 8dbfcba5f5d6 f2fs: remove unneeded set_cold_node() 7e93bf8ebc34 f2fs: add nowait aio support 1e64d3ed2753 f2fs: wrap all options with f2fs_sb_info.mount_opt 7f270a67a1da f2fs: Don't overwrite all types of node to keep node chain c6a9e6a41f4f f2fs: introduce mount option for fsync mode 82bebed3c1fd f2fs: fix to restore old mount option in ->remount_fs 808427a63b93 f2fs: wrap sb_rdonly with f2fs_readonly 5ebe362c0c60 f2fs: avoid selinux denial on CAP_SYS_RESOURCE ea34734357a9 f2fs: support hot file extension 2189c2e46468 f2fs: fix to avoid race in between atomic write and background GC 5f6950805928 f2fs: do gc in greedy mode for whole range if gc_urgent mode is set 79f1a15fa536 f2fs: issue discard aggressively in the gc_urgent mode aea8da88a747 f2fs: set readdir_ra by default 8fe06ea28273 f2fs: add auto tuning for small devices 073c145d5bef f2fs: add mount option for segment allocation policy e7efe40d7aa5 f2fs: don't stop GC if GC is contended 882d0e094488 f2fs: expose extension_list sysfs entry 52320a2a28be f2fs: fix to set KEEP_SIZE bit in f2fs_zero_range ef66237f28e9 f2fs: introduce sb_lock to make encrypt pwsalt update exclusive c8e77267ed1f f2fs: remove redundant initialization of pointer 'p' 755dcc3262d4 f2fs: flush cp pack except cp pack 2 page at first 92223ccb699a f2fs: clean up f2fs_sb_has_xxx functions d8ecd46ca803 f2fs: remove redundant check of page type when submit bio 99f512132e54 f2fs: fix to handle looped node chain during recovery 66a2346def3d f2fs: handle quota for orphan inodes bd9e1956d17e f2fs: support passing down write hints to block layer with F2FS policy d8f02c3b68c5 f2fs: support passing down write hints given by users to block layer d4fff1411d4e f2fs: fix to clear CP_TRIMMED_FLAG f50100868cb8 f2fs: support large nat bitmap e9437125502c f2fs: fix to check extent cache in f2fs_drop_extent_tree 5c1d55c37f2c f2fs: restrict inline_xattr_size configuration 74d48dc6ec93 f2fs: fix heap mode to reset it back 68afcb259568 f2fs: fix potential corruption in area before F2FS_SUPER_OFFSET 6b4edfb10398 fscrypt: fix build with pre-4.6 gcc versions 4bcc4865feab fscrypt: remove 'ci' parameter from fscrypt_put_encryption_info() 69e5234f04b6 fscrypt: fix up fscrypt_fname_encrypted_size() for internal use 7919cba92304 fscrypt: define fscrypt_fname_alloc_buffer() to be for presented names aef0017f3b1a fscrypt: calculate NUL-padding length in one place only 5232cae0e922 fscrypt: move fscrypt_symlink_data to fscrypt_private.h 169bd9ba8542 ubifs: switch to fscrypt_get_symlink() 63498ca7def3 ubifs: switch to fscrypt ->symlink() helper functions a85637d12cb1 fscrypt: remove fscrypt_fname_usr_to_disk() 77bb20f72679 ext4: switch to fscrypt_get_symlink() 79b3f39a2e79 ext4: switch to fscrypt ->symlink() helper functions 70fe2fb67bc6 f2fs: switch to fscrypt_get_symlink() 96dda4e02d6b f2fs: switch to fscrypt ->symlink() helper functions 0063988cc044 fscrypt: new helper function - fscrypt_get_symlink() 48a0375c8889 fscrypt: new helper functions for ->symlink() 585a194dd1d0 fscrypt: trim down fscrypt.h includes 411771ab56f4 fscrypt: move fscrypt_is_dot_dotdot() to fs/crypto/fname.c ad35db34396b fscrypt: move fscrypt_valid_enc_modes() to fscrypt_private.h 72b3e1c61d8b fscrypt: move fscrypt_operations declaration to fscrypt_supp.h 2fa9a1f9268a fscrypt: split fscrypt_dummy_context_enabled() into supp/notsupp versions e298b5de1cca fscrypt: move fscrypt_ctx declaration to fscrypt_supp.h 8db0a6de3cf0 fscrypt: move fscrypt_info_cachep declaration to fscrypt_private.h c73c350ade4e fscrypt: move fscrypt_control_page() to supp/notsupp headers ca64f2f4609d fscrypt: move fscrypt_has_encryption_key() to supp/notsupp headers Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2018-01-05 10:44:52 -08:00
IS_PREALLOC, /* nat entry is preallocated */
};
/*
* For node information
*/
struct node_info {
nid_t nid; /* node id */
nid_t ino; /* inode number of the node's owner */
block_t blk_addr; /* block address of the node */
unsigned char version; /* version of the node */
unsigned char flag; /* for node information bits */
};
struct nat_entry {
struct list_head list; /* for clean or dirty nat list */
struct node_info ni; /* in-memory node information */
};
#define nat_get_nid(nat) ((nat)->ni.nid)
#define nat_set_nid(nat, n) ((nat)->ni.nid = (n))
#define nat_get_blkaddr(nat) ((nat)->ni.blk_addr)
#define nat_set_blkaddr(nat, b) ((nat)->ni.blk_addr = (b))
#define nat_get_ino(nat) ((nat)->ni.ino)
#define nat_set_ino(nat, i) ((nat)->ni.ino = (i))
#define nat_get_version(nat) ((nat)->ni.version)
#define nat_set_version(nat, v) ((nat)->ni.version = (v))
#define inc_node_version(version) (++(version))
static inline void copy_node_info(struct node_info *dst,
struct node_info *src)
{
dst->nid = src->nid;
dst->ino = src->ino;
dst->blk_addr = src->blk_addr;
dst->version = src->version;
/* should not copy flag here */
}
static inline void set_nat_flag(struct nat_entry *ne,
unsigned int type, bool set)
{
unsigned char mask = 0x01 << type;
if (set)
ne->ni.flag |= mask;
else
ne->ni.flag &= ~mask;
}
static inline bool get_nat_flag(struct nat_entry *ne, unsigned int type)
{
unsigned char mask = 0x01 << type;
return ne->ni.flag & mask;
}
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
static inline void nat_reset_flag(struct nat_entry *ne)
{
/* these states can be set only after checkpoint was done */
set_nat_flag(ne, IS_CHECKPOINTED, true);
set_nat_flag(ne, HAS_FSYNCED_INODE, false);
set_nat_flag(ne, HAS_LAST_FSYNC, true);
}
static inline void node_info_from_raw_nat(struct node_info *ni,
struct f2fs_nat_entry *raw_ne)
{
ni->ino = le32_to_cpu(raw_ne->ino);
ni->blk_addr = le32_to_cpu(raw_ne->block_addr);
ni->version = raw_ne->version;
}
static inline void raw_nat_from_node_info(struct f2fs_nat_entry *raw_ne,
struct node_info *ni)
{
raw_ne->ino = cpu_to_le32(ni->ino);
raw_ne->block_addr = cpu_to_le32(ni->blk_addr);
raw_ne->version = ni->version;
}
static inline bool excess_dirty_nats(struct f2fs_sb_info *sbi)
{
return NM_I(sbi)->dirty_nat_cnt >= NM_I(sbi)->max_nid *
NM_I(sbi)->dirty_nats_ratio / 100;
}
static inline bool excess_cached_nats(struct f2fs_sb_info *sbi)
{
return NM_I(sbi)->nat_cnt >= DEF_NAT_CACHE_THRESHOLD;
}
enum mem_type {
FREE_NIDS, /* indicates the free nid list */
NAT_ENTRIES, /* indicates the cached nat entry */
DIRTY_DENTS, /* indicates dirty dentry pages */
INO_ENTRIES, /* indicates inode entries */
EXTENT_CACHE, /* indicates extent cache */
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
INMEM_PAGES, /* indicates inmemory pages */
BASE_CHECK, /* check kernel status */
};
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
struct nat_entry_set {
struct list_head set_list; /* link with other nat sets */
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
struct list_head entry_list; /* link with dirty nat entries */
nid_t set; /* set number*/
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
unsigned int entry_cnt; /* the # of nat entries in set */
};
struct free_nid {
struct list_head list; /* for free node id list */
nid_t nid; /* node id */
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 state; /* in use or not: FREE_NID or PREALLOC_NID */
};
static inline void next_free_nid(struct f2fs_sb_info *sbi, nid_t *nid)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
struct free_nid *fnid;
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
if (nm_i->nid_cnt[FREE_NID] <= 0) {
spin_unlock(&nm_i->nid_list_lock);
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
fnid = list_first_entry(&nm_i->free_nid_list, struct free_nid, list);
*nid = fnid->nid;
spin_unlock(&nm_i->nid_list_lock);
}
/*
* inline functions
*/
static inline void get_nat_bitmap(struct f2fs_sb_info *sbi, void *addr)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
#ifdef CONFIG_F2FS_CHECK_FS
if (memcmp(nm_i->nat_bitmap, nm_i->nat_bitmap_mir,
nm_i->bitmap_size))
f2fs_bug_on(sbi, 1);
#endif
memcpy(addr, nm_i->nat_bitmap, nm_i->bitmap_size);
}
static inline pgoff_t current_nat_addr(struct f2fs_sb_info *sbi, nid_t start)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
pgoff_t block_off;
pgoff_t block_addr;
/*
* block_off = segment_off * 512 + off_in_segment
* OLD = (segment_off * 512) * 2 + off_in_segment
* NEW = 2 * (segment_off * 512 + off_in_segment) - off_in_segment
*/
block_off = NAT_BLOCK_OFFSET(start);
block_addr = (pgoff_t)(nm_i->nat_blkaddr +
(block_off << 1) -
(block_off & (sbi->blocks_per_seg - 1)));
if (f2fs_test_bit(block_off, nm_i->nat_bitmap))
block_addr += sbi->blocks_per_seg;
return block_addr;
}
static inline pgoff_t next_nat_addr(struct f2fs_sb_info *sbi,
pgoff_t block_addr)
{
struct f2fs_nm_info *nm_i = NM_I(sbi);
block_addr -= nm_i->nat_blkaddr;
block_addr ^= 1 << sbi->log_blocks_per_seg;
return block_addr + nm_i->nat_blkaddr;
}
static inline void set_to_next_nat(struct f2fs_nm_info *nm_i, nid_t start_nid)
{
unsigned int block_off = NAT_BLOCK_OFFSET(start_nid);
f2fs_change_bit(block_off, nm_i->nat_bitmap);
#ifdef CONFIG_F2FS_CHECK_FS
f2fs_change_bit(block_off, nm_i->nat_bitmap_mir);
#endif
}
static inline nid_t ino_of_node(struct page *node_page)
{
struct f2fs_node *rn = F2FS_NODE(node_page);
return le32_to_cpu(rn->footer.ino);
}
static inline nid_t nid_of_node(struct page *node_page)
{
struct f2fs_node *rn = F2FS_NODE(node_page);
return le32_to_cpu(rn->footer.nid);
}
static inline unsigned int ofs_of_node(struct page *node_page)
{
struct f2fs_node *rn = F2FS_NODE(node_page);
unsigned flag = le32_to_cpu(rn->footer.flag);
return flag >> OFFSET_BIT_SHIFT;
}
static inline __u64 cpver_of_node(struct page *node_page)
{
struct f2fs_node *rn = F2FS_NODE(node_page);
return le64_to_cpu(rn->footer.cp_ver);
}
static inline block_t next_blkaddr_of_node(struct page *node_page)
{
struct f2fs_node *rn = F2FS_NODE(node_page);
return le32_to_cpu(rn->footer.next_blkaddr);
}
static inline void fill_node_footer(struct page *page, nid_t nid,
nid_t ino, unsigned int ofs, bool reset)
{
struct f2fs_node *rn = F2FS_NODE(page);
unsigned int old_flag = 0;
if (reset)
memset(rn, 0, sizeof(*rn));
else
old_flag = le32_to_cpu(rn->footer.flag);
rn->footer.nid = cpu_to_le32(nid);
rn->footer.ino = cpu_to_le32(ino);
/* should remain old flag bits such as COLD_BIT_SHIFT */
rn->footer.flag = cpu_to_le32((ofs << OFFSET_BIT_SHIFT) |
(old_flag & OFFSET_BIT_MASK));
}
static inline void copy_node_footer(struct page *dst, struct page *src)
{
struct f2fs_node *src_rn = F2FS_NODE(src);
struct f2fs_node *dst_rn = F2FS_NODE(dst);
memcpy(&dst_rn->footer, &src_rn->footer, sizeof(struct node_footer));
}
static inline void fill_node_footer_blkaddr(struct page *page, block_t blkaddr)
{
struct f2fs_checkpoint *ckpt = F2FS_CKPT(F2FS_P_SB(page));
struct f2fs_node *rn = F2FS_NODE(page);
__u64 cp_ver = cur_cp_version(ckpt);
if (__is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG))
cp_ver |= (cur_cp_crc(ckpt) << 32);
rn->footer.cp_ver = cpu_to_le64(cp_ver);
rn->footer.next_blkaddr = cpu_to_le32(blkaddr);
}
static inline bool is_recoverable_dnode(struct page *page)
{
struct f2fs_checkpoint *ckpt = F2FS_CKPT(F2FS_P_SB(page));
__u64 cp_ver = cur_cp_version(ckpt);
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
/* Don't care crc part, if fsck.f2fs sets it. */
if (__is_set_ckpt_flags(ckpt, CP_NOCRC_RECOVERY_FLAG))
return (cp_ver << 32) == (cpver_of_node(page) << 32);
if (__is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG))
cp_ver |= (cur_cp_crc(ckpt) << 32);
return cp_ver == cpver_of_node(page);
}
/*
* f2fs assigns the following node offsets described as (num).
* N = NIDS_PER_BLOCK
*
* Inode block (0)
* |- direct node (1)
* |- direct node (2)
* |- indirect node (3)
* | `- direct node (4 => 4 + N - 1)
* |- indirect node (4 + N)
* | `- direct node (5 + N => 5 + 2N - 1)
* `- double indirect node (5 + 2N)
* `- indirect node (6 + 2N)
* `- direct node
* ......
* `- indirect node ((6 + 2N) + x(N + 1))
* `- direct node
* ......
* `- indirect node ((6 + 2N) + (N - 1)(N + 1))
* `- direct node
*/
static inline bool IS_DNODE(struct page *node_page)
{
unsigned int ofs = ofs_of_node(node_page);
if (f2fs_has_xattr_block(ofs))
return true;
if (ofs == 3 || ofs == 4 + NIDS_PER_BLOCK ||
ofs == 5 + 2 * NIDS_PER_BLOCK)
return false;
if (ofs >= 6 + 2 * NIDS_PER_BLOCK) {
ofs -= 6 + 2 * NIDS_PER_BLOCK;
if (!((long int)ofs % (NIDS_PER_BLOCK + 1)))
return false;
}
return true;
}
static inline int set_nid(struct page *p, int off, nid_t nid, bool i)
{
struct f2fs_node *rn = F2FS_NODE(p);
f2fs_wait_on_page_writeback(p, NODE, true);
if (i)
rn->i.i_nid[off - NODE_DIR1_BLOCK] = cpu_to_le32(nid);
else
rn->in.nid[off] = cpu_to_le32(nid);
return set_page_dirty(p);
}
static inline nid_t get_nid(struct page *p, int off, bool i)
{
struct f2fs_node *rn = F2FS_NODE(p);
if (i)
return le32_to_cpu(rn->i.i_nid[off - NODE_DIR1_BLOCK]);
return le32_to_cpu(rn->in.nid[off]);
}
/*
* Coldness identification:
* - Mark cold files in f2fs_inode_info
* - Mark cold node blocks in their node footer
* - Mark cold data pages in page cache
*/
static inline int is_cold_data(struct page *page)
{
return PageChecked(page);
}
static inline void set_cold_data(struct page *page)
{
SetPageChecked(page);
}
static inline void clear_cold_data(struct page *page)
{
ClearPageChecked(page);
}
static inline int is_node(struct page *page, int type)
{
struct f2fs_node *rn = F2FS_NODE(page);
return le32_to_cpu(rn->footer.flag) & (1 << type);
}
#define is_cold_node(page) is_node(page, COLD_BIT_SHIFT)
#define is_fsync_dnode(page) is_node(page, FSYNC_BIT_SHIFT)
#define is_dent_dnode(page) is_node(page, DENT_BIT_SHIFT)
static inline int is_inline_node(struct page *page)
{
return PageChecked(page);
}
static inline void set_inline_node(struct page *page)
{
SetPageChecked(page);
}
static inline void clear_inline_node(struct page *page)
{
ClearPageChecked(page);
}
f2fs/fscrypt: updates to v4.17-rc1 Pull f2fs update from Jaegeuk Kim: "In this round, we've mainly focused on performance tuning and critical bug fixes occurred in low-end devices. Sheng Yong introduced lost_found feature to keep missing files during recovery instead of thrashing them. We're preparing coming fsverity implementation. And, we've got more features to communicate with users for better performance. In low-end devices, some memory-related issues were fixed, and subtle race condtions and corner cases were addressed as well. Enhancements: - large nat bitmaps for more free node ids - add three block allocation policies to pass down write hints given by user - expose extension list to user and introduce hot file extension - tune small devices seamlessly for low-end devices - set readdir_ra by default - give more resources under gc_urgent mode regarding to discard and cleaning - introduce fsync_mode to enforce posix or not - nowait aio support - add lost_found feature to keep dangling inodes - reserve bits for future fsverity feature - add test_dummy_encryption for FBE Bug fixes: - don't use highmem for dentry pages - align memory boundary for bitops - truncate preallocated blocks in write errors - guarantee i_times on fsync call - clear CP_TRIMMED_FLAG correctly - prevent node chain loop during recovery - avoid data race between atomic write and background cleaning - avoid unnecessary selinux violation warnings on resgid option - GFP_NOFS to avoid deadlock in quota and read paths - fix f2fs_skip_inode_update to allow i_size recovery In addition to the above, there are several minor bug fixes and clean-ups" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: de465aa57271 f2fs: remain written times to update inode during fsync d0ebaf0b37b2 f2fs: make assignment of t->dentry_bitmap more readable 7f05fb451696 f2fs: truncate preallocated blocks in error case a0a9a51ecdd1 f2fs: fix a wrong condition in f2fs_skip_inode_update 5dc89047c9e8 f2fs: reserve bits for fs-verity 0751f01376d5 f2fs: Add a segment type check in inplace write 27d9598d4d38 f2fs: no need to initialize zero value for GFP_F2FS_ZERO 42a34ff76240 f2fs: don't track new nat entry in nat set 14040505a620 f2fs: clean up with F2FS_BLK_ALIGN fcea9e00a0ea f2fs: check blkaddr more accuratly before issue a bio 2c217b078fee f2fs: Set GF_NOFS in read_cache_page_gfp while doing f2fs_quota_read 0a8cedc2cea3 f2fs: introduce a new mount option test_dummy_encryption 5786b414a719 f2fs: introduce F2FS_FEATURE_LOST_FOUND feature 9813cae680f0 f2fs: release locks before return in f2fs_ioc_gc_range() cee6482cd12c f2fs: align memory boundary for bitops 8dbfcba5f5d6 f2fs: remove unneeded set_cold_node() 7e93bf8ebc34 f2fs: add nowait aio support 1e64d3ed2753 f2fs: wrap all options with f2fs_sb_info.mount_opt 7f270a67a1da f2fs: Don't overwrite all types of node to keep node chain c6a9e6a41f4f f2fs: introduce mount option for fsync mode 82bebed3c1fd f2fs: fix to restore old mount option in ->remount_fs 808427a63b93 f2fs: wrap sb_rdonly with f2fs_readonly 5ebe362c0c60 f2fs: avoid selinux denial on CAP_SYS_RESOURCE ea34734357a9 f2fs: support hot file extension 2189c2e46468 f2fs: fix to avoid race in between atomic write and background GC 5f6950805928 f2fs: do gc in greedy mode for whole range if gc_urgent mode is set 79f1a15fa536 f2fs: issue discard aggressively in the gc_urgent mode aea8da88a747 f2fs: set readdir_ra by default 8fe06ea28273 f2fs: add auto tuning for small devices 073c145d5bef f2fs: add mount option for segment allocation policy e7efe40d7aa5 f2fs: don't stop GC if GC is contended 882d0e094488 f2fs: expose extension_list sysfs entry 52320a2a28be f2fs: fix to set KEEP_SIZE bit in f2fs_zero_range ef66237f28e9 f2fs: introduce sb_lock to make encrypt pwsalt update exclusive c8e77267ed1f f2fs: remove redundant initialization of pointer 'p' 755dcc3262d4 f2fs: flush cp pack except cp pack 2 page at first 92223ccb699a f2fs: clean up f2fs_sb_has_xxx functions d8ecd46ca803 f2fs: remove redundant check of page type when submit bio 99f512132e54 f2fs: fix to handle looped node chain during recovery 66a2346def3d f2fs: handle quota for orphan inodes bd9e1956d17e f2fs: support passing down write hints to block layer with F2FS policy d8f02c3b68c5 f2fs: support passing down write hints given by users to block layer d4fff1411d4e f2fs: fix to clear CP_TRIMMED_FLAG f50100868cb8 f2fs: support large nat bitmap e9437125502c f2fs: fix to check extent cache in f2fs_drop_extent_tree 5c1d55c37f2c f2fs: restrict inline_xattr_size configuration 74d48dc6ec93 f2fs: fix heap mode to reset it back 68afcb259568 f2fs: fix potential corruption in area before F2FS_SUPER_OFFSET 6b4edfb10398 fscrypt: fix build with pre-4.6 gcc versions 4bcc4865feab fscrypt: remove 'ci' parameter from fscrypt_put_encryption_info() 69e5234f04b6 fscrypt: fix up fscrypt_fname_encrypted_size() for internal use 7919cba92304 fscrypt: define fscrypt_fname_alloc_buffer() to be for presented names aef0017f3b1a fscrypt: calculate NUL-padding length in one place only 5232cae0e922 fscrypt: move fscrypt_symlink_data to fscrypt_private.h 169bd9ba8542 ubifs: switch to fscrypt_get_symlink() 63498ca7def3 ubifs: switch to fscrypt ->symlink() helper functions a85637d12cb1 fscrypt: remove fscrypt_fname_usr_to_disk() 77bb20f72679 ext4: switch to fscrypt_get_symlink() 79b3f39a2e79 ext4: switch to fscrypt ->symlink() helper functions 70fe2fb67bc6 f2fs: switch to fscrypt_get_symlink() 96dda4e02d6b f2fs: switch to fscrypt ->symlink() helper functions 0063988cc044 fscrypt: new helper function - fscrypt_get_symlink() 48a0375c8889 fscrypt: new helper functions for ->symlink() 585a194dd1d0 fscrypt: trim down fscrypt.h includes 411771ab56f4 fscrypt: move fscrypt_is_dot_dotdot() to fs/crypto/fname.c ad35db34396b fscrypt: move fscrypt_valid_enc_modes() to fscrypt_private.h 72b3e1c61d8b fscrypt: move fscrypt_operations declaration to fscrypt_supp.h 2fa9a1f9268a fscrypt: split fscrypt_dummy_context_enabled() into supp/notsupp versions e298b5de1cca fscrypt: move fscrypt_ctx declaration to fscrypt_supp.h 8db0a6de3cf0 fscrypt: move fscrypt_info_cachep declaration to fscrypt_private.h c73c350ade4e fscrypt: move fscrypt_control_page() to supp/notsupp headers ca64f2f4609d fscrypt: move fscrypt_has_encryption_key() to supp/notsupp headers Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2018-01-05 10:44:52 -08:00
static inline void set_cold_node(struct page *page, bool is_dir)
{
struct f2fs_node *rn = F2FS_NODE(page);
unsigned int flag = le32_to_cpu(rn->footer.flag);
f2fs/fscrypt: updates to v4.17-rc1 Pull f2fs update from Jaegeuk Kim: "In this round, we've mainly focused on performance tuning and critical bug fixes occurred in low-end devices. Sheng Yong introduced lost_found feature to keep missing files during recovery instead of thrashing them. We're preparing coming fsverity implementation. And, we've got more features to communicate with users for better performance. In low-end devices, some memory-related issues were fixed, and subtle race condtions and corner cases were addressed as well. Enhancements: - large nat bitmaps for more free node ids - add three block allocation policies to pass down write hints given by user - expose extension list to user and introduce hot file extension - tune small devices seamlessly for low-end devices - set readdir_ra by default - give more resources under gc_urgent mode regarding to discard and cleaning - introduce fsync_mode to enforce posix or not - nowait aio support - add lost_found feature to keep dangling inodes - reserve bits for future fsverity feature - add test_dummy_encryption for FBE Bug fixes: - don't use highmem for dentry pages - align memory boundary for bitops - truncate preallocated blocks in write errors - guarantee i_times on fsync call - clear CP_TRIMMED_FLAG correctly - prevent node chain loop during recovery - avoid data race between atomic write and background cleaning - avoid unnecessary selinux violation warnings on resgid option - GFP_NOFS to avoid deadlock in quota and read paths - fix f2fs_skip_inode_update to allow i_size recovery In addition to the above, there are several minor bug fixes and clean-ups" Cherry-pick from origin/upstream-f2fs-stable-linux-4.14.y: de465aa57271 f2fs: remain written times to update inode during fsync d0ebaf0b37b2 f2fs: make assignment of t->dentry_bitmap more readable 7f05fb451696 f2fs: truncate preallocated blocks in error case a0a9a51ecdd1 f2fs: fix a wrong condition in f2fs_skip_inode_update 5dc89047c9e8 f2fs: reserve bits for fs-verity 0751f01376d5 f2fs: Add a segment type check in inplace write 27d9598d4d38 f2fs: no need to initialize zero value for GFP_F2FS_ZERO 42a34ff76240 f2fs: don't track new nat entry in nat set 14040505a620 f2fs: clean up with F2FS_BLK_ALIGN fcea9e00a0ea f2fs: check blkaddr more accuratly before issue a bio 2c217b078fee f2fs: Set GF_NOFS in read_cache_page_gfp while doing f2fs_quota_read 0a8cedc2cea3 f2fs: introduce a new mount option test_dummy_encryption 5786b414a719 f2fs: introduce F2FS_FEATURE_LOST_FOUND feature 9813cae680f0 f2fs: release locks before return in f2fs_ioc_gc_range() cee6482cd12c f2fs: align memory boundary for bitops 8dbfcba5f5d6 f2fs: remove unneeded set_cold_node() 7e93bf8ebc34 f2fs: add nowait aio support 1e64d3ed2753 f2fs: wrap all options with f2fs_sb_info.mount_opt 7f270a67a1da f2fs: Don't overwrite all types of node to keep node chain c6a9e6a41f4f f2fs: introduce mount option for fsync mode 82bebed3c1fd f2fs: fix to restore old mount option in ->remount_fs 808427a63b93 f2fs: wrap sb_rdonly with f2fs_readonly 5ebe362c0c60 f2fs: avoid selinux denial on CAP_SYS_RESOURCE ea34734357a9 f2fs: support hot file extension 2189c2e46468 f2fs: fix to avoid race in between atomic write and background GC 5f6950805928 f2fs: do gc in greedy mode for whole range if gc_urgent mode is set 79f1a15fa536 f2fs: issue discard aggressively in the gc_urgent mode aea8da88a747 f2fs: set readdir_ra by default 8fe06ea28273 f2fs: add auto tuning for small devices 073c145d5bef f2fs: add mount option for segment allocation policy e7efe40d7aa5 f2fs: don't stop GC if GC is contended 882d0e094488 f2fs: expose extension_list sysfs entry 52320a2a28be f2fs: fix to set KEEP_SIZE bit in f2fs_zero_range ef66237f28e9 f2fs: introduce sb_lock to make encrypt pwsalt update exclusive c8e77267ed1f f2fs: remove redundant initialization of pointer 'p' 755dcc3262d4 f2fs: flush cp pack except cp pack 2 page at first 92223ccb699a f2fs: clean up f2fs_sb_has_xxx functions d8ecd46ca803 f2fs: remove redundant check of page type when submit bio 99f512132e54 f2fs: fix to handle looped node chain during recovery 66a2346def3d f2fs: handle quota for orphan inodes bd9e1956d17e f2fs: support passing down write hints to block layer with F2FS policy d8f02c3b68c5 f2fs: support passing down write hints given by users to block layer d4fff1411d4e f2fs: fix to clear CP_TRIMMED_FLAG f50100868cb8 f2fs: support large nat bitmap e9437125502c f2fs: fix to check extent cache in f2fs_drop_extent_tree 5c1d55c37f2c f2fs: restrict inline_xattr_size configuration 74d48dc6ec93 f2fs: fix heap mode to reset it back 68afcb259568 f2fs: fix potential corruption in area before F2FS_SUPER_OFFSET 6b4edfb10398 fscrypt: fix build with pre-4.6 gcc versions 4bcc4865feab fscrypt: remove 'ci' parameter from fscrypt_put_encryption_info() 69e5234f04b6 fscrypt: fix up fscrypt_fname_encrypted_size() for internal use 7919cba92304 fscrypt: define fscrypt_fname_alloc_buffer() to be for presented names aef0017f3b1a fscrypt: calculate NUL-padding length in one place only 5232cae0e922 fscrypt: move fscrypt_symlink_data to fscrypt_private.h 169bd9ba8542 ubifs: switch to fscrypt_get_symlink() 63498ca7def3 ubifs: switch to fscrypt ->symlink() helper functions a85637d12cb1 fscrypt: remove fscrypt_fname_usr_to_disk() 77bb20f72679 ext4: switch to fscrypt_get_symlink() 79b3f39a2e79 ext4: switch to fscrypt ->symlink() helper functions 70fe2fb67bc6 f2fs: switch to fscrypt_get_symlink() 96dda4e02d6b f2fs: switch to fscrypt ->symlink() helper functions 0063988cc044 fscrypt: new helper function - fscrypt_get_symlink() 48a0375c8889 fscrypt: new helper functions for ->symlink() 585a194dd1d0 fscrypt: trim down fscrypt.h includes 411771ab56f4 fscrypt: move fscrypt_is_dot_dotdot() to fs/crypto/fname.c ad35db34396b fscrypt: move fscrypt_valid_enc_modes() to fscrypt_private.h 72b3e1c61d8b fscrypt: move fscrypt_operations declaration to fscrypt_supp.h 2fa9a1f9268a fscrypt: split fscrypt_dummy_context_enabled() into supp/notsupp versions e298b5de1cca fscrypt: move fscrypt_ctx declaration to fscrypt_supp.h 8db0a6de3cf0 fscrypt: move fscrypt_info_cachep declaration to fscrypt_private.h c73c350ade4e fscrypt: move fscrypt_control_page() to supp/notsupp headers ca64f2f4609d fscrypt: move fscrypt_has_encryption_key() to supp/notsupp headers Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
2018-01-05 10:44:52 -08:00
if (is_dir)
flag &= ~(0x1 << COLD_BIT_SHIFT);
else
flag |= (0x1 << COLD_BIT_SHIFT);
rn->footer.flag = cpu_to_le32(flag);
}
static inline void set_mark(struct page *page, int mark, int type)
{
struct f2fs_node *rn = F2FS_NODE(page);
unsigned int flag = le32_to_cpu(rn->footer.flag);
if (mark)
flag |= (0x1 << type);
else
flag &= ~(0x1 << type);
rn->footer.flag = cpu_to_le32(flag);
}
#define set_dentry_mark(page, mark) set_mark(page, mark, DENT_BIT_SHIFT)
#define set_fsync_mark(page, mark) set_mark(page, mark, FSYNC_BIT_SHIFT)