From: Yunlong Song <yunlong.song@huawei.com> To: <jaegeuk@kernel.org>, <chao@kernel.org>, <yuchao0@huawei.com>, <yunlong.song@icloud.com>, <yunlong.song@huawei.com> Cc: <miaoxie@huawei.com>, <bintian.wang@huawei.com>, <linux-fsdevel@vger.kernel.org>, <linux-f2fs-devel@lists.sourceforge.net>, <linux-kernel@vger.kernel.org> Subject: [PATCH v2] f2fs: introduce cur_reserved_blocks in sysfs Date: Fri, 11 Aug 2017 19:43:46 +0800 [thread overview] Message-ID: <1502451826-45453-1-git-send-email-yunlong.song@huawei.com> (raw) In-Reply-To: <1502199825-15218-1-git-send-email-yunlong.song@huawei.com> In this patch, we add a new sysfs interface, we can use it to gradually achieve the reserved_blocks finally, even when reserved_blocks is initially set over user_block_count - total_valid_block_count. This is very useful, especially when we upgrade kernel with new reserved_blocks value, but old disk image unluckily has user_block_count - total_valid_block_count smaller than the desired reserved_blocks. With this patch, f2fs can try its best to reserve space and get close to the reserved_blocks, and the current value of achieved reserved_blocks can be shown in real time. To ensure there is enough space for supporting system's activation, we safely increase cur_reserved_blocks in dev_valid_block(,node)_count to only take up the blocks which are just obsoleted. Signed-off-by: Yunlong Song <yunlong.song@huawei.com> --- Documentation/ABI/testing/sysfs-fs-f2fs | 6 ++++++ fs/f2fs/f2fs.h | 9 +++++++-- fs/f2fs/super.c | 3 ++- fs/f2fs/sysfs.c | 15 ++++++++++----- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs index 11b7f4e..bdbb9f3 100644 --- a/Documentation/ABI/testing/sysfs-fs-f2fs +++ b/Documentation/ABI/testing/sysfs-fs-f2fs @@ -151,3 +151,9 @@ Date: August 2017 Contact: "Jaegeuk Kim" <jaegeuk@kernel.org> Description: Controls sleep time of GC urgent mode + +What: /sys/fs/f2fs/<disk>/cur_reserved_blocks +Date: August 2017 +Contact: "Yunlong Song" <yunlong.song@huawei.com> +Description: + Shows current reserved blocks in system. diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 2f20b6b..62d7343 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1041,6 +1041,7 @@ struct f2fs_sb_info { block_t discard_blks; /* discard command candidats */ block_t last_valid_block_count; /* for recovery */ block_t reserved_blocks; /* configurable reserved blocks */ + block_t cur_reserved_blocks; /* current reserved blocks */ u32 s_next_generation; /* for NFS support */ @@ -1515,7 +1516,7 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, spin_lock(&sbi->stat_lock); sbi->total_valid_block_count += (block_t)(*count); - avail_user_block_count = sbi->user_block_count - sbi->reserved_blocks; + avail_user_block_count = sbi->user_block_count - sbi->cur_reserved_blocks; if (unlikely(sbi->total_valid_block_count > avail_user_block_count)) { diff = sbi->total_valid_block_count - avail_user_block_count; *count -= diff; @@ -1549,6 +1550,8 @@ static inline void dec_valid_block_count(struct f2fs_sb_info *sbi, f2fs_bug_on(sbi, sbi->total_valid_block_count < (block_t) count); f2fs_bug_on(sbi, inode->i_blocks < sectors); sbi->total_valid_block_count -= (block_t)count; + sbi->cur_reserved_blocks = min(sbi->reserved_blocks, + sbi->cur_reserved_blocks + count); spin_unlock(&sbi->stat_lock); f2fs_i_blocks_write(inode, count, false, true); } @@ -1695,7 +1698,7 @@ static inline int inc_valid_node_count(struct f2fs_sb_info *sbi, spin_lock(&sbi->stat_lock); valid_block_count = sbi->total_valid_block_count + 1; - if (unlikely(valid_block_count + sbi->reserved_blocks > + if (unlikely(valid_block_count + sbi->cur_reserved_blocks > sbi->user_block_count)) { spin_unlock(&sbi->stat_lock); goto enospc; @@ -1738,6 +1741,8 @@ static inline void dec_valid_node_count(struct f2fs_sb_info *sbi, sbi->total_valid_node_count--; sbi->total_valid_block_count--; + sbi->cur_reserved_blocks = min(sbi->reserved_blocks, + sbi->cur_reserved_blocks + 1); spin_unlock(&sbi->stat_lock); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 4c1bdcb..16a805f 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -957,7 +957,7 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_blocks = total_count - start_count; buf->f_bfree = user_block_count - valid_user_blocks(sbi) + ovp_count; buf->f_bavail = user_block_count - valid_user_blocks(sbi) - - sbi->reserved_blocks; + sbi->cur_reserved_blocks; avail_node_count = sbi->total_node_count - F2FS_RESERVED_NODE_NUM; @@ -2411,6 +2411,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) le64_to_cpu(sbi->ckpt->valid_block_count); sbi->last_valid_block_count = sbi->total_valid_block_count; sbi->reserved_blocks = 0; + sbi->cur_reserved_blocks = 0; for (i = 0; i < NR_INODE_TYPE; i++) { INIT_LIST_HEAD(&sbi->inode_list[i]); diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c index a1be5ac..03f9d3d 100644 --- a/fs/f2fs/sysfs.c +++ b/fs/f2fs/sysfs.c @@ -76,6 +76,12 @@ static ssize_t lifetime_write_kbytes_show(struct f2fs_attr *a, BD_PART_WRITTEN(sbi))); } +static ssize_t cur_reserved_blocks_show(struct f2fs_attr *a, + struct f2fs_sb_info *sbi, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", sbi->cur_reserved_blocks); +} + static ssize_t features_show(struct f2fs_attr *a, struct f2fs_sb_info *sbi, char *buf) { @@ -143,12 +149,9 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a, #endif if (a->struct_type == RESERVED_BLOCKS) { spin_lock(&sbi->stat_lock); - if ((unsigned long)sbi->total_valid_block_count + t > - (unsigned long)sbi->user_block_count) { - spin_unlock(&sbi->stat_lock); - return -EINVAL; - } *ui = t; + if (t < sbi->cur_reserved_blocks) + sbi->cur_reserved_blocks = t; spin_unlock(&sbi->stat_lock); return count; } @@ -274,6 +277,7 @@ static ssize_t f2fs_feature_show(struct f2fs_attr *a, #endif F2FS_GENERAL_RO_ATTR(lifetime_write_kbytes); F2FS_GENERAL_RO_ATTR(features); +F2FS_GENERAL_RO_ATTR(cur_reserved_blocks); #ifdef CONFIG_F2FS_FS_ENCRYPTION F2FS_FEATURE_RO_ATTR(encryption, FEAT_CRYPTO); @@ -317,6 +321,7 @@ static ssize_t f2fs_feature_show(struct f2fs_attr *a, ATTR_LIST(lifetime_write_kbytes), ATTR_LIST(features), ATTR_LIST(reserved_blocks), + ATTR_LIST(cur_reserved_blocks), NULL, }; -- 1.8.5.2
WARNING: multiple messages have this Message-ID (diff)
From: Yunlong Song <yunlong.song@huawei.com> To: jaegeuk@kernel.org, chao@kernel.org, yuchao0@huawei.com, yunlong.song@icloud.com, yunlong.song@huawei.com Cc: miaoxie@huawei.com, bintian.wang@huawei.com, linux-fsdevel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH v2] f2fs: introduce cur_reserved_blocks in sysfs Date: Fri, 11 Aug 2017 19:43:46 +0800 [thread overview] Message-ID: <1502451826-45453-1-git-send-email-yunlong.song@huawei.com> (raw) In-Reply-To: <1502199825-15218-1-git-send-email-yunlong.song@huawei.com> In this patch, we add a new sysfs interface, we can use it to gradually achieve the reserved_blocks finally, even when reserved_blocks is initially set over user_block_count - total_valid_block_count. This is very useful, especially when we upgrade kernel with new reserved_blocks value, but old disk image unluckily has user_block_count - total_valid_block_count smaller than the desired reserved_blocks. With this patch, f2fs can try its best to reserve space and get close to the reserved_blocks, and the current value of achieved reserved_blocks can be shown in real time. To ensure there is enough space for supporting system's activation, we safely increase cur_reserved_blocks in dev_valid_block(,node)_count to only take up the blocks which are just obsoleted. Signed-off-by: Yunlong Song <yunlong.song@huawei.com> --- Documentation/ABI/testing/sysfs-fs-f2fs | 6 ++++++ fs/f2fs/f2fs.h | 9 +++++++-- fs/f2fs/super.c | 3 ++- fs/f2fs/sysfs.c | 15 ++++++++++----- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs b/Documentation/ABI/testing/sysfs-fs-f2fs index 11b7f4e..bdbb9f3 100644 --- a/Documentation/ABI/testing/sysfs-fs-f2fs +++ b/Documentation/ABI/testing/sysfs-fs-f2fs @@ -151,3 +151,9 @@ Date: August 2017 Contact: "Jaegeuk Kim" <jaegeuk@kernel.org> Description: Controls sleep time of GC urgent mode + +What: /sys/fs/f2fs/<disk>/cur_reserved_blocks +Date: August 2017 +Contact: "Yunlong Song" <yunlong.song@huawei.com> +Description: + Shows current reserved blocks in system. diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 2f20b6b..62d7343 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1041,6 +1041,7 @@ struct f2fs_sb_info { block_t discard_blks; /* discard command candidats */ block_t last_valid_block_count; /* for recovery */ block_t reserved_blocks; /* configurable reserved blocks */ + block_t cur_reserved_blocks; /* current reserved blocks */ u32 s_next_generation; /* for NFS support */ @@ -1515,7 +1516,7 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, spin_lock(&sbi->stat_lock); sbi->total_valid_block_count += (block_t)(*count); - avail_user_block_count = sbi->user_block_count - sbi->reserved_blocks; + avail_user_block_count = sbi->user_block_count - sbi->cur_reserved_blocks; if (unlikely(sbi->total_valid_block_count > avail_user_block_count)) { diff = sbi->total_valid_block_count - avail_user_block_count; *count -= diff; @@ -1549,6 +1550,8 @@ static inline void dec_valid_block_count(struct f2fs_sb_info *sbi, f2fs_bug_on(sbi, sbi->total_valid_block_count < (block_t) count); f2fs_bug_on(sbi, inode->i_blocks < sectors); sbi->total_valid_block_count -= (block_t)count; + sbi->cur_reserved_blocks = min(sbi->reserved_blocks, + sbi->cur_reserved_blocks + count); spin_unlock(&sbi->stat_lock); f2fs_i_blocks_write(inode, count, false, true); } @@ -1695,7 +1698,7 @@ static inline int inc_valid_node_count(struct f2fs_sb_info *sbi, spin_lock(&sbi->stat_lock); valid_block_count = sbi->total_valid_block_count + 1; - if (unlikely(valid_block_count + sbi->reserved_blocks > + if (unlikely(valid_block_count + sbi->cur_reserved_blocks > sbi->user_block_count)) { spin_unlock(&sbi->stat_lock); goto enospc; @@ -1738,6 +1741,8 @@ static inline void dec_valid_node_count(struct f2fs_sb_info *sbi, sbi->total_valid_node_count--; sbi->total_valid_block_count--; + sbi->cur_reserved_blocks = min(sbi->reserved_blocks, + sbi->cur_reserved_blocks + 1); spin_unlock(&sbi->stat_lock); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 4c1bdcb..16a805f 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -957,7 +957,7 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_blocks = total_count - start_count; buf->f_bfree = user_block_count - valid_user_blocks(sbi) + ovp_count; buf->f_bavail = user_block_count - valid_user_blocks(sbi) - - sbi->reserved_blocks; + sbi->cur_reserved_blocks; avail_node_count = sbi->total_node_count - F2FS_RESERVED_NODE_NUM; @@ -2411,6 +2411,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) le64_to_cpu(sbi->ckpt->valid_block_count); sbi->last_valid_block_count = sbi->total_valid_block_count; sbi->reserved_blocks = 0; + sbi->cur_reserved_blocks = 0; for (i = 0; i < NR_INODE_TYPE; i++) { INIT_LIST_HEAD(&sbi->inode_list[i]); diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c index a1be5ac..03f9d3d 100644 --- a/fs/f2fs/sysfs.c +++ b/fs/f2fs/sysfs.c @@ -76,6 +76,12 @@ static ssize_t lifetime_write_kbytes_show(struct f2fs_attr *a, BD_PART_WRITTEN(sbi))); } +static ssize_t cur_reserved_blocks_show(struct f2fs_attr *a, + struct f2fs_sb_info *sbi, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", sbi->cur_reserved_blocks); +} + static ssize_t features_show(struct f2fs_attr *a, struct f2fs_sb_info *sbi, char *buf) { @@ -143,12 +149,9 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a, #endif if (a->struct_type == RESERVED_BLOCKS) { spin_lock(&sbi->stat_lock); - if ((unsigned long)sbi->total_valid_block_count + t > - (unsigned long)sbi->user_block_count) { - spin_unlock(&sbi->stat_lock); - return -EINVAL; - } *ui = t; + if (t < sbi->cur_reserved_blocks) + sbi->cur_reserved_blocks = t; spin_unlock(&sbi->stat_lock); return count; } @@ -274,6 +277,7 @@ static ssize_t f2fs_feature_show(struct f2fs_attr *a, #endif F2FS_GENERAL_RO_ATTR(lifetime_write_kbytes); F2FS_GENERAL_RO_ATTR(features); +F2FS_GENERAL_RO_ATTR(cur_reserved_blocks); #ifdef CONFIG_F2FS_FS_ENCRYPTION F2FS_FEATURE_RO_ATTR(encryption, FEAT_CRYPTO); @@ -317,6 +321,7 @@ static ssize_t f2fs_feature_show(struct f2fs_attr *a, ATTR_LIST(lifetime_write_kbytes), ATTR_LIST(features), ATTR_LIST(reserved_blocks), + ATTR_LIST(cur_reserved_blocks), NULL, }; -- 1.8.5.2
next prev parent reply other threads:[~2017-08-11 11:44 UTC|newest] Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-08-08 13:43 [PATCH] f2fs: introduce cur_reserved_blocks in sysfs Yunlong Song 2017-08-08 13:43 ` Yunlong Song 2017-08-10 3:15 ` Chao Yu 2017-08-10 3:15 ` Chao Yu 2017-08-10 3:58 ` Yunlong Song 2017-08-10 3:58 ` Yunlong Song 2017-08-10 11:26 ` Chao Yu 2017-08-10 11:26 ` Chao Yu 2017-08-10 11:41 ` Yunlong Song 2017-08-10 11:41 ` Yunlong Song 2017-08-11 10:18 ` Chao Yu 2017-08-11 10:18 ` Chao Yu 2017-08-11 11:47 ` Yunlong Song 2017-08-11 11:47 ` Yunlong Song 2017-08-11 11:43 ` Yunlong Song [this message] 2017-08-11 11:43 ` [PATCH v2] " Yunlong Song 2017-08-15 4:08 ` Yunlong Song 2017-08-15 4:08 ` Yunlong Song 2017-08-18 10:05 ` Yunlong Song 2017-08-18 10:05 ` Yunlong Song 2017-08-18 10:20 ` Chao Yu 2017-08-18 10:20 ` Chao Yu 2017-08-18 15:16 ` Yunlong Song 2017-08-18 15:16 ` Yunlong Song 2017-10-25 10:02 ` Yunlong Song 2017-10-25 10:02 ` Yunlong Song 2017-08-18 15:09 ` [PATCH v3] f2fs: add cur_reserved_blocks to support soft block reservation Yunlong Song 2017-08-18 15:09 ` Yunlong Song 2017-08-19 3:33 ` [f2fs-dev] " Chao Yu 2017-08-19 3:33 ` Chao Yu 2017-10-25 10:02 ` Yunlong Song 2017-10-25 10:02 ` Yunlong Song 2017-10-25 12:26 ` Chao Yu 2017-10-25 14:06 ` Yunlong Song 2017-10-25 14:06 ` Yunlong Song 2017-10-25 15:46 ` Chao Yu 2017-10-25 15:46 ` Chao Yu 2017-10-26 3:07 ` Yunlong Song 2017-10-26 3:07 ` Yunlong Song 2017-10-26 3:26 ` Chao Yu 2017-10-26 3:26 ` Chao Yu 2017-10-26 3:30 ` Yunlong Song 2017-10-26 3:30 ` Yunlong Song 2017-10-27 3:11 ` [PATCH v4] f2fs: " Yunlong Song 2017-10-27 3:11 ` Yunlong Song 2017-10-27 3:28 ` Chao Yu 2017-10-27 3:28 ` Chao Yu 2017-10-27 11:06 ` Jaegeuk Kim 2017-10-27 11:47 ` [PATCH v5] " Yunlong Song 2017-10-27 11:47 ` Yunlong Song 2017-10-27 12:36 ` [f2fs-dev] " Chao Yu 2017-10-27 12:36 ` Chao Yu 2017-10-27 12:45 ` [PATCH v5 RESEND] " Yunlong Song 2017-10-27 12:45 ` Yunlong Song
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=1502451826-45453-1-git-send-email-yunlong.song@huawei.com \ --to=yunlong.song@huawei.com \ --cc=bintian.wang@huawei.com \ --cc=chao@kernel.org \ --cc=jaegeuk@kernel.org \ --cc=linux-f2fs-devel@lists.sourceforge.net \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=miaoxie@huawei.com \ --cc=yuchao0@huawei.com \ --cc=yunlong.song@icloud.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.