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

[Xen-devel] [PATCH] linux-2.6.18: vscsi >2TB patch



From: Samuel Kvasnica <bugreports@xxxxxxxxxxxxxx>
Subject: vscsi >2TB patch

This patch fixes current 2TB limitation of the xen vscsi driver.
Both frontend (command size) and backend (missing READ_16/WRITE_16
commands) driver need a fix. Also an scsi command added to support
ALUA. Tested thoroughly on 4TB external RAID.

I also enabled some more commands to allow operating LTO tape
drives and autoloaders (tested on HP Ultrium 1/8 + Bacula).

Still more scsi commands might be missing for other specific devices 
(why not to enable all scsi commands by default ?).

This patch was tested on opensuse xenified kernels 2.6.31-2.6.34.7
in paravirtualized domU.

Signed-off-by: Samuel Kvasnica <samuel.kvasnica@xxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxxxx>

--- a/drivers/xen/scsiback/emulate.c
+++ b/drivers/xen/scsiback/emulate.c
@@ -28,6 +28,11 @@
  * IN THE SOFTWARE.
  */
 
+/*
+* Patched to support >2TB drives + allow tape & autoloader operations
+* 2010, Samuel Kvasnica, IMS Nanofabrication AG
+*/
+
 #include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_device.h>
@@ -384,85 +389,88 @@ void scsiback_emulation_init(void)
        /*
          Following commands do not require emulation.
        */
-       NO_EMULATE(TEST_UNIT_READY);       /*0x00*/
-       NO_EMULATE(REZERO_UNIT);           /*0x01*/
+       NO_EMULATE(TEST_UNIT_READY);       /*0x00*/ /* sd,st */
+       NO_EMULATE(REZERO_UNIT);           /*0x01*/ /* st */
        NO_EMULATE(REQUEST_SENSE);         /*0x03*/
        NO_EMULATE(FORMAT_UNIT);           /*0x04*/
-       NO_EMULATE(READ_BLOCK_LIMITS);     /*0x05*/
+       NO_EMULATE(READ_BLOCK_LIMITS);     /*0x05*/ /* st */
        /*NO_EMULATE(REASSIGN_BLOCKS);       *//*0x07*/
-       /*NO_EMULATE(INITIALIZE_ELEMENT_STATUS); *//*0x07*/
-       NO_EMULATE(READ_6);                /*0x08*/
-       NO_EMULATE(WRITE_6);               /*0x0a*/
-       /*NO_EMULATE(SEEK_6);                *//*0x0b*/
+       NO_EMULATE(INITIALIZE_ELEMENT_STATUS); /*0x07*/ /* ch */
+       NO_EMULATE(READ_6);                /*0x08*/ /* sd,st */
+       NO_EMULATE(WRITE_6);               /*0x0a*/ /* sd,st */
+       NO_EMULATE(SEEK_6);                /*0x0b*/
        /*NO_EMULATE(READ_REVERSE);          *//*0x0f*/
-       NO_EMULATE(WRITE_FILEMARKS);       /*0x10*/
-       NO_EMULATE(SPACE);                 /*0x11*/
+       NO_EMULATE(WRITE_FILEMARKS);       /*0x10*/ /* st */
+       NO_EMULATE(SPACE);                 /*0x11*/ /* st */
        NO_EMULATE(INQUIRY);               /*0x12*/
        /*NO_EMULATE(RECOVER_BUFFERED_DATA); *//*0x14*/
-       /*NO_EMULATE(MODE_SELECT);           *//*0x15*/
+       NO_EMULATE(MODE_SELECT);           /*0x15*/ /* st */
        /*NO_EMULATE(RESERVE);               *//*0x16*/
        /*NO_EMULATE(RELEASE);               *//*0x17*/
        /*NO_EMULATE(COPY);                  *//*0x18*/
-       NO_EMULATE(ERASE);                 /*0x19*/
-       NO_EMULATE(MODE_SENSE);            /*0x1a*/
-       /*NO_EMULATE(START_STOP);            *//*0x1b*/
-       /*NO_EMULATE(RECEIVE_DIAGNOSTIC);    *//*0x1c*/
+       NO_EMULATE(ERASE);                 /*0x19*/ /* st */
+       NO_EMULATE(MODE_SENSE);            /*0x1a*/ /* st */
+       NO_EMULATE(START_STOP);            /*0x1b*/ /* sd,st */
+       NO_EMULATE(RECEIVE_DIAGNOSTIC);    /*0x1c*/
        NO_EMULATE(SEND_DIAGNOSTIC);       /*0x1d*/
-       /*NO_EMULATE(ALLOW_MEDIUM_REMOVAL);  *//*0x1e*/
+       NO_EMULATE(ALLOW_MEDIUM_REMOVAL);  /*0x1e*/
 
        /*NO_EMULATE(SET_WINDOW);            *//*0x24*/
-       NO_EMULATE(READ_CAPACITY);         /*0x25*/
-       NO_EMULATE(READ_10);               /*0x28*/
-       NO_EMULATE(WRITE_10);              /*0x2a*/
-       /*NO_EMULATE(SEEK_10);               *//*0x2b*/
-       /*NO_EMULATE(POSITION_TO_ELEMENT);   *//*0x2b*/
+       NO_EMULATE(READ_CAPACITY);         /*0x25*/ /* sd */
+       NO_EMULATE(READ_10);               /*0x28*/ /* sd */
+       NO_EMULATE(WRITE_10);              /*0x2a*/ /* sd */
+       NO_EMULATE(SEEK_10);               /*0x2b*/ /* st */
+       NO_EMULATE(POSITION_TO_ELEMENT);   /*0x2b*/ /* ch */
        /*NO_EMULATE(WRITE_VERIFY);          *//*0x2e*/
        /*NO_EMULATE(VERIFY);                *//*0x2f*/
        /*NO_EMULATE(SEARCH_HIGH);           *//*0x30*/
        /*NO_EMULATE(SEARCH_EQUAL);          *//*0x31*/
        /*NO_EMULATE(SEARCH_LOW);            *//*0x32*/
-       /*NO_EMULATE(SET_LIMITS);            *//*0x33*/
-       /*NO_EMULATE(PRE_FETCH);             *//*0x34*/
-       /*NO_EMULATE(READ_POSITION);         *//*0x34*/
-       /*NO_EMULATE(SYNCHRONIZE_CACHE);     *//*0x35*/
-       /*NO_EMULATE(LOCK_UNLOCK_CACHE);     *//*0x36*/
-       /*NO_EMULATE(READ_DEFECT_DATA);      *//*0x37*/
-       /*NO_EMULATE(MEDIUM_SCAN);           *//*0x38*/
+       NO_EMULATE(SET_LIMITS);            /*0x33*/
+       NO_EMULATE(PRE_FETCH);             /*0x34*/ /* st! */
+       NO_EMULATE(READ_POSITION);          /*0x34*/ /* st */
+       NO_EMULATE(SYNCHRONIZE_CACHE);      /*0x35*/ /* sd */
+       NO_EMULATE(LOCK_UNLOCK_CACHE);     /*0x36*/
+       NO_EMULATE(READ_DEFECT_DATA);      /*0x37*/
+       NO_EMULATE(MEDIUM_SCAN);           /*0x38*/
        /*NO_EMULATE(COMPARE);               *//*0x39*/
        /*NO_EMULATE(COPY_VERIFY);           *//*0x3a*/
-       /*NO_EMULATE(WRITE_BUFFER);          *//*0x3b*/
-       /*NO_EMULATE(READ_BUFFER);           *//*0x3c*/
+       NO_EMULATE(WRITE_BUFFER);          /*0x3b*/
+       NO_EMULATE(READ_BUFFER);           /*0x3c*/ /* osst */
        /*NO_EMULATE(UPDATE_BLOCK);          *//*0x3d*/
        /*NO_EMULATE(READ_LONG);             *//*0x3e*/
        /*NO_EMULATE(WRITE_LONG);            *//*0x3f*/
        /*NO_EMULATE(CHANGE_DEFINITION);     *//*0x40*/
        /*NO_EMULATE(WRITE_SAME);            *//*0x41*/
-       /*NO_EMULATE(READ_TOC);              *//*0x43*/
-       /*NO_EMULATE(LOG_SELECT);            *//*0x4c*/
-       /*NO_EMULATE(LOG_SENSE);             *//*0x4d*/
+       NO_EMULATE(READ_TOC);              /*0x43*/ /* sr */
+       NO_EMULATE(LOG_SELECT);            /*0x4c*/
+       NO_EMULATE(LOG_SENSE);             /*0x4d*/ /* st! */
        /*NO_EMULATE(MODE_SELECT_10);        *//*0x55*/
        /*NO_EMULATE(RESERVE_10);            *//*0x56*/
        /*NO_EMULATE(RELEASE_10);            *//*0x57*/
-       /*NO_EMULATE(MODE_SENSE_10);         *//*0x5a*/
+       NO_EMULATE(MODE_SENSE_10);         /*0x5a*/ /* scsi_lib */
        /*NO_EMULATE(PERSISTENT_RESERVE_IN); *//*0x5e*/
        /*NO_EMULATE(PERSISTENT_RESERVE_OUT); *//*0x5f*/
        /*           REPORT_LUNS             *//*0xa0*//*Full emulaiton*/
-       /*NO_EMULATE(MOVE_MEDIUM);           *//*0xa5*/
-       /*NO_EMULATE(EXCHANGE_MEDIUM);       *//*0xa6*/
+       NO_EMULATE(MAINTENANCE_IN);           /*0xa3*/ /* IFT alua */
+       NO_EMULATE(MAINTENANCE_OUT);       /*0xa4*/ /* IFT alua */
+       NO_EMULATE(MOVE_MEDIUM);           /*0xa5*/ /* ch */
+       NO_EMULATE(EXCHANGE_MEDIUM);       /*0xa6*/ /* ch */
        /*NO_EMULATE(READ_12);               *//*0xa8*/
        /*NO_EMULATE(WRITE_12);              *//*0xaa*/
        /*NO_EMULATE(WRITE_VERIFY_12);       *//*0xae*/
        /*NO_EMULATE(SEARCH_HIGH_12);        *//*0xb0*/
        /*NO_EMULATE(SEARCH_EQUAL_12);       *//*0xb1*/
        /*NO_EMULATE(SEARCH_LOW_12);         *//*0xb2*/
-       /*NO_EMULATE(READ_ELEMENT_STATUS);   *//*0xb8*/
-       /*NO_EMULATE(SEND_VOLUME_TAG);       *//*0xb6*/
+       NO_EMULATE(READ_ELEMENT_STATUS);   /*0xb8*/ /* ch */
+       NO_EMULATE(SEND_VOLUME_TAG);       /*0xb6*/ /* ch */
        /*NO_EMULATE(WRITE_LONG_2);          *//*0xea*/
-       /*NO_EMULATE(READ_16);               *//*0x88*/
-       /*NO_EMULATE(WRITE_16);              *//*0x8a*/
-       /*NO_EMULATE(VERIFY_16);              *//*0x8f*/
-       /*NO_EMULATE(SERVICE_ACTION_IN);     *//*0x9e*/
+       NO_EMULATE(READ_16);               /*0x88*/ /* sd >2TB */
+       NO_EMULATE(WRITE_16);              /*0x8a*/ /* sd >2TB */
+       NO_EMULATE(VERIFY_16);             /*0x8f*/
+       NO_EMULATE(SERVICE_ACTION_IN);     /*0x9e*/ /* sd >2TB */
 
+/* st: QFA_REQUEST_BLOCK, QFA_SEEK_BLOCK might be needed ? */
        /*
          Following commands require emulation.
        */
--- a/drivers/xen/scsifront/scsifront.c
+++ b/drivers/xen/scsifront/scsifront.c
@@ -357,6 +357,11 @@ static int scsifront_queuecommand(struct
        int ref_cnt;
        uint16_t rqid;
 
+/* debug printk to identify more missing scsi commands
+       printk(KERN_INFO "scsicmd: len=%i, 
0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x",sc->cmd_len,
+               sc->cmnd[0],sc->cmnd[1],sc->cmnd[2],sc->cmnd[3],sc->cmnd[4],
+               sc->cmnd[5],sc->cmnd[6],sc->cmnd[7],sc->cmnd[8],sc->cmnd[9]);
+*/
        if (RING_FULL(&info->ring)) {
                goto out_host_busy;
        }
--- a/drivers/xen/scsifront/xenbus.c
+++ b/drivers/xen/scsifront/xenbus.c
@@ -27,7 +27,11 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  * IN THE SOFTWARE.
  */
- 
+
+/*
+* Patched to support >2TB drives
+* 2010, Samuel Kvasnica, IMS Nanofabrication AG
+*/
 
 #include <linux/version.h>
 #include "common.h"
@@ -219,6 +223,7 @@ static int scsifront_probe(struct xenbus
        host->max_channel = 0;
        host->max_lun     = VSCSIIF_MAX_LUN;
        host->max_sectors = (VSCSIIF_SG_TABLESIZE - 1) * PAGE_SIZE / 512;
+       host->max_cmd_len = VSCSIIF_MAX_COMMAND_SIZE;
 
        err = scsi_add_host(host, &dev->dev);
        if (err) {


Attachment: xen-vscsi-2Tb.patch
Description: Text document

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.