Skip to content

Commit df3d422

Browse files
Bart Van Asschemartinkpetersen
authored andcommitted
scsi: scsi_dh_alua: Fix a reference counting bug
The code at the end of alua_rtpg_work() is as follows: scsi_device_put(sdev); kref_put(&pg->kref, release_port_group); In other words, alua_rtpg_queue() must hold an sdev reference and a pg reference before queueing rtpg work. If no rtpg work is queued no additional references should be held when alua_rtpg_queue() returns. If no rtpg work is queued, ensure that alua_rtpg_queue() only gives up the sdev reference if that reference was obtained by the same alua_rtpg_queue() call. Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com> Reported-by: Tang Junhui <tang.junhui@zte.com.cn> Cc: Hannes Reinecke <hare@suse.com> Cc: Tang Junhui <tang.junhui@zte.com.cn> Cc: <stable@vger.kernel.org> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent aac173e commit df3d422

1 file changed

Lines changed: 3 additions & 1 deletion

File tree

drivers/scsi/device_handler/scsi_dh_alua.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,7 @@ static void alua_rtpg_queue(struct alua_port_group *pg,
891891
/* Do not queue if the worker is already running */
892892
if (!(pg->flags & ALUA_PG_RUNNING)) {
893893
kref_get(&pg->kref);
894+
sdev = NULL;
894895
start_queue = 1;
895896
}
896897
}
@@ -902,7 +903,8 @@ static void alua_rtpg_queue(struct alua_port_group *pg,
902903
if (start_queue &&
903904
!queue_delayed_work(alua_wq, &pg->rtpg_work,
904905
msecs_to_jiffies(ALUA_RTPG_DELAY_MSECS))) {
905-
scsi_device_put(sdev);
906+
if (sdev)
907+
scsi_device_put(sdev);
906908
kref_put(&pg->kref, release_port_group);
907909
}
908910
}

0 commit comments

Comments
 (0)