Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 29cd195e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
  [SCSI] fix check of PQ and PDT bits for WLUNs
  [SCSI] make scsi_check_sense HARDWARE_ERROR return ADD_TO_MLQUEUE on retry
  [SCSI] scsi_dh: make check_sense return ADD_TO_MLQUEUE
  [SCSI] zfcp: Remove duplicated unlikely() macros.
  [SCSI] zfcp: channel cannot be detached due to refcount imbalance
  [SCSI] zfcp: Fix reference counter for remote ports
  [SCSI] zfcp: Simplify ccw notify handler
  [SCSI] zfcp: Correctly query end flag in gpn_ft response
  [SCSI] zfcp: Fix request queue locking
  [SCSI] sd: select CRC_T10DIF only when necessary
parents c529b7e2 01b291bd
Loading
Loading
Loading
Loading
+1 −5
Original line number Original line Diff line number Diff line
@@ -152,10 +152,8 @@ static int zfcp_ccw_set_offline(struct ccw_device *ccw_device)
 */
 */
static int zfcp_ccw_notify(struct ccw_device *ccw_device, int event)
static int zfcp_ccw_notify(struct ccw_device *ccw_device, int event)
{
{
	struct zfcp_adapter *adapter;
	struct zfcp_adapter *adapter = dev_get_drvdata(&ccw_device->dev);


	down(&zfcp_data.config_sema);
	adapter = dev_get_drvdata(&ccw_device->dev);
	switch (event) {
	switch (event) {
	case CIO_GONE:
	case CIO_GONE:
		dev_warn(&adapter->ccw_device->dev, "device gone\n");
		dev_warn(&adapter->ccw_device->dev, "device gone\n");
@@ -174,8 +172,6 @@ static int zfcp_ccw_notify(struct ccw_device *ccw_device, int event)
					89, NULL);
					89, NULL);
		break;
		break;
	}
	}
	zfcp_erp_wait(adapter);
	up(&zfcp_data.config_sema);
	return 1;
	return 1;
}
}


+12 −21
Original line number Original line Diff line number Diff line
@@ -39,18 +39,6 @@ struct zfcp_gpn_ft {
	struct scatterlist sg_resp[ZFCP_GPN_FT_BUFFERS];
	struct scatterlist sg_resp[ZFCP_GPN_FT_BUFFERS];
};
};


static struct zfcp_port *zfcp_get_port_by_did(struct zfcp_adapter *adapter,
					      u32 d_id)
{
	struct zfcp_port *port;

	list_for_each_entry(port, &adapter->port_list_head, list)
		if ((port->d_id == d_id) &&
		    !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status))
			return port;
	return NULL;
}

static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range,
static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range,
				   struct fcp_rscn_element *elem)
				   struct fcp_rscn_element *elem)
{
{
@@ -341,11 +329,12 @@ void zfcp_test_link(struct zfcp_port *port)


	zfcp_port_get(port);
	zfcp_port_get(port);
	retval = zfcp_fc_adisc(port);
	retval = zfcp_fc_adisc(port);
	if (retval == 0 || retval == -EBUSY)
	if (retval == 0)
		return;
		return;


	/* send of ADISC was not possible */
	/* send of ADISC was not possible */
	zfcp_port_put(port);
	zfcp_port_put(port);
	if (retval != -EBUSY)
		zfcp_erp_port_forced_reopen(port, 0, 65, NULL);
		zfcp_erp_port_forced_reopen(port, 0, 65, NULL);
}
}


@@ -363,7 +352,6 @@ static int zfcp_scan_get_nameserver(struct zfcp_adapter *adapter)
		if (ret)
		if (ret)
			return ret;
			return ret;
		zfcp_erp_wait(adapter);
		zfcp_erp_wait(adapter);
		zfcp_port_put(adapter->nameserver_port);
	}
	}
	return !atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED,
	return !atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED,
				  &adapter->nameserver_port->status);
				  &adapter->nameserver_port->status);
@@ -475,7 +463,7 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft)
	struct zfcp_adapter *adapter = ct->port->adapter;
	struct zfcp_adapter *adapter = ct->port->adapter;
	struct zfcp_port *port, *tmp;
	struct zfcp_port *port, *tmp;
	u32 d_id;
	u32 d_id;
	int ret = 0, x;
	int ret = 0, x, last = 0;


	if (ct->status)
	if (ct->status)
		return -EIO;
		return -EIO;
@@ -492,19 +480,24 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft)
	down(&zfcp_data.config_sema);
	down(&zfcp_data.config_sema);


	/* first entry is the header */
	/* first entry is the header */
	for (x = 1; x < ZFCP_GPN_FT_MAX_ENTRIES; x++) {
	for (x = 1; x < ZFCP_GPN_FT_MAX_ENTRIES && !last; x++) {
		if (x % (ZFCP_GPN_FT_ENTRIES + 1))
		if (x % (ZFCP_GPN_FT_ENTRIES + 1))
			acc++;
			acc++;
		else
		else
			acc = sg_virt(++sg);
			acc = sg_virt(++sg);


		last = acc->control & 0x80;
		d_id = acc->port_id[0] << 16 | acc->port_id[1] << 8 |
		d_id = acc->port_id[0] << 16 | acc->port_id[1] << 8 |
		       acc->port_id[2];
		       acc->port_id[2];


		/* skip the adapter's port and known remote ports */
		/* skip the adapter's port and known remote ports */
		if (acc->wwpn == fc_host_port_name(adapter->scsi_host) ||
		if (acc->wwpn == fc_host_port_name(adapter->scsi_host))
		     zfcp_get_port_by_did(adapter, d_id))
			continue;
		port = zfcp_get_port_by_wwpn(adapter, acc->wwpn);
		if (port) {
			zfcp_port_get(port);
			continue;
			continue;
		}


		port = zfcp_port_enqueue(adapter, acc->wwpn,
		port = zfcp_port_enqueue(adapter, acc->wwpn,
					 ZFCP_STATUS_PORT_DID_DID |
					 ZFCP_STATUS_PORT_DID_DID |
@@ -513,8 +506,6 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft)
			ret = PTR_ERR(port);
			ret = PTR_ERR(port);
		else
		else
			zfcp_erp_port_reopen(port, 0, 149, NULL);
			zfcp_erp_port_reopen(port, 0, 149, NULL);
		if (acc->control & 0x80) /* last entry */
			break;
	}
	}


	zfcp_erp_wait(adapter);
	zfcp_erp_wait(adapter);
+44 −44
Original line number Original line Diff line number Diff line
@@ -710,10 +710,10 @@ static void zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *req)


static int zfcp_fsf_sbal_check(struct zfcp_qdio_queue *queue)
static int zfcp_fsf_sbal_check(struct zfcp_qdio_queue *queue)
{
{
	spin_lock(&queue->lock);
	spin_lock_bh(&queue->lock);
	if (atomic_read(&queue->count))
	if (atomic_read(&queue->count))
		return 1;
		return 1;
	spin_unlock(&queue->lock);
	spin_unlock_bh(&queue->lock);
	return 0;
	return 0;
}
}


@@ -722,13 +722,13 @@ static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
	long ret;
	long ret;
	struct zfcp_qdio_queue *req_q = &adapter->req_q;
	struct zfcp_qdio_queue *req_q = &adapter->req_q;


	spin_unlock(&req_q->lock);
	spin_unlock_bh(&req_q->lock);
	ret = wait_event_interruptible_timeout(adapter->request_wq,
	ret = wait_event_interruptible_timeout(adapter->request_wq,
					zfcp_fsf_sbal_check(req_q), 5 * HZ);
					zfcp_fsf_sbal_check(req_q), 5 * HZ);
	if (ret > 0)
	if (ret > 0)
		return 0;
		return 0;


	spin_lock(&req_q->lock);
	spin_lock_bh(&req_q->lock);
	return -EIO;
	return -EIO;
}
}


@@ -870,14 +870,14 @@ int zfcp_fsf_status_read(struct zfcp_adapter *adapter)
	volatile struct qdio_buffer_element *sbale;
	volatile struct qdio_buffer_element *sbale;
	int retval = -EIO;
	int retval = -EIO;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (zfcp_fsf_req_sbal_get(adapter))
	if (zfcp_fsf_req_sbal_get(adapter))
		goto out;
		goto out;


	req = zfcp_fsf_req_create(adapter, FSF_QTCB_UNSOLICITED_STATUS,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_UNSOLICITED_STATUS,
				  ZFCP_REQ_NO_QTCB,
				  ZFCP_REQ_NO_QTCB,
				  adapter->pool.fsf_req_status_read);
				  adapter->pool.fsf_req_status_read);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -910,7 +910,7 @@ int zfcp_fsf_status_read(struct zfcp_adapter *adapter)
	zfcp_fsf_req_free(req);
	zfcp_fsf_req_free(req);
	zfcp_hba_dbf_event_fsf_unsol("fail", adapter, NULL);
	zfcp_hba_dbf_event_fsf_unsol("fail", adapter, NULL);
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	return retval;
	return retval;
}
}


@@ -988,7 +988,7 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long old_req_id,
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND,
				  req_flags, adapter->pool.fsf_req_abort);
				  req_flags, adapter->pool.fsf_req_abort);
	if (unlikely(IS_ERR(req)))
	if (IS_ERR(req))
		goto out;
		goto out;


	if (unlikely(!(atomic_read(&unit->status) &
	if (unlikely(!(atomic_read(&unit->status) &
@@ -1106,13 +1106,13 @@ int zfcp_fsf_send_ct(struct zfcp_send_ct *ct, mempool_t *pool,
	struct zfcp_fsf_req *req;
	struct zfcp_fsf_req *req;
	int ret = -EIO;
	int ret = -EIO;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (zfcp_fsf_req_sbal_get(adapter))
	if (zfcp_fsf_req_sbal_get(adapter))
		goto out;
		goto out;


	req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_GENERIC,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_GENERIC,
				  ZFCP_REQ_AUTO_CLEANUP, pool);
				  ZFCP_REQ_AUTO_CLEANUP, pool);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		ret = PTR_ERR(req);
		ret = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1148,7 +1148,7 @@ int zfcp_fsf_send_ct(struct zfcp_send_ct *ct, mempool_t *pool,
	if (erp_action)
	if (erp_action)
		erp_action->fsf_req = NULL;
		erp_action->fsf_req = NULL;
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	return ret;
	return ret;
}
}


@@ -1223,7 +1223,7 @@ int zfcp_fsf_send_els(struct zfcp_send_els *els)
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS,
				  ZFCP_REQ_AUTO_CLEANUP, NULL);
				  ZFCP_REQ_AUTO_CLEANUP, NULL);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		ret = PTR_ERR(req);
		ret = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1263,14 +1263,14 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
	struct zfcp_adapter *adapter = erp_action->adapter;
	struct zfcp_adapter *adapter = erp_action->adapter;
	int retval = -EIO;
	int retval = -EIO;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (!atomic_read(&adapter->req_q.count))
	if (!atomic_read(&adapter->req_q.count))
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter,
	req = zfcp_fsf_req_create(adapter,
				  FSF_QTCB_EXCHANGE_CONFIG_DATA,
				  FSF_QTCB_EXCHANGE_CONFIG_DATA,
				  ZFCP_REQ_AUTO_CLEANUP,
				  ZFCP_REQ_AUTO_CLEANUP,
				  adapter->pool.fsf_req_erp);
				  adapter->pool.fsf_req_erp);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1295,7 +1295,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
		erp_action->fsf_req = NULL;
		erp_action->fsf_req = NULL;
	}
	}
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	return retval;
	return retval;
}
}


@@ -1306,13 +1306,13 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter,
	struct zfcp_fsf_req *req = NULL;
	struct zfcp_fsf_req *req = NULL;
	int retval = -EIO;
	int retval = -EIO;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (zfcp_fsf_req_sbal_get(adapter))
	if (zfcp_fsf_req_sbal_get(adapter))
		goto out;
		goto out;


	req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA,
				  0, NULL);
				  0, NULL);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1334,7 +1334,7 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter,
	zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
	zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
	retval = zfcp_fsf_req_send(req);
	retval = zfcp_fsf_req_send(req);
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	if (!retval)
	if (!retval)
		wait_event(req->completion_wq,
		wait_event(req->completion_wq,
			   req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
			   req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
@@ -1359,13 +1359,13 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
	if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
	if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (!atomic_read(&adapter->req_q.count))
	if (!atomic_read(&adapter->req_q.count))
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA,
				  ZFCP_REQ_AUTO_CLEANUP,
				  ZFCP_REQ_AUTO_CLEANUP,
				  adapter->pool.fsf_req_erp);
				  adapter->pool.fsf_req_erp);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1385,7 +1385,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
		erp_action->fsf_req = NULL;
		erp_action->fsf_req = NULL;
	}
	}
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	return retval;
	return retval;
}
}


@@ -1405,13 +1405,13 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter,
	if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
	if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (!atomic_read(&adapter->req_q.count))
	if (!atomic_read(&adapter->req_q.count))
		goto out;
		goto out;


	req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, 0,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, 0,
				  NULL);
				  NULL);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1427,7 +1427,7 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter,
	zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
	zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
	retval = zfcp_fsf_req_send(req);
	retval = zfcp_fsf_req_send(req);
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	if (!retval)
	if (!retval)
		wait_event(req->completion_wq,
		wait_event(req->completion_wq,
			   req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
			   req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
@@ -1531,7 +1531,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
	struct zfcp_fsf_req *req;
	struct zfcp_fsf_req *req;
	int retval = -EIO;
	int retval = -EIO;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (zfcp_fsf_req_sbal_get(adapter))
	if (zfcp_fsf_req_sbal_get(adapter))
		goto out;
		goto out;


@@ -1539,7 +1539,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
				  FSF_QTCB_OPEN_PORT_WITH_DID,
				  FSF_QTCB_OPEN_PORT_WITH_DID,
				  ZFCP_REQ_AUTO_CLEANUP,
				  ZFCP_REQ_AUTO_CLEANUP,
				  adapter->pool.fsf_req_erp);
				  adapter->pool.fsf_req_erp);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1562,7 +1562,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
		erp_action->fsf_req = NULL;
		erp_action->fsf_req = NULL;
	}
	}
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	return retval;
	return retval;
}
}


@@ -1603,14 +1603,14 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action)
	struct zfcp_fsf_req *req;
	struct zfcp_fsf_req *req;
	int retval = -EIO;
	int retval = -EIO;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (zfcp_fsf_req_sbal_get(adapter))
	if (zfcp_fsf_req_sbal_get(adapter))
		goto out;
		goto out;


	req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_PORT,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_PORT,
				  ZFCP_REQ_AUTO_CLEANUP,
				  ZFCP_REQ_AUTO_CLEANUP,
				  adapter->pool.fsf_req_erp);
				  adapter->pool.fsf_req_erp);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1633,7 +1633,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action)
		erp_action->fsf_req = NULL;
		erp_action->fsf_req = NULL;
	}
	}
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	return retval;
	return retval;
}
}


@@ -1700,14 +1700,14 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
	struct zfcp_fsf_req *req;
	struct zfcp_fsf_req *req;
	int retval = -EIO;
	int retval = -EIO;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (zfcp_fsf_req_sbal_get(adapter))
	if (zfcp_fsf_req_sbal_get(adapter))
		goto out;
		goto out;


	req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_PHYSICAL_PORT,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_PHYSICAL_PORT,
				  ZFCP_REQ_AUTO_CLEANUP,
				  ZFCP_REQ_AUTO_CLEANUP,
				  adapter->pool.fsf_req_erp);
				  adapter->pool.fsf_req_erp);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1731,7 +1731,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
		erp_action->fsf_req = NULL;
		erp_action->fsf_req = NULL;
	}
	}
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	return retval;
	return retval;
}
}


@@ -1875,14 +1875,14 @@ int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action)
	struct zfcp_fsf_req *req;
	struct zfcp_fsf_req *req;
	int retval = -EIO;
	int retval = -EIO;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (zfcp_fsf_req_sbal_get(adapter))
	if (zfcp_fsf_req_sbal_get(adapter))
		goto out;
		goto out;


	req = zfcp_fsf_req_create(adapter, FSF_QTCB_OPEN_LUN,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_OPEN_LUN,
				  ZFCP_REQ_AUTO_CLEANUP,
				  ZFCP_REQ_AUTO_CLEANUP,
				  adapter->pool.fsf_req_erp);
				  adapter->pool.fsf_req_erp);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1910,7 +1910,7 @@ int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action)
		erp_action->fsf_req = NULL;
		erp_action->fsf_req = NULL;
	}
	}
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	return retval;
	return retval;
}
}


@@ -1965,13 +1965,13 @@ int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action)
	struct zfcp_fsf_req *req;
	struct zfcp_fsf_req *req;
	int retval = -EIO;
	int retval = -EIO;


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (zfcp_fsf_req_sbal_get(adapter))
	if (zfcp_fsf_req_sbal_get(adapter))
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_LUN,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_LUN,
				  ZFCP_REQ_AUTO_CLEANUP,
				  ZFCP_REQ_AUTO_CLEANUP,
				  adapter->pool.fsf_req_erp);
				  adapter->pool.fsf_req_erp);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -1995,7 +1995,7 @@ int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action)
		erp_action->fsf_req = NULL;
		erp_action->fsf_req = NULL;
	}
	}
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);
	return retval;
	return retval;
}
}


@@ -2228,7 +2228,7 @@ int zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter,
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
				  adapter->pool.fsf_req_scsi);
				  adapter->pool.fsf_req_scsi);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = PTR_ERR(req);
		retval = PTR_ERR(req);
		goto out;
		goto out;
	}
	}
@@ -2351,7 +2351,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_adapter *adapter,
		goto out;
		goto out;
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
	req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
				  adapter->pool.fsf_req_scsi);
				  adapter->pool.fsf_req_scsi);
	if (unlikely(IS_ERR(req)))
	if (IS_ERR(req))
		goto out;
		goto out;


	req->status |= ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT;
	req->status |= ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT;
@@ -2417,12 +2417,12 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter,
		return ERR_PTR(-EINVAL);
		return ERR_PTR(-EINVAL);
	}
	}


	spin_lock(&adapter->req_q.lock);
	spin_lock_bh(&adapter->req_q.lock);
	if (zfcp_fsf_req_sbal_get(adapter))
	if (zfcp_fsf_req_sbal_get(adapter))
		goto out;
		goto out;


	req = zfcp_fsf_req_create(adapter, fsf_cfdc->command, 0, NULL);
	req = zfcp_fsf_req_create(adapter, fsf_cfdc->command, 0, NULL);
	if (unlikely(IS_ERR(req))) {
	if (IS_ERR(req)) {
		retval = -EPERM;
		retval = -EPERM;
		goto out;
		goto out;
	}
	}
@@ -2447,7 +2447,7 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter,
	zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
	zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
	retval = zfcp_fsf_req_send(req);
	retval = zfcp_fsf_req_send(req);
out:
out:
	spin_unlock(&adapter->req_q.lock);
	spin_unlock_bh(&adapter->req_q.lock);


	if (!retval) {
	if (!retval) {
		wait_event(req->completion_wq,
		wait_event(req->completion_wq,
+2 −2
Original line number Original line Diff line number Diff line
@@ -423,9 +423,9 @@ void zfcp_qdio_close(struct zfcp_adapter *adapter)


	/* clear QDIOUP flag, thus do_QDIO is not called during qdio_shutdown */
	/* clear QDIOUP flag, thus do_QDIO is not called during qdio_shutdown */
	req_q = &adapter->req_q;
	req_q = &adapter->req_q;
	spin_lock(&req_q->lock);
	spin_lock_bh(&req_q->lock);
	atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status);
	atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status);
	spin_unlock(&req_q->lock);
	spin_unlock_bh(&req_q->lock);


	qdio_shutdown(adapter->ccw_device, QDIO_FLAG_CLEANUP_USING_CLEAR);
	qdio_shutdown(adapter->ccw_device, QDIO_FLAG_CLEANUP_USING_CLEAR);


+1 −1
Original line number Original line Diff line number Diff line
@@ -63,7 +63,7 @@ comment "SCSI support type (disk, tape, CD-ROM)"
config BLK_DEV_SD
config BLK_DEV_SD
	tristate "SCSI disk support"
	tristate "SCSI disk support"
	depends on SCSI
	depends on SCSI
	select CRC_T10DIF
	select CRC_T10DIF if BLK_DEV_INTEGRITY
	---help---
	---help---
	  If you want to use SCSI hard disks, Fibre Channel disks,
	  If you want to use SCSI hard disks, Fibre Channel disks,
	  Serial ATA (SATA) or Parallel ATA (PATA) hard disks,
	  Serial ATA (SATA) or Parallel ATA (PATA) hard disks,
Loading