stable.vger.kernel.org archive mirror
 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, Yijing Wang <wangyijing@huawei.com>,
	Chandra Sekhar Lingutla <clingutla@codeaurora.org>,
	Ming Lei <ming.lei@canonical.com>, Jiri Slaby <jslaby@suse.cz>
Subject: [PATCH 4.8 85/85] driver core: fix race between creating/querying glue dir and its cleanup
Date: Wed,  4 Jan 2017 21:48:10 +0100	[thread overview]
Message-ID: <20170104200707.304099989@linuxfoundation.org> (raw)
In-Reply-To: <20170104200703.349648590@linuxfoundation.org>

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

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

From: Ming Lei <ming.lei@canonical.com>

commit cebf8fd16900fdfd58c0028617944f808f97fe50 upstream.

The global mutex of 'gdp_mutex' is used to serialize creating/querying
glue dir and its cleanup. Turns out it isn't a perfect way because
part(kobj_kset_leave()) of the actual cleanup action() is done inside
the release handler of the glue dir kobject. That means gdp_mutex has
to be held before releasing the last reference count of the glue dir
kobject.

This patch moves glue dir's cleanup after kobject_del() in device_del()
for avoiding the race.

Cc: Yijing Wang <wangyijing@huawei.com>
Reported-by: Chandra Sekhar Lingutla <clingutla@codeaurora.org>
Signed-off-by: Ming Lei <ming.lei@canonical.com>
Cc: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 drivers/base/core.c |   39 +++++++++++++++++++++++++++++----------
 1 file changed, 29 insertions(+), 10 deletions(-)

--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -836,11 +836,29 @@ static struct kobject *get_device_parent
 	return NULL;
 }
 
+static inline bool live_in_glue_dir(struct kobject *kobj,
+				    struct device *dev)
+{
+	if (!kobj || !dev->class ||
+	    kobj->kset != &dev->class->p->glue_dirs)
+		return false;
+	return true;
+}
+
+static inline struct kobject *get_glue_dir(struct device *dev)
+{
+	return dev->kobj.parent;
+}
+
+/*
+ * make sure cleaning up dir as the last step, we need to make
+ * sure .release handler of kobject is run with holding the
+ * global lock
+ */
 static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir)
 {
 	/* see if we live in a "glue" directory */
-	if (!glue_dir || !dev->class ||
-	    glue_dir->kset != &dev->class->p->glue_dirs)
+	if (!live_in_glue_dir(glue_dir, dev))
 		return;
 
 	mutex_lock(&gdp_mutex);
@@ -848,11 +866,6 @@ static void cleanup_glue_dir(struct devi
 	mutex_unlock(&gdp_mutex);
 }
 
-static void cleanup_device_parent(struct device *dev)
-{
-	cleanup_glue_dir(dev, dev->kobj.parent);
-}
-
 static int device_add_class_symlinks(struct device *dev)
 {
 	struct device_node *of_node = dev_of_node(dev);
@@ -1028,6 +1041,7 @@ int device_add(struct device *dev)
 	struct kobject *kobj;
 	struct class_interface *class_intf;
 	int error = -EINVAL;
+	struct kobject *glue_dir = NULL;
 
 	dev = get_device(dev);
 	if (!dev)
@@ -1072,8 +1086,10 @@ int device_add(struct device *dev)
 	/* first, register with generic layer. */
 	/* we require the name to be set before, and pass NULL */
 	error = kobject_add(&dev->kobj, dev->kobj.parent, NULL);
-	if (error)
+	if (error) {
+		glue_dir = get_glue_dir(dev);
 		goto Error;
+	}
 
 	/* notify platform of device entry */
 	if (platform_notify)
@@ -1154,9 +1170,10 @@ done:
 	device_remove_file(dev, &dev_attr_uevent);
  attrError:
 	kobject_uevent(&dev->kobj, KOBJ_REMOVE);
+	glue_dir = get_glue_dir(dev);
 	kobject_del(&dev->kobj);
  Error:
-	cleanup_device_parent(dev);
+	cleanup_glue_dir(dev, glue_dir);
 	put_device(parent);
 name_error:
 	kfree(dev->p);
@@ -1232,6 +1249,7 @@ EXPORT_SYMBOL_GPL(put_device);
 void device_del(struct device *dev)
 {
 	struct device *parent = dev->parent;
+	struct kobject *glue_dir = NULL;
 	struct class_interface *class_intf;
 
 	/* Notify clients of device removal.  This call must come
@@ -1276,8 +1294,9 @@ void device_del(struct device *dev)
 		blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
 					     BUS_NOTIFY_REMOVED_DEVICE, dev);
 	kobject_uevent(&dev->kobj, KOBJ_REMOVE);
-	cleanup_device_parent(dev);
+	glue_dir = get_glue_dir(dev);
 	kobject_del(&dev->kobj);
+	cleanup_glue_dir(dev, glue_dir);
 	put_device(parent);
 }
 EXPORT_SYMBOL_GPL(device_del);



  parent reply	other threads:[~2017-01-04 20:57 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20170104205509epcas3p18f5d32802d18fbe7167b7957e5cf87d4@epcas3p1.samsung.com>
2017-01-04 20:46 ` [PATCH 4.8 00/85] 4.8.16-stable review Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 01/85] aoe: fix crash in page count manipulation Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 02/85] btrfs: limit async_work allocation and worker func duration Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 03/85] Btrfs: fix BUG_ON in btrfs_mark_buffer_dirty Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 04/85] Btrfs: fix deadlock caused by fsync when logging directory entries Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 05/85] Btrfs: fix tree search logic when replaying directory entry deletes Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 06/85] Btrfs: fix relocation incorrectly dropping data references Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 07/85] btrfs: store and load values of stripes_min/stripes_max in balance status item Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 08/85] Btrfs: fix emptiness check for dirtied extent buffers at check_leaf() Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 09/85] Btrfs: fix qgroup rescan worker initialization Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 10/85] USB: serial: option: add support for Telit LE922A PIDs 0x1040, 0x1041 Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 11/85] USB: serial: option: add dlink dwm-158 Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 12/85] USB: serial: kl5kusb105: fix open error path Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 13/85] USB: cdc-acm: add device id for GW Instek AFG-125 Greg Kroah-Hartman
2017-01-04 20:46   ` [PATCH 4.8 14/85] usb: dwc3: gadget: set PCM1 field of isochronous-first TRBs Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 15/85] usb: hub: Fix auto-remount of safely removed or ejected USB-3 devices Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 16/85] usb: gadget: f_uac2: fix error handling at afunc_bind Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 17/85] usb: gadget: composite: correctly initialize ep->maxpacket Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 18/85] USB: UHCI: report non-PME wakeup signalling for Intel hardware Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 19/85] usbip: vudc: fix: Clear already_seen flag also for ep0 Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 20/85] ALSA: usb-audio: Add QuickCam Communicate Deluxe/S7500 to volume_control_quirks Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 21/85] ALSA: hiface: Fix M2Tech hiFace driver sampling rate change Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 22/85] ALSA: hda/ca0132 - Add quirk for Alienware 15 R2 2016 Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 23/85] ALSA: hda - ignore the assoc and seq when comparing pin configurations Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 24/85] ALSA: hda - fix headset-mic problem on a Dell laptop Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 25/85] ALSA: hda - Gate the mic jack on HP Z1 Gen3 AiO Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 26/85] ALSA: hda: when comparing pin configurations, ignore assoc in addition to seq Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 27/85] clk: ti: omap36xx: Work around sprz319 advisory 2.1 Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 28/85] Btrfs: fix memory leak in reading btree blocks Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 29/85] Btrfs: bail out if block group has different mixed flag Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 30/85] Btrfs: return gracefully from balance if fs tree is corrupted Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 31/85] Btrfs: dont leak reloc root nodes on error Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 32/85] btrfs: clean the old superblocks before freeing the device Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 33/85] Btrfs: fix memory leak in do_walk_down Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 34/85] btrfs: fix a possible umount deadlock Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 35/85] Btrfs: dont BUG() during drop snapshot Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 36/85] Btrfs: fix incremental send failure caused by balance Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 37/85] btrfs: make file clone aware of fatal signals Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 38/85] exec: Ensure mm->user_ns contains the execed files Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 39/85] fs: exec: apply CLOEXEC before changing dumpable task flags Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 40/85] block_dev: dont test bdev->bd_contains when it is not stable Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 41/85] mm: Add a user_ns owner to mm_struct and fix ptrace permission checks Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 42/85] vfs,mm: fix return value of read() at s_maxbytes Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 43/85] ptrace: Capture the ptracers creds not PT_PTRACE_CAP Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 45/85] ext4: fix mballoc breakage with 64k block size Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 46/85] ext4: fix stack memory corruption " Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 47/85] ext4: use more strict checks for inodes_per_block on mount Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 48/85] ext4: fix in-superblock mount options processing Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 49/85] ext4: add sanity checking to count_overhead() Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 50/85] ext4: reject inodes with negative size Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 51/85] ext4: return -ENOMEM instead of success Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 52/85] ext4: do not perform data journaling when data is encrypted Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 53/85] Revert "f2fs: use percpu_counter for # of dirty pages in inode" Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 54/85] f2fs: set ->owner for debugfs status files file_operations Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 55/85] f2fs: fix overflow due to condition check order Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 56/85] loop: return proper error from loop_queue_rq() Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 57/85] nvmet: Fix possible infinite loop triggered on hot namespace removal Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 58/85] mm/vmscan.c: set correct defer count for shrinker Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 59/85] mm, page_alloc: keep pcp count and list contents in sync if struct page is corrupted Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 60/85] usb: gadget: composite: always set ep->mult to a sensible value Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 61/85] PM / OPP: Pass opp_table to dev_pm_opp_put_regulator() Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 62/85] blk-mq: Do not invoke .queue_rq() for a stopped queue Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 63/85] dm table: fix all_blk_mq inconsistency when an empty table is loaded Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 64/85] dm table: an all_blk_mq table must be loaded for a blk-mq DM device Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 65/85] dm flakey: return -EINVAL on interval bounds error in flakey_ctr() Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 66/85] dm crypt: mark key as invalid until properly loaded Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 67/85] dm rq: fix a race condition in rq_completed() Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 68/85] dm raid: fix discard support regression Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 69/85] dm space map metadata: fix struct sm_metadata leak on failed create Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 70/85] ASoC: intel: Fix crash at suspend/resume without card registration Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 71/85] CIFS: Fix a possible memory corruption during reconnect Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 72/85] CIFS: Fix missing nls unload in smb2_reconnect() Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 73/85] CIFS: Fix a possible memory corruption in push locks Greg Kroah-Hartman
2017-01-04 20:47   ` [PATCH 4.8 74/85] kernel/watchdog: use nmi registers snapshot in hardlockup handler Greg Kroah-Hartman
2017-01-04 20:48   ` [PATCH 4.8 75/85] watchdog: mei_wdt: request stop on reboot to prevent false positive event Greg Kroah-Hartman
2017-01-04 20:48   ` [PATCH 4.8 76/85] watchdog: qcom: fix kernel panic due to external abort on non-linefetch Greg Kroah-Hartman
2017-01-04 20:48   ` [PATCH 4.8 77/85] kernel/debug/debug_core.c: more properly delay for secondary CPUs Greg Kroah-Hartman
2017-01-04 20:48   ` [PATCH 4.8 78/85] tpm xen: Remove bogus tpm_chip_unregister Greg Kroah-Hartman
2017-01-04 20:48   ` [PATCH 4.8 79/85] xen/gntdev: Use VM_MIXEDMAP instead of VM_IO to avoid NUMA balancing Greg Kroah-Hartman
2017-01-04 20:48   ` [PATCH 4.8 80/85] arm/xen: Use alloc_percpu rather than __alloc_percpu Greg Kroah-Hartman
2017-01-04 20:48   ` [PATCH 4.8 81/85] xfs: set AGI buffer type in xlog_recover_clear_agi_bucket Greg Kroah-Hartman
2017-01-04 20:48   ` [PATCH 4.8 82/85] arm64: mark reserved memblock regions explicitly in iomem Greg Kroah-Hartman
2017-01-04 20:48   ` [PATCH 4.8 83/85] Revert "netfilter: nat: convert nat bysrc hash to rhashtable" Greg Kroah-Hartman
2017-01-04 20:48   ` [PATCH 4.8 84/85] Revert "netfilter: move nat hlist_head to nf_conn" Greg Kroah-Hartman
2017-01-04 20:48   ` Greg Kroah-Hartman [this message]
2017-01-05  0:42   ` [PATCH 4.8 00/85] 4.8.16-stable review Shuah Khan
2017-01-05  4:47   ` 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=20170104200707.304099989@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=clingutla@codeaurora.org \
    --cc=jslaby@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ming.lei@canonical.com \
    --cc=stable@vger.kernel.org \
    --cc=wangyijing@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).