Patch "s390/dasd: fix refcount for PAV reassignment" has been added to the 3.10-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
s390/dasd: fix refcount for PAV reassignment
to the 3.10-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:
s390-dasd-fix-refcount-for-pav-reassignment.patch
and it can be found in the queue-3.10 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
9d862ababb609439c5d6987f6d3ddd09e703aa0bMon Sep 17 00:00:00 2001
From: Stefan Haberland <[email protected]>
Date: Tue, 15 Dec 2015 10:45:05 +0100
Subject: s390/dasd: fix refcount for PAV reassignment
From: Stefan Haberland <[email protected]>
commit 9d862ababb609439c5d6987f6d3ddd09e703aa0b upstream.
Add refcount to the DASD device when a summary unit check worker is scheduled. This prevents that the device is set offline with worker in place.
--- drivers/s390/block/dasd_alias.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)
drivers/s390/block/dasd_alias.c +16 -5
@@ -264,8 +264,10 @@ void dasd_alias_disconnect_device_from_lspin_unlock_irqrestore (&lcu->lock, flags);cancel_work_sync (&lcu->suc_data.worker);spin_lock_irqsave (&lcu->lock, flags); -if (device == lcu->suc_data.device) +if (device == lcu->suc_data.device) { +dasd_put_device (device); lcu->suc_data.device =NULL ; + } } was_pending =0 ;if (device == lcu->ruac_data.device) {
@@ -273,8 +275,10 @@ void dasd_alias_disconnect_device_from_l was_pending =1 ;cancel_delayed_work_sync (&lcu->ruac_data.dwork);spin_lock_irqsave (&lcu->lock, flags); -if (device == lcu->ruac_data.device) +if (device == lcu->ruac_data.device) { +dasd_put_device (device); lcu->ruac_data.device =NULL ; + } } private->lcu =NULL ;spin_unlock_irqrestore (&lcu->lock, flags);
@@ -549,8 +553,10 @@ static void lcu_update_work(struct work_if ((rc && (rc != -EOPNOTSUPP )) || (lcu->flags &NEED_UAC_UPDATE )) {DBF_DEV_EVENT (DBF_WARNING , device,"could not update" " alias data in lcu (rc = %d), retry later" , rc); -schedule_delayed_work (&lcu->ruac_data.dwork,30 *HZ ); +if (!schedule_delayed_work (&lcu->ruac_data.dwork,30 *HZ )) +dasd_put_device (device); }else { +dasd_put_device (device); lcu->ruac_data.device =NULL ; lcu->flags &= ~UPDATE_PENDING ; }
@@ -593,8 +599,10 @@ static int _schedule_lcu_update(struct a*/ if (!usedev)return -EINVAL ; +dasd_get_device (usedev); lcu->ruac_data.device = usedev; -schedule_delayed_work (&lcu->ruac_data.dwork,0 ); +if (!schedule_delayed_work (&lcu->ruac_data.dwork,0 )) +dasd_put_device (usedev);return 0 ; }
@@ -926,6 +934,7 @@ static void summary_unit_check_handling_/* 3. read new alias configuration */ _schedule_lcu_update (lcu, device); lcu->suc_data.device =NULL ; +dasd_put_device (device);spin_unlock_irqrestore (&lcu->lock, flags); }
@@ -985,6 +994,8 @@ void dasd_alias_handle_summary_unit_chec } lcu->suc_data.reason = reason; lcu->suc_data.device = device; +dasd_get_device (device);spin_unlock (&lcu->lock); -schedule_work (&lcu->suc_data.worker); +if (!schedule_work (&lcu->suc_data.worker)) +dasd_put_device (device); };
Patches currently in stable-queue which might be from [email protected] are
queue-3.10/s390-dasd-prevent-incorrect-length-error-under-z-vm-after-pav-changes.patch queue-3.10/s390-dasd-fix-refcount-for-pav-reassignment.patch