diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2008-02-19 03:05:49 -0500 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2008-02-19 13:57:23 -0500 |
commit | 33f1c6c3529f5f279e2e98e5cca0c5bac152153b (patch) | |
tree | 5eceff887057fb621e4e96c1eb51665ff6d91669 /drivers/firewire/fw-sbp2.c | |
parent | 5513c5f6f9bd8c8ad3727130910fa288c62526a7 (diff) |
firewire: fw-sbp2: fix NULL pointer deref. in scsi_remove_device
Fix a kernel bug when unplugging an SBP-2 device after having its
scsi_device already removed via the "delete" sysfs attribute.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/fw-sbp2.c')
-rw-r--r-- | drivers/firewire/fw-sbp2.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index 60ebcb5fe21a..5259491580fc 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
@@ -762,9 +762,10 @@ static void sbp2_release_target(struct kref *kref) | |||
762 | sbp2_unblock(tgt); | 762 | sbp2_unblock(tgt); |
763 | 763 | ||
764 | list_for_each_entry_safe(lu, next, &tgt->lu_list, link) { | 764 | list_for_each_entry_safe(lu, next, &tgt->lu_list, link) { |
765 | if (lu->sdev) | 765 | if (lu->sdev) { |
766 | scsi_remove_device(lu->sdev); | 766 | scsi_remove_device(lu->sdev); |
767 | 767 | scsi_device_put(lu->sdev); | |
768 | } | ||
768 | sbp2_send_management_orb(lu, tgt->node_id, lu->generation, | 769 | sbp2_send_management_orb(lu, tgt->node_id, lu->generation, |
769 | SBP2_LOGOUT_REQUEST, lu->login_id, NULL); | 770 | SBP2_LOGOUT_REQUEST, lu->login_id, NULL); |
770 | 771 | ||
@@ -886,12 +887,11 @@ static void sbp2_login(struct work_struct *work) | |||
886 | if (IS_ERR(sdev)) | 887 | if (IS_ERR(sdev)) |
887 | goto out_logout_login; | 888 | goto out_logout_login; |
888 | 889 | ||
889 | scsi_device_put(sdev); | ||
890 | |||
891 | /* Unreported error during __scsi_add_device() */ | 890 | /* Unreported error during __scsi_add_device() */ |
892 | smp_rmb(); /* get current card generation */ | 891 | smp_rmb(); /* get current card generation */ |
893 | if (generation != device->card->generation) { | 892 | if (generation != device->card->generation) { |
894 | scsi_remove_device(sdev); | 893 | scsi_remove_device(sdev); |
894 | scsi_device_put(sdev); | ||
895 | goto out_logout_login; | 895 | goto out_logout_login; |
896 | } | 896 | } |
897 | 897 | ||