* [PATCH 1/8] f2fs: reuse nid if it was cached only
@ 2016-06-03 3:55 Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 2/8] f2fs: remove deprecated parameter Jaegeuk Kim
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Jaegeuk Kim @ 2016-06-03 3:55 UTC (permalink / raw)
To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim
If nid's block address is assigned as:
NULL_ADDR -> NEW_ADDR -> NULL_ADDR, we can reset this nid, since its node page
has never written back.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/node.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 16532b3..15f55ae 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -317,10 +317,16 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
}
/* change address */
- nat_set_blkaddr(e, new_blkaddr);
- if (new_blkaddr == NEW_ADDR || new_blkaddr == NULL_ADDR)
- set_nat_flag(e, IS_CHECKPOINTED, false);
- __set_nat_cache_dirty(nm_i, e);
+ if (nat_get_blkaddr(e) == NEW_ADDR && new_blkaddr == NULL_ADDR) {
+ nat_set_blkaddr(e, new_blkaddr);
+ nat_reset_flag(e);
+ __clear_nat_cache_dirty(nm_i, e);
+ } else {
+ nat_set_blkaddr(e, new_blkaddr);
+ 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)
--
2.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/8] f2fs: remove deprecated parameter
2016-06-03 3:55 [PATCH 1/8] f2fs: reuse nid if it was cached only Jaegeuk Kim
@ 2016-06-03 3:55 ` Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 3/8] f2fs: avoid wrong count on dirty inodes Jaegeuk Kim
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jaegeuk Kim @ 2016-06-03 3:55 UTC (permalink / raw)
To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim
Remove deprecated paramter.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/dir.c | 4 ++--
fs/f2fs/f2fs.h | 2 +-
fs/f2fs/inline.c | 5 ++---
3 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index 6fbb1ed..f6ab3c2 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -664,7 +664,7 @@ fail:
return err;
}
-void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page)
+void f2fs_drop_nlink(struct inode *dir, struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
@@ -723,7 +723,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
mark_inode_dirty_sync(dir);
if (inode)
- f2fs_drop_nlink(dir, inode, NULL);
+ f2fs_drop_nlink(dir, inode);
if (bit_pos == NR_DENTRY_IN_BLOCK &&
!truncate_hole(dir, page->index, page->index + 1)) {
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index c4697b7..498c736 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1915,7 +1915,7 @@ struct page *init_inode_metadata(struct inode *, struct inode *,
const struct qstr *, struct page *);
void update_parent_metadata(struct inode *, struct inode *, unsigned int);
int room_for_filename(const void *, int, int);
-void f2fs_drop_nlink(struct inode *, struct inode *, struct page *);
+void f2fs_drop_nlink(struct inode *, struct inode *);
struct f2fs_dir_entry *f2fs_find_entry(struct inode *, struct qstr *,
struct page **);
struct f2fs_dir_entry *f2fs_parent_dir(struct inode *, struct page **);
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
index 1eb3043..669f92f 100644
--- a/fs/f2fs/inline.c
+++ b/fs/f2fs/inline.c
@@ -582,14 +582,13 @@ void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
&inline_dentry->dentry_bitmap);
set_page_dirty(page);
+ f2fs_put_page(page, 1);
dir->i_ctime = dir->i_mtime = CURRENT_TIME;
mark_inode_dirty_sync(dir);
if (inode)
- f2fs_drop_nlink(dir, inode, page);
-
- f2fs_put_page(page, 1);
+ f2fs_drop_nlink(dir, inode);
}
bool f2fs_empty_inline_dir(struct inode *dir)
--
2.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/8] f2fs: avoid wrong count on dirty inodes
2016-06-03 3:55 [PATCH 1/8] f2fs: reuse nid if it was cached only Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 2/8] f2fs: remove deprecated parameter Jaegeuk Kim
@ 2016-06-03 3:55 ` Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 4/8] f2fs: skip roll_forward recovery after umount Jaegeuk Kim
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jaegeuk Kim @ 2016-06-03 3:55 UTC (permalink / raw)
To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim
The number should be covered by spin_lock. Otherwise we can see wrong count
in f2fs_stat.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/super.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 27f76819e..9e75433 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -645,8 +645,8 @@ static void f2fs_dirty_inode(struct inode *inode, int flags)
list_add_tail(&F2FS_I(inode)->gdirty_list,
&sbi->inode_list[DIRTY_META]);
inc_page_count(sbi, F2FS_DIRTY_IMETA);
- spin_unlock(&sbi->inode_lock[DIRTY_META]);
stat_inc_dirty_inode(sbi, DIRTY_META);
+ spin_unlock(&sbi->inode_lock[DIRTY_META]);
}
void f2fs_inode_synced(struct inode *inode)
@@ -662,8 +662,8 @@ void f2fs_inode_synced(struct inode *inode)
clear_inode_flag(inode, FI_DIRTY_INODE);
clear_inode_flag(inode, FI_AUTO_RECOVER);
dec_page_count(sbi, F2FS_DIRTY_IMETA);
- spin_unlock(&sbi->inode_lock[DIRTY_META]);
stat_dec_dirty_inode(F2FS_I_SB(inode), DIRTY_META);
+ spin_unlock(&sbi->inode_lock[DIRTY_META]);
}
static void f2fs_i_callback(struct rcu_head *head)
--
2.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/8] f2fs: skip roll_forward recovery after umount
2016-06-03 3:55 [PATCH 1/8] f2fs: reuse nid if it was cached only Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 2/8] f2fs: remove deprecated parameter Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 3/8] f2fs: avoid wrong count on dirty inodes Jaegeuk Kim
@ 2016-06-03 3:55 ` Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 5/8] f2fs: remove obsolete parameter in f2fs_truncate Jaegeuk Kim
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jaegeuk Kim @ 2016-06-03 3:55 UTC (permalink / raw)
To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim
If f2fs was umounted successfully, we don't need to go into roll_forward.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/recovery.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
index b568b28..841bddc 100644
--- a/fs/f2fs/recovery.c
+++ b/fs/f2fs/recovery.c
@@ -579,6 +579,9 @@ int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
int ret = 0;
bool need_writecp = false;
+ if (is_set_ckpt_flags(sbi->ckpt, CP_UMOUNT_FLAG))
+ return 0;
+
fsync_entry_slab = f2fs_kmem_cache_create("f2fs_fsync_inode_entry",
sizeof(struct fsync_inode_entry));
if (!fsync_entry_slab)
--
2.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/8] f2fs: remove obsolete parameter in f2fs_truncate
2016-06-03 3:55 [PATCH 1/8] f2fs: reuse nid if it was cached only Jaegeuk Kim
` (2 preceding siblings ...)
2016-06-03 3:55 ` [PATCH 4/8] f2fs: skip roll_forward recovery after umount Jaegeuk Kim
@ 2016-06-03 3:55 ` Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 6/8] f2fs: avoid data race between FI_DIRTY_INODE flag and update_inode Jaegeuk Kim
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Jaegeuk Kim @ 2016-06-03 3:55 UTC (permalink / raw)
To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim
We don't need lock parameter, which is always true.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/f2fs.h | 2 +-
fs/f2fs/file.c | 6 +++---
fs/f2fs/inode.c | 2 +-
fs/f2fs/super.c | 2 +-
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 498c736..d1702ee 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1874,7 +1874,7 @@ static inline void *f2fs_kvzalloc(size_t size, gfp_t flags)
int f2fs_sync_file(struct file *, loff_t, loff_t, int);
void truncate_data_blocks(struct dnode_of_data *);
int truncate_blocks(struct inode *, u64, bool);
-int f2fs_truncate(struct inode *, bool);
+int f2fs_truncate(struct inode *);
int f2fs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
int f2fs_setattr(struct dentry *, struct iattr *);
int truncate_hole(struct inode *, pgoff_t, pgoff_t);
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 6f93e07..e66d223 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -647,7 +647,7 @@ free_partial:
return err;
}
-int f2fs_truncate(struct inode *inode, bool lock)
+int f2fs_truncate(struct inode *inode)
{
int err;
@@ -664,7 +664,7 @@ int f2fs_truncate(struct inode *inode, bool lock)
return err;
}
- err = truncate_blocks(inode, i_size_read(inode), lock);
+ err = truncate_blocks(inode, i_size_read(inode), true);
if (err)
return err;
@@ -728,7 +728,7 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
if (attr->ia_size <= i_size_read(inode)) {
truncate_setsize(inode, attr->ia_size);
- err = f2fs_truncate(inode, true);
+ err = f2fs_truncate(inode);
if (err)
return err;
f2fs_balance_fs(F2FS_I_SB(inode), true);
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index 11cb60a..fb3d9bd 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -355,7 +355,7 @@ void f2fs_evict_inode(struct inode *inode)
i_size_write(inode, 0);
retry:
if (F2FS_HAS_BLOCKS(inode))
- err = f2fs_truncate(inode, true);
+ err = f2fs_truncate(inode);
if (!err) {
f2fs_lock_op(sbi);
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 9e75433..94bb87d 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -590,7 +590,7 @@ static int f2fs_drop_inode(struct inode *inode)
f2fs_i_size_write(inode, 0);
if (F2FS_HAS_BLOCKS(inode))
- f2fs_truncate(inode, true);
+ f2fs_truncate(inode);
sb_end_intwrite(inode->i_sb);
--
2.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 6/8] f2fs: avoid data race between FI_DIRTY_INODE flag and update_inode
2016-06-03 3:55 [PATCH 1/8] f2fs: reuse nid if it was cached only Jaegeuk Kim
` (3 preceding siblings ...)
2016-06-03 3:55 ` [PATCH 5/8] f2fs: remove obsolete parameter in f2fs_truncate Jaegeuk Kim
@ 2016-06-03 3:55 ` Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 7/8] f2fs: fix wrong percentage Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 8/8] f2fs: control not to exceed # of cached nat entries Jaegeuk Kim
6 siblings, 0 replies; 8+ messages in thread
From: Jaegeuk Kim @ 2016-06-03 3:55 UTC (permalink / raw)
To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim
FI_DIRTY_INODE flag is not covered by inode page lock, so it can be unset
at any time like below.
Thread #1 Thread #2
- lock_page(ipage)
- update i_fields
- update i_size/i_blocks/and so on
- set FI_DIRTY_INODE
- reset FI_DIRTY_INODE
- set_page_dirty(ipage)
In this case, we can lose the latest i_field information.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/inode.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index fb3d9bd..63c4326 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -231,6 +231,8 @@ int update_inode(struct inode *inode, struct page *node_page)
{
struct f2fs_inode *ri;
+ f2fs_inode_synced(inode);
+
f2fs_wait_on_page_writeback(node_page, NODE, true);
ri = F2FS_INODE(node_page);
@@ -265,7 +267,6 @@ int update_inode(struct inode *inode, struct page *node_page)
__set_inode_rdev(inode, ri);
set_cold_node(inode, node_page);
- f2fs_inode_synced(inode);
/* deleted inode */
if (inode->i_nlink == 0)
--
2.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 7/8] f2fs: fix wrong percentage
2016-06-03 3:55 [PATCH 1/8] f2fs: reuse nid if it was cached only Jaegeuk Kim
` (4 preceding siblings ...)
2016-06-03 3:55 ` [PATCH 6/8] f2fs: avoid data race between FI_DIRTY_INODE flag and update_inode Jaegeuk Kim
@ 2016-06-03 3:55 ` Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 8/8] f2fs: control not to exceed # of cached nat entries Jaegeuk Kim
6 siblings, 0 replies; 8+ messages in thread
From: Jaegeuk Kim @ 2016-06-03 3:55 UTC (permalink / raw)
To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim
This should be 1%, 10MB / 1GB.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/node.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h
index 1f4f9d4..2c2a797 100644
--- a/fs/f2fs/node.h
+++ b/fs/f2fs/node.h
@@ -23,7 +23,7 @@
#define MAX_RA_NODE 128
/* control the memory footprint threshold (10MB per 1GB ram) */
-#define DEF_RAM_THRESHOLD 10
+#define DEF_RAM_THRESHOLD 1
/* control dirty nats ratio threshold (default: 10% over max nid count) */
#define DEF_DIRTY_NAT_RATIO_THRESHOLD 10
--
2.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 8/8] f2fs: control not to exceed # of cached nat entries
2016-06-03 3:55 [PATCH 1/8] f2fs: reuse nid if it was cached only Jaegeuk Kim
` (5 preceding siblings ...)
2016-06-03 3:55 ` [PATCH 7/8] f2fs: fix wrong percentage Jaegeuk Kim
@ 2016-06-03 3:55 ` Jaegeuk Kim
6 siblings, 0 replies; 8+ messages in thread
From: Jaegeuk Kim @ 2016-06-03 3:55 UTC (permalink / raw)
To: linux-kernel, linux-fsdevel, linux-f2fs-devel; +Cc: Jaegeuk Kim
This is to avoid cache entry management overhead including radix tree.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/f2fs/node.c | 4 ++++
fs/f2fs/node.h | 7 +++++++
fs/f2fs/segment.c | 5 +++++
3 files changed, 16 insertions(+)
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 15f55ae..d7e624c 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -52,6 +52,10 @@ bool available_free_memory(struct f2fs_sb_info *sbi, int type)
mem_size = (nm_i->nat_cnt * sizeof(struct nat_entry)) >>
PAGE_SHIFT;
res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 2);
+ if (excess_cached_nats(sbi))
+ res = false;
+ if (nm_i->nat_cnt > DEF_NAT_CACHE_THRESHOLD)
+ res = false;
} else if (type == DIRTY_DENTS) {
if (sbi->sb->s_bdi->wb.dirty_exceeded)
return false;
diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h
index 2c2a797..59e0470 100644
--- a/fs/f2fs/node.h
+++ b/fs/f2fs/node.h
@@ -27,6 +27,8 @@
/* 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 50000
/* vector size for gang look-up from nat cache that consists of radix tree */
#define NATVEC_SIZE 64
@@ -126,6 +128,11 @@ static inline bool excess_dirty_nats(struct f2fs_sb_info *sbi)
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 */
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 34a9159..9011bffd 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -345,6 +345,11 @@ void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need)
{
if (!need)
return;
+
+ /* balance_fs_bg is able to be pending */
+ if (excess_cached_nats(sbi))
+ f2fs_balance_fs_bg(sbi);
+
/*
* We should do GC or end up with checkpoint, if there are so many dirty
* dir/node pages without enough free segments.
--
2.6.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2016-06-03 3:57 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-03 3:55 [PATCH 1/8] f2fs: reuse nid if it was cached only Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 2/8] f2fs: remove deprecated parameter Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 3/8] f2fs: avoid wrong count on dirty inodes Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 4/8] f2fs: skip roll_forward recovery after umount Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 5/8] f2fs: remove obsolete parameter in f2fs_truncate Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 6/8] f2fs: avoid data race between FI_DIRTY_INODE flag and update_inode Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 7/8] f2fs: fix wrong percentage Jaegeuk Kim
2016-06-03 3:55 ` [PATCH 8/8] f2fs: control not to exceed # of cached nat entries Jaegeuk Kim
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).