From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Chao Yu <chao@kernel.org>
Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH] f2fs: separate NOCoW and pinfile semantics
Date: Thu, 12 May 2022 14:57:34 -0700 [thread overview]
Message-ID: <Yn2CztiJUY2UAjnd@google.com> (raw)
In-Reply-To: <20220512082116.2991611-1-chao@kernel.org>
On 05/12, Chao Yu wrote:
> Pinning a file is heavy, because skipping pinned files make GC
> running with heavy load or no effect.
>
> So that this patch proposes to separate nocow and pinfile semantics:
> - NOCoW flag can only be set on regular file.
> - NOCoW file will only trigger IPU at common writeback/flush.
> - NOCow file will do OPU during GC.
>
> This flag can satisfying the demand of:
> 1) avoiding fragment of file's physical block
> 2) userspace doesn't want to pin file's physical address
>
> Signed-off-by: Chao Yu <chao.yu@oppo.com>
> ---
> fs/f2fs/data.c | 3 ++-
> fs/f2fs/f2fs.h | 1 +
> fs/f2fs/file.c | 25 ++++++++++++++++++++++++-
> 3 files changed, 27 insertions(+), 2 deletions(-)
>
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 54a7a8ad994d..c8eab78f7d89 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -2495,7 +2495,8 @@ bool f2fs_should_update_inplace(struct inode *inode, struct f2fs_io_info *fio)
> if (is_inode_flag_set(inode, FI_ALIGNED_WRITE))
> return false;
>
> - if (f2fs_is_pinned_file(inode))
> + if (f2fs_is_pinned_file(inode) ||
> + F2FS_I(inode)->i_flags & F2FS_NOCOW_FL)
> return true;
>
> /* if this is cold file, we should overwrite to avoid fragmentation */
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index 492af5b96de1..e91ece55f5e8 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -2916,6 +2916,7 @@ static inline void f2fs_change_bit(unsigned int nr, char *addr)
> #define F2FS_NOCOMP_FL 0x00000400 /* Don't compress */
> #define F2FS_INDEX_FL 0x00001000 /* hash-indexed directory */
> #define F2FS_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */
> +#define F2FS_NOCOW_FL 0x00800000 /* Do not cow file */
> #define F2FS_PROJINHERIT_FL 0x20000000 /* Create with parents projid */
> #define F2FS_CASEFOLD_FL 0x40000000 /* Casefolded file */
>
> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
> index 09287876dbb7..7f92a3a157f7 100644
> --- a/fs/f2fs/file.c
> +++ b/fs/f2fs/file.c
> @@ -1851,6 +1851,20 @@ static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask)
> if (IS_NOQUOTA(inode))
> return -EPERM;
>
> + if ((iflags ^ masked_flags) & F2FS_NOCOW_FL) {
> + int ret;
> +
> + if (!S_ISREG(inode->i_mode))
> + return -EINVAL;
> + if (f2fs_should_update_outplace(inode, NULL))
> + return -EINVAL;
> + if (f2fs_is_pinned_file(inode))
> + return -EINVAL;
> + ret = f2fs_convert_inline_inode(inode);
> + if (ret)
> + return ret;
> + }
> +
> if ((iflags ^ masked_flags) & F2FS_CASEFOLD_FL) {
> if (!f2fs_sb_has_casefold(F2FS_I_SB(inode)))
> return -EOPNOTSUPP;
> @@ -1926,6 +1940,7 @@ static const struct {
> { F2FS_NOCOMP_FL, FS_NOCOMP_FL },
> { F2FS_INDEX_FL, FS_INDEX_FL },
> { F2FS_DIRSYNC_FL, FS_DIRSYNC_FL },
> + { F2FS_NOCOW_FL, FS_NOCOW_FL },
> { F2FS_PROJINHERIT_FL, FS_PROJINHERIT_FL },
> { F2FS_CASEFOLD_FL, FS_CASEFOLD_FL },
> };
> @@ -1957,7 +1972,8 @@ static const struct {
> FS_NOCOMP_FL | \
> FS_DIRSYNC_FL | \
> FS_PROJINHERIT_FL | \
> - FS_CASEFOLD_FL)
> + FS_CASEFOLD_FL | \
> + FS_NOCOW_FL)
>
> /* Convert f2fs on-disk i_flags to FS_IOC_{GET,SET}FLAGS flags */
> static inline u32 f2fs_iflags_to_fsflags(u32 iflags)
> @@ -3081,6 +3097,13 @@ static int f2fs_ioc_set_pin_file(struct file *filp, unsigned long arg)
>
> inode_lock(inode);
>
> + if (F2FS_I(inode)->i_flags & F2FS_NOCOW_FL) {
> + f2fs_info(F2FS_I_SB(inode), "inode (%lu) is already NOCOW one",
> + inode->i_ino);
> + ret = -EINVAL;
Why rejecting this? We can pin the file to get 2MB-aligned allocation on the
NOCOW file.
> + goto out;
> + }
> +
> if (!pin) {
> clear_inode_flag(inode, FI_PIN_FILE);
> f2fs_i_gc_failures_write(inode, 0);
> --
> 2.25.1
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
WARNING: multiple messages have this Message-ID (diff)
From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Chao Yu <chao@kernel.org>
Cc: linux-f2fs-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org, Chao Yu <chao.yu@oppo.com>
Subject: Re: [PATCH] f2fs: separate NOCoW and pinfile semantics
Date: Thu, 12 May 2022 14:57:34 -0700 [thread overview]
Message-ID: <Yn2CztiJUY2UAjnd@google.com> (raw)
In-Reply-To: <20220512082116.2991611-1-chao@kernel.org>
On 05/12, Chao Yu wrote:
> Pinning a file is heavy, because skipping pinned files make GC
> running with heavy load or no effect.
>
> So that this patch proposes to separate nocow and pinfile semantics:
> - NOCoW flag can only be set on regular file.
> - NOCoW file will only trigger IPU at common writeback/flush.
> - NOCow file will do OPU during GC.
>
> This flag can satisfying the demand of:
> 1) avoiding fragment of file's physical block
> 2) userspace doesn't want to pin file's physical address
>
> Signed-off-by: Chao Yu <chao.yu@oppo.com>
> ---
> fs/f2fs/data.c | 3 ++-
> fs/f2fs/f2fs.h | 1 +
> fs/f2fs/file.c | 25 ++++++++++++++++++++++++-
> 3 files changed, 27 insertions(+), 2 deletions(-)
>
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 54a7a8ad994d..c8eab78f7d89 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -2495,7 +2495,8 @@ bool f2fs_should_update_inplace(struct inode *inode, struct f2fs_io_info *fio)
> if (is_inode_flag_set(inode, FI_ALIGNED_WRITE))
> return false;
>
> - if (f2fs_is_pinned_file(inode))
> + if (f2fs_is_pinned_file(inode) ||
> + F2FS_I(inode)->i_flags & F2FS_NOCOW_FL)
> return true;
>
> /* if this is cold file, we should overwrite to avoid fragmentation */
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index 492af5b96de1..e91ece55f5e8 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -2916,6 +2916,7 @@ static inline void f2fs_change_bit(unsigned int nr, char *addr)
> #define F2FS_NOCOMP_FL 0x00000400 /* Don't compress */
> #define F2FS_INDEX_FL 0x00001000 /* hash-indexed directory */
> #define F2FS_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */
> +#define F2FS_NOCOW_FL 0x00800000 /* Do not cow file */
> #define F2FS_PROJINHERIT_FL 0x20000000 /* Create with parents projid */
> #define F2FS_CASEFOLD_FL 0x40000000 /* Casefolded file */
>
> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
> index 09287876dbb7..7f92a3a157f7 100644
> --- a/fs/f2fs/file.c
> +++ b/fs/f2fs/file.c
> @@ -1851,6 +1851,20 @@ static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask)
> if (IS_NOQUOTA(inode))
> return -EPERM;
>
> + if ((iflags ^ masked_flags) & F2FS_NOCOW_FL) {
> + int ret;
> +
> + if (!S_ISREG(inode->i_mode))
> + return -EINVAL;
> + if (f2fs_should_update_outplace(inode, NULL))
> + return -EINVAL;
> + if (f2fs_is_pinned_file(inode))
> + return -EINVAL;
> + ret = f2fs_convert_inline_inode(inode);
> + if (ret)
> + return ret;
> + }
> +
> if ((iflags ^ masked_flags) & F2FS_CASEFOLD_FL) {
> if (!f2fs_sb_has_casefold(F2FS_I_SB(inode)))
> return -EOPNOTSUPP;
> @@ -1926,6 +1940,7 @@ static const struct {
> { F2FS_NOCOMP_FL, FS_NOCOMP_FL },
> { F2FS_INDEX_FL, FS_INDEX_FL },
> { F2FS_DIRSYNC_FL, FS_DIRSYNC_FL },
> + { F2FS_NOCOW_FL, FS_NOCOW_FL },
> { F2FS_PROJINHERIT_FL, FS_PROJINHERIT_FL },
> { F2FS_CASEFOLD_FL, FS_CASEFOLD_FL },
> };
> @@ -1957,7 +1972,8 @@ static const struct {
> FS_NOCOMP_FL | \
> FS_DIRSYNC_FL | \
> FS_PROJINHERIT_FL | \
> - FS_CASEFOLD_FL)
> + FS_CASEFOLD_FL | \
> + FS_NOCOW_FL)
>
> /* Convert f2fs on-disk i_flags to FS_IOC_{GET,SET}FLAGS flags */
> static inline u32 f2fs_iflags_to_fsflags(u32 iflags)
> @@ -3081,6 +3097,13 @@ static int f2fs_ioc_set_pin_file(struct file *filp, unsigned long arg)
>
> inode_lock(inode);
>
> + if (F2FS_I(inode)->i_flags & F2FS_NOCOW_FL) {
> + f2fs_info(F2FS_I_SB(inode), "inode (%lu) is already NOCOW one",
> + inode->i_ino);
> + ret = -EINVAL;
Why rejecting this? We can pin the file to get 2MB-aligned allocation on the
NOCOW file.
> + goto out;
> + }
> +
> if (!pin) {
> clear_inode_flag(inode, FI_PIN_FILE);
> f2fs_i_gc_failures_write(inode, 0);
> --
> 2.25.1
next prev parent reply other threads:[~2022-05-12 21:57 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-12 8:21 [f2fs-dev] [PATCH] f2fs: separate NOCoW and pinfile semantics Chao Yu
2022-05-12 8:21 ` Chao Yu
2022-05-12 21:57 ` Jaegeuk Kim [this message]
2022-05-12 21:57 ` Jaegeuk Kim
2022-05-13 3:20 ` [f2fs-dev] " Chao Yu
2022-05-13 3:20 ` Chao Yu
2022-05-13 17:58 ` [f2fs-dev] " Jaegeuk Kim
2022-05-13 17:58 ` Jaegeuk Kim
-- strict thread matches above, loose matches on Subject: below --
2019-07-18 10:24 [f2fs-dev] " Chao Yu
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=Yn2CztiJUY2UAjnd@google.com \
--to=jaegeuk@kernel.org \
--cc=chao@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--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 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.