update udev to include scsi_id 0.6
PATCH 1/1 update udev to include scsi_id 0.6
Greg -
Here's a patch updating udev's copy of scsi_id to version 0.6.
Can you please apply?
Thanks.
-- Patrick Mansfield
extras/scsi_id/ChangeLog renamed from extras/orig-scsi_id/ChangeLog +23 -0
@@ -1,3 +1,26 @@ +2004-jul-30: + * scsi_id.c, scsi_serial.c: Align the buffer passed to scsi_serial, + don't bother aligning and memcpy-ing the result in scsi_inquiry. + Aligning to 512 probably does not help, since the IO length of + 254 is not a multiple of 512. + +2004-jul-30: + * scsi.h, scsi_serial.c: Use a define for the SCSI INQUIRY buffer + length. + +2004-jul-30: + * scsi_id.c: Patch from <[email protected]> add a -u flag + to substitute white space with underscores so it is easier to use + the output as a device name. + +2004-jul-30: + * scsi_serial.c: Patch from Hannes Reinecke <[email protected]> use 254 + bytes for SCSI INQUIRY commands. + +2004-jul-28: + * scsi_id.h, scsi_serial.c: get rid of dumb/dead code, and use a + 512 byte aligned buffer. + 2004-jun-23: * scsi_id.h: increase MAX_SERIAL_LEN from 128 to 256, as some devices (maybe broken ones) are giving really long id's.
extras/scsi_id/Makefile renamed from extras/orig-scsi_id/Makefile +1 -1
@@ -14,7 +14,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -SCSI_ID_VERSION=0.5 +SCSI_ID_VERSION=0.6 prefix etcdir = ${prefix}/etc
extras/scsi_id/TODO renamed from extras/orig-scsi_id/TODO +0 -3
@@ -1,6 +1,3 @@ -- Add an option to replace blanks with spaces, so the generated id can be - more easily used as a /dev name. - - Add a bus white/black list option. So for example, all scsi devices under USB could easily be blacklisted. This should allow multiple busses to be listed.
extras/scsi_id/release-notes renamed from extras/orig-scsi_id/release-notes +10 -26
@@ -1,6 +1,6 @@ -Version 0.5 of scsi_id is available at: +Version 0.6 of scsi_id is available at: -http://www-124.ibm.com/storageio/scsi_id/scsi_id-0.5.tar.gz +http://www-124.ibm.com/storageio/scsi_id/scsi_id-0.6.tar.gz scsi_id is a program to generate a unique identifier for a given SCSI device.
@@ -9,34 +9,18 @@ It is primarily for use with the udev pr want persistent naming of scsi devices. It could also be used for automatic multi-path configuration or device mapper configuration. -Version 0.5 requires: +Requires: - Linux kernel 2.6 - libsysfs 0.4.0 Major changes since the last release: + + - add -u option, patch from Christoph Varoqui, to substitute white + space with underscores so it is easier to use the output as a + device name. - - Ken Brush <[email protected]> have the command line options - override generic options. + - Use 254 bytes for SCSI INQUIRY commands, patch from Hannes + Reinecke. - - Fix the gen_scsi_id_udev_rules.sh to handle spaces in the id. - - - Don't supply a makedev() when built with klibc. Also, the - scsi_id supplied makedev() was using the old major/minor method. - - - Include compiler.h so we can build against klibc, as recent sg.h - changes need a define for __user. - -Other changes: - - - Increase the MAX_SERIAL_LEN from 128 to 256, as some (possibly - broken devics) are returning very long id's - - - Add spotless target (via Olaf Hering's udev patch) - - - minor wording changes in scsi_id.config - - - Log INQUIRY failure, including the failing page code and vpd - values - - - Escape '-' with '\-' in the man page. +See ChangeLog for more details.
extras/scsi_id/scsi.h renamed from extras/orig-scsi_id/scsi.h +7 -0
@@ -38,6 +38,13 @@ struct scsi_ioctl_command {#define SENSE_BUFF_LEN 32/* +* The request buffer size passed to the SCSI INQUIRY commands, use 254, +* as this is a nice value for some devices, especially some of the usb +* mass storage devices. +*/ +#define SCSI_INQ_BUFF_LEN 254 + +/* * SCSI INQUIRY vendor and model (really product) lengths. */ #define VENDOR_LENGTH 8
Binary files udev-bk/extras/orig-scsi_id/scsi_id and udev-bk/extras/scsi_id/scsi_id differ
extras/scsi_id/scsi_id.8 renamed from extras/orig-scsi_id/scsi_id.8 +3 -0
@@ -95,6 +95,9 @@ Generate an id for the The sysfs mount point must not be included. For example, use /block/sd, not /sys/block/sd. .TP +.BI \-u +Reformat the output : replace all whitespaces by underscores +.TP .BI \-v Generate verbose debugging output. .TP
extras/scsi_id/scsi_id.c renamed from extras/orig-scsi_id/scsi_id.c +32 -2
@@ -52,7 +52,7 @@* options are not supported, but other code is still left in place for * now. */ -static const char short_options[] ="bd:f:gip:s:vV" ; +static const char short_options[] ="bd:f:gip:s:uvV" ;/* * Just duplicate per dev options. */
@@ -70,6 +70,7 @@ static int default_page_code;static int use_stderr;static int debug;static int hotplug_mode; +static int reformat_serial;void log_message (int level,const char *format, ...) {
@@ -469,6 +470,10 @@ static int set_options(int argc, char **strncat (target, optarg,MAX_NAME_LEN );break ; +case 'u' : + reformat_serial =1 ; +break ; +case 'v' : debug++;break ;
@@ -573,6 +578,23 @@ static int per_dev_options(struct sysfs_ }/* +* format_serial: replace to whitespaces by underscores for calling +* programs that use the serial for device naming (multipath, Suse +* naming, etc...) +*/ +static void format_serial (char *serial) +{ +char *p = serial; + +while (*p !='\0' ) { +if (isspace (*p)) + *p ='_' ; + p++; + } +return ; +} + +/* * scsi_id: try to get an id, if one is found, printf it to stdout. * returns a value passed to exit() - 0 if printed an id, else 1. This * could be expanded, for example, if we want to report a failure like no
@@ -583,7 +605,7 @@ static int scsi_id(const char *target_pa {int retval;int dev_type =0 ; -char serial[MAX_SERIAL_LEN ]; +char *serial, *unaligned_buf;struct sysfs_class_device *class_dev;/* of target_path */ struct sysfs_class_device *class_dev_parent;/* for partitions */ struct sysfs_device *scsi_dev;/* the scsi_device */
@@ -689,6 +711,12 @@ static int scsi_id(const char *target_padprintf ("per dev options: good %d; page code 0x%x; callout '%s'\n" , good_dev, page_code, callout); +#define ALIGN 512 + unaligned_buf =malloc (MAX_SERIAL_LEN +ALIGN ); + serial = (char *) (((int ) unaligned_buf + (ALIGN -1 )) & ~(ALIGN -1 )); +dprintf ("buffer unaligned 0x%p; aligned 0x%p\n" , unaligned_buf, serial); +#undef ALIGN +if (!good_dev) { retval =1 ; }else if (callout[0 ] !='\0' ) {
@@ -703,6 +731,8 @@ static int scsi_id(const char *target_pa retval =0 ; }if (!retval) { +if (reformat_serial) +format_serial (serial);if (display_bus_id)printf ("%s: " , scsi_dev->name);printf ("%s" , serial);
extras/scsi_id/scsi_id.h renamed from extras/orig-scsi_id/scsi_id.h +0 -1
@@ -25,7 +25,6 @@ log_message(LOG_DEBUG, "%s: " format, __FUNCTION__ , ## arg) #define MAX_NAME_LEN 72 -#define OFFSET (2 * sizeof(unsigned int))/* * MAX_ATTR_LEN: maximum length of the result of reading a sysfs
extras/scsi_id/scsi_serial.c renamed from extras/orig-scsi_id/scsi_serial.c +17 -20
@@ -300,17 +300,12 @@ static int scsi_inquiry(struct sysfs_devunsigned char sense[SENSE_BUFF_LEN ];struct sg_io_hdr io_hdr;int retval; -unsigned char *inq; -unsigned char *buffer;int retry =3 ;/* rather random */ -if (buflen >255 ) { +if (buflen >SCSI_INQ_BUFF_LEN ) {log_message (LOG_WARNING ,"buflen %d too long\n" , buflen);return -1 ; } - inq =malloc (OFFSET +sizeof (inq_cmd) +512 ); -memset (inq,0 ,OFFSET +sizeof (inq_cmd) +512 ); - buffer = inq +OFFSET ; resend:dprintf ("%s evpd %d, page 0x%x\n" , scsi_dev->name, evpd, page);
@@ -321,7 +316,7 @@ resend: io_hdr.mx_sb_len =sizeof (sense); io_hdr.dxfer_direction =SG_DXFER_FROM_DEV ; io_hdr.dxfer_len = buflen; - io_hdr.dxferp = buffer; + io_hdr.dxferp = buf; io_hdr.cmdp = inq_cmd; io_hdr.sbp = sense; io_hdr.timeout =DEF_TIMEOUT ;
@@ -329,7 +324,8 @@ resend:if (ioctl (fd,SG_IO , &io_hdr) <0 ) {log_message (LOG_WARNING ,"%s: ioctl failed: %s\n" , scsi_dev->name,strerror (errno)); -return -1 ; + retval =-1 ; + goto error; } retval =sg_err_category3 (&io_hdr);
@@ -346,7 +342,6 @@ resend:if (!retval) { retval = buflen; -memcpy (buf, buffer, retval); }else if (retval >0 ) {if (--retry >0 ) {dprintf ("%s: Retrying ...\n" , scsi_dev->name);
@@ -355,15 +350,16 @@ resend: retval =-1 ; } +error:if (retval <0 )log_message (LOG_WARNING ,"%s: Unable to get INQUIRY vpd %d page 0x%x.\n" , scsi_dev->name, evpd, page); -free (inq);return retval; } +/* Get list of supported EVPD pages */ static int do_scsi_page0_inquiry (struct sysfs_device *scsi_dev,int fd,char *buffer,int len) {
@@ -552,15 +548,17 @@ static int check_fill_0x83_id(struct sysreturn 0 ; } +/* Get device identification VPD page */ static int do_scsi_page83_inquiry (struct sysfs_device *scsi_dev,int fd,char *serial,int len) {int retval;int id_ind, j; -unsigned char page_83[256 ]; +unsigned char page_83[SCSI_INQ_BUFF_LEN ]; -memset (page_83,0 ,256 ); - retval =scsi_inquiry (scsi_dev, fd,1 ,0x83 , page_83,255 ); +memset (page_83,0 ,SCSI_INQ_BUFF_LEN ); + retval =scsi_inquiry (scsi_dev, fd,1 ,0x83 , page_83, +SCSI_INQ_BUFF_LEN );if (retval <0 )return 1 ;
@@ -609,6 +607,7 @@ static int do_scsi_page83_inquiry(structreturn 1 ; } +/* Get unit serial number VPD page */ static int do_scsi_page80_inquiry (struct sysfs_device *scsi_dev,int fd,char *serial,int max_len) {
@@ -616,10 +615,10 @@ static int do_scsi_page80_inquiry(structint ser_ind;int i;int len; -unsigned char buf[256 ]; +unsigned char buf[SCSI_INQ_BUFF_LEN ]; -memset (buf,0 ,256 ); - retval =scsi_inquiry (scsi_dev, fd,1 ,0x80 , buf,255 ); +memset (buf,0 ,SCSI_INQ_BUFF_LEN ); + retval =scsi_inquiry (scsi_dev, fd,1 ,0x80 , buf,SCSI_INQ_BUFF_LEN );if (retval <0 )return retval;
@@ -652,13 +651,11 @@ static int do_scsi_page80_inquiry(structint scsi_get_serial (struct sysfs_device *scsi_dev,const char *devname,int page_code,char *serial,int len) { -unsigned char page0[256 ]; +unsigned char page0[SCSI_INQ_BUFF_LEN ];int fd;int ind;int retval; -if (len >255 ) { - }memset (serial,0 , len);dprintf ("opening %s\n" , devname); fd =open (devname,O_RDONLY |O_NONBLOCK );
@@ -694,7 +691,7 @@ int scsi_get_serial (struct sysfs_device* Get page 0, the page of the pages. By default, try from best to * worst of supported pages: 0x83 then 0x80. */ -if (do_scsi_page0_inquiry (scsi_dev, fd, page0,255 )) { +if (do_scsi_page0_inquiry (scsi_dev, fd, page0,SCSI_INQ_BUFF_LEN )) {/* * Don't try anything else. Black list if a specific page * should be used for this vendor+model, or maybe have an
-------------------------------------------------------
This SF.Net email is sponsored by: YOU BE THE JUDGE. Be one of 170 Project Admins to receive an Apple iPod Mini FREE for your judgement on who ports your project to Linux PPC the best. Sponsored by IBM.
Deadline: Sept. 24. Go here: http://sf.net/ppc_contest.php
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel