Re: [PATCH 3/4] aacraid: use blk_mq_rq_busy_iter() for traversing outstanding commands

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/1/19 4:34 PM, Bart Van Assche wrote:
On 11/1/19 4:18 AM, Hannes Reinecke wrote:
+static bool synchronize_busy_iter(struct request *req, void *data, bool reserved)
+{
+    struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
+    struct synchronize_busy_data *busy_data = data;
+
+    if (busy_data->sdev == cmd->device &&
+        cmd->SCp.phase == AAC_OWNER_FIRMWARE) {
+        u64 cmnd_lba;
+        u32 cmnd_count;
+
+        if (cmd->cmnd[0] == WRITE_6) {
+            cmnd_lba = ((cmd->cmnd[1] & 0x1F) << 16) |
+                (cmd->cmnd[2] << 8) |
+                cmd->cmnd[3];
+            cmnd_count = cmd->cmnd[4];
+            if (cmnd_count == 0)
+                cmnd_count = 256;
+        } else if (cmd->cmnd[0] == WRITE_16) {
+            cmnd_lba = ((u64)cmd->cmnd[2] << 56) |
+                ((u64)cmd->cmnd[3] << 48) |
+                ((u64)cmd->cmnd[4] << 40) |
+                ((u64)cmd->cmnd[5] << 32) |
+                ((u64)cmd->cmnd[6] << 24) |
+                (cmd->cmnd[7] << 16) |
+                (cmd->cmnd[8] << 8) |
+                cmd->cmnd[9];
+            cmnd_count = (cmd->cmnd[10] << 24) |
+                (cmd->cmnd[11] << 16) |
+                (cmd->cmnd[12] << 8) |
+                cmd->cmnd[13];
+        } else if (cmd->cmnd[0] == WRITE_12) {
+            cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
+                (cmd->cmnd[3] << 16) |
+                (cmd->cmnd[4] << 8) |
+                cmd->cmnd[5];
+            cmnd_count = (cmd->cmnd[6] << 24) |
+                (cmd->cmnd[7] << 16) |
+                (cmd->cmnd[8] << 8) |
+                cmd->cmnd[9];
+        } else if (cmd->cmnd[0] == WRITE_10) {
+            cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
+                (cmd->cmnd[3] << 16) |
+                (cmd->cmnd[4] << 8) |
+                cmd->cmnd[5];
+            cmnd_count = (cmd->cmnd[7] << 8) |
+                cmd->cmnd[8];
+        } else
+            return true;

The above code looks very similar to the code in scsi_trace.c. Although SCSI LLDs shouldn't parse CDBs, there are a few SCSI LLDs that do this. Would it be worth it to introduce a function in the SCSI core that extracts the most important fields from a CDB (LBA, data buffer size, ...)?

Possibly.
I'll see what I can come up with.

But in either case I'd rather do this as a separate patchset.

Cheers,

Hannes
--
Dr. Hannes Reinecke            Teamlead Storage & Networking
hare@xxxxxxx                              +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux