<feed xmlns='http://www.w3.org/2005/Atom'>
<title>kernel/linux.git/fs/fscache/page.c, branch linux-4.4.y</title>
<subtitle>Linux kernel stable tree (mirror)</subtitle>
<id>https://git.radix-linux.su/kernel/linux.git/atom?h=linux-4.4.y</id>
<link rel='self' href='https://git.radix-linux.su/kernel/linux.git/atom?h=linux-4.4.y'/>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/'/>
<updated>2018-05-30T05:49:08+00:00</updated>
<entry>
<title>fscache: Fix hanging wait on page discarded by writeback</title>
<updated>2018-05-30T05:49:08+00:00</updated>
<author>
<name>David Howells</name>
<email>dhowells@redhat.com</email>
</author>
<published>2018-04-04T12:41:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=61b4c050ad5dcb1c8dfa58e1f183f512e43055ea'/>
<id>urn:sha1:61b4c050ad5dcb1c8dfa58e1f183f512e43055ea</id>
<content type='text'>
[ Upstream commit 2c98425720233ae3e135add0c7e869b32913502f ]

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 &lt;dhowells@redhat.com&gt;
Signed-off-by: Sasha Levin &lt;alexander.levin@microsoft.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>FS-Cache: Handle a write to the page immediately beyond the EOF marker</title>
<updated>2015-11-11T07:11:02+00:00</updated>
<author>
<name>David Howells</name>
<email>dhowells@redhat.com</email>
</author>
<published>2015-11-04T15:20:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=102f4d900c9c8f5ed89ae4746d493fe3ebd7ba64'/>
<id>urn:sha1:102f4d900c9c8f5ed89ae4746d493fe3ebd7ba64</id>
<content type='text'>
Handle a write being requested to the page immediately beyond the EOF
marker on a cache object.  Currently this gets an assertion failure in
CacheFiles because the EOF marker is used there to encode information about
a partial page at the EOF - which could lead to an unknown blank spot in
the file if we extend the file over it.

The problem is actually in fscache where we check the index of the page
being written against store_limit.  store_limit is set to the number of
pages that we're allowed to store by fscache_set_store_limit() - which
means it's one more than the index of the last page we're allowed to store.
The problem is that we permit writing to a page with an index _equal_ to
the store limit - when we should reject that case.

Whilst we're at it, change the triggered assertion in CacheFiles to just
return -ENOBUFS instead.

The assertion failure looks something like this:

CacheFiles: Assertion failed
1000 &lt; 7b1 is false
------------[ cut here ]------------
kernel BUG at fs/cachefiles/rdwr.c:962!
...
RIP: 0010:[&lt;ffffffffa02c9e83&gt;]  [&lt;ffffffffa02c9e83&gt;] cachefiles_write_page+0x273/0x2d0 [cachefiles]

Cc: stable@vger.kernel.org # v2.6.31+; earlier - that + backport of a17754f (at least)
Signed-off-by: David Howells &lt;dhowells@redhat.com&gt;
Signed-off-by: Al Viro &lt;viro@zeniv.linux.org.uk&gt;
</content>
</entry>
<entry>
<title>mm, page_alloc: distinguish between being unable to sleep, unwilling to sleep and avoiding waking kswapd</title>
<updated>2015-11-07T01:50:42+00:00</updated>
<author>
<name>Mel Gorman</name>
<email>mgorman@techsingularity.net</email>
</author>
<published>2015-11-07T00:28:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=d0164adc89f6bb374d304ffcc375c6d2652fe67d'/>
<id>urn:sha1:d0164adc89f6bb374d304ffcc375c6d2652fe67d</id>
<content type='text'>
__GFP_WAIT has been used to identify atomic context in callers that hold
spinlocks or are in interrupts.  They are expected to be high priority and
have access one of two watermarks lower than "min" which can be referred
to as the "atomic reserve".  __GFP_HIGH users get access to the first
lower watermark and can be called the "high priority reserve".

Over time, callers had a requirement to not block when fallback options
were available.  Some have abused __GFP_WAIT leading to a situation where
an optimisitic allocation with a fallback option can access atomic
reserves.

This patch uses __GFP_ATOMIC to identify callers that are truely atomic,
cannot sleep and have no alternative.  High priority users continue to use
__GFP_HIGH.  __GFP_DIRECT_RECLAIM identifies callers that can sleep and
are willing to enter direct reclaim.  __GFP_KSWAPD_RECLAIM to identify
callers that want to wake kswapd for background reclaim.  __GFP_WAIT is
redefined as a caller that is willing to enter direct reclaim and wake
kswapd for background reclaim.

This patch then converts a number of sites

o __GFP_ATOMIC is used by callers that are high priority and have memory
  pools for those requests. GFP_ATOMIC uses this flag.

o Callers that have a limited mempool to guarantee forward progress clear
  __GFP_DIRECT_RECLAIM but keep __GFP_KSWAPD_RECLAIM. bio allocations fall
  into this category where kswapd will still be woken but atomic reserves
  are not used as there is a one-entry mempool to guarantee progress.

o Callers that are checking if they are non-blocking should use the
  helper gfpflags_allow_blocking() where possible. This is because
  checking for __GFP_WAIT as was done historically now can trigger false
  positives. Some exceptions like dm-crypt.c exist where the code intent
  is clearer if __GFP_DIRECT_RECLAIM is used instead of the helper due to
  flag manipulations.

o Callers that built their own GFP flags instead of starting with GFP_KERNEL
  and friends now also need to specify __GFP_KSWAPD_RECLAIM.

The first key hazard to watch out for is callers that removed __GFP_WAIT
and was depending on access to atomic reserves for inconspicuous reasons.
In some cases it may be appropriate for them to use __GFP_HIGH.

The second key hazard is callers that assembled their own combination of
GFP flags instead of starting with something like GFP_KERNEL.  They may
now wish to specify __GFP_KSWAPD_RECLAIM.  It's almost certainly harmless
if it's missed in most cases as other activity will wake kswapd.

Signed-off-by: Mel Gorman &lt;mgorman@techsingularity.net&gt;
Acked-by: Vlastimil Babka &lt;vbabka@suse.cz&gt;
Acked-by: Michal Hocko &lt;mhocko@suse.com&gt;
Acked-by: Johannes Weiner &lt;hannes@cmpxchg.org&gt;
Cc: Christoph Lameter &lt;cl@linux.com&gt;
Cc: David Rientjes &lt;rientjes@google.com&gt;
Cc: Vitaly Wool &lt;vitalywool@gmail.com&gt;
Cc: Rik van Riel &lt;riel@redhat.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</content>
</entry>
<entry>
<title>FS-Cache: Retain the netfs context in the retrieval op earlier</title>
<updated>2015-04-02T13:28:53+00:00</updated>
<author>
<name>David Howells</name>
<email>dhowells@redhat.com</email>
</author>
<published>2015-02-24T10:05:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=4a47132ff472a0c2c5441baeb50cf97f2580bc43'/>
<id>urn:sha1:4a47132ff472a0c2c5441baeb50cf97f2580bc43</id>
<content type='text'>
Now that the retrieval operation may be disposed of by fscache_put_operation()
before we actually set the context, the retrieval-specific cleanup operation
can produce a NULL-pointer dereference when it tries to unconditionally clean
up the netfs context.

Given that it is expected that we'll get at least as far as the place where we
currently set the context pointer and it is unlikely we'll go through the
error handling paths prior to that point, retain the context right from the
point that the retrieval op is allocated.

Concomitant to this, we need to retain the cookie pointer in the retrieval op
also so that we can call the netfs to release its context in the release
method.

In addition, we might now get into fscache_release_retrieval_op() with the op
only initialised.  To this end, set the operation to DEAD only after the
release method has been called and skip the n_pages test upon cleanup if the
op is still in the INITIALISED state.

Without these changes, the following oops might be seen:

	BUG: unable to handle kernel NULL pointer dereference at 00000000000000b8
	...
	RIP: 0010:[&lt;ffffffffa0089c98&gt;] fscache_release_retrieval_op+0xae/0x100
	...
	Call Trace:
	 [&lt;ffffffffa0088560&gt;] fscache_put_operation+0x117/0x2e0
	 [&lt;ffffffffa008b8f5&gt;] __fscache_read_or_alloc_pages+0x351/0x3ac
	 [&lt;ffffffffa00b761f&gt;] __nfs_readpages_from_fscache+0x59/0xbf [nfs]
	 [&lt;ffffffffa00b06c5&gt;] nfs_readpages+0x10c/0x185 [nfs]
	 [&lt;ffffffff81124925&gt;] ? alloc_pages_current+0x119/0x13e
	 [&lt;ffffffff810ee5fd&gt;] ? __page_cache_alloc+0xfb/0x10a
	 [&lt;ffffffff810f87f8&gt;] __do_page_cache_readahead+0x188/0x22c
	 [&lt;ffffffff810f8b3a&gt;] ondemand_readahead+0x29e/0x2af
	 [&lt;ffffffff810f8c92&gt;] page_cache_sync_readahead+0x38/0x3a
	 [&lt;ffffffff810ef337&gt;] generic_file_read_iter+0x1a2/0x55a
	 [&lt;ffffffffa00a9dff&gt;] ? nfs_revalidate_mapping+0xd6/0x288 [nfs]
	 [&lt;ffffffffa00a6a23&gt;] nfs_file_read+0x49/0x70 [nfs]
	 [&lt;ffffffff811363be&gt;] new_sync_read+0x78/0x9c
	 [&lt;ffffffff81137164&gt;] __vfs_read+0x13/0x38
	 [&lt;ffffffff8113721e&gt;] vfs_read+0x95/0x121
	 [&lt;ffffffff811372f6&gt;] SyS_read+0x4c/0x8a
	 [&lt;ffffffff81557a52&gt;] system_call_fastpath+0x12/0x17

Signed-off-by: David Howells &lt;dhowells@redhat.com&gt;
Reviewed-by: Steve Dickson &lt;steved@redhat.com&gt;
Acked-by: Jeff Layton &lt;jeff.layton@primarydata.com&gt;
</content>
</entry>
<entry>
<title>FS-Cache: The operation cancellation method needs calling in more places</title>
<updated>2015-04-02T13:28:53+00:00</updated>
<author>
<name>David Howells</name>
<email>dhowells@redhat.com</email>
</author>
<published>2015-02-24T10:05:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=d3b97ca4a99e4e6c78f5a21c968eadf5c8ba9971'/>
<id>urn:sha1:d3b97ca4a99e4e6c78f5a21c968eadf5c8ba9971</id>
<content type='text'>
Any time an incomplete operation is cancelled, the operation cancellation
function needs to be called to clean up.  This is currently being passed
directly to some of the functions that might want to call it, but not all.

Instead, pass the cancellation method pointer to the fscache_operation_init()
and have that cache it in the operation struct.  Further, plug in a dummy
cancellation handler if the caller declines to set one as this allows us to
call the function unconditionally (the extra overhead isn't worth bothering
about as we don't expect to be calling this typically).

The cancellation method must thence be called everywhere the CANCELLED state
is set.  Note that we call it *before* setting the CANCELLED state such that
the method can use the old state value to guide its operation.

fscache_do_cancel_retrieval() needs moving higher up in the sources so that
the init function can use it now.

Without this, the following oops may be seen:

	FS-Cache: Assertion failed
	FS-Cache: 3 == 0 is false
	------------[ cut here ]------------
	kernel BUG at ../fs/fscache/page.c:261!
	...
	RIP: 0010:[&lt;ffffffffa0089c1b&gt;]  fscache_release_retrieval_op+0x77/0x100
	 [&lt;ffffffffa008853d&gt;] fscache_put_operation+0x114/0x2da
	 [&lt;ffffffffa008b8c2&gt;] __fscache_read_or_alloc_pages+0x358/0x3b3
	 [&lt;ffffffffa00b761f&gt;] __nfs_readpages_from_fscache+0x59/0xbf [nfs]
	 [&lt;ffffffffa00b06c5&gt;] nfs_readpages+0x10c/0x185 [nfs]
	 [&lt;ffffffff81124925&gt;] ? alloc_pages_current+0x119/0x13e
	 [&lt;ffffffff810ee5fd&gt;] ? __page_cache_alloc+0xfb/0x10a
	 [&lt;ffffffff810f87f8&gt;] __do_page_cache_readahead+0x188/0x22c
	 [&lt;ffffffff810f8b3a&gt;] ondemand_readahead+0x29e/0x2af
	 [&lt;ffffffff810f8c92&gt;] page_cache_sync_readahead+0x38/0x3a
	 [&lt;ffffffff810ef337&gt;] generic_file_read_iter+0x1a2/0x55a
	 [&lt;ffffffffa00a9dff&gt;] ? nfs_revalidate_mapping+0xd6/0x288 [nfs]
	 [&lt;ffffffffa00a6a23&gt;] nfs_file_read+0x49/0x70 [nfs]
	 [&lt;ffffffff811363be&gt;] new_sync_read+0x78/0x9c
	 [&lt;ffffffff81137164&gt;] __vfs_read+0x13/0x38
	 [&lt;ffffffff8113721e&gt;] vfs_read+0x95/0x121
	 [&lt;ffffffff811372f6&gt;] SyS_read+0x4c/0x8a
	 [&lt;ffffffff81557a52&gt;] system_call_fastpath+0x12/0x17

The assertion is showing that the remaining number of pages (n_pages) is not 0
when the operation is being released.

Signed-off-by: David Howells &lt;dhowells@redhat.com&gt;
Reviewed-by: Steve Dickson &lt;steved@redhat.com&gt;
Acked-by: Jeff Layton &lt;jeff.layton@primarydata.com&gt;
</content>
</entry>
<entry>
<title>FS-Cache: Put an aborted initialised op so that it is accounted correctly</title>
<updated>2015-04-02T13:28:53+00:00</updated>
<author>
<name>David Howells</name>
<email>dhowells@redhat.com</email>
</author>
<published>2015-02-25T14:22:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=a39caadf06879017cb9a8c5c5cb4fc4ccb213275'/>
<id>urn:sha1:a39caadf06879017cb9a8c5c5cb4fc4ccb213275</id>
<content type='text'>
Call fscache_put_operation() or a wrapper on any op that has gone through
fscache_operation_init() so that the accounting shown in /proc is done
correctly, specifically fscache_n_op_release.

fscache_put_operation() therefore now allows an op in the INITIALISED state as
well as in the CANCELLED and COMPLETE states.

Note that this means that an operation can get put that doesn't have its
-&gt;object pointer filled in, so anything that depends on the object needs to be
conditional in fscache_put_operation().

Signed-off-by: David Howells &lt;dhowells@redhat.com&gt;
Reviewed-by: Steve Dickson &lt;steved@redhat.com&gt;
Acked-by: Jeff Layton &lt;jeff.layton@primarydata.com&gt;
</content>
</entry>
<entry>
<title>FS-Cache: Permit fscache_cancel_op() to cancel in-progress operations too</title>
<updated>2015-04-02T13:28:53+00:00</updated>
<author>
<name>David Howells</name>
<email>dhowells@redhat.com</email>
</author>
<published>2015-02-24T10:05:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=418b7eb9e1011bc11220a03ad0045885d04698d2'/>
<id>urn:sha1:418b7eb9e1011bc11220a03ad0045885d04698d2</id>
<content type='text'>
Currently, fscache_cancel_op() only cancels pending operations - attempts to
cancel in-progress operations are ignored.  This leads to a problem in
fscache_wait_for_operation_activation() whereby the wait is terminated, but
the object has been killed.

The check at the end of the function now triggers because it's no longer
contingent on the cache having produced an I/O error since the commit that
fixed the logic error in fscache_object_is_dead().

The result of the check is that it tries to cancel the operation - but since
the object may not be pending by this point, the cancellation request may be
ignored - with the result that the the object is just put by the caller and
fscache_put_operation has an assertion failure because the operation isn't in
either the COMPLETE or the CANCELLED states.

To fix this, we permit in-progress ops to be cancelled under some
circumstances.

The bug results in an oops that looks something like this:

	FS-Cache: fscache_wait_for_operation_activation() = -ENOBUFS [obj dead 3]
	FS-Cache:
	FS-Cache: Assertion failed
	FS-Cache: 3 == 5 is false
	------------[ cut here ]------------
	kernel BUG at ../fs/fscache/operation.c:432!
	...
	RIP: 0010:[&lt;ffffffffa0088574&gt;] fscache_put_operation+0xf2/0x2cd
	Call Trace:
	 [&lt;ffffffffa008b92a&gt;] __fscache_read_or_alloc_pages+0x2ec/0x3b3
	 [&lt;ffffffffa00b761f&gt;] __nfs_readpages_from_fscache+0x59/0xbf [nfs]
	 [&lt;ffffffffa00b06c5&gt;] nfs_readpages+0x10c/0x185 [nfs]
	 [&lt;ffffffff81124925&gt;] ? alloc_pages_current+0x119/0x13e
	 [&lt;ffffffff810ee5fd&gt;] ? __page_cache_alloc+0xfb/0x10a
	 [&lt;ffffffff810f87f8&gt;] __do_page_cache_readahead+0x188/0x22c
	 [&lt;ffffffff810f8b3a&gt;] ondemand_readahead+0x29e/0x2af
	 [&lt;ffffffff810f8c92&gt;] page_cache_sync_readahead+0x38/0x3a
	 [&lt;ffffffff810ef337&gt;] generic_file_read_iter+0x1a2/0x55a
	 [&lt;ffffffffa00a9dff&gt;] ? nfs_revalidate_mapping+0xd6/0x288 [nfs]
	 [&lt;ffffffffa00a6a23&gt;] nfs_file_read+0x49/0x70 [nfs]
	 [&lt;ffffffff811363be&gt;] new_sync_read+0x78/0x9c
	 [&lt;ffffffff81137164&gt;] __vfs_read+0x13/0x38
	 [&lt;ffffffff8113721e&gt;] vfs_read+0x95/0x121
	 [&lt;ffffffff811372f6&gt;] SyS_read+0x4c/0x8a
	 [&lt;ffffffff81557a52&gt;] system_call_fastpath+0x12/0x17

Signed-off-by: David Howells &lt;dhowells@redhat.com&gt;
Reviewed-by: Steve Dickson &lt;steved@redhat.com&gt;
Acked-by: Jeff Layton &lt;jeff.layton@primarydata.com&gt;
</content>
</entry>
<entry>
<title>FS-Cache: fscache_object_is_dead() has wrong logic, kill it</title>
<updated>2015-04-02T13:28:53+00:00</updated>
<author>
<name>David Howells</name>
<email>dhowells@redhat.com</email>
</author>
<published>2015-02-24T10:52:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=87021526300f1a292dd966e141e183630ac95317'/>
<id>urn:sha1:87021526300f1a292dd966e141e183630ac95317</id>
<content type='text'>
fscache_object_is_dead() returns true only if the object is marked dead and
the cache got an I/O error.  This should be a logical OR instead.  Since two
of the callers got split up into handling for separate subcases, expand the
other callers and kill the function.  This is probably the right thing to do
anyway since one of the subcases isn't about the object at all, but rather
about the cache.

Signed-off-by: David Howells &lt;dhowells@redhat.com&gt;
Reviewed-by: Steve Dickson &lt;steved@redhat.com&gt;
Acked-by: Jeff Layton &lt;jeff.layton@primarydata.com&gt;
</content>
</entry>
<entry>
<title>FS-Cache: refcount becomes corrupt under vma pressure.</title>
<updated>2014-09-17T21:41:40+00:00</updated>
<author>
<name>Milosz Tanski</name>
<email>milosz@adfin.com</email>
</author>
<published>2014-08-13T16:58:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=3e1199dcad004a40b55297a4736ccd1b9b81a952'/>
<id>urn:sha1:3e1199dcad004a40b55297a4736ccd1b9b81a952</id>
<content type='text'>
In rare cases under heavy VMA pressure the ref count for a fscache cookie
becomes corrupt. In this case we decrement ref count even if we fail before
incrementing the refcount.

FS-Cache: Assertion failed bnode-eca5f9c6/syslog
0 &gt; 0 is false
------------[ cut here ]------------
kernel BUG at fs/fscache/cookie.c:519!
invalid opcode: 0000 [#1] SMP
Call Trace:
[&lt;ffffffffa01ba060&gt;] __fscache_relinquish_cookie+0x50/0x220 [fscache]
[&lt;ffffffffa02d64ce&gt;] ceph_fscache_unregister_inode_cookie+0x3e/0x50 [ceph]
[&lt;ffffffffa02ae1d3&gt;] ceph_destroy_inode+0x33/0x200 [ceph]
[&lt;ffffffff811cf67e&gt;] ? __fsnotify_inode_delete+0xe/0x10
[&lt;ffffffff811a9e0c&gt;] destroy_inode+0x3c/0x70
[&lt;ffffffff811a9f51&gt;] evict+0x111/0x180
[&lt;ffffffff811aa763&gt;] iput+0x103/0x190
[&lt;ffffffff811a5de8&gt;] __dentry_kill+0x1c8/0x220
[&lt;ffffffff811a5f31&gt;] shrink_dentry_list+0xf1/0x250
[&lt;ffffffff811a762c&gt;] prune_dcache_sb+0x4c/0x60
[&lt;ffffffff811930af&gt;] super_cache_scan+0xff/0x170
[&lt;ffffffff8113d7a0&gt;] shrink_slab_node+0x140/0x2c0
[&lt;ffffffff8113f2da&gt;] shrink_slab+0x8a/0x130
[&lt;ffffffff81142572&gt;] balance_pgdat+0x3e2/0x5d0
[&lt;ffffffff811428ca&gt;] kswapd+0x16a/0x4a0
[&lt;ffffffff810a43f0&gt;] ? __wake_up_sync+0x20/0x20
[&lt;ffffffff81142760&gt;] ? balance_pgdat+0x5d0/0x5d0
[&lt;ffffffff81083e09&gt;] kthread+0xc9/0xe0
[&lt;ffffffff81010000&gt;] ? ftrace_raw_event_xen_mmu_release_ptpage+0x70/0x90
[&lt;ffffffff81083d40&gt;] ? flush_kthread_worker+0xb0/0xb0
[&lt;ffffffff8159f63c&gt;] ret_from_fork+0x7c/0xb0
[&lt;ffffffff81083d40&gt;] ? flush_kthread_worker+0xb0/0xb0
RIP [&lt;ffffffffa01b984b&gt;] __fscache_disable_cookie+0x1db/0x210 [fscache]
RSP &lt;ffff8803bc85f9b8&gt;
---[ end trace 254d0d7c74a01f25 ]---

Signed-off-by: Milosz Tanski &lt;milosz@adfin.com&gt;
Signed-off-by: David Howells &lt;dhowells@redhat.com&gt;
</content>
</entry>
<entry>
<title>FS-Cache: Timeout for releasepage()</title>
<updated>2014-08-27T14:24:06+00:00</updated>
<author>
<name>Milosz Tanski</name>
<email>milosz@adfin.com</email>
</author>
<published>2014-08-13T16:58:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=9776de96e51565286da25c74d6f631abc50c63ef'/>
<id>urn:sha1:9776de96e51565286da25c74d6f631abc50c63ef</id>
<content type='text'>
This is meant to avoid a recusive hang caused by underlying filesystem trying
to grab a free page and causing a write-out.

INFO: task kworker/u30:7:28375 blocked for more than 120 seconds.
      Not tainted 3.15.0-virtual #74
"echo 0 &gt; /proc/sys/kernel/hung_task_timeout_secs" disables this message.
kworker/u30:7   D 0000000000000000     0 28375      2 0x00000000
Workqueue: fscache_operation fscache_op_work_func [fscache]
 ffff88000b147148 0000000000000046 0000000000000000 ffff88000b1471c8
 ffff8807aa031820 0000000000014040 ffff88000b147fd8 0000000000014040
 ffff880f0c50c860 ffff8807aa031820 ffff88000b147158 ffff88007be59cd0
Call Trace:
 [&lt;ffffffff815930e9&gt;] schedule+0x29/0x70
 [&lt;ffffffffa018bed5&gt;] __fscache_wait_on_page_write+0x55/0x90 [fscache]
 [&lt;ffffffff810a4350&gt;] ? __wake_up_sync+0x20/0x20
 [&lt;ffffffffa018c135&gt;] __fscache_maybe_release_page+0x65/0x1e0 [fscache]
 [&lt;ffffffffa02ad813&gt;] ceph_releasepage+0x83/0x100 [ceph]
 [&lt;ffffffff811635b0&gt;] ? anon_vma_fork+0x130/0x130
 [&lt;ffffffff8112cdd2&gt;] try_to_release_page+0x32/0x50
 [&lt;ffffffff81140096&gt;] shrink_page_list+0x7e6/0x9d0
 [&lt;ffffffff8113f278&gt;] ? isolate_lru_pages.isra.73+0x78/0x1e0
 [&lt;ffffffff81140932&gt;] shrink_inactive_list+0x252/0x4c0
 [&lt;ffffffff811412b1&gt;] shrink_lruvec+0x3e1/0x670
 [&lt;ffffffff8114157f&gt;] shrink_zone+0x3f/0x110
 [&lt;ffffffff81141b06&gt;] do_try_to_free_pages+0x1d6/0x450
 [&lt;ffffffff8114a939&gt;] ? zone_statistics+0x99/0xc0
 [&lt;ffffffff81141e44&gt;] try_to_free_pages+0xc4/0x180
 [&lt;ffffffff81136982&gt;] __alloc_pages_nodemask+0x6b2/0xa60
 [&lt;ffffffff811c1d4e&gt;] ? __find_get_block+0xbe/0x250
 [&lt;ffffffff810a405e&gt;] ? wake_up_bit+0x2e/0x40
 [&lt;ffffffff811740c3&gt;] alloc_pages_current+0xb3/0x180
 [&lt;ffffffff8112cf07&gt;] __page_cache_alloc+0xb7/0xd0
 [&lt;ffffffff8112da6c&gt;] grab_cache_page_write_begin+0x7c/0xe0
 [&lt;ffffffff81214072&gt;] ? ext4_mark_inode_dirty+0x82/0x220
 [&lt;ffffffff81214a89&gt;] ext4_da_write_begin+0x89/0x2d0
 [&lt;ffffffff8112c6ee&gt;] generic_perform_write+0xbe/0x1d0
 [&lt;ffffffff811a96b1&gt;] ? update_time+0x81/0xc0
 [&lt;ffffffff811ad4c2&gt;] ? mnt_clone_write+0x12/0x30
 [&lt;ffffffff8112e80e&gt;] __generic_file_aio_write+0x1ce/0x3f0
 [&lt;ffffffff8112ea8e&gt;] generic_file_aio_write+0x5e/0xe0
 [&lt;ffffffff8120b94f&gt;] ext4_file_write+0x9f/0x410
 [&lt;ffffffff8120af56&gt;] ? ext4_file_open+0x66/0x180
 [&lt;ffffffff8118f0da&gt;] do_sync_write+0x5a/0x90
 [&lt;ffffffffa025c6c9&gt;] cachefiles_write_page+0x149/0x430 [cachefiles]
 [&lt;ffffffff812cf439&gt;] ? radix_tree_gang_lookup_tag+0x89/0xd0
 [&lt;ffffffffa018c512&gt;] fscache_write_op+0x222/0x3b0 [fscache]
 [&lt;ffffffffa018b35a&gt;] fscache_op_work_func+0x3a/0x100 [fscache]
 [&lt;ffffffff8107bfe9&gt;] process_one_work+0x179/0x4a0
 [&lt;ffffffff8107d47b&gt;] worker_thread+0x11b/0x370
 [&lt;ffffffff8107d360&gt;] ? manage_workers.isra.21+0x2e0/0x2e0
 [&lt;ffffffff81083d69&gt;] kthread+0xc9/0xe0
 [&lt;ffffffff81010000&gt;] ? ftrace_raw_event_xen_mmu_release_ptpage+0x70/0x90
 [&lt;ffffffff81083ca0&gt;] ? flush_kthread_worker+0xb0/0xb0
 [&lt;ffffffff8159eefc&gt;] ret_from_fork+0x7c/0xb0
 [&lt;ffffffff81083ca0&gt;] ? flush_kthread_worker+0xb0/0xb0

Signed-off-by: Milosz Tanski &lt;milosz@adfin.com&gt;
Signed-off-by: David Howells &lt;dhowells@redhat.com&gt;
</content>
</entry>
</feed>
