Patch "device-dax: fix cdev leak" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
device-dax: fix cdev leak
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
device-dax-fix-cdev-leak.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
ed01e50acdd3e4a640cf9ebd28a7e810c3ceca97Mon Sep 17 00:00:00 2001
From: Dan Williams <[email protected]>
Date: Fri, 17 Mar 2017 12:48:09 -0600
Subject: device-dax: fix cdev leak
From: Dan Williams <[email protected]>
commit ed01e50acdd3e4a640cf9ebd28a7e810c3ceca97 upstream.
If device_add() fails, cleanup the cdev. Otherwise, we leak a kobj_map() with a stale device number.
As Jason points out, there is a small possibility that userspace has opened and mapped the device in the time between cdev_add() and the device_add() failure. We need a new kill_dax_dev() helper to invalidate any established mappings.
--- drivers/dax/dax.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
drivers/dax/dax.c +11 -4
@@ -553,13 +553,10 @@ static void dax_dev_release(struct devickfree (dax_dev); } -static void unregister_dax_dev (void *dev) +static void kill_dax_dev (struct dax_dev *dax_dev) { -struct dax_dev *dax_dev =to_dax_dev (dev);struct cdev *cdev = &dax_dev->cdev; -dev_dbg (dev,"%s\n" , __func__); -/* * Note, rcu is not protecting the liveness of dax_dev, rcu is * ensuring that any fault handlers that might have seen
@@ -571,6 +568,15 @@ static void unregister_dax_dev(void *devsynchronize_srcu (&dax_srcu);unmap_mapping_range (dax_dev->inode->i_mapping,0 ,0 ,1 );cdev_del (cdev); +} + +static void unregister_dax_dev (void *dev) +{ +struct dax_dev *dax_dev =to_dax_dev (dev); + +dev_dbg (dev,"%s\n" , __func__); + +kill_dax_dev (dax_dev);device_unregister (dev); }
@@ -647,6 +653,7 @@ struct dax_dev *devm_create_dax_dev(strudev_set_name (dev,"dax%d.%d" , dax_region->id, dax_dev->id); rc =device_add (dev);if (rc) { +kill_dax_dev (dax_dev);put_device (dev);return ERR_PTR (rc); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/x86-pmem-fix-cache-flushing-for-iovec-write-8-bytes.patch queue-4.9/device-dax-fix-cdev-leak.patch