All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Lei Xue <carmark.dlut@gmail.com>,
	Vegard Nossum <vegard.nossum@gmail.com>,
	Anthony DeRobertis <aderobertis@metrics.net>,
	NeilBrown <neilb@suse.com>, Daniel Axtens <dja@axtens.net>,
	Kiran Kumar Modukuri <kiran.modukuri@gmail.com>,
	David Howells <dhowells@redhat.com>,
	Sasha Levin <alexander.levin@microsoft.com>
Subject: [PATCH 4.4 28/80] cachefiles: Fix refcounting bug in backing-file read monitoring
Date: Mon,  3 Sep 2018 18:49:06 +0200	[thread overview]
Message-ID: <20180903164935.274928805@linuxfoundation.org> (raw)
In-Reply-To: <20180903164934.171677301@linuxfoundation.org>

4.4-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Kiran Kumar Modukuri <kiran.modukuri@gmail.com>

[ Upstream commit 934140ab028713a61de8bca58c05332416d037d1 ]

cachefiles_read_waiter() has the right to access a 'monitor' object by
virtue of being called under the waitqueue lock for one of the pages in its
purview.  However, it has no ref on that monitor object or on the
associated operation.

What it is allowed to do is to move the monitor object to the operation's
to_do list, but once it drops the work_lock, it's actually no longer
permitted to access that object.  However, it is trying to enqueue the
retrieval operation for processing - but it can only do this via a pointer
in the monitor object, something it shouldn't be doing.

If it doesn't enqueue the operation, the operation may not get processed.
If the order is flipped so that the enqueue is first, then it's possible
for the work processor to look at the to_do list before the monitor is
enqueued upon it.

Fix this by getting a ref on the operation so that we can trust that it
will still be there once we've added the monitor to the to_do list and
dropped the work_lock.  The op can then be enqueued after the lock is
dropped.

The bug can manifest in one of a couple of ways.  The first manifestation
looks like:

 FS-Cache:
 FS-Cache: Assertion failed
 FS-Cache: 6 == 5 is false
 ------------[ cut here ]------------
 kernel BUG at fs/fscache/operation.c:494!
 RIP: 0010:fscache_put_operation+0x1e3/0x1f0
 ...
 fscache_op_work_func+0x26/0x50
 process_one_work+0x131/0x290
 worker_thread+0x45/0x360
 kthread+0xf8/0x130
 ? create_worker+0x190/0x190
 ? kthread_cancel_work_sync+0x10/0x10
 ret_from_fork+0x1f/0x30

This is due to the operation being in the DEAD state (6) rather than
INITIALISED, COMPLETE or CANCELLED (5) because it's already passed through
fscache_put_operation().

The bug can also manifest like the following:

 kernel BUG at fs/fscache/operation.c:69!
 ...
    [exception RIP: fscache_enqueue_operation+246]
 ...
 #7 [ffff883fff083c10] fscache_enqueue_operation at ffffffffa0b793c6
 #8 [ffff883fff083c28] cachefiles_read_waiter at ffffffffa0b15a48
 #9 [ffff883fff083c48] __wake_up_common at ffffffff810af028

I'm not entirely certain as to which is line 69 in Lei's kernel, so I'm not
entirely clear which assertion failed.

Fixes: 9ae326a69004 ("CacheFiles: A cache that backs onto a mounted filesystem")
Reported-by: Lei Xue <carmark.dlut@gmail.com>
Reported-by: Vegard Nossum <vegard.nossum@gmail.com>
Reported-by: Anthony DeRobertis <aderobertis@metrics.net>
Reported-by: NeilBrown <neilb@suse.com>
Reported-by: Daniel Axtens <dja@axtens.net>
Reported-by: Kiran Kumar Modukuri <kiran.modukuri@gmail.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 fs/cachefiles/rdwr.c |   17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

--- a/fs/cachefiles/rdwr.c
+++ b/fs/cachefiles/rdwr.c
@@ -27,6 +27,7 @@ static int cachefiles_read_waiter(wait_q
 	struct cachefiles_one_read *monitor =
 		container_of(wait, struct cachefiles_one_read, monitor);
 	struct cachefiles_object *object;
+	struct fscache_retrieval *op = monitor->op;
 	struct wait_bit_key *key = _key;
 	struct page *page = wait->private;
 
@@ -51,16 +52,22 @@ static int cachefiles_read_waiter(wait_q
 	list_del(&wait->task_list);
 
 	/* move onto the action list and queue for FS-Cache thread pool */
-	ASSERT(monitor->op);
+	ASSERT(op);
 
-	object = container_of(monitor->op->op.object,
-			      struct cachefiles_object, fscache);
+	/* We need to temporarily bump the usage count as we don't own a ref
+	 * here otherwise cachefiles_read_copier() may free the op between the
+	 * monitor being enqueued on the op->to_do list and the op getting
+	 * enqueued on the work queue.
+	 */
+	fscache_get_retrieval(op);
 
+	object = container_of(op->op.object, struct cachefiles_object, fscache);
 	spin_lock(&object->work_lock);
-	list_add_tail(&monitor->op_link, &monitor->op->to_do);
+	list_add_tail(&monitor->op_link, &op->to_do);
 	spin_unlock(&object->work_lock);
 
-	fscache_enqueue_retrieval(monitor->op);
+	fscache_enqueue_retrieval(op);
+	fscache_put_retrieval(op);
 	return 0;
 }
 



  parent reply	other threads:[~2018-09-03 17:01 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-03 16:48 [PATCH 4.4 00/80] 4.4.154-stable review Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 01/80] sched/sysctl: Check user input value of sysctl_sched_time_avg Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 02/80] Cipso: cipso_v4_optptr enter infinite loop Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 03/80] vti6: fix PMTU caching and reporting on xmit Greg Kroah-Hartman
2018-09-11 23:22   ` Ben Hutchings
2018-09-13  7:07     ` Greg Kroah-Hartman
2018-09-13  7:07       ` Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 04/80] xfrm: fix missing dst_release() after policy blocking lbcast and multicast Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 05/80] xfrm: free skb if nlsk pointer is NULL Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 06/80] mac80211: add stations tied to AP_VLANs during hw reconfig Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 07/80] nl80211: Add a missing break in parse_station_flags Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 08/80] drm/bridge: adv7511: Reset registers on hotplug Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 09/80] scsi: libiscsi: fix possible NULL pointer dereference in case of TMF Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 10/80] drm/imx: imx-ldb: disable LDB on driver bind Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 11/80] drm/imx: imx-ldb: check if channel is enabled before printing warning Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 12/80] usb: gadget: r8a66597: Fix two possible sleep-in-atomic-context bugs in init_controller() Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 13/80] usb: gadget: r8a66597: Fix a possible sleep-in-atomic-context bugs in r8a66597_queue() Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 14/80] usb/phy: fix PPC64 build errors in phy-fsl-usb.c Greg Kroah-Hartman
2018-09-03 16:48   ` [4.4,14/80] " Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 16/80] usb: gadget: f_uac2: fix endianness of struct cntrl_*_lay3 Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 17/80] tools/power turbostat: fix -S on UP systems Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 18/80] net: caif: Add a missing rcu_read_unlock() in caif_flow_cb Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 19/80] qed: Fix possible race for the link state value Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 20/80] atl1c: reserve min skb headroom Greg Kroah-Hartman
2018-09-03 16:48 ` [PATCH 4.4 21/80] net: prevent ISA drivers from building on PPC32 Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 22/80] can: mpc5xxx_can: check of_iomap return before use Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 23/80] i2c: davinci: Avoid zero value of CLKH Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 24/80] media: staging: omap4iss: Include asm/cacheflush.h after generic includes Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 25/80] bnx2x: Fix invalid memory access in rss hash config path Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 26/80] net: axienet: Fix double deregister of mdio Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 27/80] fscache: Allow cancelled operations to be enqueued Greg Kroah-Hartman
2018-09-03 16:49 ` Greg Kroah-Hartman [this message]
2018-09-03 16:49 ` [PATCH 4.4 29/80] cachefiles: Wait rather than BUGing on "Unexpected object collision" Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 30/80] selftests/ftrace: Add snapshot and tracing_on test case Greg Kroah-Hartman
2018-09-03 16:49   ` Greg Kroah-Hartman
2018-09-03 16:49   ` gregkh
2018-09-03 16:49 ` [PATCH 4.4 31/80] zswap: re-check zswap_is_full() after do zswap_shrink() Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 32/80] tools/power turbostat: Read extended processor family from CPUID Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 33/80] Revert "MIPS: BCM47XX: Enable 74K Core ExternalSync for PCIe erratum" Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 34/80] enic: handle mtu change for vf properly Greg Kroah-Hartman
2018-09-12  1:03   ` Ben Hutchings
2018-09-13  7:10     ` Greg Kroah-Hartman
2018-09-13  7:10       ` Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 35/80] arc: fix build errors in arc/include/asm/delay.h Greg Kroah-Hartman
2018-09-03 16:49   ` Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 36/80] arc: fix type warnings in arc/mm/cache.c Greg Kroah-Hartman
2018-09-03 16:49   ` Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 37/80] drivers: net: lmc: fix case value for target abort error Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 38/80] scsi: fcoe: drop frames in ELS LOGO error path Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 39/80] scsi: vmw_pvscsi: Return DID_RESET for status SAM_STAT_COMMAND_TERMINATED Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 40/80] mm/memory.c: check return value of ioremap_prot Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 41/80] cifs: add missing debug entries for kconfig options Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 42/80] cifs: check kmalloc before use Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 43/80] smb3: Do not send SMB3 SET_INFO if nothing changed Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 44/80] smb3: dont request leases in symlink creation and query Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 45/80] btrfs: dont leak ret from do_chunk_alloc Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 46/80] s390/kvm: fix deadlock when killed by oom Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 47/80] ext4: check for NUL characters in extended attributes name Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 48/80] ext4: sysfs: print ext4_super_block fields as little-endian Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 49/80] ext4: reset error code in ext4_find_entry in fallback Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 50/80] arm64: mm: check for upper PAGE_SHIFT bits in pfn_valid() Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 51/80] KVM: arm/arm64: Skip updating PTE entry if no change Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 52/80] KVM: arm/arm64: Skip updating PMD " Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 53/80] x86/speculation/l1tf: Fix overflow in l1tf_pfn_limit() on 32bit Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 54/80] x86/speculation/l1tf: Fix off-by-one error when warning that system has too much RAM Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 55/80] x86/speculation/l1tf: Suggest what to do on systems with " Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 56/80] x86/process: Re-export start_thread() Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 57/80] fuse: Dont access pipe->buffers without pipe_lock() Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 58/80] fuse: fix double request_end() Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 59/80] fuse: fix unlocked access to processing queue Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 60/80] fuse: umount should wait for all requests Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 61/80] fuse: Fix oops at process_init_reply() Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 62/80] fuse: Add missed unlock_page() to fuse_readpages_fill() Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 63/80] udl-kms: change down_interruptible to down Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 64/80] udl-kms: handle allocation failure Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 65/80] udl-kms: fix crash due to uninitialized memory Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 66/80] ASoC: dpcm: dont merge format from invalid codec dai Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 67/80] ASoC: sirf: Fix potential NULL pointer dereference Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 69/80] x86/irqflags: Mark native_restore_fl extern inline Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 70/80] x86/spectre: Add missing family 6 check to microcode check Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 71/80] s390: fix br_r1_trampoline for machines without exrl Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 72/80] s390/qdio: reset old sbal_state flags Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 73/80] s390/pci: fix out of bounds access during irq setup Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 74/80] kprobes: Make list and blacklist root user read only Greg Kroah-Hartman
2018-09-03 16:49   ` Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 75/80] MIPS: Correct the 64-bit DSP accumulator register size Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 76/80] MIPS: lib: Provide MIPS64r6 __multi3() for GCC < 7 Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 77/80] scsi: sysfs: Introduce sysfs_{un,}break_active_protection() Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 78/80] scsi: core: Avoid that SCSI device removal through sysfs triggers a deadlock Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 79/80] iscsi target: fix session creation failure handling Greg Kroah-Hartman
2018-09-03 16:49 ` [PATCH 4.4 80/80] cdrom: Fix info leak/OOB read in cdrom_ioctl_drive_status Greg Kroah-Hartman
2018-09-04  0:42 ` [PATCH 4.4 00/80] 4.4.154-stable review Nathan Chancellor
2018-09-04  5:25   ` Greg Kroah-Hartman
2018-09-04  8:23 ` Naresh Kamboju
2018-09-04 19:26 ` Shuah Khan
2018-09-04 22:51 ` Guenter Roeck

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=20180903164935.274928805@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=aderobertis@metrics.net \
    --cc=alexander.levin@microsoft.com \
    --cc=carmark.dlut@gmail.com \
    --cc=dhowells@redhat.com \
    --cc=dja@axtens.net \
    --cc=kiran.modukuri@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=neilb@suse.com \
    --cc=stable@vger.kernel.org \
    --cc=vegard.nossum@gmail.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.