Commit 1121b794 authored by Brian King's avatar Brian King Committed by James Bottomley

[SCSI] ipr: Disk remove path cleanup

Instead of NULLing the resource entry pointer when a disk
goes away to prevent any new commands being sent to it,
set the adapter resource handle to an invalid value so
new ops getting sent to it will fail with a selection timeout
response. This patch is needed for future SATA patches.
Signed-off-by: default avatarBrian King <brking@us.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent c06bb7f5
...@@ -869,8 +869,8 @@ static void ipr_handle_config_change(struct ipr_ioa_cfg *ioa_cfg, ...@@ -869,8 +869,8 @@ static void ipr_handle_config_change(struct ipr_ioa_cfg *ioa_cfg,
if (hostrcb->hcam.notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) { if (hostrcb->hcam.notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) {
if (res->sdev) { if (res->sdev) {
res->sdev->hostdata = NULL;
res->del_from_ml = 1; res->del_from_ml = 1;
res->cfgte.res_handle = IPR_INVALID_RES_HANDLE;
if (ioa_cfg->allow_ml_add_del) if (ioa_cfg->allow_ml_add_del)
schedule_work(&ioa_cfg->work_q); schedule_work(&ioa_cfg->work_q);
} else } else
...@@ -2107,7 +2107,6 @@ static void ipr_worker_thread(void *data) ...@@ -2107,7 +2107,6 @@ static void ipr_worker_thread(void *data)
did_work = 1; did_work = 1;
sdev = res->sdev; sdev = res->sdev;
if (!scsi_device_get(sdev)) { if (!scsi_device_get(sdev)) {
res->sdev = NULL;
list_move_tail(&res->queue, &ioa_cfg->free_res_q); list_move_tail(&res->queue, &ioa_cfg->free_res_q);
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
scsi_remove_device(sdev); scsi_remove_device(sdev);
...@@ -2124,6 +2123,7 @@ static void ipr_worker_thread(void *data) ...@@ -2124,6 +2123,7 @@ static void ipr_worker_thread(void *data)
bus = res->cfgte.res_addr.bus; bus = res->cfgte.res_addr.bus;
target = res->cfgte.res_addr.target; target = res->cfgte.res_addr.target;
lun = res->cfgte.res_addr.lun; lun = res->cfgte.res_addr.lun;
res->add_to_ml = 0;
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
scsi_add_device(ioa_cfg->host, bus, target, lun); scsi_add_device(ioa_cfg->host, bus, target, lun);
spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
...@@ -4980,7 +4980,7 @@ static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd) ...@@ -4980,7 +4980,7 @@ static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd)
list_for_each_entry_safe(res, temp, &old_res, queue) { list_for_each_entry_safe(res, temp, &old_res, queue) {
if (res->sdev) { if (res->sdev) {
res->del_from_ml = 1; res->del_from_ml = 1;
res->sdev->hostdata = NULL; res->cfgte.res_handle = IPR_INVALID_RES_HANDLE;
list_move_tail(&res->queue, &ioa_cfg->used_res_q); list_move_tail(&res->queue, &ioa_cfg->used_res_q);
} else { } else {
list_move_tail(&res->queue, &ioa_cfg->free_res_q); list_move_tail(&res->queue, &ioa_cfg->free_res_q);
......
...@@ -133,6 +133,7 @@ ...@@ -133,6 +133,7 @@
#define IPR_MAX_SCSI_RATE(width) ((320 * 10) / ((width) / 8)) #define IPR_MAX_SCSI_RATE(width) ((320 * 10) / ((width) / 8))
#define IPR_IOA_RES_HANDLE 0xffffffff #define IPR_IOA_RES_HANDLE 0xffffffff
#define IPR_INVALID_RES_HANDLE 0
#define IPR_IOA_RES_ADDR 0x00ffffff #define IPR_IOA_RES_ADDR 0x00ffffff
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment