From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Chao Yu <yuchao0@huawei.com>
Cc: kernel-team@android.com, linux-kernel@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH v2] f2fs: fix quota_sync failure due to f2fs_lock_op
Date: Thu, 23 Apr 2020 20:35:27 -0700 [thread overview]
Message-ID: <20200424033527.GA106894@google.com> (raw)
In-Reply-To: <e67273bc-7416-c86e-58ba-c025029e8099@huawei.com>
On 04/24, Chao Yu wrote:
> On 2020/4/24 3:49, Jaegeuk Kim wrote:
> > On 04/23, Chao Yu wrote:
> >> On 2020/4/17 5:39, Jaegeuk Kim wrote:
> >>> f2fs_quota_sync() uses f2fs_lock_op() before flushing dirty pages, but
> >>> f2fs_write_data_page() returns EAGAIN.
> >>> Likewise dentry blocks, we can just bypass getting the lock, since quota
> >>> blocks are also maintained by checkpoint.
> >>>
> >>> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
> >>> ---
> >>> v2:
> >>> - fix multipage write case
> >>>
> >>> fs/f2fs/compress.c | 2 +-
> >>> fs/f2fs/data.c | 4 ++--
> >>> 2 files changed, 3 insertions(+), 3 deletions(-)
> >>>
> >>> diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
> >>> index df7b2d15eacde..faaa358289010 100644
> >>> --- a/fs/f2fs/compress.c
> >>> +++ b/fs/f2fs/compress.c
> >>> @@ -985,7 +985,7 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
> >>> loff_t psize;
> >>> int i, err;
> >>>
> >>> - if (!f2fs_trylock_op(sbi))
> >>> + if (!IS_NOQUOTA(inode) && !f2fs_trylock_op(sbi))
> >>> return -EAGAIN;
> >>
> >> I encounter deadlock..
> >>
> >> Should call f2fs_unlock_op() for non-quota compressed inode later.
> >
> > Could you elaborate a bit?
>
> I meant we need to change as below, otherwise, cp_rwsem can be negative
> after f2fs_unlock_op if writebacked datas are belong to compressed quota
> file.
Ah, I see. Fixed.
Thanks,
>
> >From 817dc629c47d3000c595640ecb3099b880519d47 Mon Sep 17 00:00:00 2001
> From: Jaegeuk Kim <jaegeuk@kernel.org>
> Date: Thu, 9 Apr 2020 10:25:21 -0700
> Subject: [PATCH] f2fs: fix quota_sync failure due to f2fs_lock_op
>
> f2fs_quota_sync() uses f2fs_lock_op() before flushing dirty pages, but
> f2fs_write_data_page() returns EAGAIN.
> Likewise dentry blocks, we can just bypass getting the lock, since quota
> blocks are also maintained by checkpoint.
>
> Reviewed-by: Chao Yu <yuchao0@huawei.com>
> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
> ---
> fs/f2fs/compress.c | 8 +++++---
> fs/f2fs/data.c | 4 ++--
> 2 files changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
> index df7b2d15eacd..26b071afe48a 100644
> --- a/fs/f2fs/compress.c
> +++ b/fs/f2fs/compress.c
> @@ -985,7 +985,7 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
> loff_t psize;
> int i, err;
>
> - if (!f2fs_trylock_op(sbi))
> + if (!IS_NOQUOTA(inode) && !f2fs_trylock_op(sbi))
> return -EAGAIN;
>
> set_new_dnode(&dn, cc->inode, NULL, NULL, 0);
> @@ -1092,7 +1092,8 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
> set_inode_flag(inode, FI_FIRST_BLOCK_WRITTEN);
>
> f2fs_put_dnode(&dn);
> - f2fs_unlock_op(sbi);
> + if (!IS_NOQUOTA(inode))
> + f2fs_unlock_op(sbi);
>
> spin_lock(&fi->i_size_lock);
> if (fi->last_disk_size < psize)
> @@ -1118,7 +1119,8 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
> out_put_dnode:
> f2fs_put_dnode(&dn);
> out_unlock_op:
> - f2fs_unlock_op(sbi);
> + if (!IS_NOQUOTA(inode))
> + f2fs_unlock_op(sbi);
> return -EAGAIN;
> }
>
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 8dd48c5b6c0d..dd439dbb134d 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -2660,8 +2660,8 @@ int f2fs_write_single_data_page(struct page *page, int *submitted,
> f2fs_available_free_memory(sbi, BASE_CHECK))))
> goto redirty_out;
>
> - /* Dentry blocks are controlled by checkpoint */
> - if (S_ISDIR(inode->i_mode)) {
> + /* Dentry/quota blocks are controlled by checkpoint */
> + if (S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) {
> fio.need_lock = LOCK_DONE;
> err = f2fs_do_write_data_page(&fio);
> goto done;
> --
> 2.18.0.rc1
>
>
>
> >
> >>
> >> Thanks,
> >>
> >>>
> >>> set_new_dnode(&dn, cc->inode, NULL, NULL, 0);
> >>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> >>> index accd28728642a..5c8d3823d7593 100644
> >>> --- a/fs/f2fs/data.c
> >>> +++ b/fs/f2fs/data.c
> >>> @@ -2656,8 +2656,8 @@ int f2fs_write_single_data_page(struct page *page, int *submitted,
> >>> f2fs_available_free_memory(sbi, BASE_CHECK))))
> >>> goto redirty_out;
> >>>
> >>> - /* Dentry blocks are controlled by checkpoint */
> >>> - if (S_ISDIR(inode->i_mode)) {
> >>> + /* Dentry/quota blocks are controlled by checkpoint */
> >>> + if (S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) {
> >>> fio.need_lock = LOCK_DONE;
> >>> err = f2fs_do_write_data_page(&fio);
> >>> goto done;
> >>>
> > .
> >
_______________________________________________
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 <yuchao0@huawei.com>
Cc: linux-kernel@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com
Subject: Re: [f2fs-dev] [PATCH v2] f2fs: fix quota_sync failure due to f2fs_lock_op
Date: Thu, 23 Apr 2020 20:35:27 -0700 [thread overview]
Message-ID: <20200424033527.GA106894@google.com> (raw)
In-Reply-To: <e67273bc-7416-c86e-58ba-c025029e8099@huawei.com>
On 04/24, Chao Yu wrote:
> On 2020/4/24 3:49, Jaegeuk Kim wrote:
> > On 04/23, Chao Yu wrote:
> >> On 2020/4/17 5:39, Jaegeuk Kim wrote:
> >>> f2fs_quota_sync() uses f2fs_lock_op() before flushing dirty pages, but
> >>> f2fs_write_data_page() returns EAGAIN.
> >>> Likewise dentry blocks, we can just bypass getting the lock, since quota
> >>> blocks are also maintained by checkpoint.
> >>>
> >>> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
> >>> ---
> >>> v2:
> >>> - fix multipage write case
> >>>
> >>> fs/f2fs/compress.c | 2 +-
> >>> fs/f2fs/data.c | 4 ++--
> >>> 2 files changed, 3 insertions(+), 3 deletions(-)
> >>>
> >>> diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
> >>> index df7b2d15eacde..faaa358289010 100644
> >>> --- a/fs/f2fs/compress.c
> >>> +++ b/fs/f2fs/compress.c
> >>> @@ -985,7 +985,7 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
> >>> loff_t psize;
> >>> int i, err;
> >>>
> >>> - if (!f2fs_trylock_op(sbi))
> >>> + if (!IS_NOQUOTA(inode) && !f2fs_trylock_op(sbi))
> >>> return -EAGAIN;
> >>
> >> I encounter deadlock..
> >>
> >> Should call f2fs_unlock_op() for non-quota compressed inode later.
> >
> > Could you elaborate a bit?
>
> I meant we need to change as below, otherwise, cp_rwsem can be negative
> after f2fs_unlock_op if writebacked datas are belong to compressed quota
> file.
Ah, I see. Fixed.
Thanks,
>
> >From 817dc629c47d3000c595640ecb3099b880519d47 Mon Sep 17 00:00:00 2001
> From: Jaegeuk Kim <jaegeuk@kernel.org>
> Date: Thu, 9 Apr 2020 10:25:21 -0700
> Subject: [PATCH] f2fs: fix quota_sync failure due to f2fs_lock_op
>
> f2fs_quota_sync() uses f2fs_lock_op() before flushing dirty pages, but
> f2fs_write_data_page() returns EAGAIN.
> Likewise dentry blocks, we can just bypass getting the lock, since quota
> blocks are also maintained by checkpoint.
>
> Reviewed-by: Chao Yu <yuchao0@huawei.com>
> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
> ---
> fs/f2fs/compress.c | 8 +++++---
> fs/f2fs/data.c | 4 ++--
> 2 files changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
> index df7b2d15eacd..26b071afe48a 100644
> --- a/fs/f2fs/compress.c
> +++ b/fs/f2fs/compress.c
> @@ -985,7 +985,7 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
> loff_t psize;
> int i, err;
>
> - if (!f2fs_trylock_op(sbi))
> + if (!IS_NOQUOTA(inode) && !f2fs_trylock_op(sbi))
> return -EAGAIN;
>
> set_new_dnode(&dn, cc->inode, NULL, NULL, 0);
> @@ -1092,7 +1092,8 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
> set_inode_flag(inode, FI_FIRST_BLOCK_WRITTEN);
>
> f2fs_put_dnode(&dn);
> - f2fs_unlock_op(sbi);
> + if (!IS_NOQUOTA(inode))
> + f2fs_unlock_op(sbi);
>
> spin_lock(&fi->i_size_lock);
> if (fi->last_disk_size < psize)
> @@ -1118,7 +1119,8 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc,
> out_put_dnode:
> f2fs_put_dnode(&dn);
> out_unlock_op:
> - f2fs_unlock_op(sbi);
> + if (!IS_NOQUOTA(inode))
> + f2fs_unlock_op(sbi);
> return -EAGAIN;
> }
>
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 8dd48c5b6c0d..dd439dbb134d 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -2660,8 +2660,8 @@ int f2fs_write_single_data_page(struct page *page, int *submitted,
> f2fs_available_free_memory(sbi, BASE_CHECK))))
> goto redirty_out;
>
> - /* Dentry blocks are controlled by checkpoint */
> - if (S_ISDIR(inode->i_mode)) {
> + /* Dentry/quota blocks are controlled by checkpoint */
> + if (S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) {
> fio.need_lock = LOCK_DONE;
> err = f2fs_do_write_data_page(&fio);
> goto done;
> --
> 2.18.0.rc1
>
>
>
> >
> >>
> >> Thanks,
> >>
> >>>
> >>> set_new_dnode(&dn, cc->inode, NULL, NULL, 0);
> >>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> >>> index accd28728642a..5c8d3823d7593 100644
> >>> --- a/fs/f2fs/data.c
> >>> +++ b/fs/f2fs/data.c
> >>> @@ -2656,8 +2656,8 @@ int f2fs_write_single_data_page(struct page *page, int *submitted,
> >>> f2fs_available_free_memory(sbi, BASE_CHECK))))
> >>> goto redirty_out;
> >>>
> >>> - /* Dentry blocks are controlled by checkpoint */
> >>> - if (S_ISDIR(inode->i_mode)) {
> >>> + /* Dentry/quota blocks are controlled by checkpoint */
> >>> + if (S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) {
> >>> fio.need_lock = LOCK_DONE;
> >>> err = f2fs_do_write_data_page(&fio);
> >>> goto done;
> >>>
> > .
> >
next prev parent reply other threads:[~2020-04-24 3:35 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-09 17:30 [f2fs-dev] [PATCH] f2fs: fix quota_sync failure due to f2fs_lock_op Jaegeuk Kim
2020-04-09 17:30 ` Jaegeuk Kim
2020-04-16 7:15 ` [f2fs-dev] " Chao Yu
2020-04-16 7:15 ` Chao Yu
2020-04-16 21:39 ` [f2fs-dev] [PATCH v2] " Jaegeuk Kim
2020-04-16 21:39 ` Jaegeuk Kim
2020-04-17 7:24 ` Chao Yu
2020-04-17 7:24 ` Chao Yu
2020-04-23 9:47 ` Chao Yu
2020-04-23 9:47 ` Chao Yu
2020-04-23 19:49 ` Jaegeuk Kim
2020-04-23 19:49 ` Jaegeuk Kim
2020-04-24 1:00 ` Chao Yu
2020-04-24 1:00 ` Chao Yu
2020-04-24 3:35 ` Jaegeuk Kim [this message]
2020-04-24 3:35 ` Jaegeuk Kim
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=20200424033527.GA106894@google.com \
--to=jaegeuk@kernel.org \
--cc=kernel-team@android.com \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
--cc=yuchao0@huawei.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: 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.