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

Commit be8cde8b 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] aic79xx: check for non-NULL scb in ahd_handle_nonpkt_busfree
  [SCSI] zfcp: Set hardware timeout as requested by BSG request.
  [SCSI] zfcp: Introduce bsg_timeout callback.
  [SCSI] scsi_transport_fc: Allow LLD to reset FC BSG timeout
  [SCSI] zfcp: add missing compat ptr conversion
  [SCSI] zfcp: Fix linebreak in hba trace
  [SCSI] zfcp: Issue zfcp_fc_wka_port_put after FC CT BSG request
  [SCSI] qla2xxx: Update version number to 8.03.01-k10.
  [SCSI] fc-transport: Use packed modifier for fc_bsg_request structure.
  [SCSI] qla2xxx: Perform fast mailbox read of flash regardless of size nor address alignment.
  [SCSI] qla2xxx: Correct FCP2 recovery handling.
  [SCSI] scsi_lib: Fix bug in completion of bidi commands
  [SCSI] mptsas: Fix issue with chain pools allocation on katmai
  [SCSI] aacraid: fix File System going into read-only mode
  [SCSI] lpfc: fix file permissions
parents 981a2edd 534ef056
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -4330,6 +4330,8 @@ initChainBuffers(MPT_ADAPTER *ioc)


	if (ioc->bus_type == SPI)
	if (ioc->bus_type == SPI)
		num_chain *= MPT_SCSI_CAN_QUEUE;
		num_chain *= MPT_SCSI_CAN_QUEUE;
	else if (ioc->bus_type == SAS)
		num_chain *= MPT_SAS_CAN_QUEUE;
	else
	else
		num_chain *= MPT_FC_CAN_QUEUE;
		num_chain *= MPT_FC_CAN_QUEUE;


+7 −2
Original line number Original line Diff line number Diff line
@@ -12,6 +12,7 @@


#include <linux/types.h>
#include <linux/types.h>
#include <linux/miscdevice.h>
#include <linux/miscdevice.h>
#include <asm/compat.h>
#include <asm/ccwdev.h>
#include <asm/ccwdev.h>
#include "zfcp_def.h"
#include "zfcp_def.h"
#include "zfcp_ext.h"
#include "zfcp_ext.h"
@@ -163,7 +164,7 @@ static void zfcp_cfdc_req_to_sense(struct zfcp_cfdc_data *data,
}
}


static long zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command,
static long zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command,
				unsigned long buffer)
				unsigned long arg)
{
{
	struct zfcp_cfdc_data *data;
	struct zfcp_cfdc_data *data;
	struct zfcp_cfdc_data __user *data_user;
	struct zfcp_cfdc_data __user *data_user;
@@ -175,7 +176,11 @@ static long zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command,
	if (command != ZFCP_CFDC_IOC)
	if (command != ZFCP_CFDC_IOC)
		return -ENOTTY;
		return -ENOTTY;


	data_user = (void __user *) buffer;
	if (is_compat_task())
		data_user = compat_ptr(arg);
	else
		data_user = (void __user *)arg;

	if (!data_user)
	if (!data_user)
		return -EINVAL;
		return -EINVAL;


+1 −1
Original line number Original line Diff line number Diff line
@@ -327,7 +327,7 @@ static void zfcp_dbf_hba_view_response(char **p,
			break;
			break;
		zfcp_dbf_out(p, "scsi_cmnd", "0x%0Lx", r->u.fcp.cmnd);
		zfcp_dbf_out(p, "scsi_cmnd", "0x%0Lx", r->u.fcp.cmnd);
		zfcp_dbf_out(p, "scsi_serial", "0x%016Lx", r->u.fcp.serial);
		zfcp_dbf_out(p, "scsi_serial", "0x%016Lx", r->u.fcp.serial);
		p += sprintf(*p, "\n");
		*p += sprintf(*p, "\n");
		break;
		break;


	case FSF_QTCB_OPEN_PORT_WITH_DID:
	case FSF_QTCB_OPEN_PORT_WITH_DID:
+3 −2
Original line number Original line Diff line number Diff line
@@ -108,6 +108,7 @@ extern void zfcp_fc_wka_ports_force_offline(struct zfcp_fc_wka_ports *);
extern int zfcp_fc_gs_setup(struct zfcp_adapter *);
extern int zfcp_fc_gs_setup(struct zfcp_adapter *);
extern void zfcp_fc_gs_destroy(struct zfcp_adapter *);
extern void zfcp_fc_gs_destroy(struct zfcp_adapter *);
extern int zfcp_fc_exec_bsg_job(struct fc_bsg_job *);
extern int zfcp_fc_exec_bsg_job(struct fc_bsg_job *);
extern int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *);


/* zfcp_fsf.c */
/* zfcp_fsf.c */
extern int zfcp_fsf_open_port(struct zfcp_erp_action *);
extern int zfcp_fsf_open_port(struct zfcp_erp_action *);
@@ -129,9 +130,9 @@ extern void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *);
extern int zfcp_fsf_status_read(struct zfcp_qdio *);
extern int zfcp_fsf_status_read(struct zfcp_qdio *);
extern int zfcp_status_read_refill(struct zfcp_adapter *adapter);
extern int zfcp_status_read_refill(struct zfcp_adapter *adapter);
extern int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *, struct zfcp_fsf_ct_els *,
extern int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *, struct zfcp_fsf_ct_els *,
			    mempool_t *);
			    mempool_t *, unsigned int);
extern int zfcp_fsf_send_els(struct zfcp_adapter *, u32,
extern int zfcp_fsf_send_els(struct zfcp_adapter *, u32,
			     struct zfcp_fsf_ct_els *);
			     struct zfcp_fsf_ct_els *, unsigned int);
extern int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *,
extern int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *,
					  struct scsi_cmnd *);
					  struct scsi_cmnd *);
extern void zfcp_fsf_req_free(struct zfcp_fsf_req *);
extern void zfcp_fsf_req_free(struct zfcp_fsf_req *);
+57 −27
Original line number Original line Diff line number Diff line
@@ -258,7 +258,8 @@ static int zfcp_fc_ns_gid_pn_request(struct zfcp_port *port,
	gid_pn->gid_pn_req.gid_pn.fn_wwpn = port->wwpn;
	gid_pn->gid_pn_req.gid_pn.fn_wwpn = port->wwpn;


	ret = zfcp_fsf_send_ct(&adapter->gs->ds, &gid_pn->ct,
	ret = zfcp_fsf_send_ct(&adapter->gs->ds, &gid_pn->ct,
			       adapter->pool.gid_pn_req);
			       adapter->pool.gid_pn_req,
			       ZFCP_FC_CTELS_TMO);
	if (!ret) {
	if (!ret) {
		wait_for_completion(&completion);
		wait_for_completion(&completion);
		zfcp_fc_ns_gid_pn_eval(gid_pn);
		zfcp_fc_ns_gid_pn_eval(gid_pn);
@@ -421,7 +422,8 @@ static int zfcp_fc_adisc(struct zfcp_port *port)
	hton24(adisc->adisc_req.adisc_port_id,
	hton24(adisc->adisc_req.adisc_port_id,
	       fc_host_port_id(adapter->scsi_host));
	       fc_host_port_id(adapter->scsi_host));


	ret = zfcp_fsf_send_els(adapter, port->d_id, &adisc->els);
	ret = zfcp_fsf_send_els(adapter, port->d_id, &adisc->els,
				ZFCP_FC_CTELS_TMO);
	if (ret)
	if (ret)
		kmem_cache_free(zfcp_data.adisc_cache, adisc);
		kmem_cache_free(zfcp_data.adisc_cache, adisc);


@@ -532,7 +534,8 @@ static int zfcp_fc_send_gpn_ft(struct zfcp_fc_gpn_ft *gpn_ft,
	ct->req = &gpn_ft->sg_req;
	ct->req = &gpn_ft->sg_req;
	ct->resp = gpn_ft->sg_resp;
	ct->resp = gpn_ft->sg_resp;


	ret = zfcp_fsf_send_ct(&adapter->gs->ds, ct, NULL);
	ret = zfcp_fsf_send_ct(&adapter->gs->ds, ct, NULL,
			       ZFCP_FC_CTELS_TMO);
	if (!ret)
	if (!ret)
		wait_for_completion(&completion);
		wait_for_completion(&completion);
	return ret;
	return ret;
@@ -677,6 +680,44 @@ static void zfcp_fc_ct_els_job_handler(void *data)
	job->job_done(job);
	job->job_done(job);
}
}


static struct zfcp_fc_wka_port *zfcp_fc_job_wka_port(struct fc_bsg_job *job)
{
	u32 preamble_word1;
	u8 gs_type;
	struct zfcp_adapter *adapter;

	preamble_word1 = job->request->rqst_data.r_ct.preamble_word1;
	gs_type = (preamble_word1 & 0xff000000) >> 24;

	adapter = (struct zfcp_adapter *) job->shost->hostdata[0];

	switch (gs_type) {
	case FC_FST_ALIAS:
		return &adapter->gs->as;
	case FC_FST_MGMT:
		return &adapter->gs->ms;
	case FC_FST_TIME:
		return &adapter->gs->ts;
		break;
	case FC_FST_DIR:
		return &adapter->gs->ds;
		break;
	default:
		return NULL;
	}
}

static void zfcp_fc_ct_job_handler(void *data)
{
	struct fc_bsg_job *job = data;
	struct zfcp_fc_wka_port *wka_port;

	wka_port = zfcp_fc_job_wka_port(job);
	zfcp_fc_wka_port_put(wka_port);

	zfcp_fc_ct_els_job_handler(data);
}

static int zfcp_fc_exec_els_job(struct fc_bsg_job *job,
static int zfcp_fc_exec_els_job(struct fc_bsg_job *job,
				struct zfcp_adapter *adapter)
				struct zfcp_adapter *adapter)
{
{
@@ -695,43 +736,27 @@ static int zfcp_fc_exec_els_job(struct fc_bsg_job *job,
	} else
	} else
		d_id = ntoh24(job->request->rqst_data.h_els.port_id);
		d_id = ntoh24(job->request->rqst_data.h_els.port_id);


	return zfcp_fsf_send_els(adapter, d_id, els);
	els->handler = zfcp_fc_ct_els_job_handler;
	return zfcp_fsf_send_els(adapter, d_id, els, job->req->timeout / HZ);
}
}


static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job,
static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job,
			       struct zfcp_adapter *adapter)
			       struct zfcp_adapter *adapter)
{
{
	int ret;
	int ret;
	u8 gs_type;
	struct zfcp_fsf_ct_els *ct = job->dd_data;
	struct zfcp_fsf_ct_els *ct = job->dd_data;
	struct zfcp_fc_wka_port *wka_port;
	struct zfcp_fc_wka_port *wka_port;
	u32 preamble_word1;


	preamble_word1 = job->request->rqst_data.r_ct.preamble_word1;
	wka_port = zfcp_fc_job_wka_port(job);
	gs_type = (preamble_word1 & 0xff000000) >> 24;
	if (!wka_port)

		return -EINVAL;
	switch (gs_type) {
	case FC_FST_ALIAS:
		wka_port = &adapter->gs->as;
		break;
	case FC_FST_MGMT:
		wka_port = &adapter->gs->ms;
		break;
	case FC_FST_TIME:
		wka_port = &adapter->gs->ts;
		break;
	case FC_FST_DIR:
		wka_port = &adapter->gs->ds;
		break;
	default:
		return -EINVAL; /* no such service */
	}


	ret = zfcp_fc_wka_port_get(wka_port);
	ret = zfcp_fc_wka_port_get(wka_port);
	if (ret)
	if (ret)
		return ret;
		return ret;


	ret = zfcp_fsf_send_ct(wka_port, ct, NULL);
	ct->handler = zfcp_fc_ct_job_handler;
	ret = zfcp_fsf_send_ct(wka_port, ct, NULL, job->req->timeout / HZ);
	if (ret)
	if (ret)
		zfcp_fc_wka_port_put(wka_port);
		zfcp_fc_wka_port_put(wka_port);


@@ -752,7 +777,6 @@ int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job)


	ct_els->req = job->request_payload.sg_list;
	ct_els->req = job->request_payload.sg_list;
	ct_els->resp = job->reply_payload.sg_list;
	ct_els->resp = job->reply_payload.sg_list;
	ct_els->handler = zfcp_fc_ct_els_job_handler;
	ct_els->handler_data = job;
	ct_els->handler_data = job;


	switch (job->request->msgcode) {
	switch (job->request->msgcode) {
@@ -767,6 +791,12 @@ int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job)
	}
	}
}
}


int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *job)
{
	/* hardware tracks timeout, reset bsg timeout to not interfere */
	return -EAGAIN;
}

int zfcp_fc_gs_setup(struct zfcp_adapter *adapter)
int zfcp_fc_gs_setup(struct zfcp_adapter *adapter)
{
{
	struct zfcp_fc_wka_ports *wka_ports;
	struct zfcp_fc_wka_ports *wka_ports;
Loading