From: Jaegeuk Kim <jaegeuk.kim@samsung.com>
To: unlisted-recipients:; (no To-header on input)
Cc: Jaegeuk Kim <jaegeuk.kim@samsung.com>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net
Subject: [PATCH 9/9] f2fs: fix the bitmap consistency of dirty segments
Date: Mon, 01 Apr 2013 15:56:00 +0900 [thread overview]
Message-ID: <1364799360-23145-9-git-send-email-jaegeuk.kim@samsung.com> (raw)
In-Reply-To: <1364799360-23145-1-git-send-email-jaegeuk.kim@samsung.com>
Like below, there are 8 segment bitmaps for SSR victim candidates.
enum dirty_type {
DIRTY_HOT_DATA, /* dirty segments assigned as hot data logs */
DIRTY_WARM_DATA, /* dirty segments assigned as warm data logs */
DIRTY_COLD_DATA, /* dirty segments assigned as cold data logs */
DIRTY_HOT_NODE, /* dirty segments assigned as hot node logs */
DIRTY_WARM_NODE, /* dirty segments assigned as warm node logs */
DIRTY_COLD_NODE, /* dirty segments assigned as cold node logs */
DIRTY, /* to count # of dirty segments */
PRE, /* to count # of entirely obsolete segments */
NR_DIRTY_TYPE
};
The upper 6 bitmaps indicates segments dirtied by active log areas respectively.
And, the DIRTY bitmap integrates all the 6 bitmaps.
For example,
o DIRTY_HOT_DATA : 1010000
o DIRTY_WARM_DATA: 0100000
o DIRTY_COLD_DATA: 0001000
o DIRTY_HOT_NODE : 0000010
o DIRTY_WARM_NODE: 0000001
o DIRTY_COLD_NODE: 0000000
In this case,
o DIRTY : 1111011,
which means that we should guarantee the consistency between DIRTY and other
bitmaps concreately.
However, the SSR mode selects victims freely from any log types, which can set
multiple bits across the various bitmap types.
So, this patch eliminates this inconsistency.
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
---
fs/f2fs/segment.c | 23 ++++++++++++++++++-----
1 file changed, 18 insertions(+), 5 deletions(-)
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index fe520d3..7c67ec2 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -49,9 +49,20 @@ static void __locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno,
if (dirty_type == DIRTY) {
struct seg_entry *sentry = get_seg_entry(sbi, segno);
+ enum dirty_type t = DIRTY_HOT_DATA;
+
dirty_type = sentry->type;
+
if (!test_and_set_bit(segno, dirty_i->dirty_segmap[dirty_type]))
dirty_i->nr_dirty[dirty_type]++;
+
+ /* Only one bitmap should be set */
+ for (; t <= DIRTY_COLD_NODE; t++) {
+ if (t == dirty_type)
+ continue;
+ if (test_and_clear_bit(segno, dirty_i->dirty_segmap[t]))
+ dirty_i->nr_dirty[t]--;
+ }
}
}
@@ -64,11 +75,13 @@ static void __remove_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno,
dirty_i->nr_dirty[dirty_type]--;
if (dirty_type == DIRTY) {
- struct seg_entry *sentry = get_seg_entry(sbi, segno);
- dirty_type = sentry->type;
- if (test_and_clear_bit(segno,
- dirty_i->dirty_segmap[dirty_type]))
- dirty_i->nr_dirty[dirty_type]--;
+ enum dirty_type t = DIRTY_HOT_DATA;
+
+ /* clear all the bitmaps */
+ for (; t <= DIRTY_COLD_NODE; t++)
+ if (test_and_clear_bit(segno, dirty_i->dirty_segmap[t]))
+ dirty_i->nr_dirty[t]--;
+
if (get_valid_blocks(sbi, segno, sbi->segs_per_sec) == 0)
clear_bit(GET_SECNO(sbi, segno),
dirty_i->victim_secmap);
--
1.8.1.3.566.gaa39828
next prev parent reply other threads:[~2013-04-01 6:57 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-01 6:55 [PATCH 1/9] f2fs: do not use duplicate names in a macro Jaegeuk Kim
2013-04-01 6:55 ` [PATCH 2/9] f2fs: introduce TOTAL_SECS macro Jaegeuk Kim
2013-04-03 1:17 ` Namjae Jeon
2013-04-01 6:55 ` [PATCH 3/9] f2fs: remove redundant lock_page calls Jaegeuk Kim
2013-04-03 5:58 ` Namjae Jeon
2013-04-03 8:12 ` [PATCH 3/9 v2] " Jaegeuk Kim
2013-04-03 8:27 ` Namjae Jeon
2013-04-01 6:55 ` [PATCH 4/9] f2fs: allocate new segment aligned with sections Jaegeuk Kim
2013-04-03 6:00 ` Namjae Jeon
2013-04-01 6:55 ` [PATCH 5/9] f2fs: change GC bitmaps to apply the section granularity Jaegeuk Kim
2013-04-03 5:46 ` Namjae Jeon
2013-04-03 8:06 ` [PATCH 5/9 v2] " Jaegeuk Kim
2013-04-03 8:21 ` Namjae Jeon
2013-04-01 6:55 ` [PATCH 6/9] f2fs: check completion of foreground GC Jaegeuk Kim
2013-04-03 5:54 ` Namjae Jeon
2013-04-01 6:55 ` [PATCH 7/9] f2fs: allocate remained free segments in the LFS mode Jaegeuk Kim
2013-04-03 5:59 ` Namjae Jeon
2013-04-01 6:55 ` [PATCH 8/9] f2fs: avoid race for summary information Jaegeuk Kim
2013-04-03 5:54 ` Namjae Jeon
2013-04-01 6:56 ` Jaegeuk Kim [this message]
2013-04-03 1:14 ` [PATCH 9/9] f2fs: fix the bitmap consistency of dirty segments Namjae Jeon
2013-04-03 1:15 ` [PATCH 1/9] f2fs: do not use duplicate names in a macro Namjae Jeon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1364799360-23145-9-git-send-email-jaegeuk.kim@samsung.com \
--to=jaegeuk.kim@samsung.com \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®