mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-10-30 14:55:26 +03:00
[PATCH] update udev scsi_id to scsi_id 0.5
This patch syncs the scsi_id in the udev tree to version 0.5.
This commit is contained in:
parent
c59a72105d
commit
062db23d5e
@ -1,3 +1,42 @@
|
||||
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.
|
||||
|
@ -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.4
|
||||
SCSI_ID_VERSION=0.5
|
||||
|
||||
prefix =
|
||||
etcdir = ${prefix}/etc
|
||||
@ -71,5 +71,6 @@ clean:
|
||||
rm -f $(PROG) $(OBJS) $(GEN_HEADER)
|
||||
|
||||
spotless: clean
|
||||
|
||||
$(PROG): $(OBJS)
|
||||
$(LD) $(LDFLAGS) -o $(PROG) $(CRT0) $(OBJS) $(SYSFS) $(LIB_OBJS) $(ARCH_LIB_OBJS)
|
||||
|
@ -1,6 +1,9 @@
|
||||
- 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().
|
||||
|
@ -27,22 +27,12 @@
|
||||
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 ]
|
||||
@ -56,12 +46,17 @@ echo "# Start of autogenerated scsi_id rules. Edit the NAME portions of these"
|
||||
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
|
||||
|
@ -1,49 +1,42 @@
|
||||
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.
|
||||
|
@ -12,12 +12,12 @@ all SCSI devices that properly support page 0x80 or page 0x83.
|
||||
|
||||
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.
|
||||
|
||||
@ -58,18 +58,18 @@ mode, and expects the environment variable DEVPATH to specify the
|
||||
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.
|
||||
@ -89,9 +89,9 @@ Use SCSI INQUIRY VPD page code 0x80 or 0x83. The default behaviour is to
|
||||
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
|
||||
@ -113,7 +113,7 @@ and the results will likely not be as expected.
|
||||
|
||||
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
|
||||
|
@ -111,7 +111,7 @@ int sysfs_get_attr(const char *devpath, const char *attr, char *value,
|
||||
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];
|
||||
|
||||
@ -129,7 +129,7 @@ static int get_major_minor(const char *devpath, int *major, int *minor)
|
||||
}
|
||||
|
||||
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;
|
||||
@ -140,18 +140,18 @@ static int get_major_minor(const char *devpath, int *major, int *minor)
|
||||
|
||||
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;
|
||||
}
|
||||
@ -759,10 +759,6 @@ int main(int argc, char **argv)
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -779,6 +775,11 @@ int main(int argc, char **argv)
|
||||
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");
|
||||
|
@ -9,12 +9,12 @@
|
||||
# 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>
|
||||
#
|
||||
@ -32,12 +32,12 @@ options=-b
|
||||
#
|
||||
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
|
||||
|
@ -37,7 +37,7 @@
|
||||
* 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
|
||||
@ -53,10 +53,6 @@ extern int scsi_get_serial (struct sysfs_device *scsi_dev, const char
|
||||
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
|
||||
|
@ -30,6 +30,7 @@
|
||||
#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"
|
||||
@ -312,6 +313,8 @@ static int scsi_inquiry(struct sysfs_device *scsi_dev, int fd, unsigned
|
||||
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);
|
||||
@ -352,6 +355,11 @@ resend:
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user