Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: arm: Move the SCSI pointer to private command data

Set .cmd_size in the SCSI host template instead of using the SCSI pointer
from struct scsi_cmnd. This patch prepares for removal of the SCSI pointer
from struct scsi_cmnd. The ARM SCSI drivers have been identified as follows:
$ git grep -l '#include.*arm_scsi.h'
drivers/scsi/arm/acornscsi.c
drivers/scsi/arm/cumana_2.c
drivers/scsi/arm/eesox.c
drivers/scsi/arm/fas216.c
drivers/scsi/arm/powertec.c

Link: https://lore.kernel.org/r/20220218195117.25689-11-bvanassche@acm.org
Cc: Russell King <linux@armlinux.org.uk>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Bart Van Assche and committed by
Martin K. Petersen
dc417545 8c97e2f3

+56 -29
+12 -8
drivers/scsi/arm/acornscsi.c
··· 729 729 */ 730 730 host->scsi.phase = PHASE_CONNECTING; 731 731 host->SCpnt = SCpnt; 732 - host->scsi.SCp = SCpnt->SCp; 732 + host->scsi.SCp = *arm_scsi_pointer(SCpnt); 733 733 host->dma.xfer_setup = 0; 734 734 host->dma.xfer_required = 0; 735 735 host->dma.xfer_done = 0; ··· 1424 1424 static 1425 1425 void acornscsi_message(AS_Host *host) 1426 1426 { 1427 + struct scsi_pointer *scsi_pointer; 1427 1428 unsigned char message[16]; 1428 1429 unsigned int msgidx = 0, msglen = 1; 1429 1430 ··· 1494 1493 * the saved data pointer for the current I/O process. 1495 1494 */ 1496 1495 acornscsi_dma_cleanup(host); 1497 - host->SCpnt->SCp = host->scsi.SCp; 1498 - host->SCpnt->SCp.sent_command = 0; 1496 + scsi_pointer = arm_scsi_pointer(host->SCpnt); 1497 + *scsi_pointer = host->scsi.SCp; 1498 + scsi_pointer->sent_command = 0; 1499 1499 host->scsi.phase = PHASE_MSGIN; 1500 1500 break; 1501 1501 ··· 1511 1509 * the present command and status areas.' 1512 1510 */ 1513 1511 acornscsi_dma_cleanup(host); 1514 - host->scsi.SCp = host->SCpnt->SCp; 1512 + host->scsi.SCp = *arm_scsi_pointer(host->SCpnt); 1515 1513 host->scsi.phase = PHASE_MSGIN; 1516 1514 break; 1517 1515 ··· 1811 1809 /* 1812 1810 * Restore data pointer from SAVED pointers. 1813 1811 */ 1814 - host->scsi.SCp = host->SCpnt->SCp; 1812 + host->scsi.SCp = *arm_scsi_pointer(host->SCpnt); 1815 1813 #if (DEBUG & (DEBUG_QUEUES|DEBUG_DISCON)) 1816 1814 printk(", data pointers: [%p, %X]", 1817 1815 host->scsi.SCp.ptr, host->scsi.SCp.this_residual); ··· 2410 2408 */ 2411 2409 static int acornscsi_queuecmd_lck(struct scsi_cmnd *SCpnt) 2412 2410 { 2411 + struct scsi_pointer *scsi_pointer = arm_scsi_pointer(SCpnt); 2413 2412 void (*done)(struct scsi_cmnd *) = scsi_done; 2414 2413 AS_Host *host = (AS_Host *)SCpnt->device->host->hostdata; 2415 2414 ··· 2426 2423 2427 2424 SCpnt->host_scribble = NULL; 2428 2425 SCpnt->result = 0; 2429 - SCpnt->SCp.phase = (int)acornscsi_datadirection(SCpnt->cmnd[0]); 2430 - SCpnt->SCp.sent_command = 0; 2431 - SCpnt->SCp.scsi_xferred = 0; 2426 + scsi_pointer->phase = (int)acornscsi_datadirection(SCpnt->cmnd[0]); 2427 + scsi_pointer->sent_command = 0; 2428 + scsi_pointer->scsi_xferred = 0; 2432 2429 2433 2430 init_SCp(SCpnt); 2434 2431 ··· 2794 2791 .cmd_per_lun = 2, 2795 2792 .dma_boundary = PAGE_SIZE - 1, 2796 2793 .proc_name = "acornscsi", 2794 + .cmd_size = sizeof(struct arm_cmd_priv), 2797 2795 }; 2798 2796 2799 2797 static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
+23 -10
drivers/scsi/arm/arm_scsi.h
··· 9 9 10 10 #define BELT_AND_BRACES 11 11 12 + struct arm_cmd_priv { 13 + struct scsi_pointer scsi_pointer; 14 + }; 15 + 16 + static inline struct scsi_pointer *arm_scsi_pointer(struct scsi_cmnd *cmd) 17 + { 18 + struct arm_cmd_priv *acmd = scsi_cmd_priv(cmd); 19 + 20 + return &acmd->scsi_pointer; 21 + } 22 + 12 23 /* 13 24 * The scatter-gather list handling. This contains all 14 25 * the yucky stuff that needs to be fixed properly. ··· 87 76 88 77 static inline void init_SCp(struct scsi_cmnd *SCpnt) 89 78 { 90 - memset(&SCpnt->SCp, 0, sizeof(struct scsi_pointer)); 79 + struct scsi_pointer *scsi_pointer = arm_scsi_pointer(SCpnt); 80 + 81 + memset(scsi_pointer, 0, sizeof(struct scsi_pointer)); 91 82 92 83 if (scsi_bufflen(SCpnt)) { 93 84 unsigned long len = 0; 94 85 95 - SCpnt->SCp.buffer = scsi_sglist(SCpnt); 96 - SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1; 97 - SCpnt->SCp.ptr = sg_virt(SCpnt->SCp.buffer); 98 - SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; 99 - SCpnt->SCp.phase = scsi_bufflen(SCpnt); 86 + scsi_pointer->buffer = scsi_sglist(SCpnt); 87 + scsi_pointer->buffers_residual = scsi_sg_count(SCpnt) - 1; 88 + scsi_pointer->ptr = sg_virt(scsi_pointer->buffer); 89 + scsi_pointer->this_residual = scsi_pointer->buffer->length; 90 + scsi_pointer->phase = scsi_bufflen(SCpnt); 100 91 101 92 #ifdef BELT_AND_BRACES 102 93 { /* ··· 122 109 * FIXME: Totaly naive fixup. We should abort 123 110 * with error 124 111 */ 125 - SCpnt->SCp.phase = 112 + scsi_pointer->phase = 126 113 min_t(unsigned long, len, 127 114 scsi_bufflen(SCpnt)); 128 115 } 129 116 } 130 117 #endif 131 118 } else { 132 - SCpnt->SCp.ptr = NULL; 133 - SCpnt->SCp.this_residual = 0; 134 - SCpnt->SCp.phase = 0; 119 + scsi_pointer->ptr = NULL; 120 + scsi_pointer->this_residual = 0; 121 + scsi_pointer->phase = 0; 135 122 } 136 123 }
+17 -11
drivers/scsi/arm/fas216.c
··· 761 761 fas216_log(info, LOG_ERROR, "null buffer passed to " 762 762 "fas216_starttransfer"); 763 763 print_SCp(&info->scsi.SCp, "SCp: ", "\n"); 764 - print_SCp(&info->SCpnt->SCp, "Cmnd SCp: ", "\n"); 764 + print_SCp(arm_scsi_pointer(info->SCpnt), "Cmnd SCp: ", "\n"); 765 765 return; 766 766 } 767 767 ··· 1011 1011 /* 1012 1012 * Restore data pointer from SAVED data pointer 1013 1013 */ 1014 - info->scsi.SCp = info->SCpnt->SCp; 1014 + info->scsi.SCp = *arm_scsi_pointer(info->SCpnt); 1015 1015 1016 1016 fas216_log(info, LOG_CONNECT, "data pointers: [%p, %X]", 1017 1017 info->scsi.SCp.ptr, info->scsi.SCp.this_residual); ··· 1054 1054 1055 1055 static void fas216_parse_message(FAS216_Info *info, unsigned char *message, int msglen) 1056 1056 { 1057 + struct scsi_pointer *scsi_pointer; 1057 1058 int i; 1058 1059 1059 1060 switch (message[0]) { ··· 1079 1078 * as required by the SCSI II standard. These always 1080 1079 * point to the start of their respective areas. 1081 1080 */ 1082 - info->SCpnt->SCp = info->scsi.SCp; 1083 - info->SCpnt->SCp.sent_command = 0; 1081 + scsi_pointer = arm_scsi_pointer(info->SCpnt); 1082 + *scsi_pointer = info->scsi.SCp; 1083 + scsi_pointer->sent_command = 0; 1084 1084 fas216_log(info, LOG_CONNECT | LOG_MESSAGES | LOG_BUFFER, 1085 1085 "save data pointers: [%p, %X]", 1086 1086 info->scsi.SCp.ptr, info->scsi.SCp.this_residual); ··· 1094 1092 /* 1095 1093 * Restore current data pointer from SAVED data pointer 1096 1094 */ 1097 - info->scsi.SCp = info->SCpnt->SCp; 1095 + info->scsi.SCp = *arm_scsi_pointer(info->SCpnt); 1098 1096 fas216_log(info, LOG_CONNECT | LOG_MESSAGES | LOG_BUFFER, 1099 1097 "restore data pointers: [%p, 0x%x]", 1100 1098 info->scsi.SCp.ptr, info->scsi.SCp.this_residual); ··· 1772 1770 * claim host busy 1773 1771 */ 1774 1772 info->scsi.phase = PHASE_SELECTION; 1775 - info->scsi.SCp = SCpnt->SCp; 1773 + info->scsi.SCp = *arm_scsi_pointer(SCpnt); 1776 1774 info->SCpnt = SCpnt; 1777 1775 info->dma.transfer_type = fasdma_none; 1778 1776 ··· 1851 1849 * claim host busy 1852 1850 */ 1853 1851 info->scsi.phase = PHASE_SELECTION; 1854 - info->scsi.SCp = SCpnt->SCp; 1852 + info->scsi.SCp = *arm_scsi_pointer(SCpnt); 1855 1853 info->SCpnt = SCpnt; 1856 1854 info->dma.transfer_type = fasdma_none; 1857 1855 ··· 2001 1999 static void fas216_rq_sns_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, 2002 2000 unsigned int result) 2003 2001 { 2002 + struct scsi_pointer *scsi_pointer = arm_scsi_pointer(SCpnt); 2003 + 2004 2004 fas216_log_target(info, LOG_CONNECT, SCpnt->device->id, 2005 2005 "request sense complete, result=0x%04x%02x%02x", 2006 - result, SCpnt->SCp.Message, SCpnt->SCp.Status); 2006 + result, scsi_pointer->Message, scsi_pointer->Status); 2007 2007 2008 - if (result != DID_OK || SCpnt->SCp.Status != SAM_STAT_GOOD) 2008 + if (result != DID_OK || scsi_pointer->Status != SAM_STAT_GOOD) 2009 2009 /* 2010 2010 * Something went wrong. Make sure that we don't 2011 2011 * have valid data in the sense buffer that could ··· 2037 2033 static void 2038 2034 fas216_std_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, unsigned int result) 2039 2035 { 2036 + struct scsi_pointer *scsi_pointer = arm_scsi_pointer(SCpnt); 2037 + 2040 2038 info->stats.fins += 1; 2041 2039 2042 2040 set_host_byte(SCpnt, result); ··· 2113 2107 fas216_log_target(info, LOG_CONNECT, SCpnt->device->id, 2114 2108 "requesting sense"); 2115 2109 init_SCp(SCpnt); 2116 - SCpnt->SCp.Message = 0; 2117 - SCpnt->SCp.Status = 0; 2110 + scsi_pointer->Message = 0; 2111 + scsi_pointer->Status = 0; 2118 2112 SCpnt->host_scribble = (void *)fas216_rq_sns_done; 2119 2113 2120 2114 /*
+4
drivers/scsi/arm/fas216.h
··· 312 312 313 313 /* driver-private data per SCSI command. */ 314 314 struct fas216_cmd_priv { 315 + /* 316 + * @scsi_pointer must be the first member. See also arm_scsi_pointer(). 317 + */ 318 + struct scsi_pointer scsi_pointer; 315 319 void (*scsi_done)(struct scsi_cmnd *cmd); 316 320 }; 317 321