All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Fixed for 64bit LUNs
@ 2014-07-04 11:54 Hannes Reinecke
  2014-07-04 11:54 ` [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers Hannes Reinecke
  2014-07-04 11:54 ` [PATCH 2/2] ib_srp: 64bit LUN fixes Hannes Reinecke
  0 siblings, 2 replies; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-04 11:54 UTC (permalink / raw)
  To: James Bottomley; +Cc: Christoph Hellwig, linux-scsi, Hannes Reinecke

Hi Christoph,

here are some more fixes for 64bit LUNs, which should fix the latest
built issues from Fengguang.
Most notably I've introduced a new accessor 'sdev_scsi2lun' for those
devices which are not capable of handling LUNs higher than 255.
And I've removed the custom LUN handling code from ib_srp.

Hannes Reinecke (2):
  Use sdev_scsi2lun for SCSI parallel drivers
  ib_srp: 64bit LUN fixes

 arch/ia64/hp/sim/simscsi.c            |  2 +-
 drivers/infiniband/ulp/srp/ib_srp.c   |  9 ++--
 drivers/infiniband/ulp/srpt/ib_srpt.c | 81 +--------------------------------
 drivers/scsi/53c700.c                 | 12 ++---
 drivers/scsi/BusLogic.c               |  2 +-
 drivers/scsi/NCR5380.c                | 32 ++++++-------
 drivers/scsi/NCR53c406a.c             |  2 +-
 drivers/scsi/a100u2w.c                |  4 +-
 drivers/scsi/advansys.c               | 16 +++----
 drivers/scsi/aha152x.c                | 13 +++---
 drivers/scsi/aha1542.c                |  4 +-
 drivers/scsi/aha1740.c                |  2 +-
 drivers/scsi/aic7xxx/aic79xx_osm.c    | 19 ++++----
 drivers/scsi/aic7xxx/aic79xx_proc.c   |  2 +-
 drivers/scsi/aic7xxx/aic7xxx_osm.c    | 23 +++++-----
 drivers/scsi/aic7xxx/aic7xxx_proc.c   |  2 +-
 drivers/scsi/arm/acornscsi.c          | 20 ++++----
 drivers/scsi/arm/fas216.c             | 15 +++---
 drivers/scsi/arm/queue.c              |  8 ++--
 drivers/scsi/atari_NCR5380.c          | 81 +++++++++++++++++----------------
 drivers/scsi/atp870u.c                |  2 +-
 drivers/scsi/bnx2fc/bnx2fc_io.c       |  4 +-
 drivers/scsi/ch.c                     | 16 +++----
 drivers/scsi/dc395x.c                 | 73 ++++++++++++++---------------
 drivers/scsi/eata.c                   |  4 +-
 drivers/scsi/eata_pio.c               |  2 +-
 drivers/scsi/esp_scsi.c               |  6 +--
 drivers/scsi/g_NCR5380.c              |  2 +-
 drivers/scsi/gdth.c                   |  4 +-
 drivers/scsi/hptiop.c                 |  6 +--
 drivers/scsi/in2000.c                 | 36 ++++++++-------
 drivers/scsi/initio.c                 |  4 +-
 drivers/scsi/megaraid.c               | 10 ++--
 drivers/scsi/mesh.c                   |  6 +--
 drivers/scsi/mvumi.c                  |  2 +-
 drivers/scsi/ncr53c8xx.c              | 33 +++++++-------
 drivers/scsi/nsp32.c                  | 14 +++---
 drivers/scsi/ps3rom.c                 |  2 +-
 drivers/scsi/qlogicpti.c              |  6 +--
 drivers/scsi/scsi.c                   |  2 +-
 drivers/scsi/stex.c                   |  2 +-
 drivers/scsi/sun3_NCR5380.c           | 86 +++++++++++++++++++----------------
 drivers/scsi/sym53c8xx_2/sym_glue.c   | 19 ++++----
 drivers/scsi/sym53c8xx_2/sym_hipd.c   | 10 ++--
 drivers/scsi/tmscsim.c                | 12 +++--
 drivers/scsi/u14-34f.c                |  6 +--
 drivers/scsi/ufs/ufshcd.c             |  4 +-
 drivers/scsi/ultrastor.c              |  2 +-
 drivers/scsi/wd33c93.c                | 35 ++++++++------
 drivers/scsi/wd7000.c                 |  3 +-
 drivers/staging/rts5208/rtsx.c        |  4 +-
 include/scsi/scsi_device.h            |  5 ++
 52 files changed, 373 insertions(+), 398 deletions(-)

-- 
1.7.12.4


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-04 11:54 [PATCH 0/2] Fixed for 64bit LUNs Hannes Reinecke
@ 2014-07-04 11:54 ` Hannes Reinecke
  2014-07-04 13:44   ` Christoph Hellwig
  2014-07-04 19:44   ` Douglas Gilbert
  2014-07-04 11:54 ` [PATCH 2/2] ib_srp: 64bit LUN fixes Hannes Reinecke
  1 sibling, 2 replies; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-04 11:54 UTC (permalink / raw)
  To: James Bottomley; +Cc: Christoph Hellwig, linux-scsi, Hannes Reinecke

SCSI-2 defines only up to 256 LUNs with a flat namespace.
This patch introduces an accessor 'sdev_scsi2lun' which should be
used for these drivers to avoid problems when using 64-bit LUNs
internally.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 arch/ia64/hp/sim/simscsi.c          |  2 +-
 drivers/scsi/53c700.c               | 12 +++---
 drivers/scsi/BusLogic.c             |  2 +-
 drivers/scsi/NCR5380.c              | 32 +++++++-------
 drivers/scsi/NCR53c406a.c           |  2 +-
 drivers/scsi/a100u2w.c              |  4 +-
 drivers/scsi/advansys.c             | 16 +++----
 drivers/scsi/aha152x.c              | 13 +++---
 drivers/scsi/aha1542.c              |  4 +-
 drivers/scsi/aha1740.c              |  2 +-
 drivers/scsi/aic7xxx/aic79xx_osm.c  | 19 ++++----
 drivers/scsi/aic7xxx/aic79xx_proc.c |  2 +-
 drivers/scsi/aic7xxx/aic7xxx_osm.c  | 23 +++++-----
 drivers/scsi/aic7xxx/aic7xxx_proc.c |  2 +-
 drivers/scsi/arm/acornscsi.c        | 20 +++++----
 drivers/scsi/arm/fas216.c           | 15 ++++---
 drivers/scsi/arm/queue.c            |  8 ++--
 drivers/scsi/atari_NCR5380.c        | 81 ++++++++++++++++++----------------
 drivers/scsi/atp870u.c              |  2 +-
 drivers/scsi/bnx2fc/bnx2fc_io.c     |  4 +-
 drivers/scsi/ch.c                   | 16 +++----
 drivers/scsi/dc395x.c               | 73 +++++++++++++++----------------
 drivers/scsi/eata.c                 |  4 +-
 drivers/scsi/eata_pio.c             |  2 +-
 drivers/scsi/esp_scsi.c             |  6 +--
 drivers/scsi/g_NCR5380.c            |  2 +-
 drivers/scsi/gdth.c                 |  4 +-
 drivers/scsi/hptiop.c               |  6 +--
 drivers/scsi/in2000.c               | 36 +++++++++-------
 drivers/scsi/initio.c               |  4 +-
 drivers/scsi/megaraid.c             | 10 ++---
 drivers/scsi/mesh.c                 |  6 +--
 drivers/scsi/mvumi.c                |  2 +-
 drivers/scsi/ncr53c8xx.c            | 33 +++++++-------
 drivers/scsi/nsp32.c                | 14 +++---
 drivers/scsi/ps3rom.c               |  2 +-
 drivers/scsi/qlogicpti.c            |  6 +--
 drivers/scsi/scsi.c                 |  2 +-
 drivers/scsi/stex.c                 |  2 +-
 drivers/scsi/sun3_NCR5380.c         | 86 +++++++++++++++++++++----------------
 drivers/scsi/sym53c8xx_2/sym_glue.c | 19 ++++----
 drivers/scsi/sym53c8xx_2/sym_hipd.c | 10 ++---
 drivers/scsi/tmscsim.c              | 12 ++++--
 drivers/scsi/u14-34f.c              |  6 +--
 drivers/scsi/ufs/ufshcd.c           |  4 +-
 drivers/scsi/ultrastor.c            |  2 +-
 drivers/scsi/wd33c93.c              | 35 ++++++++-------
 drivers/scsi/wd7000.c               |  3 +-
 drivers/staging/rts5208/rtsx.c      |  4 +-
 include/scsi/scsi_device.h          |  5 +++
 50 files changed, 366 insertions(+), 315 deletions(-)

diff --git a/arch/ia64/hp/sim/simscsi.c b/arch/ia64/hp/sim/simscsi.c
index 3a428f1..3abd6fa 100644
--- a/arch/ia64/hp/sim/simscsi.c
+++ b/arch/ia64/hp/sim/simscsi.c
@@ -219,7 +219,7 @@ simscsi_queuecommand_lck (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)
 
 	sc->result = DID_BAD_TARGET << 16;
 	sc->scsi_done = done;
-	if (target_id <= 15 && sc->device->lun == 0) {
+	if (target_id <= 15 && sdev_scsi2lun(sc->device) == 0) {
 		switch (sc->cmnd[0]) {
 		      case INQUIRY:
 			if (scsi_bufflen(sc) < 35) {
diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c
index a3adfb4..d91811d 100644
--- a/drivers/scsi/53c700.c
+++ b/drivers/scsi/53c700.c
@@ -792,7 +792,7 @@ process_extended_message(struct Scsi_Host *host,
 
 	if(SCp != NULL) {
 		pun = SCp->device->id;
-		lun = SCp->device->lun;
+		lun = sdev_scsi2lun(SCp->device);
 	}
 
 	switch(hostdata->msgin[2]) {
@@ -875,7 +875,7 @@ process_message(struct Scsi_Host *host,	struct NCR_700_Host_Parameters *hostdata
 
 	if(SCp != NULL) {
 		pun = SCp->device->id;
-		lun = SCp->device->lun;
+		lun = sdev_scsi2lun(SCp->device);
 	}
 
 #ifdef NCR_700_DEBUG
@@ -962,7 +962,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
 
 	if(SCp != NULL) {
 		pun = SCp->device->id;
-		lun = SCp->device->lun;
+		lun = sdev_scsi2lun(SCp->device);
 	}
 
 	if(dsps == A_GOOD_STATUS_AFTER_STATUS) {
@@ -1005,7 +1005,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
 						 DMA_TO_DEVICE);
 
 				cmnd[0] = REQUEST_SENSE;
-				cmnd[1] = (SCp->device->lun & 0x7) << 5;
+				cmnd[1] = sdev_scsi2lun(SCp->device) << 5;
 				cmnd[2] = 0;
 				cmnd[3] = 0;
 				cmnd[4] = SCSI_SENSE_BUFFERSIZE;
@@ -1415,7 +1415,7 @@ NCR_700_start_command(struct scsi_cmnd *SCp)
 
 	hostdata->msgout[0] = NCR_700_identify((SCp->cmnd[0] != REQUEST_SENSE &&
 						slot->flags != NCR_700_FLAG_AUTOSENSE),
-					       SCp->device->lun);
+					       sdev_scsi2lun(SCp->device));
 	/* for INQUIRY or REQUEST_SENSE commands, we cannot be sure
 	 * if the negotiated transfer parameters still hold, so
 	 * always renegotiate them */
@@ -1528,7 +1528,7 @@ NCR_700_intr(int irq, void *dev_id)
 
 		if(SCp != NULL) {
 			pun = SCp->device->id;
-			lun = SCp->device->lun;
+			lun = sdev_scsi2lun(SCp->device);
 		}
 
 		if(sstat0 & SCSI_RESET_DETECTED) {
diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
index 972f817..6dd99b6 100644
--- a/drivers/scsi/BusLogic.c
+++ b/drivers/scsi/BusLogic.c
@@ -3032,7 +3032,7 @@ static int blogic_qcmd_lck(struct scsi_cmnd *command,
 	unsigned char *cdb = command->cmnd;
 	int cdblen = command->cmd_len;
 	int tgt_id = command->device->id;
-	int lun = command->device->lun;
+	int lun = sdev_scsi2lun(command->device);
 	int buflen = scsi_bufflen(command);
 	int count;
 	struct blogic_ccb *ccb;
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
index 2893d6a..4e5440d 100644
--- a/drivers/scsi/NCR5380.c
+++ b/drivers/scsi/NCR5380.c
@@ -762,7 +762,7 @@ static int __maybe_unused NCR5380_show_info(struct seq_file *m,
 
 static void lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, struct seq_file *m)
 {
-	SPRINTF("scsi%d : destination target %d, lun %d\n", cmd->device->host->host_no, cmd->device->id, (u8)cmd->device->lun);
+	SPRINTF("scsi%d : destination target %d, lun %d\n", cmd->device->host->host_no, cmd->device->id, sdev_scsi2lun(cmd->device));
 	SPRINTF("        command = ");
 	lprint_command(cmd->cmnd, m);
 }
@@ -1039,9 +1039,9 @@ static void NCR5380_main(struct work_struct *work)
 			for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble) 
 			{
 				if (prev != tmp)
-				    dprintk(NDEBUG_LISTS, "MAIN tmp=%p   target=%d   busy=%d lun=%d\n", tmp, tmp->device->id, hostdata->busy[tmp->device->id], (u8)tmp->device->lun);
+					dprintk(NDEBUG_LISTS, "MAIN tmp=%p   target=%d   busy=%d lun=%d\n", tmp, tmp->device->id, hostdata->busy[tmp->device->id], sdev_scsi2lun(tmp->device));
 				/*  When we find one, remove it from the issue queue. */
-				if (!(hostdata->busy[tmp->device->id] & (1 << tmp->device->lun))) {
+				if (!(hostdata->busy[tmp->device->id] & (1 << sdev_scsi2lun(tmp->device)))) {
 					if (prev) {
 						REMOVE(prev, prev->host_scribble, tmp, tmp->host_scribble);
 						prev->host_scribble = tmp->host_scribble;
@@ -1057,7 +1057,7 @@ static void NCR5380_main(struct work_struct *work)
 					 * On failure, we must add the command back to the
 					 *   issue queue so we can keep trying. 
 					 */
-					dprintk(NDEBUG_MAIN|NDEBUG_QUEUES, "scsi%d : main() : command for target %d lun %d removed from issue_queue\n", instance->host_no, tmp->device->id, (u8)tmp->device->lun);
+					dprintk(NDEBUG_MAIN|NDEBUG_QUEUES, "scsi%d : main() : command for target %d lun %d removed from issue_queue\n", instance->host_no, tmp->device->id, sdev_scsi2lun(tmp->device));
 	
 					/*
 					 * A successful selection is defined as one that 
@@ -1512,7 +1512,7 @@ part2:
 	}
 
 	dprintk(NDEBUG_SELECTION, "scsi%d : target %d selected, going into MESSAGE OUT phase.\n", instance->host_no, cmd->device->id);
-	tmp[0] = IDENTIFY(((instance->irq == SCSI_IRQ_NONE) ? 0 : 1), cmd->device->lun);
+	tmp[0] = IDENTIFY(((instance->irq == SCSI_IRQ_NONE) ? 0 : 1), sdev_scsi2lun(cmd->device));
 
 	len = 1;
 	cmd->tag = 0;
@@ -1524,7 +1524,7 @@ part2:
 	dprintk(NDEBUG_SELECTION, "scsi%d : nexus established.\n", instance->host_no);
 	/* XXX need to handle errors here */
 	hostdata->connected = cmd;
-	hostdata->busy[cmd->device->id] |= (1 << (cmd->device->lun & 0xFF));
+	hostdata->busy[cmd->device->id] |= (1 << sdev_scsi2lun(cmd->device));
 
 	initialize_SCp(cmd);
 
@@ -2210,14 +2210,14 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
 				case LINKED_FLG_CMD_COMPLETE:
 					/* Accept message by clearing ACK */
 					NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-					dprintk(NDEBUG_LINKED, "scsi%d : target %d lun %d linked command complete.\n", instance->host_no, cmd->device->id, (u8)cmd->device->lun);
+					dprintk(NDEBUG_LINKED, "scsi%d : target %d lun %d linked command complete.\n", instance->host_no, cmd->device->id, sdev_scsi2lun(cmd->device));
 					/* 
 					 * Sanity check : A linked command should only terminate with
 					 * one of these messages if there are more linked commands
 					 * available.
 					 */
 					if (!cmd->next_link) {
-					    printk("scsi%d : target %d lun %d linked command complete, no next_link\n" instance->host_no, cmd->device->id, (u8)cmd->device->lun);
+						printk("scsi%d : target %d lun %d linked command complete, no next_link\n" instance->host_no, cmd->device->id, sdev_scsi2lun(cmd->device));
 						sink = 1;
 						do_abort(instance);
 						return;
@@ -2226,7 +2226,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
 					/* The next command is still part of this process */
 					cmd->next_link->tag = cmd->tag;
 					cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);
-					dprintk(NDEBUG_LINKED, "scsi%d : target %d lun %d linked request done, calling scsi_done().\n", instance->host_no, cmd->device->id, (u8)cmd->device->lun);
+					dprintk(NDEBUG_LINKED, "scsi%d : target %d lun %d linked request done, calling scsi_done().\n", instance->host_no, cmd->device->id, sdev_scsi2lun(cmd->device));
 					collect_stats(hostdata, cmd);
 					cmd->scsi_done(cmd);
 					cmd = hostdata->connected;
@@ -2238,8 +2238,8 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
 					sink = 1;
 					NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 					hostdata->connected = NULL;
-					dprintk(NDEBUG_QUEUES, "scsi%d : command for target %d, lun %d completed\n", instance->host_no, cmd->device->id, (u8)cmd->device->lun);
-					hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xFF));
+					dprintk(NDEBUG_QUEUES, "scsi%d : command for target %d, lun %d completed\n", instance->host_no, cmd->device->id, sdev_scsi2lun(cmd->device));
+					hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 
 					/* 
 					 * I'm not sure what the correct thing to do here is : 
@@ -2304,7 +2304,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
 					case ORDERED_QUEUE_TAG:
 					case SIMPLE_QUEUE_TAG:
 						cmd->device->simple_tags = 0;
-						hostdata->busy[cmd->device->id] |= (1 << (cmd->device->lun & 0xFF));
+						hostdata->busy[cmd->device->id] |= (1 << sdev_scsi2lun(cmd->device));
 						break;
 					default:
 						break;
@@ -2318,7 +2318,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
 						    hostdata->disconnected_queue;
 						hostdata->connected = NULL;
 						hostdata->disconnected_queue = cmd;
-						dprintk(NDEBUG_QUEUES, "scsi%d : command for target %d lun %d was moved from connected to" "  the disconnected_queue\n", instance->host_no, cmd->device->id, (u8)cmd->device->lun);
+						dprintk(NDEBUG_QUEUES, "scsi%d : command for target %d lun %d was moved from connected to" "  the disconnected_queue\n", instance->host_no, cmd->device->id, sdev_scsi2lun(cmd->device));
 						/* 
 						 * Restore phase bits to 0 so an interrupted selection, 
 						 * arbitration can resume.
@@ -2426,7 +2426,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
 				hostdata->last_message = msgout;
 				NCR5380_transfer_pio(instance, &phase, &len, &data);
 				if (msgout == ABORT) {
-					hostdata->busy[cmd->device->id] &= ~(1 << (cmd->device->lun & 0xFF));
+					hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 					hostdata->connected = NULL;
 					cmd->result = DID_ERROR << 16;
 					collect_stats(hostdata, cmd);
@@ -2562,7 +2562,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) {
 
 
 		for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble)
-			if ((target_mask == (1 << tmp->device->id)) && (lun == (u8)tmp->device->lun)
+			if ((target_mask == (1 << tmp->device->id)) && (lun == sdev_scsi2lun(tmp->device))
 			    ) {
 				if (prev) {
 					REMOVE(prev, prev->host_scribble, tmp, tmp->host_scribble);
@@ -2588,7 +2588,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) {
 		do_abort(instance);
 	} else {
 		hostdata->connected = tmp;
-		dprintk(NDEBUG_RESELECTION, "scsi%d : nexus established, target = %d, lun = %d, tag = %d\n", instance->host_no, tmp->device->id, (u8)tmp->device->lun, tmp->tag);
+		dprintk(NDEBUG_RESELECTION, "scsi%d : nexus established, target = %d, lun = %d, tag = %d\n", instance->host_no, tmp->device->id, sdev_scsi2lun(tmp->device), tmp->tag);
 	}
 }
 
diff --git a/drivers/scsi/NCR53c406a.c b/drivers/scsi/NCR53c406a.c
index c91888a..1e44137 100644
--- a/drivers/scsi/NCR53c406a.c
+++ b/drivers/scsi/NCR53c406a.c
@@ -698,7 +698,7 @@ static int NCR53c406a_queue_lck(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
 	int i;
 
 	VDEB(printk("NCR53c406a_queue called\n"));
-	DEB(printk("cmd=%02x, cmd_len=%02x, target=%02x, lun=%02x, bufflen=%d\n", SCpnt->cmnd[0], SCpnt->cmd_len, SCpnt->target, SCpnt->lun, scsi_bufflen(SCpnt)));
+	DEB(printk("cmd=%02x, cmd_len=%02x, target=%02x, lun=%02x, bufflen=%d\n", SCpnt->cmnd[0], SCpnt->cmd_len, SCpnt->device->target, sdev_scsi2lun(SCpnt->device), scsi_bufflen(SCpnt)));
 
 #if 0
 	VDEB(for (i = 0; i < SCpnt->cmd_len; i++)
diff --git a/drivers/scsi/a100u2w.c b/drivers/scsi/a100u2w.c
index 0163457..fe0596b 100644
--- a/drivers/scsi/a100u2w.c
+++ b/drivers/scsi/a100u2w.c
@@ -855,7 +855,7 @@ static int inia100_build_scb(struct orc_host * host, struct orc_scb * scb, struc
 	scb->opcode = ORC_EXECSCSI;
 	scb->flags = SCF_NO_DCHK;	/* Clear done bit               */
 	scb->target = cmd->device->id;
-	scb->lun = cmd->device->lun;
+	scb->lun = sdev_scsi2lun(cmd->device);
 	scb->reserved0 = 0;
 	scb->reserved1 = 0;
 	scb->sg_len = cpu_to_le32(0);
@@ -891,7 +891,7 @@ static int inia100_build_scb(struct orc_host * host, struct orc_scb * scb, struc
 		printk("max cdb length= %x\b", cmd->cmd_len);
 		scb->cdb_len = IMAX_CDB;
 	}
-	scb->ident = cmd->device->lun | DISC_ALLOW;
+	scb->ident = sdev_scsi2lun(cmd->device) | DISC_ALLOW;
 	if (cmd->device->tagged_supported) {	/* Tag Support                  */
 		scb->tag_msg = SIMPLE_QUEUE_TAG;	/* Do simple tag only   */
 	} else {
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
index e716d0a..11a8ec5 100644
--- a/drivers/scsi/advansys.c
+++ b/drivers/scsi/advansys.c
@@ -7688,7 +7688,7 @@ advansys_narrow_slave_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc)
 	ASC_SCSI_BIT_ID_TYPE tid_bit = 1 << sdev->id;
 	ASC_SCSI_BIT_ID_TYPE orig_use_tagged_qng = asc_dvc->use_tagged_qng;
 
-	if (sdev->lun == 0) {
+	if (sdev_scsi2lun(sdev) == 0) {
 		ASC_SCSI_BIT_ID_TYPE orig_init_sdtr = asc_dvc->init_sdtr;
 		if ((asc_dvc->cfg->sdtr_enable & tid_bit) && sdev->sdtr) {
 			asc_dvc->init_sdtr |= tid_bit;
@@ -7702,7 +7702,7 @@ advansys_narrow_slave_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc)
 
 	if (sdev->tagged_supported) {
 		if (asc_dvc->cfg->cmd_qng_enabled & tid_bit) {
-			if (sdev->lun == 0) {
+			if (sdev_scsi2lun(sdev) == 0) {
 				asc_dvc->cfg->can_tagged_qng |= tid_bit;
 				asc_dvc->use_tagged_qng |= tid_bit;
 			}
@@ -7710,14 +7710,14 @@ advansys_narrow_slave_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc)
 						asc_dvc->max_dvc_qng[sdev->id]);
 		}
 	} else {
-		if (sdev->lun == 0) {
+		if (sdev_scsi2lun(sdev) == 0) {
 			asc_dvc->cfg->can_tagged_qng &= ~tid_bit;
 			asc_dvc->use_tagged_qng &= ~tid_bit;
 		}
 		scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
 	}
 
-	if ((sdev->lun == 0) &&
+	if ((sdev_scsi2lun(sdev) == 0) &&
 	    (orig_use_tagged_qng != asc_dvc->use_tagged_qng)) {
 		AscWriteLramByte(asc_dvc->iop_base, ASCV_DISC_ENABLE_B,
 				 asc_dvc->cfg->disc_enable);
@@ -7815,7 +7815,7 @@ advansys_wide_slave_configure(struct scsi_device *sdev, ADV_DVC_VAR *adv_dvc)
 	AdvPortAddr iop_base = adv_dvc->iop_base;
 	unsigned short tidmask = 1 << sdev->id;
 
-	if (sdev->lun == 0) {
+	if (sdev_scsi2lun(sdev) == 0) {
 		/*
 		 * Handle WDTR, SDTR, and Tag Queuing. If the feature
 		 * is enabled in the EEPROM and the device supports the
@@ -7907,9 +7907,9 @@ static int asc_build_req(struct asc_board *boardp, struct scsi_cmnd *scp,
 	asc_scsi_q->cdbptr = &scp->cmnd[0];
 	asc_scsi_q->q2.cdb_len = scp->cmd_len;
 	asc_scsi_q->q1.target_id = ASC_TID_TO_TARGET_ID(scp->device->id);
-	asc_scsi_q->q1.target_lun = scp->device->lun;
+	asc_scsi_q->q1.target_lun = sdev_scsi2lun(scp->device);
 	asc_scsi_q->q2.target_ix =
-	    ASC_TIDLUN_TO_IX(scp->device->id, scp->device->lun);
+		ASC_TIDLUN_TO_IX(scp->device->id, sdev_scsi2lun(scp->device));
 	asc_scsi_q->q1.sense_addr = advansys_get_sense_buffer_dma(scp);
 	asc_scsi_q->q1.sense_len = SCSI_SENSE_BUFFERSIZE;
 
@@ -8167,7 +8167,7 @@ adv_build_req(struct asc_board *boardp, struct scsi_cmnd *scp,
 	}
 
 	scsiqp->target_id = scp->device->id;
-	scsiqp->target_lun = scp->device->lun;
+	scsiqp->target_lun = sdev_scsi2lun(scp->device);
 
 	scsiqp->sense_addr = cpu_to_le32(virt_to_bus(&scp->sense_buffer[0]));
 	scsiqp->sense_len = SCSI_SENSE_BUFFERSIZE;
diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c
index e77b72f..b08fa37 100644
--- a/drivers/scsi/aha152x.c
+++ b/drivers/scsi/aha152x.c
@@ -321,7 +321,7 @@ static LIST_HEAD(aha152x_host_list);
 #define CMDINFO(cmd) \
 			(cmd) ? ((cmd)->device->host->host_no) : -1, \
                         (cmd) ? ((cmd)->device->id & 0x0f) : -1, \
-			(cmd) ? ((u8)(cmd)->device->lun & 0x07) : -1
+			(cmd) ? (sdev_scsi2lun((cmd)->device)) : -1
 
 static inline void
 CMD_INC_RESID(struct scsi_cmnd *cmd, int inc)
@@ -730,7 +730,8 @@ static inline Scsi_Cmnd *remove_lun_SC(Scsi_Cmnd ** SC, int target, int lun)
 	Scsi_Cmnd *ptr, *prev;
 
 	for (ptr = *SC, prev = NULL;
-	     ptr && ((ptr->device->id != target) || (ptr->device->lun != lun));
+	     ptr && ((ptr->device->id != target) ||
+		     sdev_scsi2lun(ptr->device) != lun));
 	     prev = ptr, ptr = SCNEXT(ptr))
 	     ;
 
@@ -1602,7 +1603,7 @@ static void busfree_run(struct Scsi_Host *shpnt)
 #if defined(AHA152X_DEBUG)
 			int hostno=DONE_SC->device->host->host_no;
 			int id=DONE_SC->device->id & 0xf;
-			int lun=((u8)DONE_SC->device->lun) & 0x7;
+			int lun=(sdev_scsi2lun(DONE_SC->device)) & 0x7;
 #endif
 			Scsi_Cmnd *ptr = DONE_SC;
 			DONE_SC=NULL;
@@ -1686,7 +1687,7 @@ static void seldo_run(struct Scsi_Host *shpnt)
 
 	SETPORT(SSTAT0, CLRSELDO);
 	
-	ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
+	ADDMSGO(IDENTIFY(RECONNECT, sdev_scsi2lun(CURRENT_SC->device)));
 
 	if (CURRENT_SC->SCp.phase & aborting) {
 		ADDMSGO(ABORT);
@@ -2001,7 +2002,7 @@ static void msgo_init(struct Scsi_Host *shpnt)
 {
 	if(MSGOLEN==0) {
 		if((CURRENT_SC->SCp.phase & syncneg) && SYNCNEG==2 && SYNCRATE==0) {
-			ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
+			ADDMSGO(IDENTIFY(RECONNECT, sdev_scsi2lun(CURRENT_SC->device)));
 		} else {
 			printk(INFO_LEAD "unexpected MESSAGE OUT phase; rejecting\n", CMDINFO(CURRENT_SC));
 			ADDMSGO(MESSAGE_REJECT);
@@ -2984,7 +2985,7 @@ static void get_command(struct seq_file *m, Scsi_Cmnd * ptr)
 	int i;
 
 	SPRINTF("%p: target=%d; lun=%d; cmnd=( ",
-		ptr, ptr->device->id, (u8)ptr->device->lun);
+		ptr, ptr->device->id, sdev_scsi2lun(ptr->device));
 
 	for (i = 0; i < COMMAND_SIZE(ptr->cmnd[0]); i++)
 		SPRINTF("0x%02x ", ptr->cmnd[i]);
diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c
index 770c48d..ae2bf2b 100644
--- a/drivers/scsi/aha1542.c
+++ b/drivers/scsi/aha1542.c
@@ -561,7 +561,7 @@ static int aha1542_queuecommand_lck(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *
 	unchar direction;
 	unchar *cmd = (unchar *) SCpnt->cmnd;
 	unchar target = SCpnt->device->id;
-	unchar lun = SCpnt->device->lun;
+	unchar lun = sdev_scsi2lun(SCpnt->device);
 	unsigned long flags;
 	int bufflen = scsi_bufflen(SCpnt);
 	int mbo;
@@ -1228,7 +1228,7 @@ static int aha1542_dev_reset(Scsi_Cmnd * SCpnt)
 	unsigned long flags;
 	struct mailbox *mb;
 	unchar target = SCpnt->device->id;
-	unchar lun = SCpnt->device->lun;
+	unchar lun = sdev_scsi2lun(SCpnt->device);
 	int mbo;
 	struct ccb *ccb;
 	unchar ahacmd = CMD_START_SCSI;
diff --git a/drivers/scsi/aha1740.c b/drivers/scsi/aha1740.c
index 5f31017..a1646b4 100644
--- a/drivers/scsi/aha1740.c
+++ b/drivers/scsi/aha1740.c
@@ -417,7 +417,7 @@ static int aha1740_queuecommand_lck(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *)
 		host->ecb[ecbno].datalen = 0;
 		host->ecb[ecbno].dataptr = 0;
 	}
-	host->ecb[ecbno].lun = SCpnt->device->lun;
+	host->ecb[ecbno].lun = sdev_scsi2lun(SCpnt->device);
 	host->ecb[ecbno].ses = 1; /* Suppress underrun errors */
 	host->ecb[ecbno].dir = direction;
 	host->ecb[ecbno].ars = 1; /* Yes, get the sense on an error */
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c
index ed333669..5611d4d 100644
--- a/drivers/scsi/aic7xxx/aic79xx_osm.c
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.c
@@ -838,7 +838,7 @@ ahd_linux_dev_reset(struct scsi_cmnd *cmd)
 	reset_scb->platform_data->xfer_len = 0;
 	reset_scb->hscb->control = 0;
 	reset_scb->hscb->scsiid = BUILD_SCSIID(ahd,cmd);
-	reset_scb->hscb->lun = cmd->device->lun;
+	reset_scb->hscb->lun = sdev_scsi2lun(cmd->device);
 	reset_scb->hscb->cdb_len = 0;
 	reset_scb->hscb->task_management = SIU_TASKMGMT_LUN_RESET;
 	reset_scb->flags |= SCB_DEVICE_RESET|SCB_RECOVERY_SCB|SCB_ACTIVE;
@@ -1537,7 +1537,7 @@ ahd_linux_device_queue_depth(struct scsi_device *sdev)
 
 	ahd_compile_devinfo(&devinfo,
 			    ahd->our_id,
-			    sdev->sdev_target->id, sdev->lun,
+			    sdev->sdev_target->id, sdev_scsi2lun(sdev),
 			    sdev->sdev_target->channel == 0 ? 'A' : 'B',
 			    ROLE_INITIATOR);
 	tags = ahd_linux_user_tagdepth(ahd, &devinfo);
@@ -1584,7 +1584,7 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev,
 		col_idx = AHD_NEVER_COL_IDX;
 	} else {
 		col_idx = AHD_BUILD_COL_IDX(cmd->device->id,
-					    cmd->device->lun);
+					    sdev_scsi2lun(cmd->device));
 	}
 	if ((scb = ahd_get_scb(ahd, col_idx)) == NULL) {
 		ahd->flags |= AHD_RESOURCE_SHORTAGE;
@@ -1603,7 +1603,7 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev,
 	 */
 	hscb->control = 0;
 	hscb->scsiid = BUILD_SCSIID(ahd, cmd);
-	hscb->lun = cmd->device->lun;
+	hscb->lun = sdev_scsi2lun(cmd->device);
 	scb->hscb->task_management = 0;
 	mask = SCB_GET_TARGET_MASK(ahd, scb);
 
@@ -1900,7 +1900,7 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd,
 
 	ahd_compile_devinfo(&devinfo,
 			    ahd->our_id,
-			    sdev->sdev_target->id, sdev->lun,
+			    sdev->sdev_target->id, sdev_scsi2lun(sdev),
 			    sdev->sdev_target->channel == 0 ? 'A' : 'B',
 			    ROLE_INITIATOR);
 	
@@ -2137,7 +2137,7 @@ ahd_linux_queue_cmd_complete(struct ahd_softc *ahd, struct scsi_cmnd *cmd)
 	if (do_fallback) {
 		printk("%s: device overrun (status %x) on %d:%d:%d\n",
 		       ahd_name(ahd), status, cmd->device->channel,
-		       cmd->device->id, (u8)cmd->device->lun);
+		       cmd->device->id, sdev_scsi2lun(cmd->device));
 	}
 
 	ahd_cmd_set_transaction_status(cmd, new_status);
@@ -2253,13 +2253,13 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd)
 	disconnected = TRUE;
 	if (ahd_search_qinfifo(ahd, cmd->device->id, 
 			       cmd->device->channel + 'A',
-			       cmd->device->lun,
+			       sdev_scsi2lun(cmd->device),
 			       pending_scb->hscb->tag,
 			       ROLE_INITIATOR, CAM_REQ_ABORTED,
 			       SEARCH_COMPLETE) > 0) {
 		printk("%s:%d:%d:%d: Cmd aborted from QINFIFO\n",
 		       ahd_name(ahd), cmd->device->channel, 
-		       cmd->device->id, (u8)cmd->device->lun);
+		       cmd->device->id, sdev_scsi2lun(cmd->device));
 		retval = SUCCESS;
 		goto done;
 	}
@@ -2346,7 +2346,8 @@ ahd_linux_queue_abort_cmd(struct scsi_cmnd *cmd)
 		 * to run.
 		 */
 		ahd_search_qinfifo(ahd, cmd->device->id,
-				   cmd->device->channel + 'A', cmd->device->lun,
+				   cmd->device->channel + 'A',
+				   sdev_scsi2lun(cmd->device),
 				   SCB_LIST_NULL, ROLE_INITIATOR,
 				   CAM_REQUEUE_REQ, SEARCH_COMPLETE);
 		ahd_qinfifo_requeue_tail(ahd, pending_scb);
diff --git a/drivers/scsi/aic7xxx/aic79xx_proc.c b/drivers/scsi/aic7xxx/aic79xx_proc.c
index 27dbfcc..2e1f92e 100644
--- a/drivers/scsi/aic7xxx/aic79xx_proc.c
+++ b/drivers/scsi/aic7xxx/aic79xx_proc.c
@@ -197,7 +197,7 @@ ahd_dump_device_state(struct seq_file *m, struct scsi_device *sdev)
 
 	seq_printf(m, "\tChannel %c Target %d Lun %d Settings\n",
 		  sdev->sdev_target->channel + 'A',
-		   sdev->sdev_target->id, (u8)sdev->lun);
+		   sdev->sdev_target->id, sdev_scsi2lun(sdev));
 
 	seq_printf(m, "\t\tCommands Queued %ld\n", dev->commands_issued);
 	seq_printf(m, "\t\tCommands Active %d\n", dev->active);
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c
index d2c9bf3..1232e69 100644
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c
@@ -1404,7 +1404,7 @@ ahc_linux_device_queue_depth(struct scsi_device *sdev)
 	ahc_compile_devinfo(&devinfo,
 			    sdev->sdev_target->channel == 0
 			  ? ahc->our_id : ahc->our_id_b,
-			    sdev->sdev_target->id, sdev->lun,
+			    sdev->sdev_target->id, sdev_scsi2lun(sdev),
 			    sdev->sdev_target->channel == 0 ? 'A' : 'B',
 			    ROLE_INITIATOR);
 	tags = ahc_linux_user_tagdepth(ahc, &devinfo);
@@ -1482,7 +1482,7 @@ ahc_linux_run_command(struct ahc_softc *ahc, struct ahc_linux_device *dev,
 	 */
 	hscb->control = 0;
 	hscb->scsiid = BUILD_SCSIID(ahc, cmd);
-	hscb->lun = cmd->device->lun;
+	hscb->lun = sdev_scsi2lun(cmd->device);
 	mask = SCB_GET_TARGET_MASK(ahc, scb);
 	tinfo = ahc_fetch_transinfo(ahc, SCB_GET_CHANNEL(ahc, scb),
 				    SCB_GET_OUR_ID(scb),
@@ -1830,7 +1830,7 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
 
 	ahc_compile_devinfo(&devinfo,
 			    ahc->our_id,
-			    sdev->sdev_target->id, sdev->lun,
+			    sdev->sdev_target->id, sdev_scsi2lun(sdev),
 			    sdev->sdev_target->channel == 0 ? 'A' : 'B',
 			    ROLE_INITIATOR);
 	
@@ -2110,7 +2110,7 @@ ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
 		 */
 		printk("%s:%d:%d:%d: Is not an active device\n",
 		       ahc_name(ahc), cmd->device->channel, cmd->device->id,
-		       (u8)cmd->device->lun);
+		       sdev_scsi2lun(cmd->device));
 		retval = SUCCESS;
 		goto no_cmd;
 	}
@@ -2118,11 +2118,11 @@ ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
 	if ((dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED)) == 0
 	 && ahc_search_untagged_queues(ahc, cmd, cmd->device->id,
 				       cmd->device->channel + 'A',
-				       (u8)cmd->device->lun,
+				       sdev_scsi2lun(cmd->device),
 				       CAM_REQ_ABORTED, SEARCH_COMPLETE) != 0) {
 		printk("%s:%d:%d:%d: Command found on untagged queue\n",
 		       ahc_name(ahc), cmd->device->channel, cmd->device->id,
-		       (u8)cmd->device->lun);
+		       sdev_scsi2lun(cmd->device));
 		retval = SUCCESS;
 		goto done;
 	}
@@ -2182,19 +2182,19 @@ ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
 	if (flag == SCB_ABORT) {
 		if (ahc_search_qinfifo(ahc, cmd->device->id,
 				       cmd->device->channel + 'A',
-				       cmd->device->lun,
+				       sdev_scsi2lun(cmd->device),
 				       pending_scb->hscb->tag,
 				       ROLE_INITIATOR, CAM_REQ_ABORTED,
 				       SEARCH_COMPLETE) > 0) {
 			printk("%s:%d:%d:%d: Cmd aborted from QINFIFO\n",
 			       ahc_name(ahc), cmd->device->channel,
-			       cmd->device->id, (u8)cmd->device->lun);
+			       cmd->device->id, sdev_scsi2lun(cmd->device));
 			retval = SUCCESS;
 			goto done;
 		}
 	} else if (ahc_search_qinfifo(ahc, cmd->device->id,
 				      cmd->device->channel + 'A',
-				      cmd->device->lun,
+				      sdev_scsi2lun(cmd->device),
 				      pending_scb->hscb->tag,
 				      ROLE_INITIATOR, /*status*/0,
 				      SEARCH_COUNT) > 0) {
@@ -2270,7 +2270,8 @@ ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
 		 */
 		ahc_search_disc_list(ahc, cmd->device->id,
 				     cmd->device->channel + 'A',
-				     cmd->device->lun, pending_scb->hscb->tag,
+				     sdev_scsi2lun(cmd->device),
+				     pending_scb->hscb->tag,
 				     /*stop_on_first*/TRUE,
 				     /*remove*/TRUE,
 				     /*save_state*/FALSE);
@@ -2295,7 +2296,7 @@ ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag)
 		 */
 		ahc_search_qinfifo(ahc, cmd->device->id,
 				   cmd->device->channel + 'A',
-				   cmd->device->lun, SCB_LIST_NULL,
+				   sdev_scsi2lun(cmd->device), SCB_LIST_NULL,
 				   ROLE_INITIATOR, CAM_REQUEUE_REQ,
 				   SEARCH_COMPLETE);
 		ahc_qinfifo_requeue_tail(ahc, pending_scb);
diff --git a/drivers/scsi/aic7xxx/aic7xxx_proc.c b/drivers/scsi/aic7xxx/aic7xxx_proc.c
index 64eec6c..e7787c6 100644
--- a/drivers/scsi/aic7xxx/aic7xxx_proc.c
+++ b/drivers/scsi/aic7xxx/aic7xxx_proc.c
@@ -175,7 +175,7 @@ ahc_dump_device_state(struct seq_file *m, struct scsi_device *sdev)
 
 	seq_printf(m, "\tChannel %c Target %d Lun %d Settings\n",
 		  sdev->sdev_target->channel + 'A',
-		   sdev->sdev_target->id, (u8)sdev->lun);
+		   sdev->sdev_target->id, sdev_scsi2lun(sdev));
 
 	seq_printf(m, "\t\tCommands Queued %ld\n", dev->commands_issued);
 	seq_printf(m, "\t\tCommands Active %d\n", dev->active);
diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c
index 2e797a3..e0336e7 100644
--- a/drivers/scsi/arm/acornscsi.c
+++ b/drivers/scsi/arm/acornscsi.c
@@ -760,7 +760,8 @@ intr_ret_t acornscsi_kick(AS_Host *host)
 	    SCpnt->tag = SCpnt->device->current_tag;
 	} else
 #endif
-	    set_bit(SCpnt->device->id * 8 + SCpnt->device->lun, host->busyluns);
+		set_bit(SCpnt->device->id * 8 + sdev_scsi2lun(SCpnt->device),
+			host->busyluns);
 
 	host->stats.removes += 1;
 
@@ -863,7 +864,8 @@ static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp,
 	if (!SCpnt->scsi_done)
 	    panic("scsi%d.H: null scsi_done function in acornscsi_done", host->host->host_no);
 
-	clear_bit(SCpnt->device->id * 8 + SCpnt->device->lun, host->busyluns);
+	clear_bit(SCpnt->device->id * 8 + sdev_scsi2lun(SCpnt->device),
+		  host->busyluns);
 
 	SCpnt->scsi_done(SCpnt);
     } else
@@ -1576,7 +1578,7 @@ void acornscsi_message(AS_Host *host)
 	    printk(KERN_NOTICE "scsi%d.%c: disabling tagged queueing\n",
 		    host->host->host_no, acornscsi_target(host));
 	    host->SCpnt->device->simple_tags = 0;
-	    set_bit(host->SCpnt->device->id * 8 + host->SCpnt->device->lun, host->busyluns);
+	    set_bit(host->SCpnt->device->id * 8 + sdev_scsi2lun(host->SCpnt->device), host->busyluns);
 	    break;
 #endif
 	case EXTENDED_MESSAGE | (EXTENDED_SDTR << 8):
@@ -1688,7 +1690,7 @@ void acornscsi_buildmessages(AS_Host *host)
 
     msgqueue_addmsg(&host->scsi.msgs, 1,
 		     IDENTIFY(host->device[host->SCpnt->device->id].disconnect_ok,
-			     host->SCpnt->device->lun));
+			      sdev_scsi2lun(host->SCpnt->device)));
 
 #if 0
     /* does the device need the current command aborted */
@@ -1788,7 +1790,8 @@ int acornscsi_reconnect(AS_Host *host)
     host->scsi.reconnected.tag = 0;
 
     if (host->scsi.disconnectable && host->SCpnt &&
-	host->SCpnt->device->id == target && host->SCpnt->device->lun == lun)
+	host->SCpnt->device->id == target &&
+	sdev_scsi2lun(host->SCpnt->device) == lun)
 	ok = 1;
 
     if (!ok && queue_probetgtlun(&host->queues.disconnected, target, lun))
@@ -1826,7 +1829,7 @@ int acornscsi_reconnect_finish(AS_Host *host)
     if (host->scsi.disconnectable && host->SCpnt) {
 	host->scsi.disconnectable = 0;
 	if (host->SCpnt->device->id  == host->scsi.reconnected.target &&
-	    host->SCpnt->device->lun == host->scsi.reconnected.lun &&
+	    sdev_scsi2lun(host->SCpnt->device) == host->scsi.reconnected.lun &&
 	    host->SCpnt->tag         == host->scsi.reconnected.tag) {
 #if (DEBUG & (DEBUG_QUEUES|DEBUG_DISCON))
 	    DBG(host->SCpnt, printk("scsi%d.%c: reconnected",
@@ -2671,7 +2674,8 @@ int acornscsi_abort(struct scsi_cmnd *SCpnt)
 //#if (DEBUG & DEBUG_ABORT)
 		printk("clear ");
 //#endif
-		clear_bit(SCpnt->device->id * 8 + SCpnt->device->lun, host->busyluns);
+		clear_bit(SCpnt->device->id * 8 + sdev_scsi2lun(SCpnt->device),
+			  host->busyluns);
 
 	/*
 	 * We found the command, and cleared it out.  Either
@@ -2853,7 +2857,7 @@ static int acornscsi_show_info(struct seq_file *m, struct Scsi_Host *instance)
 
     shost_for_each_device(scd, instance) {
 	seq_printf(m, "Device/Lun TaggedQ      Sync\n");
-	seq_printf(m, "     %d/%d   ", scd->id, scd->lun);
+	seq_printf(m, "     %d/%d   ", scd->id, sdev_scsi2lun(scd));
 	if (scd->tagged_supported)
 		seq_printf(m, "%3sabled(%3d) ",
 			     scd->simple_tags ? "en" : "dis",
diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c
index b46a6f6..2dd52e7 100644
--- a/drivers/scsi/arm/fas216.c
+++ b/drivers/scsi/arm/fas216.c
@@ -989,7 +989,7 @@ fas216_reselected_intr(FAS216_Info *info)
 	if (info->scsi.disconnectable && info->SCpnt) {
 		info->scsi.disconnectable = 0;
 		if (info->SCpnt->device->id  == target &&
-		    info->SCpnt->device->lun == lun &&
+		    sdev_scsi2lun(info->SCpnt->device) == lun &&
 		    info->SCpnt->tag         == tag) {
 			fas216_log(info, LOG_CONNECT, "reconnected previously executing command");
 		} else {
@@ -1780,7 +1780,8 @@ static void fas216_start_command(FAS216_Info *info, struct scsi_cmnd *SCpnt)
 	 * build outgoing message bytes
 	 */
 	msgqueue_flush(&info->scsi.msgs);
-	msgqueue_addmsg(&info->scsi.msgs, 1, IDENTIFY(disconnect_ok, SCpnt->device->lun));
+	msgqueue_addmsg(&info->scsi.msgs, 1,
+			IDENTIFY(disconnect_ok, sdev_scsi2lun(SCpnt->device)));
 
 	/*
 	 * add tag message if required
@@ -1821,7 +1822,8 @@ static void fas216_allocate_tag(FAS216_Info *info, struct scsi_cmnd *SCpnt)
 			SCpnt->tag = SCpnt->device->current_tag;
 	} else
 #endif
-		set_bit(SCpnt->device->id * 8 + SCpnt->device->lun, info->busyluns);
+		set_bit(SCpnt->device->id * 8 + sdev_scsi2lun(SCpnt->device),
+			info->busyluns);
 
 	info->stats.removes += 1;
 	switch (SCpnt->cmnd[0]) {
@@ -2171,7 +2173,7 @@ static void fas216_done(FAS216_Info *info, unsigned int result)
 	 * status.
 	 */
 	info->device[SCpnt->device->id].parity_check = 0;
-	clear_bit(SCpnt->device->id * 8 + SCpnt->device->lun, info->busyluns);
+	clear_bit(SCpnt->device->id * 8 + sdev_scsi2lun(SCpnt->device), info->busyluns);
 
 	fn = (void (*)(FAS216_Info *, struct scsi_cmnd *, unsigned int))SCpnt->host_scribble;
 	fn(info, SCpnt, result);
@@ -2398,7 +2400,8 @@ static enum res_find fas216_find_command(FAS216_Info *info,
 		 * been set.
 		 */
 		info->origSCpnt = NULL;
-		clear_bit(SCpnt->device->id * 8 + SCpnt->device->lun, info->busyluns);
+		clear_bit(SCpnt->device->id * 8 + sdev_scsi2lun(SCpnt->device),
+			  info->busyluns);
 		printk("waiting for execution ");
 		res = res_success;
 	} else
@@ -3000,7 +3003,7 @@ void fas216_print_devices(FAS216_Info *info, struct seq_file *m)
 
 	shost_for_each_device(scd, info->host) {
 		dev = &info->device[scd->id];
-		seq_printf(m, "     %d/%d   ", scd->id, scd->lun);
+		seq_printf(m, "     %d/%d   ", scd->id, sdev_scsi2lun(scd));
 		if (scd->tagged_supported)
 			seq_printf(m, "%3sabled(%3d) ",
 				     scd->simple_tags ? "en" : "dis",
diff --git a/drivers/scsi/arm/queue.c b/drivers/scsi/arm/queue.c
index cb11cce..d62b48e 100644
--- a/drivers/scsi/arm/queue.c
+++ b/drivers/scsi/arm/queue.c
@@ -167,7 +167,7 @@ struct scsi_cmnd *queue_remove_exclude(Queue_t *queue, unsigned long *exclude)
 	spin_lock_irqsave(&queue->queue_lock, flags);
 	list_for_each(l, &queue->head) {
 		QE_t *q = list_entry(l, QE_t, list);
-		if (!test_bit(q->SCpnt->device->id * 8 + q->SCpnt->device->lun, exclude)) {
+		if (!test_bit(q->SCpnt->device->id * 8 + sdev_scsi2lun(q->SCpnt->device), exclude)) {
 			SCpnt = __queue_remove(queue, l);
 			break;
 		}
@@ -215,7 +215,8 @@ struct scsi_cmnd *queue_remove_tgtluntag(Queue_t *queue, int target, int lun,
 	spin_lock_irqsave(&queue->queue_lock, flags);
 	list_for_each(l, &queue->head) {
 		QE_t *q = list_entry(l, QE_t, list);
-		if (q->SCpnt->device->id == target && q->SCpnt->device->lun == lun &&
+		if (q->SCpnt->device->id == target &&
+		    sdev_scsi2lun(q->SCpnt->device) == lun &&
 		    q->SCpnt->tag == tag) {
 			SCpnt = __queue_remove(queue, l);
 			break;
@@ -265,7 +266,8 @@ int queue_probetgtlun (Queue_t *queue, int target, int lun)
 	spin_lock_irqsave(&queue->queue_lock, flags);
 	list_for_each(l, &queue->head) {
 		QE_t *q = list_entry(l, QE_t, list);
-		if (q->SCpnt->device->id == target && q->SCpnt->device->lun == lun) {
+		if (q->SCpnt->device->id == target &&
+		    sdev_scsi2lun(q->SCpnt->device) == lun) {
 			found = 1;
 			break;
 		}
diff --git a/drivers/scsi/atari_NCR5380.c b/drivers/scsi/atari_NCR5380.c
index 1814aa2..0542bfd 100644
--- a/drivers/scsi/atari_NCR5380.c
+++ b/drivers/scsi/atari_NCR5380.c
@@ -361,17 +361,18 @@ static void __init init_tags(void)
 
 static int is_lun_busy(Scsi_Cmnd *cmd, int should_be_tagged)
 {
+	u8 lun = sdev_scsi2lun(cmd->device);
 	SETUP_HOSTDATA(cmd->device->host);
 
-	if (hostdata->busy[cmd->device->id] & (1 << cmd->device->lun))
+	if (hostdata->busy[cmd->device->id] & (1 << lun))
 		return 1;
 	if (!should_be_tagged ||
 	    !setup_use_tagged_queuing || !cmd->device->tagged_supported)
 		return 0;
-	if (TagAlloc[cmd->device->id][cmd->device->lun].nr_allocated >=
-	    TagAlloc[cmd->device->id][cmd->device->lun].queue_size) {
+	if (TagAlloc[cmd->device->id][lun].nr_allocated >=
+	    TagAlloc[cmd->device->id][lun].queue_size) {
 		dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d: no free tags\n",
-			   H_NO(cmd), cmd->device->id, cmd->device->lun);
+			   H_NO(cmd), cmd->device->id, lun);
 		return 1;
 	}
 	return 0;
@@ -385,6 +386,7 @@ static int is_lun_busy(Scsi_Cmnd *cmd, int should_be_tagged)
 
 static void cmd_get_tag(Scsi_Cmnd *cmd, int should_be_tagged)
 {
+	u8 lun = sdev_scsi2lun(cmd->device);
 	SETUP_HOSTDATA(cmd->device->host);
 
 	/* If we or the target don't support tagged queuing, allocate the LUN for
@@ -393,11 +395,11 @@ static void cmd_get_tag(Scsi_Cmnd *cmd, int should_be_tagged)
 	if (!should_be_tagged ||
 	    !setup_use_tagged_queuing || !cmd->device->tagged_supported) {
 		cmd->tag = TAG_NONE;
-		hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
+		hostdata->busy[cmd->device->id] |= (1 << lun);
 		dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d now allocated by untagged "
-			   "command\n", H_NO(cmd), cmd->device->id, cmd->device->lun);
+			   "command\n", H_NO(cmd), cmd->device->id, lun);
 	} else {
-		TAG_ALLOC *ta = &TagAlloc[cmd->device->id][cmd->device->lun];
+		TAG_ALLOC *ta = &TagAlloc[cmd->device->id][lun];
 
 		cmd->tag = find_first_zero_bit(ta->allocated, MAX_TAGS);
 		set_bit(cmd->tag, ta->allocated);
@@ -405,7 +407,7 @@ static void cmd_get_tag(Scsi_Cmnd *cmd, int should_be_tagged)
 		dprintk(NDEBUG_TAGS, "scsi%d: using tag %d for target %d lun %d "
 			   "(now %d tags in use)\n",
 			   H_NO(cmd), cmd->tag, cmd->device->id,
-			   cmd->device->lun, ta->nr_allocated);
+			   lun, ta->nr_allocated);
 	}
 }
 
@@ -416,21 +418,22 @@ static void cmd_get_tag(Scsi_Cmnd *cmd, int should_be_tagged)
 
 static void cmd_free_tag(Scsi_Cmnd *cmd)
 {
+	u8 lun = sdev_scsi2lun(cmd->device);
 	SETUP_HOSTDATA(cmd->device->host);
 
 	if (cmd->tag == TAG_NONE) {
-		hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+		hostdata->busy[cmd->device->id] &= ~(1 << lun);
 		dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d untagged cmd finished\n",
-			   H_NO(cmd), cmd->device->id, cmd->device->lun);
+			   H_NO(cmd), cmd->device->id, lun);
 	} else if (cmd->tag >= MAX_TAGS) {
 		printk(KERN_NOTICE "scsi%d: trying to free bad tag %d!\n",
 		       H_NO(cmd), cmd->tag);
 	} else {
-		TAG_ALLOC *ta = &TagAlloc[cmd->device->id][cmd->device->lun];
+		TAG_ALLOC *ta = &TagAlloc[cmd->device->id][lun];
 		clear_bit(cmd->tag, ta->allocated);
 		ta->nr_allocated--;
 		dprintk(NDEBUG_TAGS, "scsi%d: freed tag %d for target %d lun %d\n",
-			   H_NO(cmd), cmd->tag, cmd->device->id, cmd->device->lun);
+			   H_NO(cmd), cmd->tag, cmd->device->id, lun);
 	}
 }
 
@@ -714,7 +717,7 @@ static void lprint_Scsi_Cmnd(Scsi_Cmnd *cmd)
 	int i, s;
 	unsigned char *command;
 	printk("scsi%d: destination target %d, lun %d\n",
-		H_NO(cmd), cmd->device->id, cmd->device->lun);
+	       H_NO(cmd), cmd->device->id, sdev_scsi2lun(cmd->device));
 	printk(KERN_CONT "        command = ");
 	command = cmd->cmnd;
 	printk(KERN_CONT "%2d (0x%02x)", command[0], command[0]);
@@ -760,7 +763,7 @@ static void show_Scsi_Cmnd(Scsi_Cmnd *cmd, struct seq_file *m)
 	int i, s;
 	unsigned char *command;
 	seq_printf(m, "scsi%d: destination target %d, lun %d\n",
-		H_NO(cmd), cmd->device->id, cmd->device->lun);
+		   H_NO(cmd), cmd->device->id, sdev_scsi2lun(cmd->device));
 	seq_printf(m, "        command = ");
 	command = cmd->cmnd;
 	seq_printf(m, "%2d (0x%02x)", command[0], command[0]);
@@ -1065,7 +1068,7 @@ static void NCR5380_main(struct work_struct *work)
 				if (prev != tmp)
 					printk("MAIN tmp=%p   target=%d   busy=%d lun=%d\n",
 					       tmp, tmp->device->id, hostdata->busy[tmp->device->id],
-					       tmp->device->lun);
+					       sdev_scsi2lun(tmp->device));
 #endif
 				/*  When we find one, remove it from the issue queue. */
 				/* ++guenther: possible race with Falcon locking */
@@ -1073,7 +1076,7 @@ static void NCR5380_main(struct work_struct *work)
 #ifdef SUPPORT_TAGS
 				    !is_lun_busy( tmp, tmp->cmnd[0] != REQUEST_SENSE)
 #else
-				    !(hostdata->busy[tmp->device->id] & (1 << tmp->device->lun))
+				    !(hostdata->busy[tmp->device->id] & (1 << sdev_scsi2lun(tmp->device)))
 #endif
 				    ) {
 					/* ++guenther: just to be sure, this must be atomic */
@@ -1098,8 +1101,8 @@ static void NCR5380_main(struct work_struct *work)
 					 *   issue queue so we can keep trying.
 					 */
 					dprintk(NDEBUG_MAIN, "scsi%d: main(): command for target %d "
-						    "lun %d removed from issue_queue\n",
-						    HOSTNO, tmp->device->id, tmp->device->lun);
+						"lun %d removed from issue_queue\n",
+						HOSTNO, tmp->device->id, sdev_scsi2lun(tmp->device));
 					/*
 					 * REQUEST SENSE commands are issued without tagged
 					 * queueing, even on SCSI-II devices because the
@@ -1648,7 +1651,7 @@ static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd, int tag)
 
 	dprintk(NDEBUG_SELECTION, "scsi%d: target %d selected, going into MESSAGE OUT phase.\n",
 		   HOSTNO, cmd->device->id);
-	tmp[0] = IDENTIFY(1, cmd->device->lun);
+	tmp[0] = IDENTIFY(1, sdev_scsi2lun(cmd->device));
 
 #ifdef SUPPORT_TAGS
 	if (cmd->tag != TAG_NONE) {
@@ -1670,7 +1673,7 @@ static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd, int tag)
 	/* XXX need to handle errors here */
 	hostdata->connected = cmd;
 #ifndef SUPPORT_TAGS
-	hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
+	hostdata->busy[cmd->device->id] |= (1 << sdev_scsi2lun(cmd->device));
 #endif
 
 	initialize_SCp(cmd);
@@ -1979,6 +1982,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 	unsigned char *data;
 	unsigned char phase, tmp, extended_msg[10], old_phase = 0xff;
 	Scsi_Cmnd *cmd = (Scsi_Cmnd *) hostdata->connected;
+	u8 lun = sdev_scsi2lun(cmd->device);
 
 	while (1) {
 		tmp = NCR5380_read(STATUS_REG);
@@ -2062,7 +2066,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 						 * polled-IO. */
 						printk(KERN_NOTICE "scsi%d: switching target %d "
 							   "lun %d to slow handshake\n", HOSTNO,
-							   cmd->device->id, cmd->device->lun);
+						           cmd->device->id, lun);
 						cmd->device->borken = 1;
 						NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
 							ICR_ASSERT_ATN);
@@ -2114,7 +2118,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 					NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 
 					dprintk(NDEBUG_LINKED, "scsi%d: target %d lun %d linked command "
-						   "complete.\n", HOSTNO, cmd->device->id, cmd->device->lun);
+						   "complete.\n", HOSTNO, cmd->device->id, lun);
 
 					/* Enable reselect interrupts */
 					NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
@@ -2127,7 +2131,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 					if (!cmd->next_link) {
 						 printk(KERN_NOTICE "scsi%d: target %d lun %d "
 							"linked command complete, no next_link\n",
-							HOSTNO, cmd->device->id, cmd->device->lun);
+							HOSTNO, cmd->device->id, lun);
 						sink = 1;
 						do_abort(instance);
 						return;
@@ -2140,7 +2144,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 					cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);
 					dprintk(NDEBUG_LINKED, "scsi%d: target %d lun %d linked request "
 						   "done, calling scsi_done().\n",
-						   HOSTNO, cmd->device->id, cmd->device->lun);
+						   HOSTNO, cmd->device->id, lun);
 #ifdef NCR5380_STATS
 					collect_stats(hostdata, cmd);
 #endif
@@ -2156,7 +2160,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 					falcon_dont_release++;
 					hostdata->connected = NULL;
 					dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d, lun %d "
-						  "completed\n", HOSTNO, cmd->device->id, cmd->device->lun);
+						  "completed\n", HOSTNO, cmd->device->id, lun);
 #ifdef SUPPORT_TAGS
 					cmd_free_tag(cmd);
 					if (status_byte(cmd->SCp.Status) == QUEUE_FULL) {
@@ -2168,16 +2172,16 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 						 */
 						/* ++Andreas: the mid level code knows about
 						   QUEUE_FULL now. */
-						TAG_ALLOC *ta = &TagAlloc[cmd->device->id][cmd->device->lun];
+						TAG_ALLOC *ta = &TagAlloc[cmd->device->id][lun];
 						dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d returned "
 							   "QUEUE_FULL after %d commands\n",
-							   HOSTNO, cmd->device->id, cmd->device->lun,
+							   HOSTNO, cmd->device->id, lun,
 							   ta->nr_allocated);
 						if (ta->queue_size > ta->nr_allocated)
 							ta->nr_allocated = ta->queue_size;
 					}
 #else
-					hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+					hostdata->busy[cmd->device->id] &= ~(1 << lun);
 #endif
 					/* Enable reselect interrupts */
 					NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
@@ -2265,12 +2269,12 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 						 * the command is treated as untagged further on.
 						 */
 						cmd->device->tagged_supported = 0;
-						hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
+						hostdata->busy[cmd->device->id] |= (1 << lun);
 						cmd->tag = TAG_NONE;
 						dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d rejected "
 							   "QUEUE_TAG message; tagged queuing "
 							   "disabled\n",
-							   HOSTNO, cmd->device->id, cmd->device->lun);
+							   HOSTNO, cmd->device->id, lun);
 						break;
 					}
 					break;
@@ -2287,7 +2291,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 					dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d lun %d was "
 						  "moved from connected to the "
 						  "disconnected_queue\n", HOSTNO,
-						  cmd->device->id, cmd->device->lun);
+						  cmd->device->id, lun);
 					/*
 					 * Restore phase bits to 0 so an interrupted selection,
 					 * arbitration can resume.
@@ -2386,13 +2390,13 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 					} else if (tmp != EXTENDED_MESSAGE)
 						printk(KERN_DEBUG "scsi%d: rejecting unknown "
 						       "message %02x from target %d, lun %d\n",
-						       HOSTNO, tmp, cmd->device->id, cmd->device->lun);
+						       HOSTNO, tmp, cmd->device->id, lun);
 					else
 						printk(KERN_DEBUG "scsi%d: rejecting unknown "
 						       "extended message "
 						       "code %02x, length %d from target %d, lun %d\n",
 						       HOSTNO, extended_msg[1], extended_msg[0],
-						       cmd->device->id, cmd->device->lun);
+						       cmd->device->id, lun);
 
 
 					msgout = MESSAGE_REJECT;
@@ -2409,7 +2413,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
 #ifdef SUPPORT_TAGS
 					cmd_free_tag(cmd);
 #else
-					hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+					hostdata->busy[cmd->device->id] &= ~(1 << lun);
 #endif
 					hostdata->connected = NULL;
 					cmd->result = DID_ERROR << 16;
@@ -2546,7 +2550,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance)
 
 	for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL;
 	     tmp; prev = tmp, tmp = NEXT(tmp)) {
-		if ((target_mask == (1 << tmp->device->id)) && (lun == tmp->device->lun)
+		if ((target_mask == (1 << tmp->device->id)) && (lun == sdev_scsi2lun(tmp->device))
 #ifdef SUPPORT_TAGS
 		    && (tag == tmp->tag)
 #endif
@@ -2589,7 +2593,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance)
 
 	hostdata->connected = tmp;
 	dprintk(NDEBUG_RESELECTION, "scsi%d: nexus established, target = %d, lun = %d, tag = %d\n",
-		   HOSTNO, tmp->device->id, tmp->device->lun, tmp->tag);
+		HOSTNO, tmp->device->id, sdev_scsi2lun(tmp->device), tmp->tag);
 	falcon_dont_release--;
 }
 
@@ -2618,6 +2622,7 @@ int NCR5380_abort(Scsi_Cmnd *cmd)
 	SETUP_HOSTDATA(instance);
 	Scsi_Cmnd *tmp, **prev;
 	unsigned long flags;
+	u8 lun = sdev_scsi2lun(cmd->device);
 
 	printk(KERN_NOTICE "scsi%d: aborting command\n", HOSTNO);
 	scsi_print_command(cmd);
@@ -2668,7 +2673,7 @@ int NCR5380_abort(Scsi_Cmnd *cmd)
 #ifdef SUPPORT_TAGS
 			cmd_free_tag(cmd);
 #else
-			hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+			hostdata->busy[cmd->device->id] &= ~(1 << lun);
 #endif
 			local_irq_restore(flags);
 			cmd->scsi_done(cmd);
@@ -2776,7 +2781,7 @@ int NCR5380_abort(Scsi_Cmnd *cmd)
 #ifdef SUPPORT_TAGS
 					cmd_free_tag(tmp);
 #else
-					hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+					hostdata->busy[cmd->device->id] &= ~(1 << lun);
 #endif
 					local_irq_restore(flags);
 					tmp->scsi_done(tmp);
diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c
index a795d81..59e2a69 100644
--- a/drivers/scsi/atp870u.c
+++ b/drivers/scsi/atp870u.c
@@ -835,7 +835,7 @@ oktosend:
 		outb(workreq->cmnd[i], tmport++);
 	}
 	tmport = workport + 0x0f;
-	outb(workreq->device->lun, tmport);
+	outb(sdev_scsi2lun(workreq->device), tmport);
 	tmport += 0x02;
 	/*
 	 *	Write the target
diff --git a/drivers/scsi/bnx2fc/bnx2fc_io.c b/drivers/scsi/bnx2fc/bnx2fc_io.c
index 32a5e0a..00db81d 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_io.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_io.c
@@ -1448,9 +1448,9 @@ static void bnx2fc_lun_reset_cmpl(struct bnx2fc_cmd *io_req)
 	struct scsi_cmnd *sc_cmd = io_req->sc_cmd;
 	struct bnx2fc_rport *tgt = io_req->tgt;
 	struct bnx2fc_cmd *cmd, *tmp;
-	int tm_lun = sc_cmd->device->lun;
+	u64 tm_lun = sc_cmd->device->lun;
+	u64 lun;
 	int rc = 0;
-	int lun;
 
 	/* called with tgt_lock held */
 	BNX2FC_IO_DBG(io_req, "Entered bnx2fc_lun_reset_cmpl\n");
diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c
index ba1c3bf..6738578 100644
--- a/drivers/scsi/ch.c
+++ b/drivers/scsi/ch.c
@@ -251,7 +251,7 @@ ch_read_element_status(scsi_changer *ch, u_int elem, char *data)
  retry:
 	memset(cmd,0,sizeof(cmd));
 	cmd[0] = READ_ELEMENT_STATUS;
-	cmd[1] = (ch->device->lun << 5) |
+	cmd[1] = (sdev_scsi2lun(ch->device) << 5) |
 		(ch->voltags ? 0x10 : 0) |
 		ch_elem_to_typecode(ch,elem);
 	cmd[2] = (elem >> 8) & 0xff;
@@ -287,7 +287,7 @@ ch_init_elem(scsi_changer *ch)
 	VPRINTK(KERN_INFO, "INITIALIZE ELEMENT STATUS, may take some time ...\n");
 	memset(cmd,0,sizeof(cmd));
 	cmd[0] = INITIALIZE_ELEMENT_STATUS;
-	cmd[1] = ch->device->lun << 5;
+	cmd[1] = sdev_scsi2lun(ch->device) << 5;
 	err = ch_do_scsi(ch, cmd, NULL, 0, DMA_NONE);
 	VPRINTK(KERN_INFO, "... finished\n");
 	return err;
@@ -307,7 +307,7 @@ ch_readconfig(scsi_changer *ch)
 
 	memset(cmd,0,sizeof(cmd));
 	cmd[0] = MODE_SENSE;
-	cmd[1] = ch->device->lun << 5;
+	cmd[1] = sdev_scsi2lun(ch->device) << 5;
 	cmd[2] = 0x1d;
 	cmd[4] = 255;
 	result = ch_do_scsi(ch, cmd, buffer, 255, DMA_FROM_DEVICE);
@@ -432,7 +432,7 @@ ch_position(scsi_changer *ch, u_int trans, u_int elem, int rotate)
 		trans = ch->firsts[CHET_MT];
 	memset(cmd,0,sizeof(cmd));
 	cmd[0]  = POSITION_TO_ELEMENT;
-	cmd[1]  = ch->device->lun << 5;
+	cmd[1]  = sdev_scsi2lun(ch->device) << 5;
 	cmd[2]  = (trans >> 8) & 0xff;
 	cmd[3]  =  trans       & 0xff;
 	cmd[4]  = (elem  >> 8) & 0xff;
@@ -451,7 +451,7 @@ ch_move(scsi_changer *ch, u_int trans, u_int src, u_int dest, int rotate)
 		trans = ch->firsts[CHET_MT];
 	memset(cmd,0,sizeof(cmd));
 	cmd[0]  = MOVE_MEDIUM;
-	cmd[1]  = ch->device->lun << 5;
+	cmd[1]  = sdev_scsi2lun(ch->device) << 5;
 	cmd[2]  = (trans >> 8) & 0xff;
 	cmd[3]  =  trans       & 0xff;
 	cmd[4]  = (src   >> 8) & 0xff;
@@ -474,7 +474,7 @@ ch_exchange(scsi_changer *ch, u_int trans, u_int src,
 		trans = ch->firsts[CHET_MT];
 	memset(cmd,0,sizeof(cmd));
 	cmd[0]  = EXCHANGE_MEDIUM;
-	cmd[1]  = ch->device->lun << 5;
+	cmd[1]  = sdev_scsi2lun(ch->device) << 5;
 	cmd[2]  = (trans >> 8) & 0xff;
 	cmd[3]  =  trans       & 0xff;
 	cmd[4]  = (src   >> 8) & 0xff;
@@ -522,7 +522,7 @@ ch_set_voltag(scsi_changer *ch, u_int elem,
 		elem, tag);
 	memset(cmd,0,sizeof(cmd));
 	cmd[0]  = SEND_VOLUME_TAG;
-	cmd[1] = (ch->device->lun << 5) |
+	cmd[1] = (sdev_scsi2lun(ch->device) << 5) |
 		ch_elem_to_typecode(ch,elem);
 	cmd[2] = (elem >> 8) & 0xff;
 	cmd[3] = elem        & 0xff;
@@ -758,7 +758,7 @@ static long ch_ioctl(struct file *file,
 	voltag_retry:
 		memset(ch_cmd, 0, sizeof(ch_cmd));
 		ch_cmd[0] = READ_ELEMENT_STATUS;
-		ch_cmd[1] = (ch->device->lun << 5) |
+		ch_cmd[1] = (sdev_scsi2lun(ch->device) << 5) |
 			(ch->voltags ? 0x10 : 0) |
 			ch_elem_to_typecode(ch,elem);
 		ch_cmd[2] = (elem >> 8) & 0xff;
diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c
index 0c6be0a..4fb10aa 100644
--- a/drivers/scsi/dc395x.c
+++ b/drivers/scsi/dc395x.c
@@ -1087,31 +1087,31 @@ static int dc395x_queue_command_lck(struct scsi_cmnd *cmd, void (*done)(struct s
 	struct AdapterCtlBlk *acb =
 	    (struct AdapterCtlBlk *)cmd->device->host->hostdata;
 	dprintkdbg(DBG_0, "queue_command: (0x%p) <%02i-%i> cmnd=0x%02x\n",
-		cmd, cmd->device->id, (u8)cmd->device->lun, cmd->cmnd[0]);
+		   cmd, cmd->device->id, sdev_scsi2lun(cmd->device), cmd->cmnd[0]);
 
 	/* Assume BAD_TARGET; will be cleared later */
 	cmd->result = DID_BAD_TARGET << 16;
 
 	/* ignore invalid targets */
 	if (cmd->device->id >= acb->scsi_host->max_id ||
-	    cmd->device->lun >= acb->scsi_host->max_lun ||
-	    cmd->device->lun >31) {
+	    sdev_scsi2lun(cmd->device) >= acb->scsi_host->max_lun ||
+	    sdev_scsi2lun(cmd->device) >31) {
 		goto complete;
 	}
 
 	/* does the specified lun on the specified device exist */
-	if (!(acb->dcb_map[cmd->device->id] & (1 << cmd->device->lun))) {
+	if (!(acb->dcb_map[cmd->device->id] & (1 << sdev_scsi2lun(cmd->device)))) {
 		dprintkl(KERN_INFO, "queue_command: Ignore target <%02i-%i>\n",
-			cmd->device->id, (u8)cmd->device->lun);
+			 cmd->device->id, sdev_scsi2lun(cmd->device));
 		goto complete;
 	}
 
 	/* do we have a DCB for the device */
-	dcb = find_dcb(acb, cmd->device->id, cmd->device->lun);
+	dcb = find_dcb(acb, cmd->device->id, sdev_scsi2lun(cmd->device));
 	if (!dcb) {
 		/* should never happen */
 		dprintkl(KERN_ERR, "queue_command: No such device <%02i-%i>",
-			cmd->device->id, (u8)cmd->device->lun);
+			 cmd->device->id, sdev_scsi2lun(cmd->device));
 		goto complete;
 	}
 
@@ -1205,9 +1205,9 @@ static void dump_register_info(struct AdapterCtlBlk *acb,
 		else
 			dprintkl(KERN_INFO, "dump: srb=%p cmd=%p "
 				 "cmnd=0x%02x <%02i-%i>\n",
-				srb, srb->cmd,
-				srb->cmd->cmnd[0], srb->cmd->device->id,
-				(u8)srb->cmd->device->lun);
+				 srb, srb->cmd,
+				 srb->cmd->cmnd[0], srb->cmd->device->id,
+				 sdev_scsi2lun(srb->cmd->device));
 		printk("  sglist=%p cnt=%i idx=%i len=%zu\n",
 		       srb->segment_x, srb->sg_count, srb->sg_index,
 		       srb->total_xfer_length);
@@ -1302,7 +1302,7 @@ static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
 		(struct AdapterCtlBlk *)cmd->device->host->hostdata;
 	dprintkl(KERN_INFO,
 		"eh_bus_reset: (0%p) target=<%02i-%i> cmd=%p\n",
-		cmd, cmd->device->id, (u8)cmd->device->lun, cmd);
+		cmd, cmd->device->id, sdev_scsi2lun(cmd->device), cmd);
 
 	if (timer_pending(&acb->waiting_timer))
 		del_timer(&acb->waiting_timer);
@@ -1369,9 +1369,9 @@ static int dc395x_eh_abort(struct scsi_cmnd *cmd)
 	struct DeviceCtlBlk *dcb;
 	struct ScsiReqBlk *srb;
 	dprintkl(KERN_INFO, "eh_abort: (0x%p) target=<%02i-%i> cmd=%p\n",
-		cmd, cmd->device->id, (u8)cmd->device->lun, cmd);
+		 cmd, cmd->device->id, sdev_scsi2lun(cmd->device), cmd);
 
-	dcb = find_dcb(acb, cmd->device->id, cmd->device->lun);
+	dcb = find_dcb(acb, cmd->device->id, sdev_scsi2lun(cmd->device));
 	if (!dcb) {
 		dprintkl(KERN_DEBUG, "eh_abort: No such device\n");
 		return FAILED;
@@ -1603,9 +1603,9 @@ static u8 start_scsi(struct AdapterCtlBlk* acb, struct DeviceCtlBlk* dcb,
 		}
 		if (tag_number >= dcb->max_command) {
 			dprintkl(KERN_WARNING, "start_scsi: (0x%p) "
-				"Out of tags target=<%02i-%i>)\n",
-				srb->cmd, srb->cmd->device->id,
-				(u8)srb->cmd->device->lun);
+				 "Out of tags target=<%02i-%i>)\n",
+				 srb->cmd, srb->cmd->device->id,
+				 sdev_scsi2lun(srb->cmd->device));
 			srb->state = SRB_READY;
 			DC395x_write16(acb, TRM_S1040_SCSI_CONTROL,
 				       DO_HWRESELECT);
@@ -1623,8 +1623,8 @@ static u8 start_scsi(struct AdapterCtlBlk* acb, struct DeviceCtlBlk* dcb,
 /*polling:*/
 	/* Send CDB ..command block ......... */
 	dprintkdbg(DBG_KG, "start_scsi: (0x%p) <%02i-%i> cmnd=0x%02x tag=%i\n",
-		srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun,
-		srb->cmd->cmnd[0], srb->tag_number);
+		   srb->cmd, srb->cmd->device->id, sdev_scsi2lun(srb->cmd->device),
+		   srb->cmd->cmnd[0], srb->tag_number);
 	if (srb->flag & AUTO_REQSENSE) {
 		DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE);
 		DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5));
@@ -2041,7 +2041,7 @@ static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 	u16 scsi_status = *pscsi_status;
 	u32 d_left_counter = 0;
 	dprintkdbg(DBG_0, "data_out_phase0: (0x%p) <%02i-%i>\n",
-		srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
+		   srb->cmd, srb->cmd->device->id, sdev_scsi2lun(srb->cmd->device));
 
 	/*
 	 * KG: We need to drain the buffers before we draw any conclusions!
@@ -2171,7 +2171,7 @@ static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 		u16 *pscsi_status)
 {
 	dprintkdbg(DBG_0, "data_out_phase1: (0x%p) <%02i-%i>\n",
-		srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
+		   srb->cmd, srb->cmd->device->id, sdev_scsi2lun(srb->cmd->device));
 	clear_fifo(acb, "data_out_phase1");
 	/* do prepare before transfer when data out phase */
 	data_io_transfer(acb, srb, XFERDATAOUT);
@@ -2183,7 +2183,7 @@ static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 	u16 scsi_status = *pscsi_status;
 
 	dprintkdbg(DBG_0, "data_in_phase0: (0x%p) <%02i-%i>\n",
-		srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
+		   srb->cmd, srb->cmd->device->id, sdev_scsi2lun(srb->cmd->device));
 
 	/*
 	 * KG: DataIn is much more tricky than DataOut. When the device is finished
@@ -2394,7 +2394,7 @@ static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 		u16 *pscsi_status)
 {
 	dprintkdbg(DBG_0, "data_in_phase1: (0x%p) <%02i-%i>\n",
-		srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
+		   srb->cmd, srb->cmd->device->id, sdev_scsi2lun(srb->cmd->device));
 	data_io_transfer(acb, srb, XFERDATAIN);
 }
 
@@ -2406,9 +2406,9 @@ static void data_io_transfer(struct AdapterCtlBlk *acb,
 	u8 bval;
 	dprintkdbg(DBG_0,
 		"data_io_transfer: (0x%p) <%02i-%i> %c len=%i, sg=(%i/%i)\n",
-		srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun,
-		((io_dir & DMACMD_DIR) ? 'r' : 'w'),
-		srb->total_xfer_length, srb->sg_index, srb->sg_count);
+		   srb->cmd, srb->cmd->device->id, sdev_scsi2lun(srb->cmd->device),
+		   ((io_dir & DMACMD_DIR) ? 'r' : 'w'),
+		   srb->total_xfer_length, srb->sg_index, srb->sg_count);
 	if (srb == acb->tmp_srb)
 		dprintkl(KERN_ERR, "data_io_transfer: Using tmp_srb!\n");
 	if (srb->sg_index >= srb->sg_count) {
@@ -2579,7 +2579,7 @@ static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 		u16 *pscsi_status)
 {
 	dprintkdbg(DBG_0, "status_phase0: (0x%p) <%02i-%i>\n",
-		srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
+		   srb->cmd, srb->cmd->device->id, sdev_scsi2lun(srb->cmd->device));
 	srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);
 	srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);	/* get message */
 	srb->state = SRB_COMPLETED;
@@ -2593,7 +2593,7 @@ static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
 		u16 *pscsi_status)
 {
 	dprintkdbg(DBG_0, "status_phase1: (0x%p) <%02i-%i>\n",
-		srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
+		   srb->cmd, srb->cmd->device->id, sdev_scsi2lun(srb->cmd->device));
 	srb->state = SRB_STATUS;
 	DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);	/* it's important for atn stop */
 	DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_COMP);
@@ -3318,7 +3318,7 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
 	int ckc_only = 1;
 
 	dprintkdbg(DBG_1, "srb_done: (0x%p) <%02i-%i>\n", srb->cmd,
-		srb->cmd->device->id, (u8)srb->cmd->device->lun);
+		   srb->cmd->device->id, sdev_scsi2lun(srb->cmd->device));
 	dprintkdbg(DBG_SG, "srb_done: srb=%p sg=%i(%i/%i) buf=%p\n",
 		   srb, scsi_sg_count(cmd), srb->sg_index, srb->sg_count,
 		   scsi_sgtalbe(cmd));
@@ -3497,9 +3497,9 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
 	if (debug_enabled(DBG_KG)) {
 		if (srb->total_xfer_length)
 			dprintkdbg(DBG_KG, "srb_done: (0x%p) <%02i-%i> "
-				"cmnd=0x%02x Missed %i bytes\n",
-				cmd, cmd->device->id, (u8)cmd->device->lun,
-				cmd->cmnd[0], srb->total_xfer_length);
+				   "cmnd=0x%02x Missed %i bytes\n",
+				   cmd, cmd->device->id, sdev_scsi2lun(cmd->device),
+				   cmd->cmnd[0], srb->total_xfer_length);
 	}
 
 	srb_going_remove(dcb, srb);
@@ -3538,7 +3538,7 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag,
 			dir = p->sc_data_direction;
 			result = MK_RES(0, did_flag, 0, 0);
 			printk("G:%p(%02i-%i) ", p,
-			       p->device->id, (u8)p->device->lun);
+			       p->device->id, sdev_scsi2lun(p->device));
 			srb_going_remove(dcb, srb);
 			free_tag(dcb, srb);
 			srb_free_insert(acb, srb);
@@ -3568,7 +3568,7 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag,
 
 			result = MK_RES(0, did_flag, 0, 0);
 			printk("W:%p<%02i-%i>", p, p->device->id,
-			       (u8)p->device->lun);
+			       sdev_scsi2lun(p->device));
 			srb_waiting_remove(dcb, srb);
 			srb_free_insert(acb, srb);
 			p->result = result;
@@ -3677,7 +3677,7 @@ static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
 {
 	struct scsi_cmnd *cmd = srb->cmd;
 	dprintkdbg(DBG_1, "request_sense: (0x%p) <%02i-%i>\n",
-		cmd, cmd->device->id, (u8)cmd->device->lun);
+		   cmd, cmd->device->id, sdev_scsi2lun(cmd->device));
 
 	srb->flag |= AUTO_REQSENSE;
 	srb->adapter_status = 0;
@@ -3905,7 +3905,7 @@ static int dc395x_slave_alloc(struct scsi_device *scsi_device)
 	struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata;
 	struct DeviceCtlBlk *dcb;
 
-	dcb = device_alloc(acb, scsi_device->id, scsi_device->lun);
+	dcb = device_alloc(acb, scsi_device->id, sdev_scsi2lun(scsi_device));
 	if (!dcb)
 		return -ENOMEM;
 	adapter_add_device(acb, dcb);
@@ -3923,7 +3923,8 @@ static int dc395x_slave_alloc(struct scsi_device *scsi_device)
 static void dc395x_slave_destroy(struct scsi_device *scsi_device)
 {
 	struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata;
-	struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id, scsi_device->lun);
+	struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id,
+					    sdev_scsi2lun(scsi_device));
 	if (dcb)
 		adapter_remove_and_free_device(acb, dcb);
 }
diff --git a/drivers/scsi/eata.c b/drivers/scsi/eata.c
index 03372cf..aeefa93 100644
--- a/drivers/scsi/eata.c
+++ b/drivers/scsi/eata.c
@@ -1812,7 +1812,7 @@ static int eata2x_queuecommand_lck(struct scsi_cmnd *SCpnt,
 	cpp->one = 1;
 	cpp->channel = SCpnt->device->channel;
 	cpp->target = SCpnt->device->id;
-	cpp->lun = SCpnt->device->lun;
+	cpp->lun = sdev_scsi2lun(SCpnt->device);
 	cpp->SCpnt = SCpnt;
 	memcpy(cpp->cdb, SCpnt->cmnd, SCpnt->cmd_len);
 
@@ -2449,7 +2449,7 @@ static irqreturn_t ihdlr(struct Scsi_Host *shost)
 			       "target_status 0x%x, sense key 0x%x.\n",
 			       ha->board_name,
 			       SCpnt->device->channel, SCpnt->device->id,
-			       (u8)SCpnt->device->lun,
+			       sdev_scsi2lun(SCpnt->device),
 			       spp->target_status, SCpnt->sense_buffer[2]);
 
 		ha->target_to[SCpnt->device->id][SCpnt->device->channel] = 0;
diff --git a/drivers/scsi/eata_pio.c b/drivers/scsi/eata_pio.c
index 8319d2b..65c3a8a 100644
--- a/drivers/scsi/eata_pio.c
+++ b/drivers/scsi/eata_pio.c
@@ -352,7 +352,7 @@ static int eata_pio_queue_lck(struct scsi_cmnd *cmd,
 	cp->reqlen = 0;
 
 	cp->cp_id = cmd->device->id;
-	cp->cp_lun = cmd->device->lun;
+	cp->cp_lun = sdev_scsi2lun(cmd->device);
 	cp->cp_dispri = 0;
 	cp->cp_identify = 1;
 	memcpy(cp->cp_cdb, cmd->cmnd, COMMAND_SIZE(*cmd->cmnd));
diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c
index 55548dc..0f7ec18 100644
--- a/drivers/scsi/esp_scsi.c
+++ b/drivers/scsi/esp_scsi.c
@@ -600,7 +600,7 @@ static void esp_autosense(struct esp *esp, struct esp_cmd_entry *ent)
 	u8 *p, val;
 
 	tgt = dev->id;
-	lun = dev->lun;
+	lun = sdev_scsi2lun(dev);
 
 
 	if (!ent->sense_ptr) {
@@ -706,7 +706,7 @@ static void esp_maybe_execute_command(struct esp *esp)
 	cmd = ent->cmd;
 	dev = cmd->device;
 	tgt = dev->id;
-	lun = dev->lun;
+	lun = sdev_scsi2lun(dev);
 	tp = &esp->target[tgt];
 	lp = dev->hostdata;
 
@@ -857,7 +857,7 @@ static void esp_cmd_is_done(struct esp *esp, struct esp_cmd_entry *ent,
 {
 	struct scsi_device *dev = cmd->device;
 	int tgt = dev->id;
-	int lun = dev->lun;
+	int lun = sdev_scsi2lun(dev);
 
 	esp->active_cmd = NULL;
 	esp_unmap_dma(esp, cmd);
diff --git a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c
index a1bc8ca..e537ac3 100644
--- a/drivers/scsi/g_NCR5380.c
+++ b/drivers/scsi/g_NCR5380.c
@@ -768,7 +768,7 @@ static void sprint_command(struct seq_file *m, unsigned char *command)
 
 static void sprint_Scsi_Cmnd(struct seq_file *m, Scsi_Cmnd * cmd)
 {
-	PRINTP("host number %d destination target %d, lun %d\n" ANDP cmd->device->host->host_no ANDP cmd->device->id ANDP cmd->device->lun);
+	PRINTP("host number %d destination target %d, lun %d\n" ANDP cmd->device->host->host_no ANDP cmd->device->id ANDP sdev_scsi2lun(cmd->device));
 	PRINTP("        command = ");
 	sprint_command(m, cmd->cmnd);
 }
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c
index 0f1ae13..c3438b0 100644
--- a/drivers/scsi/gdth.c
+++ b/drivers/scsi/gdth.c
@@ -2047,7 +2047,7 @@ static void gdth_next(gdth_ha_str *ha)
         if (!nscp_cmndinfo->internal_command) {
             b = nscp->device->channel;
             t = nscp->device->id;
-            l = nscp->device->lun;
+            l = sdev_scsi2lun(nscp->device);
             if (nscp_cmndinfo->priority >= DEFAULT_PRI) {
                 if ((b != ha->virt_bus && ha->raw[BUS_L2P(ha,b)].lock) ||
                     (b == ha->virt_bus && t < MAX_HDRIVES && ha->hdr[t].lock))
@@ -2606,7 +2606,7 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, u8 b)
     struct gdth_cmndinfo *cmndinfo;
 
     t = scp->device->id;
-    l = scp->device->lun;
+    l = sdev_scsi2lun(scp->device);
     cmdp = ha->pccb;
     TRACE(("gdth_fill_raw_cmd() cmd 0x%x bus %d ID %d LUN %d\n",
            scp->cmnd[0],b,t,l));
diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c
index ee196b3..b64b0e4 100644
--- a/drivers/scsi/hptiop.c
+++ b/drivers/scsi/hptiop.c
@@ -1028,7 +1028,7 @@ static int hptiop_queuecommand_lck(struct scsi_cmnd *scp,
 			"req_index=%d, req=%p\n",
 			scp,
 			host->host_no, scp->device->channel,
-			scp->device->id, scp->device->lun,
+			scp->device->id, sdev_scsi2lun(scp->device),
 			cpu_to_be32(((u32 *)scp->cmnd)[0]),
 			cpu_to_be32(((u32 *)scp->cmnd)[1]),
 			cpu_to_be32(((u32 *)scp->cmnd)[2]),
@@ -1037,7 +1037,7 @@ static int hptiop_queuecommand_lck(struct scsi_cmnd *scp,
 
 	scp->result = 0;
 
-	if (scp->device->channel || scp->device->lun ||
+	if (scp->device->channel || sdev_scsi2lun(scp->device) ||
 			scp->device->id > hba->max_devices) {
 		scp->result = DID_BAD_TARGET << 16;
 		free_req(hba, _req);
@@ -1057,7 +1057,7 @@ static int hptiop_queuecommand_lck(struct scsi_cmnd *scp,
 	req->dataxfer_length = cpu_to_le32(scsi_bufflen(scp));
 	req->channel = scp->device->channel;
 	req->target = scp->device->id;
-	req->lun = scp->device->lun;
+	req->lun = sdev_scsi2lun(scp->device);
 	req->header.size = cpu_to_le32(
 				sizeof(struct hpt_iop_request_scsi_command)
 				 - sizeof(struct hpt_iopsg)
diff --git a/drivers/scsi/in2000.c b/drivers/scsi/in2000.c
index b1c4d83..83af7f9 100644
--- a/drivers/scsi/in2000.c
+++ b/drivers/scsi/in2000.c
@@ -471,7 +471,7 @@ static void in2000_execute(struct Scsi_Host *instance)
 	cmd = (Scsi_Cmnd *) hostdata->input_Q;
 	prev = NULL;
 	while (cmd) {
-		if (!(hostdata->busy[cmd->device->id] & (1 << cmd->device->lun)))
+		if (!(hostdata->busy[cmd->device->id] & (1 << sdev_scsi2lun(cmd->device))))
 			break;
 		prev = cmd;
 		cmd = (Scsi_Cmnd *) cmd->host_scribble;
@@ -541,7 +541,7 @@ static void in2000_execute(struct Scsi_Host *instance)
 	if (!(hostdata->input_Q))	/* input_Q empty? */
 		goto no;
 	for (prev = (Scsi_Cmnd *) hostdata->input_Q; prev; prev = (Scsi_Cmnd *) prev->host_scribble) {
-		if ((prev->device->id != cmd->device->id) || (prev->device->lun != cmd->device->lun)) {
+		if ((prev->device->id != cmd->device->id) || prev->device->lun != cmd->device->lun)) {
 			for (prev = (Scsi_Cmnd *) hostdata->input_Q; prev; prev = (Scsi_Cmnd *) prev->host_scribble)
 				prev->SCp.phase = 1;
 			goto yes;
@@ -559,9 +559,9 @@ static void in2000_execute(struct Scsi_Host *instance)
       no:
 	write_3393(hostdata, WD_SOURCE_ID, ((cmd->SCp.phase) ? SRCID_ER : 0));
 
-	write_3393(hostdata, WD_TARGET_LUN, cmd->device->lun);
+	write_3393(hostdata, WD_TARGET_LUN, sdev_scsi2lun(cmd->device));
 	write_3393(hostdata, WD_SYNCHRONOUS_TRANSFER, hostdata->sync_xfer[cmd->device->id]);
-	hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
+	hostdata->busy[cmd->device->id] |= (1 << sdev_scsi2lun(cmd->device));
 
 	if ((hostdata->level2 <= L2_NONE) || (hostdata->sync_stat[cmd->device->id] == SS_UNSET)) {
 
@@ -1075,7 +1075,7 @@ static irqreturn_t in2000_intr(int irqnum, void *dev_id)
 		}
 
 		cmd->result = DID_NO_CONNECT << 16;
-		hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+		hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 		hostdata->state = S_UNCONNECTED;
 		cmd->scsi_done(cmd);
 
@@ -1097,7 +1097,7 @@ static irqreturn_t in2000_intr(int irqnum, void *dev_id)
 
 		/* construct an IDENTIFY message with correct disconnect bit */
 
-		hostdata->outgoing_msg[0] = (0x80 | 0x00 | cmd->device->lun);
+		hostdata->outgoing_msg[0] = (0x80 | 0x00 | sdev_scsi2lun(cmd->device));
 		if (cmd->SCp.phase)
 			hostdata->outgoing_msg[0] |= 0x40;
 
@@ -1333,7 +1333,7 @@ static irqreturn_t in2000_intr(int irqnum, void *dev_id)
 			lun = read_3393(hostdata, WD_TARGET_LUN);
 			DB(DB_INTR, printk(":%d.%d", cmd->SCp.Status, lun))
 			    hostdata->connected = NULL;
-			hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+			hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 			hostdata->state = S_UNCONNECTED;
 			if (cmd->SCp.Status == ILLEGAL_STATUS_BYTE)
 				cmd->SCp.Status = lun;
@@ -1418,7 +1418,7 @@ static irqreturn_t in2000_intr(int irqnum, void *dev_id)
 		}
 		DB(DB_INTR, printk("UNEXP_DISC"))
 		    hostdata->connected = NULL;
-		hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+		hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 		hostdata->state = S_UNCONNECTED;
 		if (cmd->cmnd[0] == REQUEST_SENSE && cmd->SCp.Status != GOOD)
 			cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);
@@ -1449,7 +1449,7 @@ static irqreturn_t in2000_intr(int irqnum, void *dev_id)
 		switch (hostdata->state) {
 		case S_PRE_CMP_DISC:
 			hostdata->connected = NULL;
-			hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+			hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 			hostdata->state = S_UNCONNECTED;
 			DB(DB_INTR, printk(":%d", cmd->SCp.Status))
 			    if (cmd->cmnd[0] == REQUEST_SENSE && cmd->SCp.Status != GOOD)
@@ -1494,7 +1494,7 @@ static irqreturn_t in2000_intr(int irqnum, void *dev_id)
 			if (hostdata->selecting) {
 				cmd = (Scsi_Cmnd *) hostdata->selecting;
 				hostdata->selecting = NULL;
-				hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+				hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 				cmd->host_scribble = (uchar *) hostdata->input_Q;
 				hostdata->input_Q = cmd;
 			}
@@ -1504,7 +1504,7 @@ static irqreturn_t in2000_intr(int irqnum, void *dev_id)
 
 			if (cmd) {
 				if (phs == 0x00) {
-					hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+					hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 					cmd->host_scribble = (uchar *) hostdata->input_Q;
 					hostdata->input_Q = cmd;
 				} else {
@@ -1536,7 +1536,8 @@ static irqreturn_t in2000_intr(int irqnum, void *dev_id)
 		cmd = (Scsi_Cmnd *) hostdata->disconnected_Q;
 		patch = NULL;
 		while (cmd) {
-			if (id == cmd->device->id && lun == cmd->device->lun)
+			if (id == cmd->device->id &&
+			    lun == sdev_scsi2lun(cmd->device))
 				break;
 			patch = cmd;
 			cmd = (Scsi_Cmnd *) cmd->host_scribble;
@@ -1757,7 +1758,7 @@ static int __in2000_abort(Scsi_Cmnd * cmd)
 		sr = read_3393(hostdata, WD_SCSI_STATUS);
 		printk("asr=%02x, sr=%02x.", asr, sr);
 
-		hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+		hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 		hostdata->connected = NULL;
 		hostdata->state = S_UNCONNECTED;
 		cmd->result = DID_ABORT << 16;
@@ -2251,14 +2252,16 @@ static int in2000_show_info(struct seq_file *m, struct Scsi_Host *instance)
 		seq_printf(m, "\nconnected:     ");
 		if (hd->connected) {
 			cmd = (Scsi_Cmnd *) hd->connected;
-			seq_printf(m, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
+			seq_printf(m, " %d:%d(%02x)", cmd->device->id,
+				   sdev_scsi2lun(cmd->device), cmd->cmnd[0]);
 		}
 	}
 	if (hd->proc & PR_INPUTQ) {
 		seq_printf(m, "\ninput_Q:       ");
 		cmd = (Scsi_Cmnd *) hd->input_Q;
 		while (cmd) {
-			seq_printf(m, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
+			seq_printf(m, " %d:%d(%02x)", cmd->device->id,
+				   sdev_scsi2lun(cmd->device), cmd->cmnd[0]);
 			cmd = (Scsi_Cmnd *) cmd->host_scribble;
 		}
 	}
@@ -2266,7 +2269,8 @@ static int in2000_show_info(struct seq_file *m, struct Scsi_Host *instance)
 		seq_printf(m, "\ndisconnected_Q:");
 		cmd = (Scsi_Cmnd *) hd->disconnected_Q;
 		while (cmd) {
-			seq_printf(m, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
+			seq_printf(m, " %d:%d(%02x)", cmd->device->id,
+				   sdev_scsi2lun(cmd->device), cmd->cmnd[0]);
 			cmd = (Scsi_Cmnd *) cmd->host_scribble;
 		}
 	}
diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c
index e5dae7b..2ac878e 100644
--- a/drivers/scsi/initio.c
+++ b/drivers/scsi/initio.c
@@ -2573,8 +2573,8 @@ static void initio_build_scb(struct initio_host * host, struct scsi_ctrl_blk * c
 	cblk->opcode = ExecSCSI;
 	cblk->flags = SCF_POST;	/* After SCSI done, call post routine */
 	cblk->target = cmnd->device->id;
-	cblk->lun = cmnd->device->lun;
-	cblk->ident = cmnd->device->lun | DISC_ALLOW;
+	cblk->lun = sdev_scsi2lun(cmnd->device);
+	cblk->ident = sdev_scsi2lun(cmnd->device) | DISC_ALLOW;
 
 	cblk->flags |= SCF_SENSE;	/* Turn on auto request sense   */
 
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index ac5d94c..eccbb75 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -583,7 +583,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
 	if(islogical) {
 
 		/* have just LUN 0 for each target on virtual channels */
-		if (cmd->device->lun) {
+		if (sdev_scsi2lun(cmd->device)) {
 			cmd->result = (DID_BAD_TARGET << 16);
 			cmd->scsi_done(cmd);
 			return NULL;
@@ -610,7 +610,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
 
 	}
 	else {
-		if( cmd->device->lun > 7) {
+		if (sdev_scsi2lun(cmd->device) > 7) {
 			/*
 			 * Do not support lun >7 for physically accessed
 			 * devices
@@ -970,7 +970,7 @@ mega_prepare_passthru(adapter_t *adapter, scb_t *scb, Scsi_Cmnd *cmd,
 		(channel << 4) | target : target;
 
 	pthru->cdblen = cmd->cmd_len;
-	pthru->logdrv = cmd->device->lun;
+	pthru->logdrv = sdev_scsi2lun(cmd->device);
 
 	memcpy(pthru->cdb, cmd->cmnd, cmd->cmd_len);
 
@@ -1033,7 +1033,7 @@ mega_prepare_extpassthru(adapter_t *adapter, scb_t *scb, Scsi_Cmnd *cmd,
 		(channel << 4) | target : target;
 
 	epthru->cdblen = cmd->cmd_len;
-	epthru->logdrv = cmd->device->lun;
+	epthru->logdrv = sdev_scsi2lun(cmd->device);
 
 	memcpy(epthru->cdb, cmd->cmnd, cmd->cmd_len);
 
@@ -1942,7 +1942,7 @@ megaraid_abort_and_reset(adapter_t *adapter, Scsi_Cmnd *cmd, int aor)
 	printk(KERN_WARNING "megaraid: %s cmd=%x <c=%d t=%d l=%d>\n",
 	     (aor == SCB_ABORT)? "ABORTING":"RESET",
 	     cmd->cmnd[0], cmd->device->channel,
-	     cmd->device->id, (u32)cmd->device->lun);
+	     cmd->device->id, sdev_scsi2lun(cmd->device));
 
 	if(list_empty(&adapter->pending_list))
 		return FALSE;
diff --git a/drivers/scsi/mesh.c b/drivers/scsi/mesh.c
index e8a04ae..d69203a 100644
--- a/drivers/scsi/mesh.c
+++ b/drivers/scsi/mesh.c
@@ -1228,11 +1228,11 @@ static void handle_msgin(struct mesh_state *ms)
 			if (cmd == NULL) {
 				do_abort(ms);
 				ms->msgphase = msg_out;
-			} else if (code != cmd->device->lun + IDENTIFY_BASE) {
+			} else if (code != sdev_scsi2lun(cmd->device) + IDENTIFY_BASE) {
 				printk(KERN_WARNING "mesh: lun mismatch "
 				       "(%d != %d) on reselection from "
 				       "target %d\n", code - IDENTIFY_BASE,
-				       cmd->device->lun, ms->conn_tgt);
+				       sdev_scsi2lun(cmd->device), ms->conn_tgt);
 			}
 			break;
 		}
@@ -1544,7 +1544,7 @@ static void cmd_complete(struct mesh_state *ms)
 		case selecting:
 			dlog(ms, "Selecting phase at command completion",0);
 			ms->msgout[0] = IDENTIFY(ALLOW_RESEL(ms->conn_tgt),
-						 (cmd? cmd->device->lun: 0));
+						 (cmd? sdev_scsi2lun(cmd->device): 0));
 			ms->n_msgout = 1;
 			ms->expect_reply = 0;
 			if (ms->aborting) {
diff --git a/drivers/scsi/mvumi.c b/drivers/scsi/mvumi.c
index edbee8d..59f6f06 100644
--- a/drivers/scsi/mvumi.c
+++ b/drivers/scsi/mvumi.c
@@ -2071,7 +2071,7 @@ static unsigned char mvumi_build_frame(struct mvumi_hba *mhba,
 	cmd->cmd_status = REQ_STATUS_PENDING;
 	pframe = cmd->frame;
 	pframe->device_id = ((unsigned short) scmd->device->id) |
-				(((unsigned short) scmd->device->lun) << 8);
+		(sdev_scsi2lun(scmd->device) << 8);
 	pframe->cmd_flag = 0;
 
 	switch (scmd->sc_data_direction) {
diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c
index 7d014b1..ba673a8 100644
--- a/drivers/scsi/ncr53c8xx.c
+++ b/drivers/scsi/ncr53c8xx.c
@@ -4120,7 +4120,7 @@ static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd)
 {
 	struct scsi_device *sdev = cmd->device;
 	struct tcb *tp = &np->target[sdev->id];
-	struct lcb *lp = tp->lp[sdev->lun];
+	struct lcb *lp = tp->lp[sdev_scsi2lun(sdev)];
 	struct ccb *cp;
 
 	int	segments;
@@ -4135,9 +4135,9 @@ static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd)
 	**
 	**---------------------------------------------
 	*/
-	if ((sdev->id == np->myaddr	  ) ||
-		(sdev->id >= MAX_TARGET) ||
-		(sdev->lun    >= MAX_LUN   )) {
+	if ((sdev->id == np->myaddr) ||
+	    (sdev->id >= MAX_TARGET) ||
+	    (sdev_scsi2lun(sdev) >= MAX_LUN)) {
 		return(DID_BAD_TARGET);
 	}
 
@@ -4189,7 +4189,7 @@ static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd)
 	**----------------------------------------------------
 	*/
 
-	idmsg = IDENTIFY(0, sdev->lun);
+	idmsg = IDENTIFY(0, sdev_scsi2lun(sdev));
 
 	if (cp ->tag != NO_TAG ||
 		(cp != np->ccb && np->disc && !(tp->usrflag & UF_NODISC)))
@@ -4841,7 +4841,7 @@ void ncr_complete (struct ncb *np, struct ccb *cp)
 	cmd = cp->cmd;
 	cp->cmd = NULL;
 	tp = &np->target[cmd->device->id];
-	lp = tp->lp[cmd->device->lun];
+	lp = tp->lp[sdev_scsi2lun(cmd->device)];
 
 	/*
 	**	We donnot queue more than 1 ccb per target 
@@ -4935,7 +4935,8 @@ void ncr_complete (struct ncb *np, struct ccb *cp)
 		**	Allocate the lcb if not yet.
 		*/
 		if (!lp)
-			ncr_alloc_lcb (np, cmd->device->id, cmd->device->lun);
+			ncr_alloc_lcb (np, cmd->device->id,
+				       sdev_scsi2lun(cmd->device));
 
 		tp->bytes     += cp->data_len;
 		tp->transfers ++;
@@ -5631,7 +5632,7 @@ static void ncr_setwide (struct ncb *np, struct ccb *cp, u_char wide, u_char ack
 
 static void ncr_setup_tags (struct ncb *np, struct scsi_device *sdev)
 {
-	unsigned char tn = sdev->id, ln = sdev->lun;
+	unsigned char tn = sdev->id, ln = sdev_scsi2lun(sdev);
 	struct tcb *tp = &np->target[tn];
 	struct lcb *lp = tp->lp[ln];
 	u_char   reqtags, maxdepth;
@@ -6542,7 +6543,7 @@ static void ncr_sir_to_redo(struct ncb *np, int num, struct ccb *cp)
 {
 	struct scsi_cmnd *cmd	= cp->cmd;
 	struct tcb *tp	= &np->target[cmd->device->id];
-	struct lcb *lp	= tp->lp[cmd->device->lun];
+	struct lcb *lp	= tp->lp[sdev_scsi2lun(cmd->device)];
 	struct list_head *qp;
 	struct ccb *	cp2;
 	int		disc_cnt = 0;
@@ -6619,7 +6620,7 @@ static void ncr_sir_to_redo(struct ncb *np, int num, struct ccb *cp)
 		**
 		**	identify message
 		*/
-		cp->scsi_smsg2[0]	= IDENTIFY(0, cmd->device->lun);
+		cp->scsi_smsg2[0]	= IDENTIFY(0, sdev_scsi2lun(cmd->device));
 		cp->phys.smsg.addr	= cpu_to_scr(CCB_PHYS (cp, scsi_smsg2));
 		cp->phys.smsg.size	= cpu_to_scr(1);
 
@@ -6633,7 +6634,7 @@ static void ncr_sir_to_redo(struct ncb *np, int num, struct ccb *cp)
 		**	patch requested size into sense command
 		*/
 		cp->sensecmd[0]		= 0x03;
-		cp->sensecmd[1]		= cmd->device->lun << 5;
+		cp->sensecmd[1]		= (sdev_scsi2lun(cmd->device) & 0x7) << 5;
 		cp->sensecmd[4]		= sizeof(cp->sense_buf);
 
 		/*
@@ -7143,7 +7144,7 @@ out:
 static struct ccb *ncr_get_ccb(struct ncb *np, struct scsi_cmnd *cmd)
 {
 	u_char tn = cmd->device->id;
-	u_char ln = cmd->device->lun;
+	u_char ln = sdev_scsi2lun(cmd->device);
 	struct tcb *tp = &np->target[tn];
 	struct lcb *lp = tp->lp[ln];
 	u_char tag = NO_TAG;
@@ -7580,7 +7581,7 @@ fail:
 */
 static struct lcb *ncr_setup_lcb (struct ncb *np, struct scsi_device *sdev)
 {
-	unsigned char tn = sdev->id, ln = sdev->lun;
+	unsigned char tn = sdev->id, ln = sdev_scsi2lun(sdev);
 	struct tcb *tp = &np->target[tn];
 	struct lcb *lp = tp->lp[ln];
 
@@ -7975,7 +7976,7 @@ static int ncr53c8xx_slave_configure(struct scsi_device *device)
 	struct Scsi_Host *host = device->host;
 	struct ncb *np = ((struct host_data *) host->hostdata)->ncb;
 	struct tcb *tp = &np->target[device->id];
-	struct lcb *lp = tp->lp[device->lun];
+	struct lcb *lp = tp->lp[sdev_scsi2lun(device)];
 	int numtags, depth_to_use;
 
 	ncr_setup_lcb(np, device);
@@ -7986,7 +7987,7 @@ static int ncr53c8xx_slave_configure(struct scsi_device *device)
 	**	Use at least 2.
 	**	Donnot use more than our maximum.
 	*/
-	numtags = device_queue_depth(np->unit, device->id, device->lun);
+	numtags = device_queue_depth(np->unit, device->id, sdev_scsi2lun(device));
 	if (numtags > tp->usrtags)
 		numtags = tp->usrtags;
 	if (!device->tagged_supported)
@@ -8019,7 +8020,7 @@ static int ncr53c8xx_slave_configure(struct scsi_device *device)
 
 #ifdef DEBUG_NCR53C8XX
 	printk("ncr53c8xx_select_queue_depth: host=%d, id=%d, lun=%d, depth=%d\n",
-	       np->unit, device->id, device->lun, depth_to_use);
+	       np->unit, device->id, sdev_scsi2lun(device), depth_to_use);
 #endif
 
 	if (spi_support_sync(device->sdev_target) &&
diff --git a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c
index 0665f9c..d6856c8 100644
--- a/drivers/scsi/nsp32.c
+++ b/drivers/scsi/nsp32.c
@@ -376,7 +376,7 @@ static void nsp32_build_identify(struct scsi_cmnd *SCpnt)
 		/* mode = TRUE; */
 	}
 
-	data->msgoutbuf[pos] = IDENTIFY(mode, SCpnt->device->lun); pos++;
+	data->msgoutbuf[pos] = IDENTIFY(mode, sdev_scsi2lun(SCpnt->device)); pos++;
 
 	data->msgout_len = pos;
 }
@@ -917,8 +917,10 @@ static int nsp32_queuecommand_lck(struct scsi_cmnd *SCpnt, void (*done)(struct s
 	nsp32_dbg(NSP32_DEBUG_QUEUECOMMAND,
 		  "enter. target: 0x%x LUN: 0x%x cmnd: 0x%x cmndlen: 0x%x "
 		  "use_sg: 0x%x reqbuf: 0x%lx reqlen: 0x%x",
-		  SCpnt->device->id, SCpnt->device->lun, SCpnt->cmnd[0], SCpnt->cmd_len,
-		  scsi_sg_count(SCpnt), scsi_sglist(SCpnt), scsi_bufflen(SCpnt));
+		  SCpnt->device->id, sdev_scsi2lun(SCpnt->device),
+		  SCpnt->cmnd[0], SCpnt->cmd_len,
+		  scsi_sg_count(SCpnt), scsi_sglist(SCpnt),
+		  scsi_bufflen(SCpnt));
 
 	if (data->CurrentSC != NULL) {
 		nsp32_msg(KERN_ERR, "Currentsc != NULL. Cancel this command request");
@@ -937,7 +939,7 @@ static int nsp32_queuecommand_lck(struct scsi_cmnd *SCpnt, void (*done)(struct s
 	}
 
 	/* check target LUN is allowable value */
-	if (SCpnt->device->lun >= MAX_LUN) {
+	if (sdev_scsi2lun(SCpnt->device) >= MAX_LUN) {
 		nsp32_dbg(NSP32_DEBUG_QUEUECOMMAND, "no more lun");
 		SCpnt->result = DID_BAD_TARGET << 16;
 		done(SCpnt);
@@ -960,13 +962,13 @@ static int nsp32_queuecommand_lck(struct scsi_cmnd *SCpnt, void (*done)(struct s
 	/* initialize data */
 	data->msgout_len	= 0;
 	data->msgin_len		= 0;
-	cur_lunt		= &(data->lunt[SCpnt->device->id][SCpnt->device->lun]);
+	cur_lunt		= &(data->lunt[SCpnt->device->id][sdev_scsi2lun(SCpnt->device)]);
 	cur_lunt->SCpnt		= SCpnt;
 	cur_lunt->save_datp	= 0;
 	cur_lunt->msgin03	= FALSE;
 	data->cur_lunt		= cur_lunt;
 	data->cur_id		= SCpnt->device->id;
-	data->cur_lun		= SCpnt->device->lun;
+	data->cur_lun		= sdev_scsi2lun(SCpnt->device);
 
 	ret = nsp32_setup_sg_table(SCpnt);
 	if (ret == FALSE) {
diff --git a/drivers/scsi/ps3rom.c b/drivers/scsi/ps3rom.c
index e6e2a30..d790f4e 100644
--- a/drivers/scsi/ps3rom.c
+++ b/drivers/scsi/ps3rom.c
@@ -79,7 +79,7 @@ static int ps3rom_slave_configure(struct scsi_device *scsi_dev)
 	struct ps3_storage_device *dev = priv->dev;
 
 	dev_dbg(&dev->sbd.core, "%s:%u: id %u, lun %u, channel %u\n", __func__,
-		__LINE__, scsi_dev->id, scsi_dev->lun, scsi_dev->channel);
+		__LINE__, scsi_dev->id, sdev_scsi2lun(scsi_dev), scsi_dev->channel);
 
 	/*
 	 * ATAPI SFF8020 devices use MODE_SENSE_10,
diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c
index 6d48d30..0422327 100644
--- a/drivers/scsi/qlogicpti.c
+++ b/drivers/scsi/qlogicpti.c
@@ -861,7 +861,7 @@ static inline void cmd_frob(struct Command_Entry *cmd, struct scsi_cmnd *Cmnd,
 	cmd->hdr.entry_cnt = 1;
 	cmd->hdr.entry_type = ENTRY_COMMAND;
 	cmd->target_id = Cmnd->device->id;
-	cmd->target_lun = Cmnd->device->lun;
+	cmd->target_lun = sdev_scsi2lun(Cmnd->device);
 	cmd->cdb_length = Cmnd->cmd_len;
 	cmd->control_flags = 0;
 	if (Cmnd->device->tagged_supported) {
@@ -1222,7 +1222,7 @@ static int qlogicpti_abort(struct scsi_cmnd *Cmnd)
 	int i;
 
 	printk(KERN_WARNING "qlogicpti%d: Aborting cmd for tgt[%d] lun[%d]\n",
-	       qpti->qpti_id, (int)Cmnd->device->id, (int)Cmnd->device->lun);
+	       qpti->qpti_id, (int)Cmnd->device->id, sdev_scsi2lun(Cmnd->device));
 
 	qlogicpti_disable_irqs(qpti);
 
@@ -1235,7 +1235,7 @@ static int qlogicpti_abort(struct scsi_cmnd *Cmnd)
 	cmd_cookie = i;
 
 	param[0] = MBOX_ABORT;
-	param[1] = (((u_short) Cmnd->device->id) << 8) | Cmnd->device->lun;
+	param[1] = (((u_short) Cmnd->device->id) << 8) | sdev_scsi2lun(Cmnd->device);
 	param[2] = cmd_cookie >> 16;
 	param[3] = cmd_cookie & 0xffff;
 	if (qlogicpti_mbox_command(qpti, param, 0) ||
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index ce5b4e5..f56eb94 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -681,7 +681,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
 	if (cmd->device->scsi_level <= SCSI_2 &&
 	    cmd->device->scsi_level != SCSI_UNKNOWN) {
 		cmd->cmnd[1] = (cmd->cmnd[1] & 0x1f) |
-			       (cmd->device->lun << 5 & 0xe0);
+			(sdev_scsi2lun(cmd->device) << 5 & 0xe0);
 	}
 
 	scsi_log_send(cmd);
diff --git a/drivers/scsi/stex.c b/drivers/scsi/stex.c
index 1aa4bef..d7fcbdb 100644
--- a/drivers/scsi/stex.c
+++ b/drivers/scsi/stex.c
@@ -582,7 +582,7 @@ stex_queuecommand_lck(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 
 	host = cmd->device->host;
 	id = cmd->device->id;
-	lun = cmd->device->lun;
+	lun = sdev_scsi2lun(cmd->device);
 	hba = (struct st_hba *) &host->hostdata[0];
 
 	if (unlikely(hba->mu_status == MU_STATE_RESETTING))
diff --git a/drivers/scsi/sun3_NCR5380.c b/drivers/scsi/sun3_NCR5380.c
index 8822079..3c81d4a 100644
--- a/drivers/scsi/sun3_NCR5380.c
+++ b/drivers/scsi/sun3_NCR5380.c
@@ -355,17 +355,18 @@ static void __init init_tags( void )
 
 static int is_lun_busy(struct scsi_cmnd *cmd, int should_be_tagged)
 {
+    u8 lun = sdev_scsi2lun(cmd->device);
     SETUP_HOSTDATA(cmd->device->host);
 
-    if (hostdata->busy[cmd->device->id] & (1 << cmd->device->lun))
+    if (hostdata->busy[cmd->device->id] & (1 << lun))
 	return( 1 );
     if (!should_be_tagged ||
 	!setup_use_tagged_queuing || !cmd->device->tagged_supported)
 	return( 0 );
-    if (TagAlloc[cmd->device->id][cmd->device->lun].nr_allocated >=
-	TagAlloc[cmd->device->id][cmd->device->lun].queue_size ) {
+    if (TagAlloc[cmd->device->id][lun].nr_allocated >=
+	TagAlloc[cmd->device->id][lun].queue_size ) {
 	dprintk(NDEBUG_TAGS,  "scsi%d: target %d lun %d: no free tags\n",
-		    H_NO(cmd), cmd->device->id, cmd->device->lun );
+		    H_NO(cmd), cmd->device->id, lun );
 	return( 1 );
     }
     return( 0 );
@@ -379,6 +380,7 @@ static int is_lun_busy(struct scsi_cmnd *cmd, int should_be_tagged)
 
 static void cmd_get_tag(struct scsi_cmnd *cmd, int should_be_tagged)
 {
+    u8 lun = sdev_scsi2lun(cmd->device);
     SETUP_HOSTDATA(cmd->device->host);
 
     /* If we or the target don't support tagged queuing, allocate the LUN for
@@ -387,19 +389,19 @@ static void cmd_get_tag(struct scsi_cmnd *cmd, int should_be_tagged)
     if (!should_be_tagged ||
 	!setup_use_tagged_queuing || !cmd->device->tagged_supported) {
 	cmd->tag = TAG_NONE;
-	hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
+	hostdata->busy[cmd->device->id] |= (1 << lun);
 	dprintk(NDEBUG_TAGS,  "scsi%d: target %d lun %d now allocated by untagged "
-		    "command\n", H_NO(cmd), cmd->device->id, cmd->device->lun );
+		    "command\n", H_NO(cmd), cmd->device->id, lun );
     }
     else {
-	TAG_ALLOC *ta = &TagAlloc[cmd->device->id][cmd->device->lun];
+	TAG_ALLOC *ta = &TagAlloc[cmd->device->id][lun];
 
 	cmd->tag = find_first_zero_bit( &ta->allocated, MAX_TAGS );
 	set_bit( cmd->tag, &ta->allocated );
 	ta->nr_allocated++;
 	dprintk(NDEBUG_TAGS,  "scsi%d: using tag %d for target %d lun %d "
 		    "(now %d tags in use)\n",
-		    H_NO(cmd), cmd->tag, cmd->device->id, cmd->device->lun,
+		    H_NO(cmd), cmd->tag, cmd->device->id, lun,
 		    ta->nr_allocated );
     }
 }
@@ -411,23 +413,24 @@ static void cmd_get_tag(struct scsi_cmnd *cmd, int should_be_tagged)
 
 static void cmd_free_tag(struct scsi_cmnd *cmd)
 {
+    u8 lun = sdev_scsi2lun(cmd->device);
     SETUP_HOSTDATA(cmd->device->host);
 
     if (cmd->tag == TAG_NONE) {
-	hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+	hostdata->busy[cmd->device->id] &= ~(1 << lun);
 	dprintk(NDEBUG_TAGS,  "scsi%d: target %d lun %d untagged cmd finished\n",
-		    H_NO(cmd), cmd->device->id, cmd->device->lun );
+		    H_NO(cmd), cmd->device->id, lun );
     }
     else if (cmd->tag >= MAX_TAGS) {
 	printk(KERN_NOTICE "scsi%d: trying to free bad tag %d!\n",
 		H_NO(cmd), cmd->tag );
     }
     else {
-	TAG_ALLOC *ta = &TagAlloc[cmd->device->id][cmd->device->lun];
+	TAG_ALLOC *ta = &TagAlloc[cmd->device->id][lun];
 	clear_bit( cmd->tag, &ta->allocated );
 	ta->nr_allocated--;
 	dprintk(NDEBUG_TAGS,  "scsi%d: freed tag %d for target %d lun %d\n",
-		    H_NO(cmd), cmd->tag, cmd->device->id, cmd->device->lun );
+		    H_NO(cmd), cmd->tag, cmd->device->id, lun );
     }
 }
 
@@ -660,7 +663,7 @@ static void lprint_Scsi_Cmnd(Scsi_Cmnd *cmd)
 	int i, s;
 	unsigned char *command;
 	printk("scsi%d: destination target %d, lun %d\n",
-		H_NO(cmd), cmd->device->id, cmd->device->lun);
+	       H_NO(cmd), cmd->device->id, sdev_scsi2lun(cmd->device));
 	printk(KERN_CONT "        command = ");
 	command = cmd->cmnd;
 	printk(KERN_CONT "%2d (0x%02x)", command[0], command[0]);
@@ -706,7 +709,7 @@ static void show_Scsi_Cmnd(Scsi_Cmnd *cmd, struct seq_file *m)
 	int i, s;
 	unsigned char *command;
 	seq_printf(m, "scsi%d: destination target %d, lun %d\n",
-		H_NO(cmd), cmd->device->id, cmd->device->lun);
+		   H_NO(cmd), cmd->device->id, sdev_scsi2lun(cmd->device));
 	seq_printf(m, "        command = ");
 	command = cmd->cmnd;
 	seq_printf(m, "%2d (0x%02x)", command[0], command[0]);
@@ -1007,14 +1010,18 @@ static void NCR5380_main (struct work_struct *bl)
 		 prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp) ) {
 
 		if (prev != tmp)
-			dprintk(NDEBUG_LISTS, "MAIN tmp=%p   target=%d   busy=%d lun=%d\n", tmp, tmp->device->id, hostdata->busy[tmp->device->id], tmp->device->lun);
+			dprintk(NDEBUG_LISTS,
+				"MAIN tmp=%p   target=%d   busy=%d lun=%d\n",
+				tmp, tmp->device->id,
+				hostdata->busy[tmp->device->id],
+				sdev_scsi2lun(tmp->device));
 		/*  When we find one, remove it from the issue queue. */
 		/* ++guenther: possible race with Falcon locking */
 		if (
 #ifdef SUPPORT_TAGS
 		    !is_lun_busy( tmp, tmp->cmnd[0] != REQUEST_SENSE)
 #else
-		    !(hostdata->busy[tmp->device->id] & (1 << tmp->device->lun))
+		    !(hostdata->busy[tmp->device->id] & (1 << sdev_scsi2lun(tmp->device)))
 #endif
 		    ) {
 		    /* ++guenther: just to be sure, this must be atomic */
@@ -1038,8 +1045,8 @@ static void NCR5380_main (struct work_struct *bl)
 		     *   issue queue so we can keep trying.	
 		     */
 		    dprintk(NDEBUG_MAIN, "scsi%d: main(): command for target %d "
-				"lun %d removed from issue_queue\n",
-				HOSTNO, tmp->device->id, tmp->device->lun);
+			    "lun %d removed from issue_queue\n",
+			    HOSTNO, tmp->device->id, sdev_scsi2lun(tmp->device));
 		    /* 
 		     * REQUEST SENSE commands are issued without tagged
 		     * queueing, even on SCSI-II devices because the 
@@ -1589,7 +1596,7 @@ static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd,
 
     dprintk(NDEBUG_SELECTION, "scsi%d: target %d selected, going into MESSAGE OUT phase.\n",
 	       HOSTNO, cmd->device->id);
-    tmp[0] = IDENTIFY(1, cmd->device->lun);
+    tmp[0] = IDENTIFY(1, sdev_scsi2lun(cmd->device));
 
 #ifdef SUPPORT_TAGS
     if (cmd->tag != TAG_NONE) {
@@ -1611,7 +1618,7 @@ static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd,
     /* XXX need to handle errors here */
     hostdata->connected = cmd;
 #ifndef SUPPORT_TAGS
-    hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
+    hostdata->busy[cmd->device->id] |= (1 << sdev_scsi2lun(cmd->device));
 #endif    
 #ifdef SUN3_SCSI_VME
     dregs->csr |= CSR_INTR;
@@ -1909,6 +1916,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
     unsigned char *data;
     unsigned char phase, tmp, extended_msg[10], old_phase=0xff;
     struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected;
+    u8 lun = sdev_scsi2lun(cmd->device);
 
 #ifdef SUN3_SCSI_VME
     dregs->csr |= CSR_INTR;
@@ -2021,7 +2029,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
 			 * polled-IO. */ 
 			printk(KERN_NOTICE "scsi%d: switching target %d "
 			       "lun %d to slow handshake\n", HOSTNO,
-			       cmd->device->id, cmd->device->lun);
+			       cmd->device->id, lun);
 			cmd->device->borken = 1;
 			NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | 
 			    ICR_ASSERT_ATN);
@@ -2079,7 +2087,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
 		    NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 		    
 		    dprintk(NDEBUG_LINKED, "scsi%d: target %d lun %d linked command "
-			       "complete.\n", HOSTNO, cmd->device->id, cmd->device->lun);
+			       "complete.\n", HOSTNO, cmd->device->id, lun);
 
 		    /* Enable reselect interrupts */
 		    NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
@@ -2092,7 +2100,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
 		    if (!cmd->next_link) {
 			 printk(KERN_NOTICE "scsi%d: target %d lun %d "
 				"linked command complete, no next_link\n",
-				HOSTNO, cmd->device->id, cmd->device->lun);
+				HOSTNO, cmd->device->id, lun);
 			    sink = 1;
 			    do_abort (instance);
 			    return;
@@ -2105,7 +2113,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
 		    cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8); 
 		    dprintk(NDEBUG_LINKED, "scsi%d: target %d lun %d linked request "
 			       "done, calling scsi_done().\n",
-			       HOSTNO, cmd->device->id, cmd->device->lun);
+			       HOSTNO, cmd->device->id, lun);
 #ifdef NCR5380_STATS
 		    collect_stats(hostdata, cmd);
 #endif
@@ -2119,7 +2127,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
 		    NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 		    hostdata->connected = NULL;
 		    dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d, lun %d "
-			      "completed\n", HOSTNO, cmd->device->id, cmd->device->lun);
+			      "completed\n", HOSTNO, cmd->device->id, lun);
 #ifdef SUPPORT_TAGS
 		    cmd_free_tag( cmd );
 		    if (status_byte(cmd->SCp.Status) == QUEUE_FULL) {
@@ -2131,16 +2139,16 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
 			 */
 			/* ++Andreas: the mid level code knows about
 			   QUEUE_FULL now. */
-			TAG_ALLOC *ta = &TagAlloc[cmd->device->id][cmd->device->lun];
+			TAG_ALLOC *ta = &TagAlloc[cmd->device->id][lun];
 			dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d returned "
 				   "QUEUE_FULL after %d commands\n",
-				   HOSTNO, cmd->device->id, cmd->device->lun,
+				   HOSTNO, cmd->device->id, lun,
 				   ta->nr_allocated);
 			if (ta->queue_size > ta->nr_allocated)
 			    ta->nr_allocated = ta->queue_size;
 		    }
 #else
-		    hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+		    hostdata->busy[cmd->device->id] &= ~(1 << lun);
 #endif
 		    /* Enable reselect interrupts */
 		    NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
@@ -2226,12 +2234,12 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
 			 * the command is treated as untagged further on.
 			 */
 			cmd->device->tagged_supported = 0;
-			hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
+			hostdata->busy[cmd->device->id] |= (1 << lun);
 			cmd->tag = TAG_NONE;
 			dprintk(NDEBUG_TAGS, "scsi%d: target %d lun %d rejected "
 				   "QUEUE_TAG message; tagged queuing "
 				   "disabled\n",
-				   HOSTNO, cmd->device->id, cmd->device->lun);
+				   HOSTNO, cmd->device->id, lun);
 			break;
 		    }
 		    break;
@@ -2248,7 +2256,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
 		    dprintk(NDEBUG_QUEUES, "scsi%d: command for target %d lun %d was "
 			      "moved from connected to the "
 			      "disconnected_queue\n", HOSTNO, 
-			      cmd->device->id, cmd->device->lun);
+			      cmd->device->id, lun);
 		    /* 
 		     * Restore phase bits to 0 so an interrupted selection, 
 		     * arbitration can resume.
@@ -2350,13 +2358,13 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
 		    } else if (tmp != EXTENDED_MESSAGE)
 			printk(KERN_DEBUG "scsi%d: rejecting unknown "
 			       "message %02x from target %d, lun %d\n",
-			       HOSTNO, tmp, cmd->device->id, cmd->device->lun);
+			       HOSTNO, tmp, cmd->device->id, lun);
 		    else
 			printk(KERN_DEBUG "scsi%d: rejecting unknown "
 			       "extended message "
 			       "code %02x, length %d from target %d, lun %d\n",
 			       HOSTNO, extended_msg[1], extended_msg[0],
-			       cmd->device->id, cmd->device->lun);
+			       cmd->device->id, lun);
    
 
 		    msgout = MESSAGE_REJECT;
@@ -2374,7 +2382,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
 #ifdef SUPPORT_TAGS
 		    cmd_free_tag( cmd );
 #else
-		    hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+		    hostdata->busy[cmd->device->id] &= ~(1 << lun);
 #endif
 		    hostdata->connected = NULL;
 		    cmd->result = DID_ERROR << 16;
@@ -2493,7 +2501,8 @@ static void NCR5380_reselect (struct Scsi_Host *instance)
 
     for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue, prev = NULL;
 	 tmp; prev = tmp, tmp = NEXT(tmp) ) {
-	if ((target_mask == (1 << tmp->device->id)) && (lun == tmp->device->lun)
+       if ((target_mask == (1 << tmp->device->id)) &&
+	   (lun == sdev_scsi2lun(tmp->device))
 #ifdef SUPPORT_TAGS
 	    && (tag == tmp->tag) 
 #endif
@@ -2577,7 +2586,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance)
     
     hostdata->connected = tmp;
     dprintk(NDEBUG_RESELECTION, "scsi%d: nexus established, target = %d, lun = %d, tag = %d\n",
-	       HOSTNO, tmp->device->id, tmp->device->lun, tmp->tag);
+	    HOSTNO, tmp->device->id, sdev_scsi2lun(tmp->device), tmp->tag);
 }
 
 
@@ -2604,6 +2613,7 @@ static int NCR5380_abort(struct scsi_cmnd *cmd)
     SETUP_HOSTDATA(instance);
     struct scsi_cmnd *tmp, **prev;
     unsigned long flags;
+    u8 lun = sdev_scsi2lun(cmd->device);
 
     printk(KERN_NOTICE "scsi%d: aborting command\n", HOSTNO);
     scsi_print_command(cmd);
@@ -2650,7 +2660,7 @@ static int NCR5380_abort(struct scsi_cmnd *cmd)
 #ifdef SUPPORT_TAGS
 	  cmd_free_tag( cmd );
 #else
-	  hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+	  hostdata->busy[cmd->device->id] &= ~(1 << lun);
 #endif
 	  local_irq_restore(flags);
 	  cmd->scsi_done(cmd);
@@ -2755,7 +2765,7 @@ static int NCR5380_abort(struct scsi_cmnd *cmd)
 #ifdef SUPPORT_TAGS
 		    cmd_free_tag( tmp );
 #else
-		    hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+		    hostdata->busy[cmd->device->id] &= ~(1 << lun);
 #endif
 		    local_irq_restore(flags);
 		    tmp->scsi_done(tmp);
diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c
index e59e6f9..2220684 100644
--- a/drivers/scsi/sym53c8xx_2/sym_glue.c
+++ b/drivers/scsi/sym53c8xx_2/sym_glue.c
@@ -313,7 +313,7 @@ static int sym_queue_command(struct sym_hcb *np, struct scsi_cmnd *cmd)
 	/*
 	 *  Select tagged/untagged.
 	 */
-	lp = sym_lp(tp, sdev->lun);
+	lp = sym_lp(tp, sdev_scsi2lun(sdev));
 	order = (lp && lp->s.reqtags) ? M_SIMPLE_TAG : 0;
 
 	/*
@@ -742,7 +742,8 @@ static int sym53c8xx_slave_alloc(struct scsi_device *sdev)
 	unsigned long flags;
 	int error;
 
-	if (sdev->id >= SYM_CONF_MAX_TARGET || sdev->lun >= SYM_CONF_MAX_LUN)
+	if (sdev->id >= SYM_CONF_MAX_TARGET ||
+	    sdev_scsi2lun(sdev) >= SYM_CONF_MAX_LUN)
 		return -ENXIO;
 
 	spin_lock_irqsave(np->s.host->host_lock, flags);
@@ -765,7 +766,7 @@ static int sym53c8xx_slave_alloc(struct scsi_device *sdev)
 	}
 
 	if (tp->usrflags & SYM_SCAN_LUNS_DISABLED) {
-		if (sdev->lun != 0) {
+		if (sdev_scsi2lun(sdev) != 0) {
 			error = -ENXIO;
 			goto out;
 		}
@@ -773,7 +774,7 @@ static int sym53c8xx_slave_alloc(struct scsi_device *sdev)
 				"Multiple LUNs disabled in NVRAM\n");
 	}
 
-	lp = sym_alloc_lcb(np, sdev->id, sdev->lun);
+	lp = sym_alloc_lcb(np, sdev->id, sdev_scsi2lun(sdev));
 	if (!lp) {
 		error = -ENOMEM;
 		goto out;
@@ -798,7 +799,7 @@ static int sym53c8xx_slave_configure(struct scsi_device *sdev)
 {
 	struct sym_hcb *np = sym_get_hcb(sdev->host);
 	struct sym_tcb *tp = &np->target[sdev->id];
-	struct sym_lcb *lp = sym_lp(tp, sdev->lun);
+	struct sym_lcb *lp = sym_lp(tp, sdev_scsi2lun(sdev));
 	int reqtags, depth_to_use;
 
 	/*
@@ -824,7 +825,7 @@ static int sym53c8xx_slave_configure(struct scsi_device *sdev)
 				sdev->tagged_supported ? MSG_SIMPLE_TAG : 0,
 				depth_to_use);
 	lp->s.scdev_depth = depth_to_use;
-	sym_tune_dev_queuing(tp, sdev->lun, reqtags);
+	sym_tune_dev_queuing(tp, sdev_scsi2lun(sdev), reqtags);
 
 	if (!spi_initial_dv(sdev->sdev_target))
 		spi_dv_device(sdev);
@@ -836,7 +837,7 @@ static void sym53c8xx_slave_destroy(struct scsi_device *sdev)
 {
 	struct sym_hcb *np = sym_get_hcb(sdev->host);
 	struct sym_tcb *tp = &np->target[sdev->id];
-	struct sym_lcb *lp = sym_lp(tp, sdev->lun);
+	struct sym_lcb *lp = sym_lp(tp, sdev_scsi2lun(sdev));
 	unsigned long flags;
 
 	/* if slave_alloc returned before allocating a sym_lcb, return */
@@ -851,11 +852,11 @@ static void sym53c8xx_slave_destroy(struct scsi_device *sdev)
 		 * so let's try to stop all on-going I/O.
 		 */
 		starget_printk(KERN_WARNING, tp->starget,
-			       "Removing busy LCB (%d)\n", (u8)sdev->lun);
+			       "Removing busy LCB (%d)\n", sdev_scsi2lun(sdev));
 		sym_reset_scsi_bus(np, 1);
 	}
 
-	if (sym_free_lcb(np, sdev->id, sdev->lun) == 0) {
+	if (sym_free_lcb(np, sdev->id, sdev_scsi2lun(sdev)) == 0) {
 		/*
 		 * It was the last unit for this target.
 		 */
diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c
index 6b349e3..7204e51 100644
--- a/drivers/scsi/sym53c8xx_2/sym_hipd.c
+++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c
@@ -4650,7 +4650,7 @@ out_stuck:
 struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char tag_order)
 {
 	u_char tn = cmd->device->id;
-	u_char ln = cmd->device->lun;
+	u_char ln = sdev_scsi2lun(cmd->device);
 	struct sym_tcb *tp = &np->target[tn];
 	struct sym_lcb *lp = sym_lp(tp, ln);
 	u_short tag = NO_TAG;
@@ -5159,14 +5159,14 @@ int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *
 	/*
 	 *  Retrieve the lun descriptor.
 	 */
-	lp = sym_lp(tp, sdev->lun);
+	lp = sym_lp(tp, sdev_scsi2lun(sdev));
 
 	can_disconnect = (cp->tag != NO_TAG) ||
 		(lp && (lp->curr_flags & SYM_DISC_ENABLED));
 
 	msgptr = cp->scsi_smsg;
 	msglen = 0;
-	msgptr[msglen++] = IDENTIFY(can_disconnect, sdev->lun);
+	msgptr[msglen++] = IDENTIFY(can_disconnect, sdev_scsi2lun(sdev));
 
 	/*
 	 *  Build the tag message if present.
@@ -5383,7 +5383,7 @@ void sym_complete_error(struct sym_hcb *np, struct sym_ccb *cp)
 	 *  Get target and lun pointers.
 	 */
 	tp = &np->target[cp->target];
-	lp = sym_lp(tp, sdev->lun);
+	lp = sym_lp(tp, sdev_scsi2lun(sdev));
 
 	/*
 	 *  Check for extended errors.
@@ -5414,7 +5414,7 @@ if (resid)
 	 *  not yet started by SCRIPTS.
 	 */
 	i = (INL(np, nc_scratcha) - np->squeue_ba) / 4;
-	i = sym_dequeue_from_squeue(np, i, cp->target, sdev->lun, -1);
+	i = sym_dequeue_from_squeue(np, i, cp->target, sdev_scsi2lun(sdev), -1);
 
 	/*
 	 *  Restart the SCRIPTS processor.
diff --git a/drivers/scsi/tmscsim.c b/drivers/scsi/tmscsim.c
index b006cf7..ea8b4c6 100644
--- a/drivers/scsi/tmscsim.c
+++ b/drivers/scsi/tmscsim.c
@@ -621,7 +621,7 @@ dc390_StartSCSI( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_sr
     {
 	dc390_freetag (pDCB, pSRB);
 	DEBUG0(printk ("DC390: Interrupt during Start SCSI (target %02i-%02i)\n",
-		scmd->device->id, scmd->device->lun));
+		       scmd->device->id, sdev_scsi2lun(scmd->device)));
 	pSRB->SRBState = SRB_READY;
 	//DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
 	pACB->SelLost++;
@@ -1726,7 +1726,9 @@ dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb*
 	    } else {
 		SET_RES_DRV(pcmd->result, DRIVER_SENSE);
 		//pSRB->ScsiCmdLen	 = (u8) (pSRB->Segment1[0] >> 8);
-		DEBUG0 (printk ("DC390: RETRY (%02x), target %02i-%02i\n", pcmd->cmnd[0], pcmd->device->id, pcmd->device->lun));
+		DEBUG0 (printk ("DC390: RETRY (%02x), target %02i-%02i\n",
+				pcmd->cmnd[0], pcmd->device->id,
+				sdev_scsi2lun(pcmd->device)));
 		pSRB->TotalXferredLen = 0;
 		SET_RES_DID(pcmd->result, DID_SOFT_ERROR);
 	    }
@@ -1746,7 +1748,9 @@ dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb*
 	else if (status == SAM_STAT_TASK_SET_FULL)
 	{
 	    scsi_track_queue_full(pcmd->device, pDCB->GoingSRBCnt - 1);
-	    DEBUG0 (printk ("DC390: RETRY (%02x), target %02i-%02i\n", pcmd->cmnd[0], pcmd->device->id, pcmd->device->lun));
+	    DEBUG0 (printk ("DC390: RETRY (%02x), target %02i-%02i\n",
+			    pcmd->cmnd[0], pcmd->device->id,
+			    sdev_scsi2lun(pcmd->device)));
 	    pSRB->TotalXferredLen = 0;
 	    SET_RES_DID(pcmd->result, DID_SOFT_ERROR);
 	}
@@ -2078,7 +2082,7 @@ static int dc390_slave_alloc(struct scsi_device *scsi_device)
 	struct dc390_acb *pACB = (struct dc390_acb*) scsi_device->host->hostdata;
 	struct dc390_dcb *pDCB, *pDCB2 = NULL;
 	uint id = scsi_device->id;
-	uint lun = scsi_device->lun;
+	uint lun = sdev_scsi2lun(scsi_device);
 
 	pDCB = kzalloc(sizeof(struct dc390_dcb), GFP_KERNEL);
 	if (!pDCB)
diff --git a/drivers/scsi/u14-34f.c b/drivers/scsi/u14-34f.c
index 5a03bb3..1ffede5 100644
--- a/drivers/scsi/u14-34f.c
+++ b/drivers/scsi/u14-34f.c
@@ -1287,12 +1287,12 @@ static int u14_34f_queuecommand_lck(struct scsi_cmnd *SCpnt, void (*done)(struct
 
    if (do_trace) printk("%s: qcomm, mbox %d, target %d.%d:%d.\n",
                         BN(j), i, SCpnt->device->channel, SCpnt->device->id,
-                        SCpnt->device->lun);
+                        sdev_scsi2lun(SCpnt->device));
 
    cpp->opcode = OP_SCSI;
    cpp->channel = SCpnt->device->channel;
    cpp->target = SCpnt->device->id;
-   cpp->lun = SCpnt->device->lun;
+   cpp->lun = sdev_scsi2lun(SCpnt->device);
    cpp->SCpnt = SCpnt;
    cpp->cdb_len = SCpnt->cmd_len;
    memcpy(cpp->cdb, SCpnt->cmnd, SCpnt->cmd_len);
@@ -1666,7 +1666,7 @@ static int reorder(unsigned int j, unsigned long cursec,
          printk("%s %d.%d:%d mb %d fc %d nr %d sec %ld ns %u"\
                 " cur %ld s:%c r:%c rev:%c in:%c ov:%c xd %d.\n",
                 (ihdlr ? "ihdlr" : "qcomm"), SCpnt->channel, SCpnt->target,
-                SCpnt->lun, k, flushcount, n_ready,
+                sdev_scsi2lun(SCpnt->device), k, flushcount, n_ready,
                 blk_rq_pos(SCpnt->request), blk_rq_sectors(SCpnt->request),
 		cursec, YESNO(s), YESNO(r), YESNO(rev), YESNO(input_only),
                 YESNO(overlap), cpp->xdir);
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 0c28772..8a0e717 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -920,7 +920,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	lrbp->sense_bufflen = SCSI_SENSE_BUFFERSIZE;
 	lrbp->sense_buffer = cmd->sense_buffer;
 	lrbp->task_tag = tag;
-	lrbp->lun = cmd->device->lun;
+	lrbp->lun = sdev_scsi2lun(cmd->device);
 	lrbp->intr_cmd = false;
 	lrbp->command_type = UTP_CMD_TYPE_SCSI;
 
@@ -1976,7 +1976,7 @@ static void ufshcd_adjust_lun_qdepth(struct scsi_cmnd *cmd)
 			 * Check if the outstanding command belongs
 			 * to the LUN which reported SAM_STAT_TASK_SET_FULL.
 			 */
-			if (cmd->device->lun == hba->lrb[i].lun)
+			if (sdev_scsi2lun(cmd->device) == hba->lrb[i].lun)
 				lun_qdepth++;
 		}
 	}
diff --git a/drivers/scsi/ultrastor.c b/drivers/scsi/ultrastor.c
index 14e0c40..a34c297 100644
--- a/drivers/scsi/ultrastor.c
+++ b/drivers/scsi/ultrastor.c
@@ -735,7 +735,7 @@ static int ultrastor_queuecommand_lck(struct scsi_cmnd *SCpnt,
     my_mscp->ca = SCpnt->device->type != TYPE_TAPE;
     my_mscp->target_id = SCpnt->device->id;
     my_mscp->ch_no = 0;
-    my_mscp->lun = SCpnt->device->lun;
+    my_mscp->lun = sdev_scsi2lun(SCpnt->device);
     if (scsi_sg_count(SCpnt)) {
 	/* Set scatter/gather flag in SCSI command packet */
 	my_mscp->sg = TRUE;
diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c
index 41883a8..a9c2575 100644
--- a/drivers/scsi/wd33c93.c
+++ b/drivers/scsi/wd33c93.c
@@ -502,7 +502,8 @@ wd33c93_execute(struct Scsi_Host *instance)
 	cmd = (struct scsi_cmnd *) hostdata->input_Q;
 	prev = NULL;
 	while (cmd) {
-		if (!(hostdata->busy[cmd->device->id] & (1 << cmd->device->lun)))
+		if (!(hostdata->busy[cmd->device->id] &
+		      (1 << sdev_scsi2lun(cmd->device))))
 			break;
 		prev = cmd;
 		cmd = (struct scsi_cmnd *) cmd->host_scribble;
@@ -593,10 +594,10 @@ wd33c93_execute(struct Scsi_Host *instance)
 
 	write_wd33c93(regs, WD_SOURCE_ID, ((cmd->SCp.phase) ? SRCID_ER : 0));
 
-	write_wd33c93(regs, WD_TARGET_LUN, cmd->device->lun);
+	write_wd33c93(regs, WD_TARGET_LUN, sdev_scsi2lun(cmd->device));
 	write_wd33c93(regs, WD_SYNCHRONOUS_TRANSFER,
 		      hostdata->sync_xfer[cmd->device->id]);
-	hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
+	hostdata->busy[cmd->device->id] |= (1 << sdev_scsi2lun(cmd->device));
 
 	if ((hostdata->level2 == L2_NONE) ||
 	    (hostdata->sync_stat[cmd->device->id] == SS_UNSET)) {
@@ -862,7 +863,7 @@ wd33c93_intr(struct Scsi_Host *instance)
 		}
 
 		cmd->result = DID_NO_CONNECT << 16;
-		hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+		hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 		hostdata->state = S_UNCONNECTED;
 		cmd->scsi_done(cmd);
 
@@ -895,7 +896,7 @@ wd33c93_intr(struct Scsi_Host *instance)
 
 		/* construct an IDENTIFY message with correct disconnect bit */
 
-		hostdata->outgoing_msg[0] = (0x80 | 0x00 | cmd->device->lun);
+		hostdata->outgoing_msg[0] = IDENTIFY(0, sdev_scsi2lun(cmd->device));
 		if (cmd->SCp.phase)
 			hostdata->outgoing_msg[0] |= 0x40;
 
@@ -1179,7 +1180,7 @@ wd33c93_intr(struct Scsi_Host *instance)
 			lun = read_wd33c93(regs, WD_TARGET_LUN);
 			DB(DB_INTR, printk(":%d.%d", cmd->SCp.Status, lun))
 			    hostdata->connected = NULL;
-			hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+			hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 			hostdata->state = S_UNCONNECTED;
 			if (cmd->SCp.Status == ILLEGAL_STATUS_BYTE)
 				cmd->SCp.Status = lun;
@@ -1268,7 +1269,7 @@ wd33c93_intr(struct Scsi_Host *instance)
 		}
 		DB(DB_INTR, printk("UNEXP_DISC"))
 		    hostdata->connected = NULL;
-		hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+		hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 		hostdata->state = S_UNCONNECTED;
 		if (cmd->cmnd[0] == REQUEST_SENSE && cmd->SCp.Status != GOOD)
 			cmd->result =
@@ -1300,7 +1301,7 @@ wd33c93_intr(struct Scsi_Host *instance)
 		switch (hostdata->state) {
 		case S_PRE_CMP_DISC:
 			hostdata->connected = NULL;
-			hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+			hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 			hostdata->state = S_UNCONNECTED;
 			DB(DB_INTR, printk(":%d", cmd->SCp.Status))
 			    if (cmd->cmnd[0] == REQUEST_SENSE
@@ -1353,7 +1354,7 @@ wd33c93_intr(struct Scsi_Host *instance)
 			if (hostdata->selecting) {
 				cmd = (struct scsi_cmnd *) hostdata->selecting;
 				hostdata->selecting = NULL;
-				hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+				hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 				cmd->host_scribble =
 				    (uchar *) hostdata->input_Q;
 				hostdata->input_Q = cmd;
@@ -1365,7 +1366,7 @@ wd33c93_intr(struct Scsi_Host *instance)
 			if (cmd) {
 				if (phs == 0x00) {
 					hostdata->busy[cmd->device->id] &=
-					    ~(1 << cmd->device->lun);
+						~(1 << sdev_scsi2lun(cmd->device));
 					cmd->host_scribble =
 					    (uchar *) hostdata->input_Q;
 					hostdata->input_Q = cmd;
@@ -1448,7 +1449,8 @@ wd33c93_intr(struct Scsi_Host *instance)
 		cmd = (struct scsi_cmnd *) hostdata->disconnected_Q;
 		patch = NULL;
 		while (cmd) {
-			if (id == cmd->device->id && lun == cmd->device->lun)
+			if (id == cmd->device->id &&
+			    lun == sdev_scsi2lun(cmd->device))
 				break;
 			patch = cmd;
 			cmd = (struct scsi_cmnd *) cmd->host_scribble;
@@ -1705,7 +1707,7 @@ wd33c93_abort(struct scsi_cmnd * cmd)
 		sr = read_wd33c93(regs, WD_SCSI_STATUS);
 		printk("asr=%02x, sr=%02x.", asr, sr);
 
-		hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
+		hostdata->busy[cmd->device->id] &= ~(1 << sdev_scsi2lun(cmd->device));
 		hostdata->connected = NULL;
 		hostdata->state = S_UNCONNECTED;
 		cmd->result = DID_ABORT << 16;
@@ -2170,7 +2172,8 @@ wd33c93_show_info(struct seq_file *m, struct Scsi_Host *instance)
 		if (hd->connected) {
 			cmd = (struct scsi_cmnd *) hd->connected;
 			seq_printf(m, " %d:%d(%02x)",
-				cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
+				   cmd->device->id, sdev_scsi2lun(cmd->device),
+				   cmd->cmnd[0]);
 		}
 	}
 	if (hd->proc & PR_INPUTQ) {
@@ -2178,7 +2181,8 @@ wd33c93_show_info(struct seq_file *m, struct Scsi_Host *instance)
 		cmd = (struct scsi_cmnd *) hd->input_Q;
 		while (cmd) {
 			seq_printf(m, " %d:%d(%02x)",
-				cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
+				   cmd->device->id, sdev_scsi2lun(cmd->device),
+				   cmd->cmnd[0]);
 			cmd = (struct scsi_cmnd *) cmd->host_scribble;
 		}
 	}
@@ -2187,7 +2191,8 @@ wd33c93_show_info(struct seq_file *m, struct Scsi_Host *instance)
 		cmd = (struct scsi_cmnd *) hd->disconnected_Q;
 		while (cmd) {
 			seq_printf(m, " %d:%d(%02x)",
-				cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
+				   cmd->device->id, sdev_scsi2lun(cmd->device),
+				   cmd->cmnd[0]);
 			cmd = (struct scsi_cmnd *) cmd->host_scribble;
 		}
 	}
diff --git a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c
index 3267423..56bf3bf 100644
--- a/drivers/scsi/wd7000.c
+++ b/drivers/scsi/wd7000.c
@@ -1093,7 +1093,8 @@ static int wd7000_queuecommand_lck(struct scsi_cmnd *SCpnt,
 	Adapter *host = (Adapter *) SCpnt->device->host->hostdata;
 
 	cdblen = SCpnt->cmd_len;
-	idlun = ((SCpnt->device->id << 5) & 0xe0) | (SCpnt->device->lun & 7);
+	idlun = ((SCpnt->device->id << 5) & 0xe0) |
+		(sdev_scsi2lun(SCpnt->device) & 7);
 	SCpnt->scsi_done = done;
 	SCpnt->SCp.phase = 1;
 	scb = alloc_scbs(SCpnt->device->host, 1);
diff --git a/drivers/staging/rts5208/rtsx.c b/drivers/staging/rts5208/rtsx.c
index c0a0e60..be0f91b 100644
--- a/drivers/staging/rts5208/rtsx.c
+++ b/drivers/staging/rts5208/rtsx.c
@@ -465,14 +465,14 @@ static int rtsx_control_thread(void *__dev)
 		else if (chip->srb->device->id) {
 			dev_err(&dev->pci->dev, "Bad target number (%d:%d)\n",
 				chip->srb->device->id,
-				chip->srb->device->lun);
+				sdev_scsi2lun(chip->srb->device));
 			chip->srb->result = DID_BAD_TARGET << 16;
 		}
 
 		else if (chip->srb->device->lun > chip->max_lun) {
 			dev_err(&dev->pci->dev, "Bad LUN (%d:%d)\n",
 				chip->srb->device->id,
-				chip->srb->device->lun);
+				sdev_scsi2lun(chip->srb->device));
 			chip->srb->result = DID_BAD_TARGET << 16;
 		}
 
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index 816e8a2..e48c60d 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -462,6 +462,11 @@ static inline unsigned int sdev_id(struct scsi_device *sdev)
 	return sdev->id;
 }
 
+static inline u8 sdev_scsi2lun(struct scsi_device *sdev)
+{
+	return (u8)(sdev->lun & 0xff);
+}
+
 #define scmd_id(scmd) sdev_id((scmd)->device)
 #define scmd_channel(scmd) sdev_channel((scmd)->device)
 
-- 
1.7.12.4


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH 2/2] ib_srp: 64bit LUN fixes
  2014-07-04 11:54 [PATCH 0/2] Fixed for 64bit LUNs Hannes Reinecke
  2014-07-04 11:54 ` [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers Hannes Reinecke
@ 2014-07-04 11:54 ` Hannes Reinecke
  2014-07-04 12:31   ` Bart Van Assche
  1 sibling, 1 reply; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-04 11:54 UTC (permalink / raw)
  To: James Bottomley
  Cc: Christoph Hellwig, linux-scsi, Hannes Reinecke, Bart van Assche

SRP is capable of handling 64bit LUNs, so as we now have proper
support for it we can modify the driver to use the standard functions.

Cc: Bart van Assche <bvanassche@acm.org>
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/infiniband/ulp/srp/ib_srp.c   |  9 ++--
 drivers/infiniband/ulp/srpt/ib_srpt.c | 81 +----------------------------------
 2 files changed, 7 insertions(+), 83 deletions(-)

diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index e3c2c5b..eb55f25 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -1713,7 +1713,8 @@ static void srp_process_aer_req(struct srp_target_port *target,
 	s32 delta = be32_to_cpu(req->req_lim_delta);
 
 	shost_printk(KERN_ERR, target->scsi_host, PFX
-		     "ignoring AER for LUN %llu\n", be64_to_cpu(req->lun));
+		     "ignoring AER for LUN %llu\n",
+		     scsilun_to_int((struct scsi_lun *)&req->lun));
 
 	if (srp_response_common(target, delta, &rsp, sizeof rsp))
 		shost_printk(KERN_ERR, target->scsi_host, PFX
@@ -1887,7 +1888,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
 	memset(cmd, 0, sizeof *cmd);
 
 	cmd->opcode = SRP_CMD;
-	cmd->lun    = cpu_to_be64((u64) scmnd->device->lun << 48);
+	int_to_scsilun(scmnd->device->lun, (struct scsi_lun *)&cmd->lun);
 	cmd->tag    = req->index;
 	memcpy(cmd->cdb, scmnd->cmnd, scmnd->cmd_len);
 
@@ -2305,7 +2306,7 @@ srp_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)
 }
 
 static int srp_send_tsk_mgmt(struct srp_target_port *target,
-			     u64 req_tag, unsigned int lun, u8 func)
+			     u64 req_tag, u64 lun, u8 func)
 {
 	struct srp_rport *rport = target->rport;
 	struct ib_device *dev = target->srp_host->srp_dev->dev;
@@ -2338,7 +2339,7 @@ static int srp_send_tsk_mgmt(struct srp_target_port *target,
 	memset(tsk_mgmt, 0, sizeof *tsk_mgmt);
 
 	tsk_mgmt->opcode 	= SRP_TSK_MGMT;
-	tsk_mgmt->lun		= cpu_to_be64((u64) lun << 48);
+	int_to_scsilun(lun, (struct scsi_lun *)&tsk_mgmt->lun);
 	tsk_mgmt->tag		= req_tag | SRP_TAG_TSK_MGMT;
 	tsk_mgmt->tsk_mgmt_func = func;
 	tsk_mgmt->task_tag	= req_tag;
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
index fe09f27..232c29a 100644
--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
@@ -1601,81 +1601,6 @@ static int srpt_build_tskmgmt_rsp(struct srpt_rdma_ch *ch,
 	return resp_len;
 }
 
-#define NO_SUCH_LUN ((uint64_t)-1LL)
-
-/*
- * SCSI LUN addressing method. See also SAM-2 and the section about
- * eight byte LUNs.
- */
-enum scsi_lun_addr_method {
-	SCSI_LUN_ADDR_METHOD_PERIPHERAL   = 0,
-	SCSI_LUN_ADDR_METHOD_FLAT         = 1,
-	SCSI_LUN_ADDR_METHOD_LUN          = 2,
-	SCSI_LUN_ADDR_METHOD_EXTENDED_LUN = 3,
-};
-
-/*
- * srpt_unpack_lun() - Convert from network LUN to linear LUN.
- *
- * Convert an 2-byte, 4-byte, 6-byte or 8-byte LUN structure in network byte
- * order (big endian) to a linear LUN. Supports three LUN addressing methods:
- * peripheral, flat and logical unit. See also SAM-2, section 4.9.4 (page 40).
- */
-static uint64_t srpt_unpack_lun(const uint8_t *lun, int len)
-{
-	uint64_t res = NO_SUCH_LUN;
-	int addressing_method;
-
-	if (unlikely(len < 2)) {
-		printk(KERN_ERR "Illegal LUN length %d, expected 2 bytes or "
-		       "more", len);
-		goto out;
-	}
-
-	switch (len) {
-	case 8:
-		if ((*((__be64 *)lun) &
-		     __constant_cpu_to_be64(0x0000FFFFFFFFFFFFLL)) != 0)
-			goto out_err;
-		break;
-	case 4:
-		if (*((__be16 *)&lun[2]) != 0)
-			goto out_err;
-		break;
-	case 6:
-		if (*((__be32 *)&lun[2]) != 0)
-			goto out_err;
-		break;
-	case 2:
-		break;
-	default:
-		goto out_err;
-	}
-
-	addressing_method = (*lun) >> 6; /* highest two bits of byte 0 */
-	switch (addressing_method) {
-	case SCSI_LUN_ADDR_METHOD_PERIPHERAL:
-	case SCSI_LUN_ADDR_METHOD_FLAT:
-	case SCSI_LUN_ADDR_METHOD_LUN:
-		res = *(lun + 1) | (((*lun) & 0x3f) << 8);
-		break;
-
-	case SCSI_LUN_ADDR_METHOD_EXTENDED_LUN:
-	default:
-		printk(KERN_ERR "Unimplemented LUN addressing method %u",
-		       addressing_method);
-		break;
-	}
-
-out:
-	return res;
-
-out_err:
-	printk(KERN_ERR "Support for multi-level LUNs has not yet been"
-	       " implemented");
-	goto out;
-}
-
 static int srpt_check_stop_free(struct se_cmd *cmd)
 {
 	struct srpt_send_ioctx *ioctx = container_of(cmd,
@@ -1728,8 +1653,7 @@ static int srpt_handle_cmd(struct srpt_rdma_ch *ch,
 		goto send_sense;
 	}
 
-	unpacked_lun = srpt_unpack_lun((uint8_t *)&srp_cmd->lun,
-				       sizeof(srp_cmd->lun));
+	unpacked_lun = scsilun_to_int((struct scsi_lun *)&srp_cmd->lun);
 	rc = target_submit_cmd(cmd, ch->sess, srp_cmd->cdb,
 			&send_ioctx->sense_data[0], unpacked_lun, data_len,
 			MSG_SIMPLE_TAG, dir, TARGET_SCF_ACK_KREF);
@@ -1840,8 +1764,7 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch,
 			TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED;
 		goto fail;
 	}
-	unpacked_lun = srpt_unpack_lun((uint8_t *)&srp_tsk->lun,
-				       sizeof(srp_tsk->lun));
+	unpacked_lun = scsilun_to_int((struct scsi_lun *)&srp_tsk->lun);
 
 	if (srp_tsk->tsk_mgmt_func == SRP_TSK_ABORT_TASK) {
 		rc = srpt_rx_mgmt_fn_tag(send_ioctx, srp_tsk->task_tag);
-- 
1.7.12.4


^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/2] ib_srp: 64bit LUN fixes
  2014-07-04 11:54 ` [PATCH 2/2] ib_srp: 64bit LUN fixes Hannes Reinecke
@ 2014-07-04 12:31   ` Bart Van Assche
  2014-07-04 13:01     ` Hannes Reinecke
  0 siblings, 1 reply; 22+ messages in thread
From: Bart Van Assche @ 2014-07-04 12:31 UTC (permalink / raw)
  To: Hannes Reinecke, James Bottomley; +Cc: Christoph Hellwig, linux-scsi

On 07/04/14 13:54, Hannes Reinecke wrote:
> SRP is capable of handling 64bit LUNs, so as we now have proper
> support for it we can modify the driver to use the standard functions.
> 
> Cc: Bart van Assche <bvanassche@acm.org>
> Signed-off-by: Hannes Reinecke <hare@suse.de>
> ---
>  drivers/infiniband/ulp/srp/ib_srp.c   |  9 ++--
>  drivers/infiniband/ulp/srpt/ib_srpt.c | 81 +----------------------------------
>  2 files changed, 7 insertions(+), 83 deletions(-)

The SRP initiator and target drivers are independent drivers so this
should be two patches instead of one. Furthermore, I do not agree with
introducing a call to int_to_scsilun() in the hot path of the initiator
driver since that causes a small but unnecessary additional overhead.
Please keep in mind that there is no need to repeat the int_to_scsilun()
conversion for every I/O request. Hence my earlier proposal to cache the
int_to_scsilun() result.

Bart.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/2] ib_srp: 64bit LUN fixes
  2014-07-04 12:31   ` Bart Van Assche
@ 2014-07-04 13:01     ` Hannes Reinecke
  2014-07-04 13:48       ` Christoph Hellwig
  0 siblings, 1 reply; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-04 13:01 UTC (permalink / raw)
  To: Bart Van Assche, James Bottomley; +Cc: Christoph Hellwig, linux-scsi

On 07/04/2014 02:31 PM, Bart Van Assche wrote:
> On 07/04/14 13:54, Hannes Reinecke wrote:
>> SRP is capable of handling 64bit LUNs, so as we now have proper
>> support for it we can modify the driver to use the standard functions.
>>
>> Cc: Bart van Assche <bvanassche@acm.org>
>> Signed-off-by: Hannes Reinecke <hare@suse.de>
>> ---
>>   drivers/infiniband/ulp/srp/ib_srp.c   |  9 ++--
>>   drivers/infiniband/ulp/srpt/ib_srpt.c | 81 +----------------------------------
>>   2 files changed, 7 insertions(+), 83 deletions(-)
>
> The SRP initiator and target drivers are independent drivers so this
> should be two patches instead of one. Furthermore, I do not agree with
> introducing a call to int_to_scsilun() in the hot path of the initiator
> driver since that causes a small but unnecessary additional overhead.
> Please keep in mind that there is no need to repeat the int_to_scsilun()
> conversion for every I/O request. Hence my earlier proposal to cache the
> int_to_scsilun() result.
>
What I would like to do is to provide accessor functions for the 
scsi lun; I've started this already for the older SCSI parallel 
drivers (see my earlier patch).
Once everything is moved over to accessors it should be trivial to 
move from the current scsilun_to_int representation in struct 
scsi_device to the 'real' LUN.

Adding another field would be bit of an overkill IMO, seeing that we 
can achieve the very same thing with a bit of code reshuffling.

James, Christoph, what's your opinion on using accessors?
Would solve this issue nicely, and we can also use proper functions 
for HBAs only capable of handling 32bit LUNs.
Drawback is that we would need accessors also for this capable of 
handling full 64bit LUNs, thus potentially incur some overhead there.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-04 11:54 ` [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers Hannes Reinecke
@ 2014-07-04 13:44   ` Christoph Hellwig
  2014-07-04 14:12     ` Hannes Reinecke
  2014-07-04 19:44   ` Douglas Gilbert
  1 sibling, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2014-07-04 13:44 UTC (permalink / raw)
  To: Hannes Reinecke; +Cc: James Bottomley, Christoph Hellwig, linux-scsi

On Fri, Jul 04, 2014 at 01:54:34PM +0200, Hannes Reinecke wrote:
> SCSI-2 defines only up to 256 LUNs with a flat namespace.
> This patch introduces an accessor 'sdev_scsi2lun' which should be
> used for these drivers to avoid problems when using 64-bit LUNs
> internally.

So what would be set in the upper 48 bits for those drivers?  We receive
the LUN over the wire to start with.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/2] ib_srp: 64bit LUN fixes
  2014-07-04 13:01     ` Hannes Reinecke
@ 2014-07-04 13:48       ` Christoph Hellwig
  2014-07-04 14:12         ` Hannes Reinecke
  0 siblings, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2014-07-04 13:48 UTC (permalink / raw)
  To: Hannes Reinecke
  Cc: Bart Van Assche, James Bottomley, Christoph Hellwig, linux-scsi

On Fri, Jul 04, 2014 at 03:01:40PM +0200, Hannes Reinecke wrote:
> What I would like to do is to provide accessor functions for the scsi lun;
> I've started this already for the older SCSI parallel drivers (see my
> earlier patch).
> Once everything is moved over to accessors it should be trivial to move from
> the current scsilun_to_int representation in struct scsi_device to the
> 'real' LUN.
> 
> Adding another field would be bit of an overkill IMO, seeing that we can
> achieve the very same thing with a bit of code reshuffling.
> 
> James, Christoph, what's your opinion on using accessors?
> Would solve this issue nicely, and we can also use proper functions for HBAs
> only capable of handling 32bit LUNs.
> Drawback is that we would need accessors also for this capable of handling
> full 64bit LUNs, thus potentially incur some overhead there.

I think storing the struct scsi_lun in the scsi_device is the right way
to go ahead.  Any "accessors" for 8 or 32-bit LUNs should be simply
enough by just ignoring bits in the array, so there's very little
performance overhead.

If we can get rid of the old scalar LUN field that would be great,
and given that we know the printk format fallout already it doesn't look
like too much work.  Do you want to look into this?


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-04 13:44   ` Christoph Hellwig
@ 2014-07-04 14:12     ` Hannes Reinecke
  2014-07-05  9:41       ` Christoph Hellwig
  0 siblings, 1 reply; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-04 14:12 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: James Bottomley, linux-scsi

On 07/04/2014 03:44 PM, Christoph Hellwig wrote:
> On Fri, Jul 04, 2014 at 01:54:34PM +0200, Hannes Reinecke wrote:
>> SCSI-2 defines only up to 256 LUNs with a flat namespace.
>> This patch introduces an accessor 'sdev_scsi2lun' which should be
>> used for these drivers to avoid problems when using 64-bit LUNs
>> internally.
>
> So what would be set in the upper 48 bits for those drivers?  We receive
> the LUN over the wire to start with.
>
None. All these devices are physically incapable of receiving or 
sending LUNs more that a byte wide.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/2] ib_srp: 64bit LUN fixes
  2014-07-04 13:48       ` Christoph Hellwig
@ 2014-07-04 14:12         ` Hannes Reinecke
  2014-07-04 14:38           ` Bart Van Assche
  0 siblings, 1 reply; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-04 14:12 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Bart Van Assche, James Bottomley, linux-scsi

On 07/04/2014 03:48 PM, Christoph Hellwig wrote:
> On Fri, Jul 04, 2014 at 03:01:40PM +0200, Hannes Reinecke wrote:
>> What I would like to do is to provide accessor functions for the scsi lun;
>> I've started this already for the older SCSI parallel drivers (see my
>> earlier patch).
>> Once everything is moved over to accessors it should be trivial to move from
>> the current scsilun_to_int representation in struct scsi_device to the
>> 'real' LUN.
>>
>> Adding another field would be bit of an overkill IMO, seeing that we can
>> achieve the very same thing with a bit of code reshuffling.
>>
>> James, Christoph, what's your opinion on using accessors?
>> Would solve this issue nicely, and we can also use proper functions for HBAs
>> only capable of handling 32bit LUNs.
>> Drawback is that we would need accessors also for this capable of handling
>> full 64bit LUNs, thus potentially incur some overhead there.
>
> I think storing the struct scsi_lun in the scsi_device is the right way
> to go ahead.  Any "accessors" for 8 or 32-bit LUNs should be simply
> enough by just ignoring bits in the array, so there's very little
> performance overhead.
>
> If we can get rid of the old scalar LUN field that would be great,
> and given that we know the printk format fallout already it doesn't look
> like too much work.  Do you want to look into this?
>
Already working on it.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/2] ib_srp: 64bit LUN fixes
  2014-07-04 14:12         ` Hannes Reinecke
@ 2014-07-04 14:38           ` Bart Van Assche
  2014-07-04 14:41             ` Hannes Reinecke
  0 siblings, 1 reply; 22+ messages in thread
From: Bart Van Assche @ 2014-07-04 14:38 UTC (permalink / raw)
  To: Hannes Reinecke, Christoph Hellwig; +Cc: James Bottomley, linux-scsi

On 07/04/14 16:12, Hannes Reinecke wrote:
> On 07/04/2014 03:48 PM, Christoph Hellwig wrote:
>> I think storing the struct scsi_lun in the scsi_device is the right way
>> to go ahead.  Any "accessors" for 8 or 32-bit LUNs should be simply
>> enough by just ignoring bits in the array, so there's very little
>> performance overhead.
>>
>> If we can get rid of the old scalar LUN field that would be great,
>> and given that we know the printk format fallout already it doesn't look
>> like too much work.  Do you want to look into this?
>
> Already working on it.

That sounds great. Regarding the SRP initiator driver: if the "__be64
lun" declarations in <scsi/srp.h> are changed into "struct scsi_lun lun"
then that allows to encode / decode LUNs inside the SRP initiator
without having to cast the address of these "lun" members into struct
scsi_lun *. In case you would prefer me to have a look into this, please
let me know.

Bart.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/2] ib_srp: 64bit LUN fixes
  2014-07-04 14:38           ` Bart Van Assche
@ 2014-07-04 14:41             ` Hannes Reinecke
  2014-07-04 16:53               ` Bart Van Assche
  0 siblings, 1 reply; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-04 14:41 UTC (permalink / raw)
  To: Bart Van Assche, Christoph Hellwig; +Cc: James Bottomley, linux-scsi

On 07/04/2014 04:38 PM, Bart Van Assche wrote:
> On 07/04/14 16:12, Hannes Reinecke wrote:
>> On 07/04/2014 03:48 PM, Christoph Hellwig wrote:
>>> I think storing the struct scsi_lun in the scsi_device is the right way
>>> to go ahead.  Any "accessors" for 8 or 32-bit LUNs should be simply
>>> enough by just ignoring bits in the array, so there's very little
>>> performance overhead.
>>>
>>> If we can get rid of the old scalar LUN field that would be great,
>>> and given that we know the printk format fallout already it doesn't look
>>> like too much work.  Do you want to look into this?
>>
>> Already working on it.
>
> That sounds great. Regarding the SRP initiator driver: if the "__be64
> lun" declarations in <scsi/srp.h> are changed into "struct scsi_lun lun"
> then that allows to encode / decode LUNs inside the SRP initiator
> without having to cast the address of these "lun" members into struct
> scsi_lun *. In case you would prefer me to have a look into this, please
> let me know.
>
That would be perfect.
Most of the HBAs supporting 64bit LUNs internally are already doing 
this.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 2/2] ib_srp: 64bit LUN fixes
  2014-07-04 14:41             ` Hannes Reinecke
@ 2014-07-04 16:53               ` Bart Van Assche
  0 siblings, 0 replies; 22+ messages in thread
From: Bart Van Assche @ 2014-07-04 16:53 UTC (permalink / raw)
  To: Hannes Reinecke, Christoph Hellwig; +Cc: James Bottomley, linux-scsi

On 07/04/14 16:41, Hannes Reinecke wrote:
> On 07/04/2014 04:38 PM, Bart Van Assche wrote:
>> On 07/04/14 16:12, Hannes Reinecke wrote:
>>> On 07/04/2014 03:48 PM, Christoph Hellwig wrote:
>>>> I think storing the struct scsi_lun in the scsi_device is the right way
>>>> to go ahead.  Any "accessors" for 8 or 32-bit LUNs should be simply
>>>> enough by just ignoring bits in the array, so there's very little
>>>> performance overhead.
>>>>
>>>> If we can get rid of the old scalar LUN field that would be great,
>>>> and given that we know the printk format fallout already it doesn't
>>>> look
>>>> like too much work.  Do you want to look into this?
>>>
>>> Already working on it.
>>
>> That sounds great. Regarding the SRP initiator driver: if the "__be64
>> lun" declarations in <scsi/srp.h> are changed into "struct scsi_lun lun"
>> then that allows to encode / decode LUNs inside the SRP initiator
>> without having to cast the address of these "lun" members into struct
>> scsi_lun *. In case you would prefer me to have a look into this, please
>> let me know.
>>
> That would be perfect.
> Most of the HBAs supporting 64bit LUNs internally are already doing this.

Here it is (compile tested only on x86 and ppc - will do more testing
once the entire series is available). Please CC all maintainers and
relevant mailing lists for the next version of the 64-bit LUN patch
series. Several IB/SRP users are reading the linux-rdma mailing list
but not the linux-scsi mailing list.


From: Bart Van Assche <bvanassche@acm.org>
Date: Fri, 4 Jul 2014 17:11:31 +0200
Subject: [PATCH] SRP: Convert lun into struct scsi_lun

Checked the following structure sizes with gdb:
* sizeof(struct srp_cmd) = 48
* sizeof(struct srp_tsk_mgmt) = 48
* sizeof(struct srp_aer_req) = 36

The ibmvscsi changes have been compile tested only (on a PPC system).

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/infiniband/ulp/srp/ib_srp.c   |  6 ++--
 drivers/infiniband/ulp/srpt/ib_srpt.c | 68 ++---------------------------------
 drivers/scsi/ibmvscsi/ibmvscsi.c      |  6 ++--
 drivers/scsi/libsrp.c                 |  7 ++--
 include/scsi/srp.h                    |  6 ++--
 5 files changed, 14 insertions(+), 79 deletions(-)

diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index b017a3a..a04f245 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -1719,7 +1719,7 @@ static void srp_process_aer_req(struct srp_target_port *target,
 	s32 delta = be32_to_cpu(req->req_lim_delta);
 
 	shost_printk(KERN_ERR, target->scsi_host, PFX
-		     "ignoring AER for LUN %llu\n", be64_to_cpu(req->lun));
+		     "ignoring AER for LUN %u\n", scsilun_to_int(&req->lun));
 
 	if (srp_response_common(target, delta, &rsp, sizeof rsp))
 		shost_printk(KERN_ERR, target->scsi_host, PFX
@@ -1914,7 +1914,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
 	memset(cmd, 0, sizeof *cmd);
 
 	cmd->opcode = SRP_CMD;
-	cmd->lun    = cpu_to_be64((u64) scmnd->device->lun << 48);
+	int_to_scsilun(scmnd->device->lun, &cmd->lun);
 	cmd->tag    = req->index;
 	memcpy(cmd->cdb, scmnd->cmnd, scmnd->cmd_len);
 
@@ -2365,7 +2365,7 @@ static int srp_send_tsk_mgmt(struct srp_target_port *target,
 	memset(tsk_mgmt, 0, sizeof *tsk_mgmt);
 
 	tsk_mgmt->opcode 	= SRP_TSK_MGMT;
-	tsk_mgmt->lun		= cpu_to_be64((u64) lun << 48);
+	int_to_scsilun(lun, &tsk_mgmt->lun);
 	tsk_mgmt->tag		= req_tag | SRP_TAG_TSK_MGMT;
 	tsk_mgmt->tsk_mgmt_func = func;
 	tsk_mgmt->task_tag	= req_tag;
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
index fe09f27..8a52cec 100644
--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
@@ -1614,68 +1614,6 @@ enum scsi_lun_addr_method {
 	SCSI_LUN_ADDR_METHOD_EXTENDED_LUN = 3,
 };
 
-/*
- * srpt_unpack_lun() - Convert from network LUN to linear LUN.
- *
- * Convert an 2-byte, 4-byte, 6-byte or 8-byte LUN structure in network byte
- * order (big endian) to a linear LUN. Supports three LUN addressing methods:
- * peripheral, flat and logical unit. See also SAM-2, section 4.9.4 (page 40).
- */
-static uint64_t srpt_unpack_lun(const uint8_t *lun, int len)
-{
-	uint64_t res = NO_SUCH_LUN;
-	int addressing_method;
-
-	if (unlikely(len < 2)) {
-		printk(KERN_ERR "Illegal LUN length %d, expected 2 bytes or "
-		       "more", len);
-		goto out;
-	}
-
-	switch (len) {
-	case 8:
-		if ((*((__be64 *)lun) &
-		     __constant_cpu_to_be64(0x0000FFFFFFFFFFFFLL)) != 0)
-			goto out_err;
-		break;
-	case 4:
-		if (*((__be16 *)&lun[2]) != 0)
-			goto out_err;
-		break;
-	case 6:
-		if (*((__be32 *)&lun[2]) != 0)
-			goto out_err;
-		break;
-	case 2:
-		break;
-	default:
-		goto out_err;
-	}
-
-	addressing_method = (*lun) >> 6; /* highest two bits of byte 0 */
-	switch (addressing_method) {
-	case SCSI_LUN_ADDR_METHOD_PERIPHERAL:
-	case SCSI_LUN_ADDR_METHOD_FLAT:
-	case SCSI_LUN_ADDR_METHOD_LUN:
-		res = *(lun + 1) | (((*lun) & 0x3f) << 8);
-		break;
-
-	case SCSI_LUN_ADDR_METHOD_EXTENDED_LUN:
-	default:
-		printk(KERN_ERR "Unimplemented LUN addressing method %u",
-		       addressing_method);
-		break;
-	}
-
-out:
-	return res;
-
-out_err:
-	printk(KERN_ERR "Support for multi-level LUNs has not yet been"
-	       " implemented");
-	goto out;
-}
-
 static int srpt_check_stop_free(struct se_cmd *cmd)
 {
 	struct srpt_send_ioctx *ioctx = container_of(cmd,
@@ -1728,8 +1666,7 @@ static int srpt_handle_cmd(struct srpt_rdma_ch *ch,
 		goto send_sense;
 	}
 
-	unpacked_lun = srpt_unpack_lun((uint8_t *)&srp_cmd->lun,
-				       sizeof(srp_cmd->lun));
+	unpacked_lun = scsilun_to_int(&srp_cmd->lun);
 	rc = target_submit_cmd(cmd, ch->sess, srp_cmd->cdb,
 			&send_ioctx->sense_data[0], unpacked_lun, data_len,
 			MSG_SIMPLE_TAG, dir, TARGET_SCF_ACK_KREF);
@@ -1840,8 +1777,7 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch,
 			TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED;
 		goto fail;
 	}
-	unpacked_lun = srpt_unpack_lun((uint8_t *)&srp_tsk->lun,
-				       sizeof(srp_tsk->lun));
+	unpacked_lun = scsilun_to_int(&srp_tsk->lun);
 
 	if (srp_tsk->tsk_mgmt_func == SRP_TSK_ABORT_TASK) {
 		rc = srpt_rx_mgmt_fn_tag(send_ioctx, srp_tsk->task_tag);
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
index 2ebfb2b..34fcfc5 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
@@ -1042,7 +1042,7 @@ static int ibmvscsi_queuecommand_lck(struct scsi_cmnd *cmnd,
 	memset(srp_cmd, 0x00, SRP_MAX_IU_LEN);
 	srp_cmd->opcode = SRP_CMD;
 	memcpy(srp_cmd->cdb, cmnd->cmnd, sizeof(srp_cmd->cdb));
-	srp_cmd->lun = cpu_to_be64(((u64)lun) << 48);
+	int_to_scsilun(lun, &srp_cmd->lun);
 
 	if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata->dev)) {
 		if (!firmware_has_feature(FW_FEATURE_CMO))
@@ -1518,7 +1518,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
 		/* Set up an abort SRP command */
 		memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt));
 		tsk_mgmt->opcode = SRP_TSK_MGMT;
-		tsk_mgmt->lun = cpu_to_be64(((u64) lun) << 48);
+		int_to_scsilun(lun, &tsk_mgmt->lun);
 		tsk_mgmt->tsk_mgmt_func = SRP_TSK_ABORT_TASK;
 		tsk_mgmt->task_tag = (u64) found_evt;
 
@@ -1641,7 +1641,7 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd)
 		/* Set up a lun reset SRP command */
 		memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt));
 		tsk_mgmt->opcode = SRP_TSK_MGMT;
-		tsk_mgmt->lun = cpu_to_be64(((u64) lun) << 48);
+		int_to_scsilun(lun, &tsk_mgmt->lun);
 		tsk_mgmt->tsk_mgmt_func = SRP_TSK_LUN_RESET;
 
 		evt->sync_srp = &srp_rsp;
diff --git a/drivers/scsi/libsrp.c b/drivers/scsi/libsrp.c
index 0707ecd..0768051 100644
--- a/drivers/scsi/libsrp.c
+++ b/drivers/scsi/libsrp.c
@@ -421,8 +421,8 @@ int srp_cmd_queue(struct Scsi_Host *shost, struct srp_cmd *cmd, void *info,
 	dir = srp_cmd_direction(cmd);
 	len = vscsis_data_length(cmd, dir);
 
-	dprintk("%p %x %lx %d %d %d %llx\n", info, cmd->cdb[0],
-		cmd->lun, dir, len, tag, (unsigned long long) cmd->tag);
+	dprintk("%p %x %u %d %d %d %llx\n", info, cmd->cdb[0],
+		scsilun_to_int(&cmd->lun), dir, len, tag, cmd->tag);
 
 	sc = scsi_host_get_command(shost, dir, GFP_KERNEL);
 	if (!sc)
@@ -433,8 +433,7 @@ int srp_cmd_queue(struct Scsi_Host *shost, struct srp_cmd *cmd, void *info,
 	sc->sdb.length = len;
 	sc->sdb.table.sgl = (void *) (unsigned long) addr;
 	sc->tag = tag;
-	err = scsi_tgt_queue_command(sc, itn_id, (struct scsi_lun *)&cmd->lun,
-				     cmd->tag);
+	err = scsi_tgt_queue_command(sc, itn_id, &cmd->lun, cmd->tag);
 	if (err)
 		scsi_host_put_command(shost, sc);
 
diff --git a/include/scsi/srp.h b/include/scsi/srp.h
index 1ae84db..4844516 100644
--- a/include/scsi/srp.h
+++ b/include/scsi/srp.h
@@ -179,7 +179,7 @@ struct srp_tsk_mgmt {
 	u8	reserved1[6];
 	u64	tag;
 	u8	reserved2[4];
-	__be64	lun __attribute__((packed));
+	struct scsi_lun	lun;
 	u8	reserved3[2];
 	u8	tsk_mgmt_func;
 	u8	reserved4;
@@ -200,7 +200,7 @@ struct srp_cmd {
 	u8	data_in_desc_cnt;
 	u64	tag;
 	u8	reserved2[4];
-	__be64	lun __attribute__((packed));
+	struct scsi_lun	lun;
 	u8	reserved3;
 	u8	task_attr;
 	u8	reserved4;
@@ -265,7 +265,7 @@ struct srp_aer_req {
 	__be32	req_lim_delta;
 	u64	tag;
 	u32	reserved2;
-	__be64	lun;
+	struct scsi_lun	lun;
 	__be32	sense_data_len;
 	u32	reserved3;
 	u8	sense_data[0];
-- 
1.8.4.5



^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-04 11:54 ` [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers Hannes Reinecke
  2014-07-04 13:44   ` Christoph Hellwig
@ 2014-07-04 19:44   ` Douglas Gilbert
  2014-07-04 20:14     ` Elliott, Robert (Server Storage)
  2014-07-07  5:47     ` Hannes Reinecke
  1 sibling, 2 replies; 22+ messages in thread
From: Douglas Gilbert @ 2014-07-04 19:44 UTC (permalink / raw)
  To: Hannes Reinecke, James Bottomley; +Cc: Christoph Hellwig, linux-scsi

On 14-07-04 07:54 AM, Hannes Reinecke wrote:
> SCSI-2 defines only up to 256 LUNs with a flat namespace.

My SCSI-2 draft (revision 10b from August 1989) only has
3 bit LUNs placed in byte 1 of the command block, in the top
3 bits. There are also things called LUNTARs and LUNTRNs
at the message level.

8 bit LUNs do ring a distant bell, perhaps after SCSI-2?

Doug Gilbert


^ permalink raw reply	[flat|nested] 22+ messages in thread

* RE: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-04 19:44   ` Douglas Gilbert
@ 2014-07-04 20:14     ` Elliott, Robert (Server Storage)
  2014-07-07  5:47     ` Hannes Reinecke
  1 sibling, 0 replies; 22+ messages in thread
From: Elliott, Robert (Server Storage) @ 2014-07-04 20:14 UTC (permalink / raw)
  To: dgilbert, Hannes Reinecke, James Bottomley; +Cc: Christoph Hellwig, linux-scsi



> -----Original Message-----
> From: linux-scsi-owner@vger.kernel.org [mailto:linux-scsi-
> owner@vger.kernel.org] On Behalf Of Douglas Gilbert
> Sent: Friday, 04 July, 2014 2:44 PM
> To: Hannes Reinecke; James Bottomley
> Cc: Christoph Hellwig; linux-scsi@vger.kernel.org
> Subject: Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
> 
> On 14-07-04 07:54 AM, Hannes Reinecke wrote:
> > SCSI-2 defines only up to 256 LUNs with a flat namespace.
> 
> My SCSI-2 draft (revision 10b from August 1989) only has
> 3 bit LUNs placed in byte 1 of the command block, in the top
> 3 bits. There are also things called LUNTARs and LUNTRNs
> at the message level.
> 
> 8 bit LUNs do ring a distant bell, perhaps after SCSI-2?
> 
> Doug Gilbert

The hierarchical LUN structures have some limited size
LUN subfields:
* the peripheral device addressing method includes an 8-bit 
  TARGET OR LUN subfield, which specifies an 8-bit LUN at the 
  current level (if the BUS IDENTIFIER field is 0)
* the logical unit addressing method has a 5-bit LUN subfield


---
Rob Elliott    HP Server Storage




^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-04 14:12     ` Hannes Reinecke
@ 2014-07-05  9:41       ` Christoph Hellwig
  2014-07-07  7:54         ` Hannes Reinecke
  0 siblings, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2014-07-05  9:41 UTC (permalink / raw)
  To: Hannes Reinecke; +Cc: Christoph Hellwig, James Bottomley, linux-scsi

On Fri, Jul 04, 2014 at 04:12:22PM +0200, Hannes Reinecke wrote:
> >So what would be set in the upper 48 bits for those drivers?  We receive
> >the LUN over the wire to start with.
> >
> None. All these devices are physically incapable of receiving or sending
> LUNs more that a byte wide.

So what problems does this patch fix then?


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-04 19:44   ` Douglas Gilbert
  2014-07-04 20:14     ` Elliott, Robert (Server Storage)
@ 2014-07-07  5:47     ` Hannes Reinecke
  1 sibling, 0 replies; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-07  5:47 UTC (permalink / raw)
  To: dgilbert, James Bottomley; +Cc: Christoph Hellwig, linux-scsi

On 07/04/2014 09:44 PM, Douglas Gilbert wrote:
> On 14-07-04 07:54 AM, Hannes Reinecke wrote:
>> SCSI-2 defines only up to 256 LUNs with a flat namespace.
>
> My SCSI-2 draft (revision 10b from August 1989) only has
> 3 bit LUNs placed in byte 1 of the command block, in the top
> 3 bits. There are also things called LUNTARs and LUNTRNs
> at the message level.
>
> 8 bit LUNs do ring a distant bell, perhaps after SCSI-2?
>
Yeah, you're right. SCSI-2 defines a 3-byte LUN; starting with SCSI-3 it 
went to 64bit.

I'll be renaming them to 'sdev_lun8'.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-05  9:41       ` Christoph Hellwig
@ 2014-07-07  7:54         ` Hannes Reinecke
  2014-07-07  7:59           ` Hannes Reinecke
  2014-07-07  9:37           ` Christoph Hellwig
  0 siblings, 2 replies; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-07  7:54 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: James Bottomley, linux-scsi

On 07/05/2014 11:41 AM, Christoph Hellwig wrote:
> On Fri, Jul 04, 2014 at 04:12:22PM +0200, Hannes Reinecke wrote:
>>> So what would be set in the upper 48 bits for those drivers?  We receive
>>> the LUN over the wire to start with.
>>>
>> None. All these devices are physically incapable of receiving or sending
>> LUNs more that a byte wide.
>
> So what problems does this patch fix then?
>
The intention is twofold:

1) Isolate from any fallout due to the 64bit LUN changes. By 
introducing accessors we are guaranteed that the drivers will only 
ever see LUN numbers they are expecting.
2) Using accessors allows us to eventually change the ->lun field to 
'struct scsi_lun', and call 'scsilun_to_int' only for display 
purposes. This will address the objection by Bart for
ib_srp, but applies to other drivers as well.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-07  7:54         ` Hannes Reinecke
@ 2014-07-07  7:59           ` Hannes Reinecke
  2014-07-07  9:37           ` Christoph Hellwig
  1 sibling, 0 replies; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-07  7:59 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: James Bottomley, linux-scsi

On 07/07/2014 09:54 AM, Hannes Reinecke wrote:
> On 07/05/2014 11:41 AM, Christoph Hellwig wrote:
>> On Fri, Jul 04, 2014 at 04:12:22PM +0200, Hannes Reinecke wrote:
>>>> So what would be set in the upper 48 bits for those drivers?  We
>>>> receive
>>>> the LUN over the wire to start with.
>>>>
>>> None. All these devices are physically incapable of receiving or
>>> sending
>>> LUNs more that a byte wide.
>>
>> So what problems does this patch fix then?
>>
> The intention is twofold:
>
> 1) Isolate from any fallout due to the 64bit LUN changes. By
> introducing accessors we are guaranteed that the drivers will only
> ever see LUN numbers they are expecting.
> 2) Using accessors allows us to eventually change the ->lun field to
> 'struct scsi_lun', and call 'scsilun_to_int' only for display
> purposes. This will address the objection by Bart for
> ib_srp, but applies to other drivers as well.
>
Oh. And it addresses the build issues Fengguang has been seen during 
automated kernel builds.
Of course.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-07  7:54         ` Hannes Reinecke
  2014-07-07  7:59           ` Hannes Reinecke
@ 2014-07-07  9:37           ` Christoph Hellwig
  2014-07-07 10:05             ` Hannes Reinecke
  1 sibling, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2014-07-07  9:37 UTC (permalink / raw)
  To: Hannes Reinecke; +Cc: James Bottomley, linux-scsi

On Mon, Jul 07, 2014 at 09:54:51AM +0200, Hannes Reinecke wrote:
> 1) Isolate from any fallout due to the 64bit LUN changes. By introducing
> accessors we are guaranteed that the drivers will only ever see LUN numbers
> they are expecting.

I really don't see the point.  The LUNs have to be passed up from the
driver anyway, so seeing anything unexpect just doesn't make sense.
Furthermore if we really are worried about this we should have asserts
that the higher bytes aren't set, and also take care of the even more
limited LUN size for SCSI-2.

> 2) Using accessors allows us to eventually change the ->lun field to 'struct
> scsi_lun', and call 'scsilun_to_int' only for display purposes. This will
> address the objection by Bart for
> ib_srp, but applies to other drivers as well.

So, for any SAM based drivers struct scsi_lun is the wire format anyway,
so those are easy.  For SCSI-2 and older we can just use scsilun_to_int
and easily get the back the LUN that came over the wire.  Is it worth to
micro optimize by not looking at the other fields?  I'd say no, but even
if it is I'd rather see this as part of the series moving to embedding
the scsi_lun.

FYI, I've merged your first set of fixes for the printk specifiers, but
I've not merged anything fixing the other warnings that the build but
sent reports for for now.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-07  9:37           ` Christoph Hellwig
@ 2014-07-07 10:05             ` Hannes Reinecke
  2014-07-07 10:11               ` Christoph Hellwig
  0 siblings, 1 reply; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-07 10:05 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: James Bottomley, linux-scsi

On 07/07/2014 11:37 AM, Christoph Hellwig wrote:
> On Mon, Jul 07, 2014 at 09:54:51AM +0200, Hannes Reinecke wrote:
>> 1) Isolate from any fallout due to the 64bit LUN changes. By introducing
>> accessors we are guaranteed that the drivers will only ever see LUN numbers
>> they are expecting.
>
> I really don't see the point.  The LUNs have to be passed up from the
> driver anyway, so seeing anything unexpect just doesn't make sense.
> Furthermore if we really are worried about this we should have asserts
> that the higher bytes aren't set, and also take care of the even more
> limited LUN size for SCSI-2.
>
>> 2) Using accessors allows us to eventually change the ->lun field to 'struct
>> scsi_lun', and call 'scsilun_to_int' only for display purposes. This will
>> address the objection by Bart for
>> ib_srp, but applies to other drivers as well.
>
> So, for any SAM based drivers struct scsi_lun is the wire format anyway,
> so those are easy.  For SCSI-2 and older we can just use scsilun_to_int
> and easily get the back the LUN that came over the wire.  Is it worth to
> micro optimize by not looking at the other fields?  I'd say no, but even
> if it is I'd rather see this as part of the series moving to embedding
> the scsi_lun.
>
> FYI, I've merged your first set of fixes for the printk specifiers, but
> I've not merged anything fixing the other warnings that the build but
> sent reports for for now.
>
Ok, so I'll be sending a patchset for fixing up the build warnings
(and keeping the current accesses to ->lun), and prepare a different 
patchset moving everything onto accessors so that we can use struct 
scsi_lun directly.
Agreed?

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-07 10:05             ` Hannes Reinecke
@ 2014-07-07 10:11               ` Christoph Hellwig
  2014-07-07 14:10                 ` Hannes Reinecke
  0 siblings, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2014-07-07 10:11 UTC (permalink / raw)
  To: Hannes Reinecke; +Cc: Christoph Hellwig, James Bottomley, linux-scsi

On Mon, Jul 07, 2014 at 12:05:04PM +0200, Hannes Reinecke wrote:
> Ok, so I'll be sending a patchset for fixing up the build warnings
> (and keeping the current accesses to ->lun), and prepare a different
> patchset moving everything onto accessors so that we can use struct scsi_lun
> directly.
> Agreed?

That would be my preference, yes.

Btw, re the build warnings:  what's the reason you prefer casts to u8
over just using the %lld printk specifier?  Avoiding casts generally
seems to be the cleaner variant to me.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers
  2014-07-07 10:11               ` Christoph Hellwig
@ 2014-07-07 14:10                 ` Hannes Reinecke
  0 siblings, 0 replies; 22+ messages in thread
From: Hannes Reinecke @ 2014-07-07 14:10 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: James Bottomley, linux-scsi

On 07/07/2014 12:11 PM, Christoph Hellwig wrote:
> On Mon, Jul 07, 2014 at 12:05:04PM +0200, Hannes Reinecke wrote:
>> Ok, so I'll be sending a patchset for fixing up the build warnings
>> (and keeping the current accesses to ->lun), and prepare a different
>> patchset moving everything onto accessors so that we can use struct scsi_lun
>> directly.
>> Agreed?
>
> That would be my preference, yes.
>
> Btw, re the build warnings:  what's the reason you prefer casts to u8
> over just using the %lld printk specifier?  Avoiding casts generally
> seems to be the cleaner variant to me.
>
Yeah, I've been a bit inconsistent here.
In general I've been using 'u8' casts for the older SCSI parallel
drivers, on the grounds they'll never be seeing any LUN numbers 
higher than that and I don't have to modify the printk output here.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2014-07-07 14:10 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-04 11:54 [PATCH 0/2] Fixed for 64bit LUNs Hannes Reinecke
2014-07-04 11:54 ` [PATCH 1/2] Use sdev_scsi2lun for SCSI parallel drivers Hannes Reinecke
2014-07-04 13:44   ` Christoph Hellwig
2014-07-04 14:12     ` Hannes Reinecke
2014-07-05  9:41       ` Christoph Hellwig
2014-07-07  7:54         ` Hannes Reinecke
2014-07-07  7:59           ` Hannes Reinecke
2014-07-07  9:37           ` Christoph Hellwig
2014-07-07 10:05             ` Hannes Reinecke
2014-07-07 10:11               ` Christoph Hellwig
2014-07-07 14:10                 ` Hannes Reinecke
2014-07-04 19:44   ` Douglas Gilbert
2014-07-04 20:14     ` Elliott, Robert (Server Storage)
2014-07-07  5:47     ` Hannes Reinecke
2014-07-04 11:54 ` [PATCH 2/2] ib_srp: 64bit LUN fixes Hannes Reinecke
2014-07-04 12:31   ` Bart Van Assche
2014-07-04 13:01     ` Hannes Reinecke
2014-07-04 13:48       ` Christoph Hellwig
2014-07-04 14:12         ` Hannes Reinecke
2014-07-04 14:38           ` Bart Van Assche
2014-07-04 14:41             ` Hannes Reinecke
2014-07-04 16:53               ` Bart Van Assche

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.