Patch "libata: transport: Remove circular dependency at free time" has been added to the 3.18-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
libata: transport: Remove circular dependency at free time
to the 3.18-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:
libata-transport-remove-circular-dependency-at-free-time.patch
and it can be found in the queue-3.18 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 foo@baz Thu Oct 5 10:58:04 CEST 2017
From: Gwendal Grignou <[email protected]>
Date: Fri, 3 Mar 2017 09:00:09 -0800
Subject: libata: transport: Remove circular dependency at free time
From: Gwendal Grignou <[email protected]>
[ Upstream commit d85fc67dd11e9a32966140677d4d6429ca540b25 ]
Without this patch, failed probe would not free resources like irq.
ata port tdev object currently hold a reference to the ata port object. Therefore the ata port object release function will not get called until the ata_tport_release is called. But that would never happen, releasing the last reference of ata port dev is done by scsi_host_release, which is called by ata_host_release when the ata port object is released.
The ata device objects actually do not need to explicitly hold a reference to their real counterpart, given the transport objects are the children of these objects and device_add() is call for each child. We know the parent will not be deleted until we call the child's device_del().
--- drivers/ata/libata-transport.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/ata/libata-transport.c +3 -6
@@ -223,7 +223,6 @@ static DECLARE_TRANSPORT_CLASS(ata_port_static void ata_tport_release (struct device *dev) { -put_device (dev->parent); }/**
@@ -283,7 +282,7 @@ int ata_tport_add(struct device *parent,device_initialize (dev); dev->type = &ata_port_type; - dev->parent =get_device (parent); + dev->parent = parent; dev->release = ata_tport_release;dev_set_name (dev,"ata%d" , ap->print_id);transport_setup_device (dev);
@@ -347,7 +346,6 @@ static DECLARE_TRANSPORT_CLASS(ata_link_static void ata_tlink_release (struct device *dev) { -put_device (dev->parent); }/**
@@ -409,7 +407,7 @@ int ata_tlink_add(struct ata_link *link)int error;device_initialize (dev); - dev->parent =get_device (&ap->tdev); + dev->parent = &ap->tdev; dev->release = ata_tlink_release;if (ata_is_host_link (link))dev_set_name (dev,"link%d" , ap->print_id);
@@ -587,7 +585,6 @@ static DECLARE_TRANSPORT_CLASS(ata_dev_cstatic void ata_tdev_release (struct device *dev) { -put_device (dev->parent); }/**
@@ -660,7 +657,7 @@ static int ata_tdev_add(struct ata_devicint error;device_initialize (dev); - dev->parent =get_device (&link->tdev); + dev->parent = &link->tdev; dev->release = ata_tdev_release;if (ata_is_host_link (link))dev_set_name (dev,"dev%d.%d" , ap->print_id,ata_dev->devno);
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/libata-transport-remove-circular-dependency-at-free-time.patch