This patch syncs the scsi_id in the udev tree to version 0.5.
+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.
+
+2004-jun-17:
+ * Makefile: Olaf Hering add spotless target (already in udev).
+
+2004-jun-17:
+ * scsi_serial.c: Include linux/compiler.h so we can build with
+ klibc using kernel headers.
+
+2004-may-24:
+ * scsi_id.c: Rename major and minor to maj min to avoid compiler
+ warnings when compiled with -D_GNU_SOURCE.
+
+2004-mar-30:
+ * scsi_id.config: Minor wording changes
+
+2004-mar-30:
+ * scsi_id.h: Don't supply a makedev() when built under klibc.
+
+2004-mar-30:
+ * scsi_id.c: Ken Brush <ken@cgi101.com> Have the command line
+ options override generic options.
+
+2004-mar-05:
+ * scsi_serial.c: Log INQUIRY failure, including the
+ failing page code and vpd values. And add a dprintf() to
+ the scsi_inquiry function.
+
+2004-mar-02:
+ * gen_scsi_id_udev_rules.sh: Per bug report from Atul Sabharwal
+ <atul.sabharwal@intel.com> change to not require that sysfs be
+ in the mount tab (and default to "/sys"), and fix so scsi_id
+ results containing spaces work correctly.
+
+2004-mar-02:
+ * scsi_id.8: Escape '-' with '\-'.
+
2004-feb-25:
* scsi_id.8: Add verbage about usage with udev, and running via
hotplug.
# 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.4
+SCSI_ID_VERSION=0.5
prefix =
etcdir = ${prefix}/etc
rm -f $(PROG) $(OBJS) $(GEN_HEADER)
spotless: clean
+
$(PROG): $(OBJS)
$(LD) $(LDFLAGS) -o $(PROG) $(CRT0) $(OBJS) $(SYSFS) $(LIB_OBJS) $(ARCH_LIB_OBJS)
-- Document that config file options override command line options, or fix
- the code. This means a '-b' in the config file disables any -g on the
- command line.
+- 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.
- Add code to check that SCSI commands get back enough data for their
intended usage, mainly callers of scsi_inquiry().
prefix=disk-
scsi_id=/sbin/scsi_id
-dump_ids()
-{
- cd ${sysfs_dir}/block
- for b in sd*
- do
- echo -n "$b "
- $scsi_id -s /block/$b
- if [ $? != 0 ]
- then
- echo $0 failed for device $b >&2
- exit 1
- fi
- done
-}
-
sysfs_dir=$(mount | awk '$5 == "sysfs" {print $3}')
+if [ "$sysfs_dir" = "" ]
+then
+ sysfs_dir="/sys"
+ echo "Using sysfs mount point \"$sysfs_dir\"" >&2
+fi
c=$(ls /${sysfs_dir}/block/sd* 2>/dev/null | wc -l)
if [ $c = 0 ]
echo "# rules to your liking."
echo "#"
first_line=yes
-dump_ids | while read in
+
+#
+cd ${sysfs_dir}/block
+for name in sd*
do
- set $in
- name=$1
- shift
- id="$*"
+ id=$($scsi_id -s /block/$name)
+ if [ $? != 0 ]
+ then
+ echo $0 failed for device $name exiting >&2
+ exit 1
+ fi
if [ $first_line = "yes" ]
then
first_line=no
-Version 0.4 of scsi_id is available at:
+Version 0.5 of scsi_id is available at:
-http://www-124.ibm.com/storageio/scsi_id/scsi_id-0.4.tar.gz
+http://www-124.ibm.com/storageio/scsi_id/scsi_id-0.5.tar.gz
scsi_id is a program to generate a unique identifier for a given SCSI
device.
-It is primarily for use with the udev callout key. It could also be used
-for automatic multi-path configuration or device mapper configuration.
+It is primarily for use with the udev program key, or hotplug scripts that
+want persistent naming of scsi devices. It could also be used for
+automatic multi-path configuration or device mapper configuration.
-Version 0.4 requires:
+Version 0.5 requires:
- Linux kernel 2.6
- libsysfs 0.4.0
Major changes since the last release:
- - Support block device partitions
+ - Ken Brush <ken@cgi101.com> have the command line options
+ override generic options.
- - Added a script to auto-generate udev rules. The script is not
- installed but is part of the tarball.
+ - Fix the gen_scsi_id_udev_rules.sh to handle spaces in the id.
-Detailed changes:
+ - Don't supply a makedev() when built with klibc. Also, the
+ scsi_id supplied makedev() was using the old major/minor method.
- - Add man page verbage about usage with udev, and running via
- hotplug
+ - Include compiler.h so we can build against klibc, as recent sg.h
+ changes need a define for __user.
- - Disable support for -e (all output to stderr) as it cannot be
- used in any useful way, and the -c (device specific callout) as
- the code is incomplete and has no users.
+Other changes:
- - Don't print errno for NULL return from sysfs_get_classdev_device.
+ - Increase the MAX_SERIAL_LEN from 128 to 256, as some (possibly
+ broken devics) are returning very long id's
- - Get rid of dead/leftover code that checked if we are on a scsi
- bus.
+ - Add spotless target (via Olaf Hering's udev patch)
- - ":" consistently in output messages.
+ - minor wording changes in scsi_id.config
- - Add missing new lines for some error messages.
+ - Log INQUIRY failure, including the failing page code and vpd
+ values
- - open O_NONBLOCK so we handle tape drives without tapes loaded.
-
- - Remove hacks based on KLIBC define to get around problems when
- building with udev (udev libsysfs files were rearranged).
-
- - As done in udev code, support partitions via looking for a
- parent of the target path. Uses libsysfs functions to do most of
- the work, and includes changing a lot of variables to be struct
- sysfs_device instead of sysfs_class_device.
+ - Escape '-' with '\-' in the man page.
If a result is generated it is sent to standard output, and the program
exits with a zero value. If no identifier is output, the program exits
-with a non-zero value.
+with a non\-zero value.
\fBscsi_id\fP is primarily for use by other utilities such as \fBudev\fP
that require a unique SCSI identifier.
-By default all devices are assume black listed, the \fB-g\fP option must
+By default all devices are assume black listed, the \fB\-g\fP option must
be specified on the command line or in the config file for any useful
behaviour.
corresponding sysfs device. See section below on usage with \fBudev\fP.
.TP
.BI \-b
-The default behaviour - treat the device as black listed, and do nothing
-unless a white listed device is found in the scsi_id config-file.
+The default behaviour \- treat the device as black listed, and do nothing
+unless a white listed device is found in the scsi_id config\-file.
.TP
.BI \-d "\| device\^"
Instead
of determining and creating a device node based on a sysfs dev
-entry as done for the \fB-s\fP, send SG_IO commands to
+entry as done for the \fB\-s\fP, send SG_IO commands to
\fBdevice\fP, such as \fB/dev/sdc\fP.
.TP
-.BI \-f "\| config-file"
+.BI \-f "\| config\-file"
Read configuration and black/white list entries from
-.B config-file
+.B config\-file
rather than the default
.B /etc/scsi_id.config
file.
query the available VPD pages, and use page 0x83 if found, else page 0x80
if found, else nothing.
.TP
-.BI \-s "\| sysfs-device"
+.BI \-s "\| sysfs\-device"
Generate an id for the
-.B sysfs-device.
+.B sysfs\-device.
The sysfs mount point must not be included. For example, use /block/sd,
not /sys/block/sd.
.TP
When in this mode, all errors and warnings are sent via syslog.
-To determine the specific value needed in a RESULT key, use the -s option,
+To determine the specific value needed in a RESULT key, use the \-s option,
for example:
.sp
return sysfs_read_attribute_value(attr_path, value, SYSFS_NAME_LEN);
}
-static int get_major_minor(const char *devpath, int *major, int *minor)
+static int get_major_minor(const char *devpath, int *maj, int *min)
{
char dev_value[MAX_ATTR_LEN];
}
dprintf("dev value %s", dev_value); /* dev_value has a trailing \n */
- if (sscanf(dev_value, "%u:%u", major, minor) != 2) {
+ if (sscanf(dev_value, "%u:%u", maj, min) != 2) {
log_message(LOG_WARNING, "%s: invalid dev major/minor\n",
devpath);
return -1;
static int create_tmp_dev(const char *devpath, char *tmpdev, int dev_type)
{
- int major, minor;
+ int maj, min;
dprintf("(%s)\n", devpath);
- if (get_major_minor(devpath, &major, &minor))
+ if (get_major_minor(devpath, &maj, &min))
return -1;
snprintf(tmpdev, MAX_NAME_LEN, "%s/%s-maj%d-min%d-%u",
- TMP_DIR, TMP_PREFIX, major, minor, getpid());
+ TMP_DIR, TMP_PREFIX, maj, min, getpid());
dprintf("tmpdev '%s'\n", tmpdev);
- if (mknod(tmpdev, 0600 | dev_type, makedev(major, minor))) {
+ if (mknod(tmpdev, 0600 | dev_type, makedev(maj, min))) {
log_message(LOG_WARNING, "mknod failed: %s\n", strerror(errno));
return -1;
}
strncpy(target_path, sysfs_mnt_path, MAX_NAME_LEN);
strncat(target_path, devpath, MAX_NAME_LEN);
- } else {
- if (set_options(argc, argv, short_options, target_path,
- maj_min_dev) < 0)
- exit(1);
}
/*
exit(1);
free(newargv);
}
+ if (!hotplug_mode) {
+ if (set_options(argc, argv, short_options, target_path,
+ maj_min_dev) < 0)
+ exit(1);
+ }
if (!sys_specified) {
log_message(LOG_WARNING, "-s must be specified\n");
# INQUIRY product identification field. Per the SCSI INQUIRY, the vendor
# is limited to 8 bytes, model to 16 bytes.
#
-# The first maching line found is used. Short matches match longer ones,
+# The first matching line found is used. Short matches match longer ones,
# if you do not want such a match space fill the extra bytes. If no model
# is specified, only the vendor string need match.
#
-# The "option" line is searched when scsi_id first starts up (for use with
-# hotplug during boot).
+# The "options" line is searched for when scsi_id starts up, and is
+# primarily for use with hotplug.
#
# options=<any scsi_id command line options>
#
#
vendor=someone, model=nicedrive, options=-g
-# If you all the scsi devices are your system support valid id's, remove
-# the -b line above, and mark all devices as good:
+# If you know all the scsi devices on your system support valid id's,
+# remove the options=-b line, and mark all devices as good:
## options=-g
# Then black list any offenders. Missing entries here could be dangerous
-# if you rely on the id for naming or multi-path configuration!
+# if you rely on the id for persistent naming or multi-path configuration.
## vendor=ELBONIA, model=borken, options=-b
* MAX_SERIAL_LEN: the maximum length of the serial number, including
* added prefixes such as vendor and product (model) strings.
*/
-#define MAX_SERIAL_LEN 128
+#define MAX_SERIAL_LEN 256
/*
* MAX_BUFFER_LEN: maximum buffer size and line length used while reading
extern void log_message (int level, const char *format, ...)
__attribute__ ((format (printf, 2, 3)));
-#ifdef __KLIBC__
-#define makedev(major, minor) ((major) << 8) | (minor)
-#endif
-
#ifndef u8
typedef unsigned char u8;
#endif
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
+#include <linux/compiler.h> /* need __user when built via klibc */
#include <scsi/sg.h>
#include <sysfs/libsysfs.h>
#include "scsi_id.h"
buffer = inq + OFFSET;
resend:
+ dprintf("%s evpd %d, page 0x%x\n", scsi_dev->name, evpd, page);
+
memset(&io_hdr, 0, sizeof(struct sg_io_hdr));
io_hdr.interface_id = 'S';
io_hdr.cmd_len = sizeof(inq_cmd);
retval = -1;
}
+ 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;
}