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