[PATCH] update udev scsi_id to scsi_id 0.3

This commit is contained in:
patmans@us.ibm.com 2004-01-16 22:03:50 -08:00 committed by Greg KH
parent eb7a964a7c
commit e996d97835
9 changed files with 147 additions and 75 deletions

View File

@ -1,3 +1,36 @@
2004-jan-15:
* Makefile: Version 0.3
2004-jan-13:
* scsi_id.c, Makefile: Fix prefix usage with scsi_id.config.
2004-jan-13:
* scsi_id.config: Clean up some comment entries.
2004-jan-13:
* Makefile: Install the sample scsi_id.config file.
2004-jan-13:
* Makefile: Use DESTDIR in all install/uninstall rules, per
problem reported by Svetoslav Slavtchev.
2004-jan-12:
* scsi_id.h, scsi_id.c, scsi_serial.c: Fix to work with current
sysfs 0.4, based on patch from Dan Stekloff, but uses
sysfs_read_attribute_value instead of
sysfs_get_value_from_attributes.
2004-jan-08:
* scsi_id.c: SYSFS_BUS_DIR was replaced with SYSFS_BUS_NAME.
2004-jan-08:
* scsi_id.c: Must now use sysfs_open_class_device_path instead of the
previous sysfs_open_class_device.
2003-dec-07:
* Makefile: patch from Olaf Hering <olh@suse.de> remove DEBUG and
add --fno-builtin
2003-dec-05:
* Makefile, scsi_id.8: Add a man page.
@ -53,12 +86,12 @@
is no support for that in klibc.
2003-nov-17:
* scsi_id.c: Patch from Brian King: check result of setting model,
not vendor in per_dev_options.
* scsi_id.c: Patch from Brian King <brking@us.ibm.com>: check
result of setting model, not vendor in per_dev_options.
2003-nov-03:
* scsi_id.c, scsi_serial.c: Use new and correct path to libsysfs.h.
2003-nov-03:
* scsi_id.h: Fix scsi_id.h so var args in marcros works ok with
* scsi_id.h: Fix scsi_id.h so var args in macros works ok with
older gcc.

View File

@ -14,9 +14,10 @@
# 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.2
SCSI_ID_VERSION=0.3
prefix =
etcdir = ${prefix}/etc
sbindir = ${prefix}/sbin
mandir = ${prefix}/usr/share/man
@ -27,7 +28,7 @@ INSTALL_DATA = ${INSTALL} -m 644
# Note some of the variables used here are set when built under udev, and
# otherwise might not be set.
override CFLAGS+=-DSCSI_ID_VERSION=\"$(SCSI_ID_VERSION)\" $(DEBUG) -Wall
override CFLAGS+=-Wall -fno-builtin
PROG=scsi_id
SYSFS=-lsysfs
@ -39,25 +40,35 @@ SYSFS=-lsysfs
# LDFLAGS=$(STRIP)
LD=$(CC)
OBJS= scsi_id.o \
scsi_serial.o \
OBJS= scsi_id.o scsi_serial.o
all: $(PROG)
# XXX use a compressed man page?
install: all
$(INSTALL_PROGRAM) -D $(PROG) $(sbindir)/$(PROG)
$(INSTALL_PROGRAM) -D $(PROG) $(DESTDIR)$(sbindir)/$(PROG)
$(INSTALL_DATA) -D scsi_id.8 $(DESTDIR)$(mandir)/man8/scsi_id.8
@if [ ! -r $(DESTDIR)$(etcdir)/scsi_id.config ]; then \
echo $(INSTALL_DATA) -D ./scsi_id.config $(DESTDIR)$(etcdir); \
$(INSTALL_DATA) -D ./scsi_id.config $(DESTDIR)$(etcdir)/scsi_id.config; \
fi
uninstall:
-rm $(sbindir)/$(PROG)
-rm $(mandir)/man8/scsi_id.8
-rm $(DESTDIR)$(sbindir)/$(PROG)
-rm $(DESTDIR)$(mandir)/man8/scsi_id.8
-rm $(DESTDIR)$(etcdir)/scsi_id.config
$(OBJS): scsi_id.h scsi.h
GEN_HEADER=scsi_id_version.h
scsi_id_version.h:
@echo "/* This file is auto-generated by the Makefile */" > $@
@echo \#define SCSI_ID_VERSION \"$(SCSI_ID_VERSION)\" >> $@
@echo \#define SCSI_ID_CONFIG_FILE \"$(etcdir)/scsi_id.config\" >> $@
$(OBJS): scsi_id.h scsi.h scsi_id_version.h
clean:
rm -f $(PROG) $(OBJS)
rm -f $(PROG) $(OBJS) $(GEN_HEADER)
$(PROG): $(OBJS)
$(LD) $(LDFLAGS) -o $(PROG) $(CRT0) $(OBJS) $(SYSFS) $(LIB_OBJS) $(ARCH_LIB_OBJS)

View File

@ -7,12 +7,7 @@ Requires:
- Linux kernel 2.6
- libsysfs
No man page yet.
libsysfs 0_2_0 was not installing libsysfs.h or dlist.h, manually copy
those files to /usr/include/sys before compiling.
- sysfsutils 0.4
Build via make and make install.

View File

@ -1,4 +1,4 @@
- add information abou the config file to the man page
- add information about the config file to the man page
- change so non-KLIBC builds under udev don't use /usr/include/sysfs,
but instead use the sysfs included with udev (needs udev change and/or

View File

@ -0,0 +1,39 @@
Version 0.3 of scsi_id is available at:
http://www-124.ibm.com/storageio/scsi_id/scsi_id-0.3.tar.gz
scsi_id is a program to generate a SCSI unique identifier for a given SCSI
device.
It is primarily for use with udev callout config entries. It can also be
used for automatic multi-path configuration or device mapper configuration.
Version 0.3 requires:
- Linux kernel 2.6
- libsysfs 0.4.0
Major changes since the last release:
- Changes to work with libsysfs 0.4.0
All changes:
- fix "prefix" usage for path to scsi_id.config
- install the sample scsi_id.config file.
- Use DESTDIR in all install/uninstall rules, per problem reported
by Svetoslav Slavtchev.
- Fix to work with current sysfs 0.4, based on patch from Dan
Stekloff, but uses sysfs_read_attribute_value instead of
sysfs_get_value_from_attributes.
- SYSFS_BUS_DIR was replaced with SYSFS_BUS_NAME.
- Must now use sysfs_open_class_device_path instead of the
previous sysfs_open_class_device.
- patch from Olaf Hering <olh@suse.de> remove DEBUG and
add --fno-builtin

View File

@ -40,6 +40,7 @@
#else
#include <sysfs/libsysfs.h>
#endif
#include "scsi_id_version.h"
#include "scsi_id.h"
#ifndef SCSI_ID_VERSION
@ -53,8 +54,6 @@
#define TMP_DIR "/tmp"
#define TMP_PREFIX "scsi"
#define CONFIG_FILE "/etc/scsi_id.config"
static const char short_options[] = "bc:d:ef:gip:s:vV";
/*
* Just duplicate per dev options.
@ -67,7 +66,7 @@ static int all_good;
static char *default_callout;
static int dev_specified;
static int sys_specified;
static char config_file[MAX_NAME_LEN] = CONFIG_FILE;
static char config_file[MAX_NAME_LEN] = SCSI_ID_CONFIG_FILE;
static int display_bus_id;
static int default_page_code;
static int use_stderr;
@ -102,6 +101,18 @@ void log_message (int level, const char *format, ...)
return;
}
int sysfs_get_attr(const char *devpath, const char *attr, char *value,
size_t bufsize)
{
char attr_path[SYSFS_PATH_MAX];
strncpy(attr_path, devpath, SYSFS_PATH_MAX);
strncat(attr_path, "/", SYSFS_PATH_MAX);
strncat(attr_path, attr, SYSFS_PATH_MAX);
dprintf("%s\n", attr_path);
return sysfs_read_attribute_value(attr_path, value, SYSFS_NAME_LEN);
}
static int sysfs_get_actual_dev(const char *sysfs_path, char *dev, int len)
{
dprintf("%s\n", sysfs_path);
@ -153,34 +164,22 @@ static int sysfs_is_bus(const char *sysfs_path, const char *bus)
static int get_major_minor(const char *devpath, int *major, int *minor)
{
struct sysfs_class_device *class_dev;
char dev_value[SYSFS_NAME_LEN];
char *dev;
char dev_value[MAX_ATTR_LEN];
dprintf("%s\n", devpath);
class_dev = sysfs_open_class_device_path(devpath);
if (!class_dev) {
log_message(LOG_WARNING, "open class %s failed: %s\n", devpath,
strerror(errno));
return -1;
}
dev = sysfs_get_attr(class_dev, "dev");
if (dev)
strncpy(dev_value, dev, SYSFS_NAME_LEN);
sysfs_close_class_device(class_dev);
if (!dev) {
if (sysfs_get_attr(devpath, "dev", dev_value, MAX_ATTR_LEN)) {
/*
* XXX This happens a lot, since sg has no dev attr.
* Someday change this back to a LOG_WARNING.
* And now sysfsutils does not set a meaningful errno
* value. Someday change this back to a LOG_WARNING.
* And if sysfsutils changes, check for ENOENT and handle
* it separately.
*/
log_message(LOG_DEBUG, "%s could not get dev attribute: %s\n",
devpath, strerror(errno));
return -1;
}
dev = NULL;
dprintf("dev %s", dev_value); /* dev_value has a trailing \n */
dprintf("dev value %s", dev_value); /* dev_value has a trailing \n */
if (sscanf(dev_value, "%u:%u", major, minor) != 2) {
log_message(LOG_WARNING, "%s: invalid dev major/minor\n",
devpath);
@ -547,8 +546,8 @@ static int per_dev_options(struct sysfs_class_device *scsi_dev, int *good_bad,
int retval;
int newargc;
char **newargv = NULL;
char *vendor;
char *model;
char vendor[MAX_ATTR_LEN];
char model[MAX_ATTR_LEN];
int option;
*good_bad = all_good;
@ -558,16 +557,14 @@ static int per_dev_options(struct sysfs_class_device *scsi_dev, int *good_bad,
else
callout[0] = '\0';
vendor = sysfs_get_attr(scsi_dev, "vendor");
if (!vendor) {
log_message(LOG_WARNING, "%s: no vendor attribute\n",
if (sysfs_get_attr(scsi_dev->path, "vendor", vendor, MAX_ATTR_LEN)) {
log_message(LOG_WARNING, "%s: cannot get vendor attribute\n",
scsi_dev->name);
return -1;
}
model = sysfs_get_attr(scsi_dev, "model");
if (!model) {
log_message(LOG_WARNING, "%s: no model attribute\n",
if (sysfs_get_attr(scsi_dev->path, "model", model, MAX_ATTR_LEN)) {
log_message(LOG_WARNING, "%s: cannot get model attribute\n",
scsi_dev->name);
return -1;
}

View File

@ -21,7 +21,9 @@
# vendor=string[,model=string],options=<per-device scsi_id options>
#
# If you normally don't need id's, black list everyone:
# If you normally don't need scsi id's, or might be attaching devices of
# an unknown functionality, black list everyone. This is the default
# behaviour (if no -b or -g is specified).
#
options=-b
@ -30,7 +32,8 @@ options=-b
#
vendor=someone, model=nicedrive, options=-g
# If you have all good devices on your system use, mark all as good:
# If you all the scsi devices are your system support valid id's, remove
# the -b line above, and mark all devices as good:
## options=-g

View File

@ -27,6 +27,12 @@
#define MAX_NAME_LEN 72
#define OFFSET (2 * sizeof(unsigned int))
/*
* MAX_ATTR_LEN: maximum length of the result of reading a sysfs
* attribute.
*/
#define MAX_ATTR_LEN 256
/*
* MAX_SERIAL_LEN: the maximum length of the serial number, including
* added prefixes such as vendor and product (model) strings.
@ -39,19 +45,8 @@
*/
#define MAX_BUFFER_LEN 256
static inline char *sysfs_get_attr(struct sysfs_class_device *dev,
const char *attr)
{
struct dlist *attributes = NULL;
attributes = sysfs_get_classdev_attributes(dev);
if (attributes == NULL)
return NULL;
return sysfs_get_value_from_attributes(attributes, attr);
}
extern int sysfs_get_attr(const char *devpath, const char *attr, char *value,
size_t bufsize);
extern int scsi_get_serial (struct sysfs_class_device *scsi_dev,
const char *devname, int page_code, char *serial,
int len);

View File

@ -385,7 +385,7 @@ static int do_scsi_page0_inquiry(struct sysfs_class_device *scsi_dev, int fd,
char *buffer, int len)
{
int retval;
char *vendor;
char vendor[MAX_ATTR_LEN];
memset(buffer, 0, len);
retval = scsi_inquiry(scsi_dev, fd, 1, 0x0, buffer, len);
@ -415,9 +415,10 @@ static int do_scsi_page0_inquiry(struct sysfs_class_device *scsi_dev, int fd,
* If the vendor id appears in the page assume the page is
* invalid.
*/
vendor = sysfs_get_attr(scsi_dev, "vendor");
if (!vendor) {
log_message(LOG_WARNING, "%s: no vendor attribute\n",
if (sysfs_get_attr(scsi_dev->path, "vendor", vendor,
MAX_ATTR_LEN)) {
log_message(LOG_WARNING,
"%s: cannot get model attribute\n",
scsi_dev->name);
return 1;
}
@ -437,12 +438,11 @@ static int do_scsi_page0_inquiry(struct sysfs_class_device *scsi_dev, int fd,
static int prepend_vendor_model(struct sysfs_class_device *scsi_dev,
char *serial)
{
char *attr;
char attr[MAX_ATTR_LEN];
int ind;
attr = sysfs_get_attr(scsi_dev, "vendor");
if (!attr) {
log_message(LOG_WARNING, "%s: no vendor attribute\n",
if (sysfs_get_attr(scsi_dev->path, "vendor", attr, MAX_ATTR_LEN)) {
log_message(LOG_WARNING, "%s: cannot get vendor attribute\n",
scsi_dev->name);
return 1;
}
@ -454,9 +454,8 @@ static int prepend_vendor_model(struct sysfs_class_device *scsi_dev,
if (serial[ind] == '\n')
serial[ind] = '\0';
attr = sysfs_get_attr(scsi_dev, "model");
if (!attr) {
log_message(LOG_WARNING, "%s: no model attribute\n",
if (sysfs_get_attr(scsi_dev->path, "model", attr, MAX_ATTR_LEN)) {
log_message(LOG_WARNING, "%s: cannot get model attribute\n",
scsi_dev->name);
return 1;
}