Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * Generic SCSI-3 ALUA SCSI Device Handler
  3 *
  4 * Copyright (C) 2007-2010 Hannes Reinecke, SUSE Linux Products GmbH.
  5 * All rights reserved.
  6 *
  7 * This program is free software; you can redistribute it and/or modify
  8 * it under the terms of the GNU General Public License as published by
  9 * the Free Software Foundation; either version 2 of the License, or
 10 * (at your option) any later version.
 11 *
 12 * This program is distributed in the hope that it will be useful,
 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 15 * GNU General Public License for more details.
 16 *
 17 * You should have received a copy of the GNU General Public License
 18 * along with this program; if not, write to the Free Software
 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 20 *
 21 */
 22#include <linux/slab.h>
 23#include <linux/delay.h>
 
 24#include <scsi/scsi.h>
 25#include <scsi/scsi_eh.h>
 26#include <scsi/scsi_dh.h>
 27
 28#define ALUA_DH_NAME "alua"
 29#define ALUA_DH_VER "1.3"
 30
 31#define TPGS_STATE_OPTIMIZED		0x0
 32#define TPGS_STATE_NONOPTIMIZED		0x1
 33#define TPGS_STATE_STANDBY		0x2
 34#define TPGS_STATE_UNAVAILABLE		0x3
 35#define TPGS_STATE_LBA_DEPENDENT	0x4
 36#define TPGS_STATE_OFFLINE		0xe
 37#define TPGS_STATE_TRANSITIONING	0xf
 38
 39#define TPGS_SUPPORT_NONE		0x00
 40#define TPGS_SUPPORT_OPTIMIZED		0x01
 41#define TPGS_SUPPORT_NONOPTIMIZED	0x02
 42#define TPGS_SUPPORT_STANDBY		0x04
 43#define TPGS_SUPPORT_UNAVAILABLE	0x08
 44#define TPGS_SUPPORT_LBA_DEPENDENT	0x10
 45#define TPGS_SUPPORT_OFFLINE		0x40
 46#define TPGS_SUPPORT_TRANSITION		0x80
 47
 48#define TPGS_MODE_UNINITIALIZED		 -1
 49#define TPGS_MODE_NONE			0x0
 50#define TPGS_MODE_IMPLICIT		0x1
 51#define TPGS_MODE_EXPLICIT		0x2
 52
 53#define ALUA_INQUIRY_SIZE		36
 54#define ALUA_FAILOVER_TIMEOUT		(60 * HZ)
 55#define ALUA_FAILOVER_RETRIES		5
 56
 
 
 
 57struct alua_dh_data {
 58	int			group_id;
 59	int			rel_port;
 60	int			tpgs;
 61	int			state;
 
 
 62	unsigned char		inq[ALUA_INQUIRY_SIZE];
 63	unsigned char		*buff;
 64	int			bufflen;
 65	unsigned char		sense[SCSI_SENSE_BUFFERSIZE];
 66	int			senselen;
 67	struct scsi_device	*sdev;
 68	activate_complete	callback_fn;
 69	void			*callback_data;
 70};
 71
 72#define ALUA_POLICY_SWITCH_CURRENT	0
 73#define ALUA_POLICY_SWITCH_ALL		1
 74
 75static char print_alua_state(int);
 76static int alua_check_sense(struct scsi_device *, struct scsi_sense_hdr *);
 77
 78static inline struct alua_dh_data *get_alua_data(struct scsi_device *sdev)
 79{
 80	struct scsi_dh_data *scsi_dh_data = sdev->scsi_dh_data;
 81	BUG_ON(scsi_dh_data == NULL);
 82	return ((struct alua_dh_data *) scsi_dh_data->buf);
 83}
 84
 85static int realloc_buffer(struct alua_dh_data *h, unsigned len)
 86{
 87	if (h->buff && h->buff != h->inq)
 88		kfree(h->buff);
 89
 90	h->buff = kmalloc(len, GFP_NOIO);
 91	if (!h->buff) {
 92		h->buff = h->inq;
 93		h->bufflen = ALUA_INQUIRY_SIZE;
 94		return 1;
 95	}
 96	h->bufflen = len;
 97	return 0;
 98}
 99
100static struct request *get_alua_req(struct scsi_device *sdev,
101				    void *buffer, unsigned buflen, int rw)
102{
103	struct request *rq;
104	struct request_queue *q = sdev->request_queue;
105
106	rq = blk_get_request(q, rw, GFP_NOIO);
107
108	if (!rq) {
109		sdev_printk(KERN_INFO, sdev,
110			    "%s: blk_get_request failed\n", __func__);
111		return NULL;
112	}
113
114	if (buflen && blk_rq_map_kern(q, rq, buffer, buflen, GFP_NOIO)) {
115		blk_put_request(rq);
116		sdev_printk(KERN_INFO, sdev,
117			    "%s: blk_rq_map_kern failed\n", __func__);
118		return NULL;
119	}
120
121	rq->cmd_type = REQ_TYPE_BLOCK_PC;
122	rq->cmd_flags |= REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |
123			 REQ_FAILFAST_DRIVER;
124	rq->retries = ALUA_FAILOVER_RETRIES;
125	rq->timeout = ALUA_FAILOVER_TIMEOUT;
126
127	return rq;
128}
129
130/*
131 * submit_std_inquiry - Issue a standard INQUIRY command
132 * @sdev: sdev the command should be send to
133 */
134static int submit_std_inquiry(struct scsi_device *sdev, struct alua_dh_data *h)
135{
136	struct request *rq;
137	int err = SCSI_DH_RES_TEMP_UNAVAIL;
138
139	rq = get_alua_req(sdev, h->inq, ALUA_INQUIRY_SIZE, READ);
140	if (!rq)
141		goto done;
142
143	/* Prepare the command. */
144	rq->cmd[0] = INQUIRY;
145	rq->cmd[1] = 0;
146	rq->cmd[2] = 0;
147	rq->cmd[4] = ALUA_INQUIRY_SIZE;
148	rq->cmd_len = COMMAND_SIZE(INQUIRY);
149
150	rq->sense = h->sense;
151	memset(rq->sense, 0, SCSI_SENSE_BUFFERSIZE);
152	rq->sense_len = h->senselen = 0;
153
154	err = blk_execute_rq(rq->q, NULL, rq, 1);
155	if (err == -EIO) {
156		sdev_printk(KERN_INFO, sdev,
157			    "%s: std inquiry failed with %x\n",
158			    ALUA_DH_NAME, rq->errors);
159		h->senselen = rq->sense_len;
160		err = SCSI_DH_IO;
161	}
162	blk_put_request(rq);
163done:
164	return err;
165}
166
167/*
168 * submit_vpd_inquiry - Issue an INQUIRY VPD page 0x83 command
169 * @sdev: sdev the command should be sent to
170 */
171static int submit_vpd_inquiry(struct scsi_device *sdev, struct alua_dh_data *h)
172{
173	struct request *rq;
174	int err = SCSI_DH_RES_TEMP_UNAVAIL;
175
176	rq = get_alua_req(sdev, h->buff, h->bufflen, READ);
177	if (!rq)
178		goto done;
179
180	/* Prepare the command. */
181	rq->cmd[0] = INQUIRY;
182	rq->cmd[1] = 1;
183	rq->cmd[2] = 0x83;
184	rq->cmd[4] = h->bufflen;
185	rq->cmd_len = COMMAND_SIZE(INQUIRY);
186
187	rq->sense = h->sense;
188	memset(rq->sense, 0, SCSI_SENSE_BUFFERSIZE);
189	rq->sense_len = h->senselen = 0;
190
191	err = blk_execute_rq(rq->q, NULL, rq, 1);
192	if (err == -EIO) {
193		sdev_printk(KERN_INFO, sdev,
194			    "%s: evpd inquiry failed with %x\n",
195			    ALUA_DH_NAME, rq->errors);
196		h->senselen = rq->sense_len;
197		err = SCSI_DH_IO;
198	}
199	blk_put_request(rq);
200done:
201	return err;
202}
203
204/*
205 * submit_rtpg - Issue a REPORT TARGET GROUP STATES command
206 * @sdev: sdev the command should be sent to
207 */
208static unsigned submit_rtpg(struct scsi_device *sdev, struct alua_dh_data *h)
209{
210	struct request *rq;
211	int err = SCSI_DH_RES_TEMP_UNAVAIL;
212
213	rq = get_alua_req(sdev, h->buff, h->bufflen, READ);
214	if (!rq)
215		goto done;
216
217	/* Prepare the command. */
218	rq->cmd[0] = MAINTENANCE_IN;
219	rq->cmd[1] = MI_REPORT_TARGET_PGS;
220	rq->cmd[6] = (h->bufflen >> 24) & 0xff;
221	rq->cmd[7] = (h->bufflen >> 16) & 0xff;
222	rq->cmd[8] = (h->bufflen >>  8) & 0xff;
223	rq->cmd[9] = h->bufflen & 0xff;
224	rq->cmd_len = COMMAND_SIZE(MAINTENANCE_IN);
225
226	rq->sense = h->sense;
227	memset(rq->sense, 0, SCSI_SENSE_BUFFERSIZE);
228	rq->sense_len = h->senselen = 0;
229
230	err = blk_execute_rq(rq->q, NULL, rq, 1);
231	if (err == -EIO) {
232		sdev_printk(KERN_INFO, sdev,
233			    "%s: rtpg failed with %x\n",
234			    ALUA_DH_NAME, rq->errors);
235		h->senselen = rq->sense_len;
236		err = SCSI_DH_IO;
237	}
238	blk_put_request(rq);
239done:
240	return err;
241}
242
243/*
244 * alua_stpg - Evaluate SET TARGET GROUP STATES
245 * @sdev: the device to be evaluated
246 * @state: the new target group state
247 *
248 * Send a SET TARGET GROUP STATES command to the device.
249 * We only have to test here if we should resubmit the command;
250 * any other error is assumed as a failure.
251 */
252static void stpg_endio(struct request *req, int error)
253{
254	struct alua_dh_data *h = req->end_io_data;
255	struct scsi_sense_hdr sense_hdr;
256	unsigned err = SCSI_DH_OK;
257
258	if (error || host_byte(req->errors) != DID_OK ||
259			msg_byte(req->errors) != COMMAND_COMPLETE) {
260		err = SCSI_DH_IO;
261		goto done;
262	}
263
264	if (h->senselen > 0) {
265		err = scsi_normalize_sense(h->sense, SCSI_SENSE_BUFFERSIZE,
266					   &sense_hdr);
267		if (!err) {
268			err = SCSI_DH_IO;
269			goto done;
270		}
271		err = alua_check_sense(h->sdev, &sense_hdr);
272		if (err == ADD_TO_MLQUEUE) {
273			err = SCSI_DH_RETRY;
274			goto done;
275		}
276		sdev_printk(KERN_INFO, h->sdev,
277			    "%s: stpg sense code: %02x/%02x/%02x\n",
278			    ALUA_DH_NAME, sense_hdr.sense_key,
279			    sense_hdr.asc, sense_hdr.ascq);
280		err = SCSI_DH_IO;
281	}
282	if (err == SCSI_DH_OK) {
283		h->state = TPGS_STATE_OPTIMIZED;
284		sdev_printk(KERN_INFO, h->sdev,
285			    "%s: port group %02x switched to state %c\n",
286			    ALUA_DH_NAME, h->group_id,
287			    print_alua_state(h->state));
288	}
289done:
290	req->end_io_data = NULL;
291	__blk_put_request(req->q, req);
292	if (h->callback_fn) {
293		h->callback_fn(h->callback_data, err);
294		h->callback_fn = h->callback_data = NULL;
295	}
296	return;
297}
298
299/*
300 * submit_stpg - Issue a SET TARGET GROUP STATES command
301 *
302 * Currently we're only setting the current target port group state
303 * to 'active/optimized' and let the array firmware figure out
304 * the states of the remaining groups.
305 */
306static unsigned submit_stpg(struct alua_dh_data *h)
307{
308	struct request *rq;
309	int stpg_len = 8;
310	struct scsi_device *sdev = h->sdev;
311
312	/* Prepare the data buffer */
313	memset(h->buff, 0, stpg_len);
314	h->buff[4] = TPGS_STATE_OPTIMIZED & 0x0f;
315	h->buff[6] = (h->group_id >> 8) & 0xff;
316	h->buff[7] = h->group_id & 0xff;
317
318	rq = get_alua_req(sdev, h->buff, stpg_len, WRITE);
319	if (!rq)
320		return SCSI_DH_RES_TEMP_UNAVAIL;
321
322	/* Prepare the command. */
323	rq->cmd[0] = MAINTENANCE_OUT;
324	rq->cmd[1] = MO_SET_TARGET_PGS;
325	rq->cmd[6] = (stpg_len >> 24) & 0xff;
326	rq->cmd[7] = (stpg_len >> 16) & 0xff;
327	rq->cmd[8] = (stpg_len >>  8) & 0xff;
328	rq->cmd[9] = stpg_len & 0xff;
329	rq->cmd_len = COMMAND_SIZE(MAINTENANCE_OUT);
330
331	rq->sense = h->sense;
332	memset(rq->sense, 0, SCSI_SENSE_BUFFERSIZE);
333	rq->sense_len = h->senselen = 0;
334	rq->end_io_data = h;
335
336	blk_execute_rq_nowait(rq->q, NULL, rq, 1, stpg_endio);
337	return SCSI_DH_OK;
338}
339
340/*
341 * alua_std_inquiry - Evaluate standard INQUIRY command
342 * @sdev: device to be checked
343 *
344 * Just extract the TPGS setting to find out if ALUA
345 * is supported.
346 */
347static int alua_std_inquiry(struct scsi_device *sdev, struct alua_dh_data *h)
348{
349	int err;
350
351	err = submit_std_inquiry(sdev, h);
352
353	if (err != SCSI_DH_OK)
354		return err;
355
356	/* Check TPGS setting */
357	h->tpgs = (h->inq[5] >> 4) & 0x3;
358	switch (h->tpgs) {
359	case TPGS_MODE_EXPLICIT|TPGS_MODE_IMPLICIT:
360		sdev_printk(KERN_INFO, sdev,
361			    "%s: supports implicit and explicit TPGS\n",
362			    ALUA_DH_NAME);
363		break;
364	case TPGS_MODE_EXPLICIT:
365		sdev_printk(KERN_INFO, sdev, "%s: supports explicit TPGS\n",
366			    ALUA_DH_NAME);
367		break;
368	case TPGS_MODE_IMPLICIT:
369		sdev_printk(KERN_INFO, sdev, "%s: supports implicit TPGS\n",
370			    ALUA_DH_NAME);
371		break;
372	default:
373		h->tpgs = TPGS_MODE_NONE;
374		sdev_printk(KERN_INFO, sdev, "%s: not supported\n",
375			    ALUA_DH_NAME);
376		err = SCSI_DH_DEV_UNSUPP;
377		break;
378	}
379
380	return err;
381}
382
383/*
384 * alua_vpd_inquiry - Evaluate INQUIRY vpd page 0x83
385 * @sdev: device to be checked
386 *
387 * Extract the relative target port and the target port group
388 * descriptor from the list of identificators.
389 */
390static int alua_vpd_inquiry(struct scsi_device *sdev, struct alua_dh_data *h)
391{
392	int len;
393	unsigned err;
394	unsigned char *d;
395
396 retry:
397	err = submit_vpd_inquiry(sdev, h);
398
399	if (err != SCSI_DH_OK)
400		return err;
401
402	/* Check if vpd page exceeds initial buffer */
403	len = (h->buff[2] << 8) + h->buff[3] + 4;
404	if (len > h->bufflen) {
405		/* Resubmit with the correct length */
406		if (realloc_buffer(h, len)) {
407			sdev_printk(KERN_WARNING, sdev,
408				    "%s: kmalloc buffer failed\n",
409				    ALUA_DH_NAME);
410			/* Temporary failure, bypass */
411			return SCSI_DH_DEV_TEMP_BUSY;
412		}
413		goto retry;
414	}
415
416	/*
417	 * Now look for the correct descriptor.
418	 */
419	d = h->buff + 4;
420	while (d < h->buff + len) {
421		switch (d[1] & 0xf) {
422		case 0x4:
423			/* Relative target port */
424			h->rel_port = (d[6] << 8) + d[7];
425			break;
426		case 0x5:
427			/* Target port group */
428			h->group_id = (d[6] << 8) + d[7];
429			break;
430		default:
431			break;
432		}
433		d += d[3] + 4;
434	}
435
436	if (h->group_id == -1) {
437		/*
438		 * Internal error; TPGS supported but required
439		 * VPD identification descriptors not present.
440		 * Disable ALUA support
441		 */
442		sdev_printk(KERN_INFO, sdev,
443			    "%s: No target port descriptors found\n",
444			    ALUA_DH_NAME);
445		h->state = TPGS_STATE_OPTIMIZED;
446		h->tpgs = TPGS_MODE_NONE;
447		err = SCSI_DH_DEV_UNSUPP;
448	} else {
449		sdev_printk(KERN_INFO, sdev,
450			    "%s: port group %02x rel port %02x\n",
451			    ALUA_DH_NAME, h->group_id, h->rel_port);
452	}
453
454	return err;
455}
456
457static char print_alua_state(int state)
458{
459	switch (state) {
460	case TPGS_STATE_OPTIMIZED:
461		return 'A';
462	case TPGS_STATE_NONOPTIMIZED:
463		return 'N';
464	case TPGS_STATE_STANDBY:
465		return 'S';
466	case TPGS_STATE_UNAVAILABLE:
467		return 'U';
468	case TPGS_STATE_LBA_DEPENDENT:
469		return 'L';
470	case TPGS_STATE_OFFLINE:
471		return 'O';
472	case TPGS_STATE_TRANSITIONING:
473		return 'T';
474	default:
475		return 'X';
476	}
477}
478
479static int alua_check_sense(struct scsi_device *sdev,
480			    struct scsi_sense_hdr *sense_hdr)
481{
482	switch (sense_hdr->sense_key) {
483	case NOT_READY:
484		if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0a)
485			/*
486			 * LUN Not Accessible - ALUA state transition
487			 */
488			return ADD_TO_MLQUEUE;
489		if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0b)
490			/*
491			 * LUN Not Accessible -- Target port in standby state
492			 */
493			return SUCCESS;
494		if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0c)
495			/*
496			 * LUN Not Accessible -- Target port in unavailable state
497			 */
498			return SUCCESS;
499		if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x12)
500			/*
501			 * LUN Not Ready -- Offline
502			 */
503			return SUCCESS;
504		break;
505	case UNIT_ATTENTION:
506		if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00)
507			/*
508			 * Power On, Reset, or Bus Device Reset, just retry.
509			 */
510			return ADD_TO_MLQUEUE;
511		if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x06) {
 
 
 
 
 
512			/*
513			 * ALUA state changed
514			 */
515			return ADD_TO_MLQUEUE;
516		}
517		if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x07) {
518			/*
519			 * Implicit ALUA state transition failed
520			 */
521			return ADD_TO_MLQUEUE;
522		}
523		if (sense_hdr->asc == 0x3f && sense_hdr->ascq == 0x0e) {
 
 
 
 
524			/*
525			 * REPORTED_LUNS_DATA_HAS_CHANGED is reported
526			 * when switching controllers on targets like
527			 * Intel Multi-Flex. We can just retry.
528			 */
529			return ADD_TO_MLQUEUE;
530		}
531
532		break;
533	}
534
535	return SCSI_RETURN_NOT_HANDLED;
536}
537
538/*
539 * alua_rtpg - Evaluate REPORT TARGET GROUP STATES
540 * @sdev: the device to be evaluated.
541 *
542 * Evaluate the Target Port Group State.
543 * Returns SCSI_DH_DEV_OFFLINED if the path is
544 * found to be unusable.
545 */
546static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h)
547{
548	struct scsi_sense_hdr sense_hdr;
549	int len, k, off, valid_states = 0;
550	char *ucp;
551	unsigned err;
552	unsigned long expiry, interval = 10;
553
554	expiry = round_jiffies_up(jiffies + ALUA_FAILOVER_TIMEOUT);
555 retry:
556	err = submit_rtpg(sdev, h);
557
558	if (err == SCSI_DH_IO && h->senselen > 0) {
559		err = scsi_normalize_sense(h->sense, SCSI_SENSE_BUFFERSIZE,
560					   &sense_hdr);
561		if (!err)
562			return SCSI_DH_IO;
563
564		err = alua_check_sense(sdev, &sense_hdr);
565		if (err == ADD_TO_MLQUEUE && time_before(jiffies, expiry))
566			goto retry;
567		sdev_printk(KERN_INFO, sdev,
568			    "%s: rtpg sense code %02x/%02x/%02x\n",
569			    ALUA_DH_NAME, sense_hdr.sense_key,
570			    sense_hdr.asc, sense_hdr.ascq);
571		err = SCSI_DH_IO;
572	}
573	if (err != SCSI_DH_OK)
574		return err;
575
576	len = (h->buff[0] << 24) + (h->buff[1] << 16) +
577		(h->buff[2] << 8) + h->buff[3] + 4;
578
579	if (len > h->bufflen) {
580		/* Resubmit with the correct length */
581		if (realloc_buffer(h, len)) {
582			sdev_printk(KERN_WARNING, sdev,
583				    "%s: kmalloc buffer failed\n",__func__);
584			/* Temporary failure, bypass */
585			return SCSI_DH_DEV_TEMP_BUSY;
586		}
587		goto retry;
588	}
589
590	for (k = 4, ucp = h->buff + 4; k < len; k += off, ucp += off) {
591		if (h->group_id == (ucp[2] << 8) + ucp[3]) {
592			h->state = ucp[0] & 0x0f;
 
593			valid_states = ucp[1];
594		}
595		off = 8 + (ucp[7] * 4);
596	}
597
598	sdev_printk(KERN_INFO, sdev,
599		    "%s: port group %02x state %c supports %c%c%c%c%c%c%c\n",
600		    ALUA_DH_NAME, h->group_id, print_alua_state(h->state),
 
601		    valid_states&TPGS_SUPPORT_TRANSITION?'T':'t',
602		    valid_states&TPGS_SUPPORT_OFFLINE?'O':'o',
603		    valid_states&TPGS_SUPPORT_LBA_DEPENDENT?'L':'l',
604		    valid_states&TPGS_SUPPORT_UNAVAILABLE?'U':'u',
605		    valid_states&TPGS_SUPPORT_STANDBY?'S':'s',
606		    valid_states&TPGS_SUPPORT_NONOPTIMIZED?'N':'n',
607		    valid_states&TPGS_SUPPORT_OPTIMIZED?'A':'a');
608
609	switch (h->state) {
610	case TPGS_STATE_TRANSITIONING:
611		if (time_before(jiffies, expiry)) {
612			/* State transition, retry */
613			interval *= 10;
614			msleep(interval);
615			goto retry;
616		}
617		/* Transitioning time exceeded, set port to standby */
618		err = SCSI_DH_RETRY;
619		h->state = TPGS_STATE_STANDBY;
620		break;
621	case TPGS_STATE_OFFLINE:
622	case TPGS_STATE_UNAVAILABLE:
623		/* Path unusable for unavailable/offline */
624		err = SCSI_DH_DEV_OFFLINED;
625		break;
626	default:
627		/* Useable path if active */
628		err = SCSI_DH_OK;
629		break;
630	}
631	return err;
632}
633
634/*
635 * alua_initialize - Initialize ALUA state
636 * @sdev: the device to be initialized
637 *
638 * For the prep_fn to work correctly we have
639 * to initialize the ALUA state for the device.
640 */
641static int alua_initialize(struct scsi_device *sdev, struct alua_dh_data *h)
642{
643	int err;
644
645	err = alua_std_inquiry(sdev, h);
646	if (err != SCSI_DH_OK)
647		goto out;
648
649	err = alua_vpd_inquiry(sdev, h);
650	if (err != SCSI_DH_OK)
651		goto out;
652
653	err = alua_rtpg(sdev, h);
654	if (err != SCSI_DH_OK)
655		goto out;
656
657out:
658	return err;
659}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
660
661/*
662 * alua_activate - activate a path
663 * @sdev: device on the path to be activated
664 *
665 * We're currently switching the port group to be activated only and
666 * let the array figure out the rest.
667 * There may be other arrays which require us to switch all port groups
668 * based on a certain policy. But until we actually encounter them it
669 * should be okay.
670 */
671static int alua_activate(struct scsi_device *sdev,
672			activate_complete fn, void *data)
673{
674	struct alua_dh_data *h = get_alua_data(sdev);
675	int err = SCSI_DH_OK;
 
 
 
 
 
676
677	if (h->group_id != -1) {
678		err = alua_rtpg(sdev, h);
679		if (err != SCSI_DH_OK)
680			goto out;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
681	}
682
683	if (h->tpgs & TPGS_MODE_EXPLICIT &&
684	    h->state != TPGS_STATE_OPTIMIZED &&
685	    h->state != TPGS_STATE_LBA_DEPENDENT) {
686		h->callback_fn = fn;
687		h->callback_data = data;
688		err = submit_stpg(h);
689		if (err == SCSI_DH_OK)
690			return 0;
691		h->callback_fn = h->callback_data = NULL;
692	}
693
694out:
695	if (fn)
696		fn(data, err);
697	return 0;
698}
699
700/*
701 * alua_prep_fn - request callback
702 *
703 * Fail I/O to all paths not in state
704 * active/optimized or active/non-optimized.
705 */
706static int alua_prep_fn(struct scsi_device *sdev, struct request *req)
707{
708	struct alua_dh_data *h = get_alua_data(sdev);
709	int ret = BLKPREP_OK;
710
711	if (h->state == TPGS_STATE_TRANSITIONING)
712		ret = BLKPREP_DEFER;
713	else if (h->state != TPGS_STATE_OPTIMIZED &&
714		 h->state != TPGS_STATE_NONOPTIMIZED &&
715		 h->state != TPGS_STATE_LBA_DEPENDENT) {
716		ret = BLKPREP_KILL;
717		req->cmd_flags |= REQ_QUIET;
718	}
719	return ret;
720
721}
722
723static const struct scsi_dh_devlist alua_dev_list[] = {
724	{"HP", "MSA VOLUME" },
725	{"HP", "HSV101" },
726	{"HP", "HSV111" },
727	{"HP", "HSV200" },
728	{"HP", "HSV210" },
729	{"HP", "HSV300" },
730	{"IBM", "2107900" },
731	{"IBM", "2145" },
732	{"Pillar", "Axiom" },
733	{"Intel", "Multi-Flex"},
734	{"NETAPP", "LUN"},
735	{"NETAPP", "LUN C-Mode"},
736	{"AIX", "NVDISK"},
737	{"Promise", "VTrak"},
738	{NULL, NULL}
739};
740
741static int alua_bus_attach(struct scsi_device *sdev);
742static void alua_bus_detach(struct scsi_device *sdev);
743
744static struct scsi_device_handler alua_dh = {
745	.name = ALUA_DH_NAME,
746	.module = THIS_MODULE,
747	.devlist = alua_dev_list,
748	.attach = alua_bus_attach,
749	.detach = alua_bus_detach,
750	.prep_fn = alua_prep_fn,
751	.check_sense = alua_check_sense,
752	.activate = alua_activate,
 
 
753};
754
755/*
756 * alua_bus_attach - Attach device handler
757 * @sdev: device to be attached to
758 */
759static int alua_bus_attach(struct scsi_device *sdev)
760{
761	struct scsi_dh_data *scsi_dh_data;
762	struct alua_dh_data *h;
763	unsigned long flags;
764	int err = SCSI_DH_OK;
765
766	scsi_dh_data = kzalloc(sizeof(*scsi_dh_data)
767			       + sizeof(*h) , GFP_KERNEL);
768	if (!scsi_dh_data) {
769		sdev_printk(KERN_ERR, sdev, "%s: Attach failed\n",
770			    ALUA_DH_NAME);
771		return -ENOMEM;
772	}
773
774	scsi_dh_data->scsi_dh = &alua_dh;
775	h = (struct alua_dh_data *) scsi_dh_data->buf;
776	h->tpgs = TPGS_MODE_UNINITIALIZED;
777	h->state = TPGS_STATE_OPTIMIZED;
778	h->group_id = -1;
779	h->rel_port = -1;
780	h->buff = h->inq;
781	h->bufflen = ALUA_INQUIRY_SIZE;
782	h->sdev = sdev;
783
784	err = alua_initialize(sdev, h);
785	if ((err != SCSI_DH_OK) && (err != SCSI_DH_DEV_OFFLINED))
786		goto failed;
787
788	if (!try_module_get(THIS_MODULE))
789		goto failed;
790
791	spin_lock_irqsave(sdev->request_queue->queue_lock, flags);
792	sdev->scsi_dh_data = scsi_dh_data;
793	spin_unlock_irqrestore(sdev->request_queue->queue_lock, flags);
 
794
795	return 0;
796
797failed:
798	kfree(scsi_dh_data);
799	sdev_printk(KERN_ERR, sdev, "%s: not attached\n", ALUA_DH_NAME);
800	return -EINVAL;
801}
802
803/*
804 * alua_bus_detach - Detach device handler
805 * @sdev: device to be detached from
806 */
807static void alua_bus_detach(struct scsi_device *sdev)
808{
809	struct scsi_dh_data *scsi_dh_data;
810	struct alua_dh_data *h;
811	unsigned long flags;
812
813	spin_lock_irqsave(sdev->request_queue->queue_lock, flags);
814	scsi_dh_data = sdev->scsi_dh_data;
815	sdev->scsi_dh_data = NULL;
816	spin_unlock_irqrestore(sdev->request_queue->queue_lock, flags);
817
818	h = (struct alua_dh_data *) scsi_dh_data->buf;
819	if (h->buff && h->inq != h->buff)
820		kfree(h->buff);
821	kfree(scsi_dh_data);
822	module_put(THIS_MODULE);
823	sdev_printk(KERN_NOTICE, sdev, "%s: Detached\n", ALUA_DH_NAME);
824}
825
826static int __init alua_init(void)
827{
828	int r;
829
830	r = scsi_register_device_handler(&alua_dh);
831	if (r != 0)
832		printk(KERN_ERR "%s: Failed to register scsi device handler",
833			ALUA_DH_NAME);
834	return r;
835}
836
837static void __exit alua_exit(void)
838{
839	scsi_unregister_device_handler(&alua_dh);
840}
841
842module_init(alua_init);
843module_exit(alua_exit);
844
845MODULE_DESCRIPTION("DM Multipath ALUA support");
846MODULE_AUTHOR("Hannes Reinecke <hare@suse.de>");
847MODULE_LICENSE("GPL");
848MODULE_VERSION(ALUA_DH_VER);
v3.5.6
  1/*
  2 * Generic SCSI-3 ALUA SCSI Device Handler
  3 *
  4 * Copyright (C) 2007-2010 Hannes Reinecke, SUSE Linux Products GmbH.
  5 * All rights reserved.
  6 *
  7 * This program is free software; you can redistribute it and/or modify
  8 * it under the terms of the GNU General Public License as published by
  9 * the Free Software Foundation; either version 2 of the License, or
 10 * (at your option) any later version.
 11 *
 12 * This program is distributed in the hope that it will be useful,
 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 15 * GNU General Public License for more details.
 16 *
 17 * You should have received a copy of the GNU General Public License
 18 * along with this program; if not, write to the Free Software
 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 20 *
 21 */
 22#include <linux/slab.h>
 23#include <linux/delay.h>
 24#include <linux/module.h>
 25#include <scsi/scsi.h>
 26#include <scsi/scsi_eh.h>
 27#include <scsi/scsi_dh.h>
 28
 29#define ALUA_DH_NAME "alua"
 30#define ALUA_DH_VER "1.3"
 31
 32#define TPGS_STATE_OPTIMIZED		0x0
 33#define TPGS_STATE_NONOPTIMIZED		0x1
 34#define TPGS_STATE_STANDBY		0x2
 35#define TPGS_STATE_UNAVAILABLE		0x3
 36#define TPGS_STATE_LBA_DEPENDENT	0x4
 37#define TPGS_STATE_OFFLINE		0xe
 38#define TPGS_STATE_TRANSITIONING	0xf
 39
 40#define TPGS_SUPPORT_NONE		0x00
 41#define TPGS_SUPPORT_OPTIMIZED		0x01
 42#define TPGS_SUPPORT_NONOPTIMIZED	0x02
 43#define TPGS_SUPPORT_STANDBY		0x04
 44#define TPGS_SUPPORT_UNAVAILABLE	0x08
 45#define TPGS_SUPPORT_LBA_DEPENDENT	0x10
 46#define TPGS_SUPPORT_OFFLINE		0x40
 47#define TPGS_SUPPORT_TRANSITION		0x80
 48
 49#define TPGS_MODE_UNINITIALIZED		 -1
 50#define TPGS_MODE_NONE			0x0
 51#define TPGS_MODE_IMPLICIT		0x1
 52#define TPGS_MODE_EXPLICIT		0x2
 53
 54#define ALUA_INQUIRY_SIZE		36
 55#define ALUA_FAILOVER_TIMEOUT		(60 * HZ)
 56#define ALUA_FAILOVER_RETRIES		5
 57
 58/* flags passed from user level */
 59#define ALUA_OPTIMIZE_STPG		1
 60
 61struct alua_dh_data {
 62	int			group_id;
 63	int			rel_port;
 64	int			tpgs;
 65	int			state;
 66	int			pref;
 67	unsigned		flags; /* used for optimizing STPG */
 68	unsigned char		inq[ALUA_INQUIRY_SIZE];
 69	unsigned char		*buff;
 70	int			bufflen;
 71	unsigned char		sense[SCSI_SENSE_BUFFERSIZE];
 72	int			senselen;
 73	struct scsi_device	*sdev;
 74	activate_complete	callback_fn;
 75	void			*callback_data;
 76};
 77
 78#define ALUA_POLICY_SWITCH_CURRENT	0
 79#define ALUA_POLICY_SWITCH_ALL		1
 80
 81static char print_alua_state(int);
 82static int alua_check_sense(struct scsi_device *, struct scsi_sense_hdr *);
 83
 84static inline struct alua_dh_data *get_alua_data(struct scsi_device *sdev)
 85{
 86	struct scsi_dh_data *scsi_dh_data = sdev->scsi_dh_data;
 87	BUG_ON(scsi_dh_data == NULL);
 88	return ((struct alua_dh_data *) scsi_dh_data->buf);
 89}
 90
 91static int realloc_buffer(struct alua_dh_data *h, unsigned len)
 92{
 93	if (h->buff && h->buff != h->inq)
 94		kfree(h->buff);
 95
 96	h->buff = kmalloc(len, GFP_NOIO);
 97	if (!h->buff) {
 98		h->buff = h->inq;
 99		h->bufflen = ALUA_INQUIRY_SIZE;
100		return 1;
101	}
102	h->bufflen = len;
103	return 0;
104}
105
106static struct request *get_alua_req(struct scsi_device *sdev,
107				    void *buffer, unsigned buflen, int rw)
108{
109	struct request *rq;
110	struct request_queue *q = sdev->request_queue;
111
112	rq = blk_get_request(q, rw, GFP_NOIO);
113
114	if (!rq) {
115		sdev_printk(KERN_INFO, sdev,
116			    "%s: blk_get_request failed\n", __func__);
117		return NULL;
118	}
119
120	if (buflen && blk_rq_map_kern(q, rq, buffer, buflen, GFP_NOIO)) {
121		blk_put_request(rq);
122		sdev_printk(KERN_INFO, sdev,
123			    "%s: blk_rq_map_kern failed\n", __func__);
124		return NULL;
125	}
126
127	rq->cmd_type = REQ_TYPE_BLOCK_PC;
128	rq->cmd_flags |= REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |
129			 REQ_FAILFAST_DRIVER;
130	rq->retries = ALUA_FAILOVER_RETRIES;
131	rq->timeout = ALUA_FAILOVER_TIMEOUT;
132
133	return rq;
134}
135
136/*
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137 * submit_vpd_inquiry - Issue an INQUIRY VPD page 0x83 command
138 * @sdev: sdev the command should be sent to
139 */
140static int submit_vpd_inquiry(struct scsi_device *sdev, struct alua_dh_data *h)
141{
142	struct request *rq;
143	int err = SCSI_DH_RES_TEMP_UNAVAIL;
144
145	rq = get_alua_req(sdev, h->buff, h->bufflen, READ);
146	if (!rq)
147		goto done;
148
149	/* Prepare the command. */
150	rq->cmd[0] = INQUIRY;
151	rq->cmd[1] = 1;
152	rq->cmd[2] = 0x83;
153	rq->cmd[4] = h->bufflen;
154	rq->cmd_len = COMMAND_SIZE(INQUIRY);
155
156	rq->sense = h->sense;
157	memset(rq->sense, 0, SCSI_SENSE_BUFFERSIZE);
158	rq->sense_len = h->senselen = 0;
159
160	err = blk_execute_rq(rq->q, NULL, rq, 1);
161	if (err == -EIO) {
162		sdev_printk(KERN_INFO, sdev,
163			    "%s: evpd inquiry failed with %x\n",
164			    ALUA_DH_NAME, rq->errors);
165		h->senselen = rq->sense_len;
166		err = SCSI_DH_IO;
167	}
168	blk_put_request(rq);
169done:
170	return err;
171}
172
173/*
174 * submit_rtpg - Issue a REPORT TARGET GROUP STATES command
175 * @sdev: sdev the command should be sent to
176 */
177static unsigned submit_rtpg(struct scsi_device *sdev, struct alua_dh_data *h)
178{
179	struct request *rq;
180	int err = SCSI_DH_RES_TEMP_UNAVAIL;
181
182	rq = get_alua_req(sdev, h->buff, h->bufflen, READ);
183	if (!rq)
184		goto done;
185
186	/* Prepare the command. */
187	rq->cmd[0] = MAINTENANCE_IN;
188	rq->cmd[1] = MI_REPORT_TARGET_PGS;
189	rq->cmd[6] = (h->bufflen >> 24) & 0xff;
190	rq->cmd[7] = (h->bufflen >> 16) & 0xff;
191	rq->cmd[8] = (h->bufflen >>  8) & 0xff;
192	rq->cmd[9] = h->bufflen & 0xff;
193	rq->cmd_len = COMMAND_SIZE(MAINTENANCE_IN);
194
195	rq->sense = h->sense;
196	memset(rq->sense, 0, SCSI_SENSE_BUFFERSIZE);
197	rq->sense_len = h->senselen = 0;
198
199	err = blk_execute_rq(rq->q, NULL, rq, 1);
200	if (err == -EIO) {
201		sdev_printk(KERN_INFO, sdev,
202			    "%s: rtpg failed with %x\n",
203			    ALUA_DH_NAME, rq->errors);
204		h->senselen = rq->sense_len;
205		err = SCSI_DH_IO;
206	}
207	blk_put_request(rq);
208done:
209	return err;
210}
211
212/*
213 * alua_stpg - Evaluate SET TARGET GROUP STATES
214 * @sdev: the device to be evaluated
215 * @state: the new target group state
216 *
217 * Send a SET TARGET GROUP STATES command to the device.
218 * We only have to test here if we should resubmit the command;
219 * any other error is assumed as a failure.
220 */
221static void stpg_endio(struct request *req, int error)
222{
223	struct alua_dh_data *h = req->end_io_data;
224	struct scsi_sense_hdr sense_hdr;
225	unsigned err = SCSI_DH_OK;
226
227	if (error || host_byte(req->errors) != DID_OK ||
228			msg_byte(req->errors) != COMMAND_COMPLETE) {
229		err = SCSI_DH_IO;
230		goto done;
231	}
232
233	if (h->senselen > 0) {
234		err = scsi_normalize_sense(h->sense, SCSI_SENSE_BUFFERSIZE,
235					   &sense_hdr);
236		if (!err) {
237			err = SCSI_DH_IO;
238			goto done;
239		}
240		err = alua_check_sense(h->sdev, &sense_hdr);
241		if (err == ADD_TO_MLQUEUE) {
242			err = SCSI_DH_RETRY;
243			goto done;
244		}
245		sdev_printk(KERN_INFO, h->sdev,
246			    "%s: stpg sense code: %02x/%02x/%02x\n",
247			    ALUA_DH_NAME, sense_hdr.sense_key,
248			    sense_hdr.asc, sense_hdr.ascq);
249		err = SCSI_DH_IO;
250	}
251	if (err == SCSI_DH_OK) {
252		h->state = TPGS_STATE_OPTIMIZED;
253		sdev_printk(KERN_INFO, h->sdev,
254			    "%s: port group %02x switched to state %c\n",
255			    ALUA_DH_NAME, h->group_id,
256			    print_alua_state(h->state));
257	}
258done:
259	req->end_io_data = NULL;
260	__blk_put_request(req->q, req);
261	if (h->callback_fn) {
262		h->callback_fn(h->callback_data, err);
263		h->callback_fn = h->callback_data = NULL;
264	}
265	return;
266}
267
268/*
269 * submit_stpg - Issue a SET TARGET GROUP STATES command
270 *
271 * Currently we're only setting the current target port group state
272 * to 'active/optimized' and let the array firmware figure out
273 * the states of the remaining groups.
274 */
275static unsigned submit_stpg(struct alua_dh_data *h)
276{
277	struct request *rq;
278	int stpg_len = 8;
279	struct scsi_device *sdev = h->sdev;
280
281	/* Prepare the data buffer */
282	memset(h->buff, 0, stpg_len);
283	h->buff[4] = TPGS_STATE_OPTIMIZED & 0x0f;
284	h->buff[6] = (h->group_id >> 8) & 0xff;
285	h->buff[7] = h->group_id & 0xff;
286
287	rq = get_alua_req(sdev, h->buff, stpg_len, WRITE);
288	if (!rq)
289		return SCSI_DH_RES_TEMP_UNAVAIL;
290
291	/* Prepare the command. */
292	rq->cmd[0] = MAINTENANCE_OUT;
293	rq->cmd[1] = MO_SET_TARGET_PGS;
294	rq->cmd[6] = (stpg_len >> 24) & 0xff;
295	rq->cmd[7] = (stpg_len >> 16) & 0xff;
296	rq->cmd[8] = (stpg_len >>  8) & 0xff;
297	rq->cmd[9] = stpg_len & 0xff;
298	rq->cmd_len = COMMAND_SIZE(MAINTENANCE_OUT);
299
300	rq->sense = h->sense;
301	memset(rq->sense, 0, SCSI_SENSE_BUFFERSIZE);
302	rq->sense_len = h->senselen = 0;
303	rq->end_io_data = h;
304
305	blk_execute_rq_nowait(rq->q, NULL, rq, 1, stpg_endio);
306	return SCSI_DH_OK;
307}
308
309/*
310 * alua_check_tpgs - Evaluate TPGS setting
311 * @sdev: device to be checked
312 *
313 * Examine the TPGS setting of the sdev to find out if ALUA
314 * is supported.
315 */
316static int alua_check_tpgs(struct scsi_device *sdev, struct alua_dh_data *h)
317{
318	int err = SCSI_DH_OK;
 
 
 
 
 
319
320	h->tpgs = scsi_device_tpgs(sdev);
 
321	switch (h->tpgs) {
322	case TPGS_MODE_EXPLICIT|TPGS_MODE_IMPLICIT:
323		sdev_printk(KERN_INFO, sdev,
324			    "%s: supports implicit and explicit TPGS\n",
325			    ALUA_DH_NAME);
326		break;
327	case TPGS_MODE_EXPLICIT:
328		sdev_printk(KERN_INFO, sdev, "%s: supports explicit TPGS\n",
329			    ALUA_DH_NAME);
330		break;
331	case TPGS_MODE_IMPLICIT:
332		sdev_printk(KERN_INFO, sdev, "%s: supports implicit TPGS\n",
333			    ALUA_DH_NAME);
334		break;
335	default:
336		h->tpgs = TPGS_MODE_NONE;
337		sdev_printk(KERN_INFO, sdev, "%s: not supported\n",
338			    ALUA_DH_NAME);
339		err = SCSI_DH_DEV_UNSUPP;
340		break;
341	}
342
343	return err;
344}
345
346/*
347 * alua_vpd_inquiry - Evaluate INQUIRY vpd page 0x83
348 * @sdev: device to be checked
349 *
350 * Extract the relative target port and the target port group
351 * descriptor from the list of identificators.
352 */
353static int alua_vpd_inquiry(struct scsi_device *sdev, struct alua_dh_data *h)
354{
355	int len;
356	unsigned err;
357	unsigned char *d;
358
359 retry:
360	err = submit_vpd_inquiry(sdev, h);
361
362	if (err != SCSI_DH_OK)
363		return err;
364
365	/* Check if vpd page exceeds initial buffer */
366	len = (h->buff[2] << 8) + h->buff[3] + 4;
367	if (len > h->bufflen) {
368		/* Resubmit with the correct length */
369		if (realloc_buffer(h, len)) {
370			sdev_printk(KERN_WARNING, sdev,
371				    "%s: kmalloc buffer failed\n",
372				    ALUA_DH_NAME);
373			/* Temporary failure, bypass */
374			return SCSI_DH_DEV_TEMP_BUSY;
375		}
376		goto retry;
377	}
378
379	/*
380	 * Now look for the correct descriptor.
381	 */
382	d = h->buff + 4;
383	while (d < h->buff + len) {
384		switch (d[1] & 0xf) {
385		case 0x4:
386			/* Relative target port */
387			h->rel_port = (d[6] << 8) + d[7];
388			break;
389		case 0x5:
390			/* Target port group */
391			h->group_id = (d[6] << 8) + d[7];
392			break;
393		default:
394			break;
395		}
396		d += d[3] + 4;
397	}
398
399	if (h->group_id == -1) {
400		/*
401		 * Internal error; TPGS supported but required
402		 * VPD identification descriptors not present.
403		 * Disable ALUA support
404		 */
405		sdev_printk(KERN_INFO, sdev,
406			    "%s: No target port descriptors found\n",
407			    ALUA_DH_NAME);
408		h->state = TPGS_STATE_OPTIMIZED;
409		h->tpgs = TPGS_MODE_NONE;
410		err = SCSI_DH_DEV_UNSUPP;
411	} else {
412		sdev_printk(KERN_INFO, sdev,
413			    "%s: port group %02x rel port %02x\n",
414			    ALUA_DH_NAME, h->group_id, h->rel_port);
415	}
416
417	return err;
418}
419
420static char print_alua_state(int state)
421{
422	switch (state) {
423	case TPGS_STATE_OPTIMIZED:
424		return 'A';
425	case TPGS_STATE_NONOPTIMIZED:
426		return 'N';
427	case TPGS_STATE_STANDBY:
428		return 'S';
429	case TPGS_STATE_UNAVAILABLE:
430		return 'U';
431	case TPGS_STATE_LBA_DEPENDENT:
432		return 'L';
433	case TPGS_STATE_OFFLINE:
434		return 'O';
435	case TPGS_STATE_TRANSITIONING:
436		return 'T';
437	default:
438		return 'X';
439	}
440}
441
442static int alua_check_sense(struct scsi_device *sdev,
443			    struct scsi_sense_hdr *sense_hdr)
444{
445	switch (sense_hdr->sense_key) {
446	case NOT_READY:
447		if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0a)
448			/*
449			 * LUN Not Accessible - ALUA state transition
450			 */
451			return ADD_TO_MLQUEUE;
452		if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0b)
453			/*
454			 * LUN Not Accessible -- Target port in standby state
455			 */
456			return SUCCESS;
457		if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0c)
458			/*
459			 * LUN Not Accessible -- Target port in unavailable state
460			 */
461			return SUCCESS;
462		if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x12)
463			/*
464			 * LUN Not Ready -- Offline
465			 */
466			return SUCCESS;
467		break;
468	case UNIT_ATTENTION:
469		if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00)
470			/*
471			 * Power On, Reset, or Bus Device Reset, just retry.
472			 */
473			return ADD_TO_MLQUEUE;
474		if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x01)
475			/*
476			 * Mode Parameters Changed
477			 */
478			return ADD_TO_MLQUEUE;
479		if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x06)
480			/*
481			 * ALUA state changed
482			 */
483			return ADD_TO_MLQUEUE;
484		if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x07)
 
485			/*
486			 * Implicit ALUA state transition failed
487			 */
488			return ADD_TO_MLQUEUE;
489		if (sense_hdr->asc == 0x3f && sense_hdr->ascq == 0x03)
490			/*
491			 * Inquiry data has changed
492			 */
493			return ADD_TO_MLQUEUE;
494		if (sense_hdr->asc == 0x3f && sense_hdr->ascq == 0x0e)
495			/*
496			 * REPORTED_LUNS_DATA_HAS_CHANGED is reported
497			 * when switching controllers on targets like
498			 * Intel Multi-Flex. We can just retry.
499			 */
500			return ADD_TO_MLQUEUE;
 
 
501		break;
502	}
503
504	return SCSI_RETURN_NOT_HANDLED;
505}
506
507/*
508 * alua_rtpg - Evaluate REPORT TARGET GROUP STATES
509 * @sdev: the device to be evaluated.
510 *
511 * Evaluate the Target Port Group State.
512 * Returns SCSI_DH_DEV_OFFLINED if the path is
513 * found to be unusable.
514 */
515static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h)
516{
517	struct scsi_sense_hdr sense_hdr;
518	int len, k, off, valid_states = 0;
519	unsigned char *ucp;
520	unsigned err;
521	unsigned long expiry, interval = 1000;
522
523	expiry = round_jiffies_up(jiffies + ALUA_FAILOVER_TIMEOUT);
524 retry:
525	err = submit_rtpg(sdev, h);
526
527	if (err == SCSI_DH_IO && h->senselen > 0) {
528		err = scsi_normalize_sense(h->sense, SCSI_SENSE_BUFFERSIZE,
529					   &sense_hdr);
530		if (!err)
531			return SCSI_DH_IO;
532
533		err = alua_check_sense(sdev, &sense_hdr);
534		if (err == ADD_TO_MLQUEUE && time_before(jiffies, expiry))
535			goto retry;
536		sdev_printk(KERN_INFO, sdev,
537			    "%s: rtpg sense code %02x/%02x/%02x\n",
538			    ALUA_DH_NAME, sense_hdr.sense_key,
539			    sense_hdr.asc, sense_hdr.ascq);
540		err = SCSI_DH_IO;
541	}
542	if (err != SCSI_DH_OK)
543		return err;
544
545	len = (h->buff[0] << 24) + (h->buff[1] << 16) +
546		(h->buff[2] << 8) + h->buff[3] + 4;
547
548	if (len > h->bufflen) {
549		/* Resubmit with the correct length */
550		if (realloc_buffer(h, len)) {
551			sdev_printk(KERN_WARNING, sdev,
552				    "%s: kmalloc buffer failed\n",__func__);
553			/* Temporary failure, bypass */
554			return SCSI_DH_DEV_TEMP_BUSY;
555		}
556		goto retry;
557	}
558
559	for (k = 4, ucp = h->buff + 4; k < len; k += off, ucp += off) {
560		if (h->group_id == (ucp[2] << 8) + ucp[3]) {
561			h->state = ucp[0] & 0x0f;
562			h->pref = ucp[0] >> 7;
563			valid_states = ucp[1];
564		}
565		off = 8 + (ucp[7] * 4);
566	}
567
568	sdev_printk(KERN_INFO, sdev,
569		    "%s: port group %02x state %c %s supports %c%c%c%c%c%c%c\n",
570		    ALUA_DH_NAME, h->group_id, print_alua_state(h->state),
571		    h->pref ? "preferred" : "non-preferred",
572		    valid_states&TPGS_SUPPORT_TRANSITION?'T':'t',
573		    valid_states&TPGS_SUPPORT_OFFLINE?'O':'o',
574		    valid_states&TPGS_SUPPORT_LBA_DEPENDENT?'L':'l',
575		    valid_states&TPGS_SUPPORT_UNAVAILABLE?'U':'u',
576		    valid_states&TPGS_SUPPORT_STANDBY?'S':'s',
577		    valid_states&TPGS_SUPPORT_NONOPTIMIZED?'N':'n',
578		    valid_states&TPGS_SUPPORT_OPTIMIZED?'A':'a');
579
580	switch (h->state) {
581	case TPGS_STATE_TRANSITIONING:
582		if (time_before(jiffies, expiry)) {
583			/* State transition, retry */
584			interval *= 2;
585			msleep(interval);
586			goto retry;
587		}
588		/* Transitioning time exceeded, set port to standby */
589		err = SCSI_DH_RETRY;
590		h->state = TPGS_STATE_STANDBY;
591		break;
592	case TPGS_STATE_OFFLINE:
593		/* Path unusable */
 
594		err = SCSI_DH_DEV_OFFLINED;
595		break;
596	default:
597		/* Useable path if active */
598		err = SCSI_DH_OK;
599		break;
600	}
601	return err;
602}
603
604/*
605 * alua_initialize - Initialize ALUA state
606 * @sdev: the device to be initialized
607 *
608 * For the prep_fn to work correctly we have
609 * to initialize the ALUA state for the device.
610 */
611static int alua_initialize(struct scsi_device *sdev, struct alua_dh_data *h)
612{
613	int err;
614
615	err = alua_check_tpgs(sdev, h);
616	if (err != SCSI_DH_OK)
617		goto out;
618
619	err = alua_vpd_inquiry(sdev, h);
620	if (err != SCSI_DH_OK)
621		goto out;
622
623	err = alua_rtpg(sdev, h);
624	if (err != SCSI_DH_OK)
625		goto out;
626
627out:
628	return err;
629}
630/*
631 * alua_set_params - set/unset the optimize flag
632 * @sdev: device on the path to be activated
633 * params - parameters in the following format
634 *      "no_of_params\0param1\0param2\0param3\0...\0"
635 * For example, to set the flag pass the following parameters
636 * from multipath.conf
637 *     hardware_handler        "2 alua 1"
638 */
639static int alua_set_params(struct scsi_device *sdev, const char *params)
640{
641	struct alua_dh_data *h = get_alua_data(sdev);
642	unsigned int optimize = 0, argc;
643	const char *p = params;
644	int result = SCSI_DH_OK;
645
646	if ((sscanf(params, "%u", &argc) != 1) || (argc != 1))
647		return -EINVAL;
648
649	while (*p++)
650		;
651	if ((sscanf(p, "%u", &optimize) != 1) || (optimize > 1))
652		return -EINVAL;
653
654	if (optimize)
655		h->flags |= ALUA_OPTIMIZE_STPG;
656	else
657		h->flags &= ~ALUA_OPTIMIZE_STPG;
658
659	return result;
660}
661
662/*
663 * alua_activate - activate a path
664 * @sdev: device on the path to be activated
665 *
666 * We're currently switching the port group to be activated only and
667 * let the array figure out the rest.
668 * There may be other arrays which require us to switch all port groups
669 * based on a certain policy. But until we actually encounter them it
670 * should be okay.
671 */
672static int alua_activate(struct scsi_device *sdev,
673			activate_complete fn, void *data)
674{
675	struct alua_dh_data *h = get_alua_data(sdev);
676	int err = SCSI_DH_OK;
677	int stpg = 0;
678
679	err = alua_rtpg(sdev, h);
680	if (err != SCSI_DH_OK)
681		goto out;
682
683	if (h->tpgs & TPGS_MODE_EXPLICIT) {
684		switch (h->state) {
685		case TPGS_STATE_NONOPTIMIZED:
686			stpg = 1;
687			if ((h->flags & ALUA_OPTIMIZE_STPG) &&
688			    (!h->pref) &&
689			    (h->tpgs & TPGS_MODE_IMPLICIT))
690				stpg = 0;
691			break;
692		case TPGS_STATE_STANDBY:
693			stpg = 1;
694			break;
695		case TPGS_STATE_UNAVAILABLE:
696		case TPGS_STATE_OFFLINE:
697			err = SCSI_DH_IO;
698			break;
699		case TPGS_STATE_TRANSITIONING:
700			err = SCSI_DH_RETRY;
701			break;
702		default:
703			break;
704		}
705	}
706
707	if (stpg) {
 
 
708		h->callback_fn = fn;
709		h->callback_data = data;
710		err = submit_stpg(h);
711		if (err == SCSI_DH_OK)
712			return 0;
713		h->callback_fn = h->callback_data = NULL;
714	}
715
716out:
717	if (fn)
718		fn(data, err);
719	return 0;
720}
721
722/*
723 * alua_prep_fn - request callback
724 *
725 * Fail I/O to all paths not in state
726 * active/optimized or active/non-optimized.
727 */
728static int alua_prep_fn(struct scsi_device *sdev, struct request *req)
729{
730	struct alua_dh_data *h = get_alua_data(sdev);
731	int ret = BLKPREP_OK;
732
733	if (h->state == TPGS_STATE_TRANSITIONING)
734		ret = BLKPREP_DEFER;
735	else if (h->state != TPGS_STATE_OPTIMIZED &&
736		 h->state != TPGS_STATE_NONOPTIMIZED &&
737		 h->state != TPGS_STATE_LBA_DEPENDENT) {
738		ret = BLKPREP_KILL;
739		req->cmd_flags |= REQ_QUIET;
740	}
741	return ret;
742
743}
744
745static bool alua_match(struct scsi_device *sdev)
746{
747	return (scsi_device_tpgs(sdev) != 0);
748}
 
 
 
 
 
 
 
 
 
 
 
 
 
749
750static int alua_bus_attach(struct scsi_device *sdev);
751static void alua_bus_detach(struct scsi_device *sdev);
752
753static struct scsi_device_handler alua_dh = {
754	.name = ALUA_DH_NAME,
755	.module = THIS_MODULE,
 
756	.attach = alua_bus_attach,
757	.detach = alua_bus_detach,
758	.prep_fn = alua_prep_fn,
759	.check_sense = alua_check_sense,
760	.activate = alua_activate,
761	.set_params = alua_set_params,
762	.match = alua_match,
763};
764
765/*
766 * alua_bus_attach - Attach device handler
767 * @sdev: device to be attached to
768 */
769static int alua_bus_attach(struct scsi_device *sdev)
770{
771	struct scsi_dh_data *scsi_dh_data;
772	struct alua_dh_data *h;
773	unsigned long flags;
774	int err = SCSI_DH_OK;
775
776	scsi_dh_data = kzalloc(sizeof(*scsi_dh_data)
777			       + sizeof(*h) , GFP_KERNEL);
778	if (!scsi_dh_data) {
779		sdev_printk(KERN_ERR, sdev, "%s: Attach failed\n",
780			    ALUA_DH_NAME);
781		return -ENOMEM;
782	}
783
784	scsi_dh_data->scsi_dh = &alua_dh;
785	h = (struct alua_dh_data *) scsi_dh_data->buf;
786	h->tpgs = TPGS_MODE_UNINITIALIZED;
787	h->state = TPGS_STATE_OPTIMIZED;
788	h->group_id = -1;
789	h->rel_port = -1;
790	h->buff = h->inq;
791	h->bufflen = ALUA_INQUIRY_SIZE;
792	h->sdev = sdev;
793
794	err = alua_initialize(sdev, h);
795	if ((err != SCSI_DH_OK) && (err != SCSI_DH_DEV_OFFLINED))
796		goto failed;
797
798	if (!try_module_get(THIS_MODULE))
799		goto failed;
800
801	spin_lock_irqsave(sdev->request_queue->queue_lock, flags);
802	sdev->scsi_dh_data = scsi_dh_data;
803	spin_unlock_irqrestore(sdev->request_queue->queue_lock, flags);
804	sdev_printk(KERN_NOTICE, sdev, "%s: Attached\n", ALUA_DH_NAME);
805
806	return 0;
807
808failed:
809	kfree(scsi_dh_data);
810	sdev_printk(KERN_ERR, sdev, "%s: not attached\n", ALUA_DH_NAME);
811	return -EINVAL;
812}
813
814/*
815 * alua_bus_detach - Detach device handler
816 * @sdev: device to be detached from
817 */
818static void alua_bus_detach(struct scsi_device *sdev)
819{
820	struct scsi_dh_data *scsi_dh_data;
821	struct alua_dh_data *h;
822	unsigned long flags;
823
824	spin_lock_irqsave(sdev->request_queue->queue_lock, flags);
825	scsi_dh_data = sdev->scsi_dh_data;
826	sdev->scsi_dh_data = NULL;
827	spin_unlock_irqrestore(sdev->request_queue->queue_lock, flags);
828
829	h = (struct alua_dh_data *) scsi_dh_data->buf;
830	if (h->buff && h->inq != h->buff)
831		kfree(h->buff);
832	kfree(scsi_dh_data);
833	module_put(THIS_MODULE);
834	sdev_printk(KERN_NOTICE, sdev, "%s: Detached\n", ALUA_DH_NAME);
835}
836
837static int __init alua_init(void)
838{
839	int r;
840
841	r = scsi_register_device_handler(&alua_dh);
842	if (r != 0)
843		printk(KERN_ERR "%s: Failed to register scsi device handler",
844			ALUA_DH_NAME);
845	return r;
846}
847
848static void __exit alua_exit(void)
849{
850	scsi_unregister_device_handler(&alua_dh);
851}
852
853module_init(alua_init);
854module_exit(alua_exit);
855
856MODULE_DESCRIPTION("DM Multipath ALUA support");
857MODULE_AUTHOR("Hannes Reinecke <hare@suse.de>");
858MODULE_LICENSE("GPL");
859MODULE_VERSION(ALUA_DH_VER);