Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1412770 > unrolled thread

[PATCH 1/8] f2fs: reuse nid if it was cached only

Started byJaegeuk Kim <jaegeuk@kernel.org>
First post2016-06-03 06:00 +0200
Last post2016-06-03 06:00 +0200
Articles 4 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCH 1/8] f2fs: reuse nid if it was cached only Jaegeuk Kim <jaegeuk@kernel.org> - 2016-06-03 06:00 +0200
    [PATCH 2/8] f2fs: remove deprecated parameter Jaegeuk Kim <jaegeuk@kernel.org> - 2016-06-03 06:00 +0200
    [PATCH 6/8] f2fs: avoid data race between FI_DIRTY_INODE flag and update_inode Jaegeuk Kim <jaegeuk@kernel.org> - 2016-06-03 06:00 +0200
    [PATCH 3/8] f2fs: avoid wrong count on dirty inodes Jaegeuk Kim <jaegeuk@kernel.org> - 2016-06-03 06:00 +0200

#1412770 — [PATCH 1/8] f2fs: reuse nid if it was cached only

FromJaegeuk Kim <jaegeuk@kernel.org>
Date2016-06-03 06:00 +0200
Subject[PATCH 1/8] f2fs: reuse nid if it was cached only
Message-ID<rFOr7-6ts-3@gated-at.bofh.it>
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

[toc] | [next] | [standalone]


#1412771 — [PATCH 2/8] f2fs: remove deprecated parameter

FromJaegeuk Kim <jaegeuk@kernel.org>
Date2016-06-03 06:00 +0200
Subject[PATCH 2/8] f2fs: remove deprecated parameter
Message-ID<rFOr7-6ts-15@gated-at.bofh.it>
In reply to#1412770
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

[toc] | [prev] | [next] | [standalone]


#1412772 — [PATCH 6/8] f2fs: avoid data race between FI_DIRTY_INODE flag and update_inode

FromJaegeuk Kim <jaegeuk@kernel.org>
Date2016-06-03 06:00 +0200
Subject[PATCH 6/8] f2fs: avoid data race between FI_DIRTY_INODE flag and update_inode
Message-ID<rFOr8-6ts-27@gated-at.bofh.it>
In reply to#1412770
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

[toc] | [prev] | [next] | [standalone]


#1412774 — [PATCH 3/8] f2fs: avoid wrong count on dirty inodes

FromJaegeuk Kim <jaegeuk@kernel.org>
Date2016-06-03 06:00 +0200
Subject[PATCH 3/8] f2fs: avoid wrong count on dirty inodes
Message-ID<rFOr7-6ts-17@gated-at.bofh.it>
In reply to#1412770
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

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web