Commit 59d65505 authored by Douglas Gilbert's avatar Douglas Gilbert Committed by Christoph Hellwig

[PATCH] sg descriptor sense cleanup lk 2.6.11-rc1-bk1

   - expand sense data handling to descriptor format
   - make module parameters visible in
       /sys/modules/sg/parameters
   - add "readable" SCSI commands: READ(16), REPORT LUNS,
     SERVICE_ACTION_IN, RECEIVE_DIAGNOSTIC, READ_LONG
     and MAINTENANCE_IN_CMD to list
Signed-off-by: default avatarDouglas Gilbert <dougg@torque.net>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent b23c1202
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Original driver (sg.c): * Original driver (sg.c):
* Copyright (C) 1992 Lawrence Foard * Copyright (C) 1992 Lawrence Foard
* Version 2 and 3 extensions to driver: * Version 2 and 3 extensions to driver:
* Copyright (C) 1998 - 2004 Douglas Gilbert * Copyright (C) 1998 - 2005 Douglas Gilbert
* *
* Modified 19-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support * Modified 19-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
* *
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
* *
*/ */
static int sg_version_num = 30531; /* 2 digits for each component */ static int sg_version_num = 30532; /* 2 digits for each component */
#define SG_VERSION_STR "3.5.31" #define SG_VERSION_STR "3.5.32"
/* /*
* D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes: * D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes:
...@@ -60,7 +60,7 @@ static int sg_version_num = 30531; /* 2 digits for each component */ ...@@ -60,7 +60,7 @@ static int sg_version_num = 30531; /* 2 digits for each component */
#ifdef CONFIG_SCSI_PROC_FS #ifdef CONFIG_SCSI_PROC_FS
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
static char *sg_version_date = "20040516"; static char *sg_version_date = "20050117";
static int sg_proc_init(void); static int sg_proc_init(void);
static void sg_proc_cleanup(void); static void sg_proc_cleanup(void);
...@@ -1282,6 +1282,8 @@ sg_cmd_done(Scsi_Cmnd * SCpnt) ...@@ -1282,6 +1282,8 @@ sg_cmd_done(Scsi_Cmnd * SCpnt)
srp->header.duration = srp->header.duration =
jiffies_to_msecs(jiffies - srp->header.duration); jiffies_to_msecs(jiffies - srp->header.duration);
if (0 != SRpnt->sr_result) { if (0 != SRpnt->sr_result) {
struct scsi_sense_hdr sshdr;
memcpy(srp->sense_b, SRpnt->sr_sense_buffer, memcpy(srp->sense_b, SRpnt->sr_sense_buffer,
sizeof (srp->sense_b)); sizeof (srp->sense_b));
srp->header.status = 0xff & SRpnt->sr_result; srp->header.status = 0xff & SRpnt->sr_result;
...@@ -1296,11 +1298,12 @@ sg_cmd_done(Scsi_Cmnd * SCpnt) ...@@ -1296,11 +1298,12 @@ sg_cmd_done(Scsi_Cmnd * SCpnt)
/* Following if statement is a patch supplied by Eric Youngdale */ /* Following if statement is a patch supplied by Eric Youngdale */
if (driver_byte(SRpnt->sr_result) != 0 if (driver_byte(SRpnt->sr_result) != 0
&& (SRpnt->sr_sense_buffer[0] & 0x7f) == 0x70 && scsi_command_normalize_sense(SCpnt, &sshdr)
&& (SRpnt->sr_sense_buffer[2] & 0xf) == UNIT_ATTENTION && !scsi_sense_is_deferred(&sshdr)
&& sshdr.sense_key == UNIT_ATTENTION
&& sdp->device->removable) { && sdp->device->removable) {
/* Detected disc change. Set the bit - this may be used if */ /* Detected possible disc change. Set the bit - this */
/* there are filesystems using this device. */ /* may be used if there are filesystems using this device */
sdp->device->changed = 1; sdp->device->changed = 1;
} }
} }
...@@ -1573,8 +1576,8 @@ sg_remove(struct class_device *cl_dev) ...@@ -1573,8 +1576,8 @@ sg_remove(struct class_device *cl_dev)
* of sysfs parameters (which module_param doesn't yet support). * of sysfs parameters (which module_param doesn't yet support).
* Sysfs parameters defined explicitly below. * Sysfs parameters defined explicitly below.
*/ */
module_param_named(def_reserved_size, def_reserved_size, int, 0); module_param_named(def_reserved_size, def_reserved_size, int, S_IRUGO);
module_param_named(allow_dio, sg_allow_dio, int, 0); module_param_named(allow_dio, sg_allow_dio, int, S_IRUGO | S_IWUSR);
MODULE_AUTHOR("Douglas Gilbert"); MODULE_AUTHOR("Douglas Gilbert");
MODULE_DESCRIPTION("SCSI generic (sg) driver"); MODULE_DESCRIPTION("SCSI generic (sg) driver");
...@@ -2606,9 +2609,14 @@ sg_page_free(char *buff, int size) ...@@ -2606,9 +2609,14 @@ sg_page_free(char *buff, int size)
free_pages((unsigned long) buff, order); free_pages((unsigned long) buff, order);
} }
#ifndef MAINTENANCE_IN_CMD
#define MAINTENANCE_IN_CMD 0xa3
#endif
static unsigned char allow_ops[] = { TEST_UNIT_READY, REQUEST_SENSE, static unsigned char allow_ops[] = { TEST_UNIT_READY, REQUEST_SENSE,
INQUIRY, READ_CAPACITY, READ_BUFFER, READ_6, READ_10, READ_12, INQUIRY, READ_CAPACITY, READ_BUFFER, READ_6, READ_10, READ_12,
MODE_SENSE, MODE_SENSE_10, LOG_SENSE READ_16, MODE_SENSE, MODE_SENSE_10, LOG_SENSE, REPORT_LUNS,
SERVICE_ACTION_IN, RECEIVE_DIAGNOSTIC, READ_LONG, MAINTENANCE_IN_CMD
}; };
static int static int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment