Commit 6d1a27f6 authored by Swen Schillig's avatar Swen Schillig Committed by James Bottomley

[SCSI] zfcp: Ensure all work is cancelled on adapter dequeue

A scheduled work might still be pending, running while the adapter is
in progress to get dequeued from the system. This can lead to an
invalid pointer dereference (Oops).  Once the adpater is set online
again, ensure the nameserver environment is initialized to the
appropriate values again.
Signed-off-by: default avatarSwen Schillig <swen@vnet.ibm.com>
Signed-off-by: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 947a9aca
...@@ -524,7 +524,6 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device) ...@@ -524,7 +524,6 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
goto sysfs_failed; goto sysfs_failed;
atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
zfcp_fc_nameserver_init(adapter);
if (!zfcp_adapter_scsi_register(adapter)) if (!zfcp_adapter_scsi_register(adapter))
return 0; return 0;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Registration and callback for the s390 common I/O layer. * Registration and callback for the s390 common I/O layer.
* *
* Copyright IBM Corporation 2002, 2008 * Copyright IBM Corporation 2002, 2009
*/ */
#define KMSG_COMPONENT "zfcp" #define KMSG_COMPONENT "zfcp"
...@@ -108,6 +108,7 @@ static int zfcp_ccw_set_online(struct ccw_device *ccw_device) ...@@ -108,6 +108,7 @@ static int zfcp_ccw_set_online(struct ccw_device *ccw_device)
/* initialize request counter */ /* initialize request counter */
BUG_ON(!zfcp_reqlist_isempty(adapter)); BUG_ON(!zfcp_reqlist_isempty(adapter));
adapter->req_no = 0; adapter->req_no = 0;
zfcp_fc_nameserver_init(adapter);
zfcp_erp_modify_adapter_status(adapter, "ccsonl1", NULL, zfcp_erp_modify_adapter_status(adapter, "ccsonl1", NULL,
ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET);
......
...@@ -98,8 +98,12 @@ static void zfcp_wka_port_offline(struct work_struct *work) ...@@ -98,8 +98,12 @@ static void zfcp_wka_port_offline(struct work_struct *work)
struct zfcp_wka_port *wka_port = struct zfcp_wka_port *wka_port =
container_of(dw, struct zfcp_wka_port, work); container_of(dw, struct zfcp_wka_port, work);
wait_event(wka_port->completion_wq, /* Don't wait forvever. If the wka_port is too busy take it offline
atomic_read(&wka_port->refcount) == 0); through a new call later */
if (!wait_event_timeout(wka_port->completion_wq,
atomic_read(&wka_port->refcount) == 0,
HZ >> 1))
return;
mutex_lock(&wka_port->mutex); mutex_lock(&wka_port->mutex);
if ((atomic_read(&wka_port->refcount) != 0) || if ((atomic_read(&wka_port->refcount) != 0) ||
......
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