add support for SYNCHRONIZECACHE10 to both iscsi and scsi backends
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Sat, 20 Nov 2010 22:42:59 +0000 (09:42 +1100)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Sat, 20 Nov 2010 22:42:59 +0000 (09:42 +1100)
iscsi.c
linux_scsi.c

diff --git a/iscsi.c b/iscsi.c
index 7aaae791b43a19fae2e3e573625e3a0bab926ad9..f8e5742faece0f6c96a9796c5c43b5be4093cff9 100644 (file)
--- a/iscsi.c
+++ b/iscsi.c
@@ -560,6 +560,51 @@ static void iscsi_read10(struct dbench_op *op)
        op->child->bytes += xferlen*512;
 }
 
+static void iscsi_synchronizecache10(struct dbench_op *op)
+{
+       struct iscsi_device *sd;
+       unsigned char cdb[]={0x35,0,0,0,0,0,0,0,0,0};
+       int res;
+       uint32_t lba = op->params[0];
+       uint32_t xferlen = op->params[1];
+       int syncnv = op->params[2];
+       int immed = op->params[3];
+       unsigned char sc;
+       int sense_key, sense_ascq;
+       unsigned int data_size=0;
+
+       sd = op->child->private;
+
+       if (syncnv) {
+               cdb[1] |= 0x04;
+       }
+       if (immed) {
+               cdb[1] |= 0x02;
+       }
+       cdb[2] = (lba>>24)&0xff;
+       cdb[3] = (lba>>16)&0xff;
+       cdb[4] = (lba>> 8)&0xff;
+       cdb[5] = (lba    )&0xff;
+
+       cdb[7] = (xferlen>>8)&0xff;
+       cdb[8] = xferlen&0xff;
+
+       res=do_iscsi_io(sd, cdb, sizeof(cdb), SG_DXFER_NONE, &data_size, NULL, &sc, &sense_key, &sense_ascq);
+       if(res){
+               printf("SCSI_IO failed\n");
+               failed(op->child);
+       }
+       if (!check_sense(sc, op->status)) {
+               printf("[%d] SYNCHRONIZECACHE10 \"%s\" failed (0x%02x) - expected %s\n", 
+                      op->child->line, op->fname, sc, op->status);
+               if (sc == SCSI_STATUS_CHECK_CONDITION) {
+                      printf("SCSI command failed with CHECK_CONDITION. Sense key:%s(%d) Ascq:%s(0x%04x)\n",
+                            scsi_status_name(sense_key, &scsi_key_names[0]), sense_key, scsi_status_name(sense_ascq, &scsi_ascq_names[0]), sense_ascq);
+               }
+               failed(op->child);
+       }
+       return;
+}
 
 static void iscsi_write10(struct dbench_op *op)
 {
@@ -858,11 +903,12 @@ static int iscsi_init(void)
 
 
 static struct backend_op ops[] = {
-       { "TESTUNITREADY",    iscsi_testunitready },
-       { "READ10",           iscsi_read10 },
-       { "READCAPACITY10",   iscsi_readcapacity10 },
-       { "PROUT",            iscsi_prout },
-       { "WRITE10",          iscsi_write10 },
+       { "TESTUNITREADY",      iscsi_testunitready },
+       { "READ10",             iscsi_read10 },
+       { "READCAPACITY10",     iscsi_readcapacity10 },
+       { "SYNCHRONIZECACHE10", iscsi_synchronizecache10 },
+       { "PROUT",              iscsi_prout },
+       { "WRITE10",            iscsi_write10 },
        { NULL, NULL}
 };
 
index 4eecac8ca2ac8e90cbc6f177246fddafd3e231f0..3306cd0f1d074920bd4d8c24b9d167bca36f3bae 100644 (file)
@@ -210,6 +210,49 @@ static void scsi_testunitready(struct dbench_op *op)
        return;
 }
 
+static void scsi_synchronizecache10(struct dbench_op *op)
+{
+       struct scsi_device *sd;
+       unsigned char cdb[]={0x35,0,0,0,0,0,0,0,0,0};
+       int res;
+       uint32_t lba = op->params[0];
+       uint32_t xferlen = op->params[1];
+       int syncnv = op->params[2];
+       int immed = op->params[3];
+       unsigned char sc;
+       unsigned int data_size=200;
+       char data[data_size];
+
+       sd = op->child->private;
+
+       if (syncnv) {
+               cdb[1] |= 0x04;
+       }
+       if (immed) {
+               cdb[1] |= 0x02;
+       }
+       cdb[2] = (lba>>24)&0xff;
+       cdb[3] = (lba>>16)&0xff;
+       cdb[4] = (lba>> 8)&0xff;
+       cdb[5] = (lba    )&0xff;
+
+       cdb[7] = (xferlen>>8)&0xff;
+       cdb[8] = xferlen&0xff;
+
+       res=scsi_io(sd->fd, cdb, sizeof(cdb), SG_DXFER_FROM_DEV, &data_size, data, &sc);
+       if(res){
+               printf("SCSI_IO failed\n");
+               failed(op->child);
+       }
+       if (!check_sense(sc, op->status)) {
+               printf("[%d] SYNCHRONIZECACHE10 \"%s\" failed (0x%02x) - expected %s\n", 
+                      op->child->line, op->fname, sc, op->status);
+               failed(op->child);
+       }
+
+       return;
+}
+
 
 static void scsi_read6(struct dbench_op *op)
 {
@@ -411,11 +454,12 @@ static void scsi_readcapacity10(struct dbench_op *op)
 }
 
 static struct backend_op ops[] = {
-       { "READ6",            scsi_read6 },
-       { "READ10",           scsi_read10 },
-       { "READCAPACITY10",   scsi_readcapacity10 },
-       { "TESTUNITREADY",    scsi_testunitready },
-       { "WRITE10",          scsi_write10 },
+       { "READ6",              scsi_read6 },
+       { "READ10",             scsi_read10 },
+       { "READCAPACITY10",     scsi_readcapacity10 },
+       { "SYNCHRONIZECACHE10", scsi_synchronizecache10 },
+       { "TESTUNITREADY",      scsi_testunitready },
+       { "WRITE10",            scsi_write10 },
        { NULL, NULL}
 };