01 Oct, 2016
5 commits
-
This patch improves the migration of dirty pages and allows migrating atomic
written pages that F2FS uses in Page Cache. Instead of the fallback releasing
page path, it provides better performance for memory compaction, CMA and other
users of memory page migrating. For dirty pages, there is no need to write back
first when migrating. For an atomic written page before committing, we can
migrate the page and update the related 'inmem_pages' list at the same time.Signed-off-by: Weichao Guo
Reviewed-by: Chao Yu
[Jaegeuk Kim: fix some coding style]
Signed-off-by: Jaegeuk Kim -
This patch introduces spinlock to protect updating process of ckpt_flags
field in struct f2fs_checkpoint, it avoids incorrectly updating in race
condition.Signed-off-by: Chao Yu
[Jaegeuk Kim: add __is_set_ckpt_flags likewise __set_ckpt_flags]
Signed-off-by: Jaegeuk Kim -
Making updating of sbi flag atomic by using {test,set,clear}_bit,
otherwise in concurrency scenario, the flag could be updated incorrectly.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
Before checkpoint, we'd be better drop any inodes.
Signed-off-by: Jaegeuk Kim
-
Previously, we used cp_version only to detect recoverable dnodes.
In order to avoid same garbage cp_version, we needed to truncate the next
dnode during checkpoint, resulting in additional discard or data write.
If we can distinguish this by using crc in addition to cp_version, we can
remove this overhead.There is backward compatibility concern where it changes node_footer layout.
So, this patch introduces a new checkpoint flag, CP_CRC_RECOVERY_FLAG, to
detect new layout. New layout will be activated only when this flag is set.Signed-off-by: Jaegeuk Kim
23 Sep, 2016
5 commits
-
This patch allow preallocates data blocks for buffered aio writes
in encrypted file.Signed-off-by: Yunlei He
Reviewed-by: Chao Yu
[Jaegeuk Kim: fix to avoid BUG_ON]
Signed-off-by: Jaegeuk Kim -
This patch enables showing dirty inode number in procfs.
Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
This patch adds to support IO error injection for testing IO error
tolerance of f2fs.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
We treat all error in read_all_xattrs as a no memory error, which covers
the real reason of failure in it. Fix it by return correct errno in order
to reflect the real cause.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
There is no more user of f2fs_filetype_table outside of dir.c, make it
static.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim
16 Sep, 2016
1 commit
-
This patch enhances the error path in recover_orphan_inode.
Signed-off-by: Jaegeuk Kim
15 Sep, 2016
2 commits
-
The macro f2fs_check_acl is defined but never used since
the initial commit, this patch removes the code that has
been dead for several years.Signed-off-by: Tiezhu Yang
Signed-off-by: Jaegeuk Kim -
When src and dst is the same file, and the latter part of source region
overlaps with the former part of destination region, current implement
will overwrite data which hasn't been moved yet and truncate data in
overlapped region.
This patch return -EINVAL when such cases occur and return 0 when
source region and destination region is actually the same part of
the same file.Signed-off-by: Fan li
Signed-off-by: Jaegeuk Kim
14 Sep, 2016
4 commits
-
Previously, f2fs_write_begin sets PageUptodate all the time. But, when user
tries to update the entire page (i.e., len == PAGE_SIZE), we need to consider
that the page is able to be copied partially afterwards. In such the case,
we will lose the remaing region in the page.This patch fixes this by setting PageUptodate in f2fs_write_end as given copied
result. In the short copy case, it returns zero to let generic_perform_write
retry copying user data again.As a result, f2fs_write_end() works:
PageUptodate len copied return retry
1. no 4096 4096 4096 false -> return 4096
2. no 4096 1024 0 true -> goto #1 case
3. yes 2048 2048 2048 false -> return 2048
4. yes 2048 1024 1024 false -> return 1024Suggested-by: Al Viro
Signed-off-by: Jaegeuk Kim -
__exchange_data_block should take block indexes as parameters
instead of offsets in bytes.Signed-off-by: Fan li
Signed-off-by: Jaegeuk Kim -
This patch includes below modifications:
1. change my maintainership from reviewer to maintainer.
2. remove maintainership of Changman Lee since he is not active about
one and a half year.
3. change website of f2fs from wiki to kernel one.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
This patch gives another chances during roll-forward recovery regarding to
-ENOMEM.Signed-off-by: Jaegeuk Kim
13 Sep, 2016
4 commits
-
There is no functional change.
Signed-off-by: Jaegeuk Kim
-
Fix wrong condition check for defragmentation of a file.
Reviewed-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
This patch skip fstrim if sbi set SBI_NEED_FSCK flag
Signed-off-by: Yunlei He
Signed-off-by: Jaegeuk Kim -
When truncating cached inline_data, we don't need to allocate a new page
all the time. Instead, it must check its page cache only.Signed-off-by: Jaegeuk Kim
08 Sep, 2016
13 commits
-
We don't need to make zeros beyond i_size, since we already wrote that through
NEW_ADDR case.Reported-by: Al Viro
Signed-off-by: Jaegeuk Kim -
Some applications may create multimeida file with temporary name like
'*.jpg.tmp' or '*.mp4.tmp', then rename to '*.jpg' or '*.mp4'.Now, f2fs can only detect multimedia filename with specified format:
"filename + '.' + extension", so it will make f2fs missing to detect
multimedia file with special temporary name, result in failing to set
cold flag on file.This patch enhances detection flow for enabling lookup extension in the
middle of temporary filename.Reported-by: Xue Liu
Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
Correct typo from 'destory' to 'destroy'.
Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
This fixes pointer panic when using inline_dentry, which was triggered when
backporting to 3.10.Signed-off-by: Jaegeuk Kim
-
tests/generic/251 of fstest suit complains us with below message:
------------[ cut here ]------------
invalid opcode: 0000 [#1] PREEMPT SMP
CPU: 2 PID: 7698 Comm: fstrim Tainted: G O 4.7.0+ #21
task: e9f4e000 task.stack: e7262000
EIP: 0060:[] EFLAGS: 00010202 CPU: 2
EIP is at write_checkpoint+0xfde/0x1020 [f2fs]
EAX: f33eb300 EBX: eecac310 ECX: 00000001 EDX: ffff0001
ESI: eecac000 EDI: eecac5f0 EBP: e7263dec ESP: e7263d18
DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
CR0: 80050033 CR2: b76ab01c CR3: 2eb89de0 CR4: 000406f0
Stack:
00000001 a220fb7b e9f4e000 00000002 419ff2d3 b3a05151 00000002 e9f4e5d8
e9f4e000 419ff2d3 b3a05151 eecac310 c10b8154 b3a05151 419ff2d3 c10b78bd
e9f4e000 e9f4e000 e9f4e5d8 00000001 e9f4e000 ec409000 eecac2cc eecac288
Call Trace:
[] ? __lock_acquire+0x3c4/0x760
[] ? mark_held_locks+0x5d/0x80
[] f2fs_trim_fs+0x1c2/0x2e0 [f2fs]
[] f2fs_ioctl+0x6b6/0x10b0 [f2fs]
[] ? __this_cpu_preempt_check+0xf/0x20
[] ? trace_hardirqs_off_caller+0x91/0x120
[] ? __exchange_data_block+0xd30/0xd30 [f2fs]
[] do_vfs_ioctl+0x81/0x7f0
[] ? kmem_cache_free+0x245/0x2e0
[] ? get_unused_fd_flags+0x40/0x40
[] ? putname+0x4c/0x50
[] ? do_sys_open+0x16e/0x1d0
[] ? do_fast_syscall_32+0x30/0x1c0
[] ? __this_cpu_preempt_check+0xf/0x20
[] SyS_ioctl+0x58/0x80
[] do_fast_syscall_32+0xa1/0x1c0
[] sysenter_past_esp+0x45/0x74
EIP: [] write_checkpoint+0xfde/0x1020 [f2fs] SS:ESP 0068:e7263d18
---[ end trace 4de95d7e6b3aa7c6 ]---The reason is: with below call stack, we will encounter BUG_ON during
doing fstrim.Thread A Thread B
- write_checkpoint
- do_checkpoint
- f2fs_write_inode
- update_inode_page
- update_inode
- set_page_dirty
- f2fs_set_node_page_dirty
- inc_page_count
- percpu_counter_inc
- set_sbi_flag(SBI_IS_DIRTY)
- clear_sbi_flag(SBI_IS_DIRTY)Thread C Thread D
- f2fs_write_node_page
- set_node_addr
- __set_nat_cache_dirty
- nm_i->dirty_nat_cnt++
- do_vfs_ioctl
- f2fs_ioctl
- f2fs_trim_fs
- write_checkpoint
- f2fs_bug_on(nm_i->dirty_nat_cnt)Fix it by setting superblock dirty correctly in do_checkpoint and
f2fs_write_node_page.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
Add roll-forward recovery process for encrypted dentry, so the first fsync
issued to an encrypted file does not need writing checkpoint.This improves the performance of the following test at thousands of small
files: open -> write -> fsync -> closeSigned-off-by: Shuoran Liu
Acked-by: Chao Yu
[Jaegeuk Kim: modify kernel message to show encrypted names]
Signed-off-by: Jaegeuk Kim -
This patch enhances the xattr consistency of dirs from suddern power-cuts.
Possible scenario would be:
1. dir->setxattr used by per-file encryption
2. file->setxattr goes into inline_xattr
3. file->fsyncIn that case, we should do checkpoint for #1.
Otherwise we'd lose dir's key information for the file given #2.Signed-off-by: Jaegeuk Kim
-
Like most filesystems, f2fs will issue discard command synchronously, so
when user trigger fstrim through ioctl, multiple discard commands will be
issued serially with sync mode, which makes poor performance.In this patch we try to support async discard, so that all discard
commands can be issued and be waited for endio in batch to improve
performance.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
This patch sets encryption name flag in the add inline entry path
if filename is encrypted.Signed-off-by: Shuoran Liu
Signed-off-by: Jaegeuk Kim -
When decrypting dirents in ->readdir, fscrypt_fname_disk_to_usr won't
change content of original encrypted dirent, we don't need to allocate
additional buffer for storing mirror of it, so get rid of it.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
When creating new inode, security_inode_init_security will be called for
initializing security info related to the inode, and filename is passed to
security module, it helps security module such as SElinux to know which
rule or label could be applied for the inode with specified name.Previously, if new inode is created as an encrypted one, f2fs will transfer
encrypted filename to security module which may fail the check of security
policy belong to the inode. So in order to this issue, alter to transfer
original unencrypted filename instead.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
In order to enhance performance, we try to readahead node page during
GC, but before loading node page we should get block address of node page
which is stored in NAT table, so synchronously read of single NAT page
block our readahead flow.f2fs_submit_page_bio: dev = (251,0), ino = 2, page_index = 0xa1e, oldaddr = 0xa1e, newaddr = 0xa1e, rw = READ_SYNC(MP), type = META
f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x35e9, oldaddr = 0x72d7a, newaddr = 0x72d7a, rw = READAHEAD ^H, type = NODE
f2fs_submit_page_bio: dev = (251,0), ino = 2, page_index = 0xc1f, oldaddr = 0xc1f, newaddr = 0xc1f, rw = READ_SYNC(MP), type = META
f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x389d, oldaddr = 0x72d7d, newaddr = 0x72d7d, rw = READAHEAD ^H, type = NODE
f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x3a82, oldaddr = 0x72d7f, newaddr = 0x72d7f, rw = READAHEAD ^H, type = NODE
f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x3bfa, oldaddr = 0x72d86, newaddr = 0x72d86, rw = READAHEAD ^H, type = NODEThis patch adds one phase that do readahead NAT pages in batch before
readahead node page for more effeciently.f2fs_submit_page_bio: dev = (251,0), ino = 2, page_index = 0x1952, oldaddr = 0x1952, newaddr = 0x1952, rw = READ_SYNC(MP), type = META
f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc34, oldaddr = 0xc34, newaddr = 0xc34, rw = READ_SYNC(MP), type = META
f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xa33, oldaddr = 0xa33, newaddr = 0xa33, rw = READ_SYNC(MP), type = META
f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc30, oldaddr = 0xc30, newaddr = 0xc30, rw = READ_SYNC(MP), type = META
f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc32, oldaddr = 0xc32, newaddr = 0xc32, rw = READ_SYNC(MP), type = META
f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc26, oldaddr = 0xc26, newaddr = 0xc26, rw = READ_SYNC(MP), type = META
f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xa2b, oldaddr = 0xa2b, newaddr = 0xa2b, rw = READ_SYNC(MP), type = META
f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc23, oldaddr = 0xc23, newaddr = 0xc23, rw = READ_SYNC(MP), type = META
f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc24, oldaddr = 0xc24, newaddr = 0xc24, rw = READ_SYNC(MP), type = META
f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xa10, oldaddr = 0xa10, newaddr = 0xa10, rw = READ_SYNC(MP), type = META
f2fs_submit_page_mbio: dev = (251,0), ino = 2, page_index = 0xc2c, oldaddr = 0xc2c, newaddr = 0xc2c, rw = READ_SYNC(MP), type = META
f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5db7, oldaddr = 0x6be00, newaddr = 0x6be00, rw = READAHEAD ^H, type = NODE
f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5db9, oldaddr = 0x6be17, newaddr = 0x6be17, rw = READAHEAD ^H, type = NODE
f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5dbc, oldaddr = 0x6be1a, newaddr = 0x6be1a, rw = READAHEAD ^H, type = NODE
f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5dc3, oldaddr = 0x6be20, newaddr = 0x6be20, rw = READAHEAD ^H, type = NODE
f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5dc7, oldaddr = 0x6be24, newaddr = 0x6be24, rw = READAHEAD ^H, type = NODE
f2fs_submit_page_bio: dev = (251,0), ino = 1, page_index = 0x5dc9, oldaddr = 0x6be25, newaddr = 0x6be25, rw = READAHEAD ^H, type = NODESigned-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
In batch discard approach of fstrim will grab/release gc_mutex lock
repeatly, it makes contention of the lock becoming more intensive.So after one batch discards were issued in checkpoint and the lock
was released, it's better to do schedule() to increase opportunity
of grabbing gc_mutex lock for other competitors.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim
30 Aug, 2016
6 commits
-
Make inline_dentry as default mount option to improve space usage and
IO performance in scenario of numerous small directory.
It adds noinline_dentry mount option, instead.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
In the following scenario,
1) we don't have the key and doing a lookup for encrypted file,
2) and the encrypted filename is big namewe should use fname->hash as name hash value instead of what is
calculated by fname->disk_name. Because in such case,
fname->disk_name is empty.Signed-off-by: Shuoran Liu
Acked-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
In write_begin(), we skip checking dnode block for preallocating block
when whole block needs to be updated since we preallocated its block in
f2fs_preallocate_blocks, for partial updated block, we will still try
to lock its node and do preallocation in write_begin(), so in
f2fs_preallocate_blocks we should not preallocate its block.But previously, the calculation of preallocating block number is
incorrect, fix it.Signed-off-by: Chao Yu
[Jaegeuk Kim: fix a bug]
Signed-off-by: Jaegeuk Kim -
Fixes the following sparse warning:
fs/f2fs/data.c:969:12: warning:
symbol 'f2fs_grab_bio' was not declared. Should it be static?Signed-off-by: Wei Yongjun
Acked-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
`flags' is used to save value from userspace, there is no need to
initialize it, and FS_FL_USER_VISIBLE is the mask for getflags.Signed-off-by: Sheng Yong
Acked-by: Chao Yu
Signed-off-by: Jaegeuk Kim -
In available_free_memory, there are two same judgement conditions which
is used for checking NAT excess, remove one of them.Signed-off-by: Chao Yu
Signed-off-by: Jaegeuk Kim