ACK/Cmnt: [SRU T/X/A/B][PATCH 1/1] fscache: Fix hanging wait on page discarded by writeback
Stefan Bader
stefan.bader at canonical.com
Fri Jun 15 15:17:49 UTC 2018
On 15.06.2018 04:33, Daniel Axtens wrote:
> From: David Howells <dhowells at redhat.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1777029
>
> If the fscache asynchronous write operation elects to discard a page that's
> pending storage to the cache because the page would be over the store limit
> then it needs to wake the page as someone may be waiting on completion of
> the write.
>
> The problem is that the store limit may be updated by a different
> asynchronous operation - and so may miss the write - and that the store
> limit may not even get updated until later by the netfs.
>
> Fix the kernel hang by making fscache_write_op() mark as written any pages
> that are over the limit.
>
> Signed-off-by: David Howells <dhowells at redhat.com>
> (cherry picked from commit 2c98425720233ae3e135add0c7e869b32913502f)
> Signed-off-by: Daniel Axtens <daniel.axtens at canonical.com>
Acked-by: Stefan Bader <stefan.bader at canonical.com>
> ---
I would classify a hang as high severity and therefore applicable to Artful
still. Daniel, please update the importance of the bug tasks accordingly if you
concur.
Thanks,
Stefan
> fs/fscache/page.c | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/fs/fscache/page.c b/fs/fscache/page.c
> index 961029e04027..da2fb58f2ecb 100644
> --- a/fs/fscache/page.c
> +++ b/fs/fscache/page.c
> @@ -776,6 +776,7 @@ static void fscache_write_op(struct fscache_operation *_op)
>
> _enter("{OP%x,%d}", op->op.debug_id, atomic_read(&op->op.usage));
>
> +again:
> spin_lock(&object->lock);
> cookie = object->cookie;
>
> @@ -816,10 +817,6 @@ static void fscache_write_op(struct fscache_operation *_op)
> goto superseded;
> page = results[0];
> _debug("gang %d [%lx]", n, page->index);
> - if (page->index >= op->store_limit) {
> - fscache_stat(&fscache_n_store_pages_over_limit);
> - goto superseded;
> - }
>
> radix_tree_tag_set(&cookie->stores, page->index,
> FSCACHE_COOKIE_STORING_TAG);
> @@ -829,6 +826,9 @@ static void fscache_write_op(struct fscache_operation *_op)
> spin_unlock(&cookie->stores_lock);
> spin_unlock(&object->lock);
>
> + if (page->index >= op->store_limit)
> + goto discard_page;
> +
> fscache_stat(&fscache_n_store_pages);
> fscache_stat(&fscache_n_cop_write_page);
> ret = object->cache->ops->write_page(op, page);
> @@ -844,6 +844,11 @@ static void fscache_write_op(struct fscache_operation *_op)
> _leave("");
> return;
>
> +discard_page:
> + fscache_stat(&fscache_n_store_pages_over_limit);
> + fscache_end_page_write(object, page);
> + goto again;
> +
> superseded:
> /* this writer is going away and there aren't any more things to
> * write */
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20180615/9b6e3c39/attachment.sig>
More information about the kernel-team
mailing list