diff --git a/devmap_name/Makefile b/devmap_name/Makefile index d8d8b09..57051d9 100644 --- a/devmap_name/Makefile +++ b/devmap_name/Makefile @@ -18,25 +18,22 @@ EXEC = devmap_name all: $(BUILD) prepare: - rm -f core *.o *.gz + rm -f core *.o glibc: prepare $(OBJS) $(CC) $(OBJS) -o $(EXEC) $(LDFLAGS) - $(GZIP) $(EXEC).8 > $(EXEC).8.gz klibc: prepare $(OBJS) $(CC) -static -o $(EXEC) $(OBJS) - $(GZIP) $(EXEC).8 > $(EXEC).8.gz install: $(EXEC) $(EXEC).8 install -d $(DESTDIR)$(bindir) install -m 755 $(EXEC) $(DESTDIR)$(bindir)/ install -d $(DESTDIR)$(mandir) - install -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) + install -m 644 $(EXEC).8 $(DESTDIR)$(mandir) uninstall: rm $(DESTDIR)$(bindir)/$(EXEC) - rm $(DESTDIR)$(mandir)/$(EXEC).8.gz clean: - rm -f core *.o $(EXEC) *.gz + rm -f core *.o $(EXEC) diff --git a/kpartx/Makefile b/kpartx/Makefile index b4cca6c..d970d29 100644 --- a/kpartx/Makefile +++ b/kpartx/Makefile @@ -23,32 +23,29 @@ EXEC = kpartx all: $(BUILD) prepare: - rm -f core *.o *.gz + rm -f core *.o glibc: prepare $(OBJS) $(CC) $(OBJS) -o $(EXEC) $(LDFLAGS) - $(GZIP) $(EXEC).8 > $(EXEC).8.gz - + klibc: prepare $(OBJS) $(CC) -static -o $(EXEC) $(CRT0) $(OBJS) $(KLIBC) $(LIBGCC) - $(GZIP) $(EXEC).8 > $(EXEC).8.gz $(MULTIPATHLIB)-$(BUILD).a: make -C $(multipathdir) BUILD=$(BUILD) -install: $(EXEC) $(EXEC).8 +install: $(EXEC) kpartx_id $(EXEC).8 install -d $(DESTDIR)$(bindir) $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir) install -d $(DESTDIR)$(libudevdir) install -m 755 kpartx_id $(DESTDIR)$(libudevdir) install -d $(DESTDIR)/etc/udev/rules.d - install -m 644 kpartx.rules $(DESTDIR)/etc/udev/rules.d/ + install -m 644 kpartx.rules $(DESTDIR)/etc/udev/rules.d/70-kpartx.rules install -d $(DESTDIR)$(mandir) - install -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) + install -m 644 $(EXEC).8 $(DESTDIR)$(mandir) uninstall: rm -f $(DESTDIR)$(bindir)/$(EXEC) - rm -f $(DESTDIR)$(mandir)/$(EXEC).8.gz clean: - rm -f core *.o $(EXEC) *.gz + rm -f core *.o $(EXEC) diff --git a/kpartx/kpartx.c b/kpartx/kpartx.c index dbe2ee2..f60e5f4 100644 --- a/kpartx/kpartx.c +++ b/kpartx/kpartx.c @@ -265,7 +265,7 @@ main(int argc, char **argv){ } if (dm_prereq(DM_TARGET, 0, 0, 0) && (what == ADD || what == DELETE)) { - fprintf(stderr, "device mapper prerequisites not met\n"); + fprintf(stderr, "device mapper prerequisites not met\n"); exit(1); } @@ -387,10 +387,10 @@ main(int argc, char **argv){ slices[j].minor = m++; start = slices[j].start - slices[k].start; - printf("%s%s%d : 0 %lu /dev/dm-%d %lu\n", + printf("%s%s%d : 0 %lu %s%s%d %lu\n", mapname, delim, j+1, (unsigned long) slices[j].size, - slices[k].minor, start); + mapname, delim, k, start); c--; } /* Terminate loop if nothing more to resolve */ @@ -431,7 +431,7 @@ main(int argc, char **argv){ break; case ADD: - for (j=0, c = 0; j/dev/null 2>&1 || rm -f core *.o *.gz + @file *-$(BUILD).a >/dev/null 2>&1 || rm -f core *.o klibc: prepare $(OBJS) ar rs libcheckers-klibc.a *.o @@ -24,4 +24,4 @@ install: uninstall: clean: - rm -f core *.a *.o *.gz + rm -f core *.a *.o diff --git a/libmultipath/Makefile b/libmultipath/Makefile index 511f5ad..3ab059a 100644 --- a/libmultipath/Makefile +++ b/libmultipath/Makefile @@ -25,7 +25,7 @@ else CLEAN = $(shell if [ ! "x$(PREVBUILD)" = "x" ]; then echo clean; fi) endif -LIBDM_API_FLUSH = $(shell objdump -T /lib/libdevmapper.so.* | grep -c dm_task_no_flush) +LIBDM_API_FLUSH = $(shell /sbin/ldconfig -p | grep devmapper.so.1 | cut -d ' ' -f 4 | xargs objdump -T | grep -c dm_task_no_flush) ifeq ($(strip $(LIBDM_API_FLUSH)),1) CFLAGS += -DLIBDM_API_FLUSH @@ -34,7 +34,7 @@ endif all: $(BUILD) prepare: $(CLEAN) - @file *-$(BUILD).a >/dev/null 2>&1 || rm -f core *.o *.gz + @file *-$(BUILD).a >/dev/null 2>&1 || rm -f core *.o @rm -f *-$(BUILD).a klibc: $(OBJS) @@ -48,4 +48,4 @@ install: uninstall: clean: - rm -f core *.a *.o *.gz + rm -f core *.a *.o diff --git a/libmultipath/config.c b/libmultipath/config.c index a39af8a..1dfc18c 100644 --- a/libmultipath/config.c +++ b/libmultipath/config.c @@ -366,12 +366,15 @@ load_config (char * file) /* * read the config file */ + set_current_keywords(&conf->keywords); + alloc_keywords(); if (filepresent(file)) { - set_current_keywords(&conf->keywords); if (init_data(file, init_keywords)) { condlog(0, "error parsing config file"); goto out; } + } else { + init_keywords(); } /* diff --git a/libmultipath/parser.c b/libmultipath/parser.c index f9c555e..5302970 100644 --- a/libmultipath/parser.c +++ b/libmultipath/parser.c @@ -455,16 +455,23 @@ process_stream(vector keywords) return r; } +int alloc_keywords(void) +{ + if (!keywords) + keywords = vector_alloc(); + + if (!keywords) + return 1; + + return 0; +} + /* Data initialization */ int init_data(char *conf_file, void (*init_keywords) (void)) { int r; - if (!keywords) - keywords = vector_alloc(); - if (!keywords) - return 1; stream = fopen(conf_file, "r"); if (!stream) { syslog(LOG_WARNING, "Configuration file open problem"); diff --git a/libmultipath/parser.h b/libmultipath/parser.h index 95d4e6f..8496684 100644 --- a/libmultipath/parser.h +++ b/libmultipath/parser.h @@ -74,6 +74,7 @@ extern vector read_value_block(void); extern int alloc_value_block(vector strvec, void (*alloc_func) (vector)); extern void *set_value(vector strvec); extern int process_stream(vector keywords); +extern int alloc_keywords(void); extern int init_data(char *conf_file, void (*init_keywords) (void)); extern struct keyword * find_keyword(vector v, char * name); void set_current_keywords (vector *k); diff --git a/libmultipath/print.c b/libmultipath/print.c index 01a157a..489bc2b 100644 --- a/libmultipath/print.c +++ b/libmultipath/print.c @@ -738,7 +738,7 @@ snprint_hwentry (char * buff, int len, struct hwentry * hwe) if (fwd > len) return len; iterate_sub_keywords(rootkw, kw, i) { - fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n", + fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k \"%v\"\n", kw, hwe); if (fwd > len) return len; diff --git a/multipath/Makefile b/multipath/Makefile index 4923b2f..bad9da7 100644 --- a/multipath/Makefile +++ b/multipath/Makefile @@ -22,9 +22,7 @@ all: $(BUILD) prepare: make -C $(multipathdir) prepare - rm -f core *.o *.gz - $(GZIP) $(EXEC).8 > $(EXEC).8.gz - $(GZIP) $(EXEC).conf.5 > $(EXEC).conf.5.gz + rm -f core *.o glibc: prepare $(OBJS) $(CC) $(OBJS) -o $(EXEC) $(LDFLAGS) @@ -42,17 +40,15 @@ install: install -d $(DESTDIR)$(bindir) $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/ install -d $(DESTDIR)/etc/udev/rules.d - install -m 644 multipath.rules $(DESTDIR)/etc/udev/rules.d/ + install -m 644 multipath.rules $(DESTDIR)/etc/udev/rules.d/71-multipath.rules install -d $(DESTDIR)$(mandir) - install -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) + install -m 644 $(EXEC).8 $(DESTDIR)$(mandir) install -d $(DESTDIR)$(man5dir) - install -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir) + install -m 644 multipath.conf.5 $(DESTDIR)$(man5dir) uninstall: rm $(DESTDIR)/etc/udev/rules.d/multipath.rules rm $(DESTDIR)$(bindir)/$(EXEC) - rm $(DESTDIR)$(mandir)/$(EXEC).8.gz - rm $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz clean: - rm -f core *.o $(EXEC) *.gz + rm -f core *.o $(EXEC) diff --git a/multipath/main.c b/multipath/main.c index 815c307..e2d7f41 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -72,7 +72,7 @@ static void usage (char * progname) { fprintf (stderr, VERSION_STRING); - fprintf (stderr, "Usage: %s\t[-v level] [-d] [-h|-l|-ll|-f|-F]\n", + fprintf (stderr, "Usage: %s\t[-v level] [-d] [-h|-l|-ll|-f|-F|-t]\n", progname); fprintf (stderr, "\t\t\t[-p failover|multibus|group_by_serial|group_by_prio]\n" \ @@ -90,6 +90,7 @@ usage (char * progname) "\t-ll\t\tshow multipath topology (maximum info)\n" \ "\t-f\t\tflush a multipath device map\n" \ "\t-F\t\tflush all multipath device maps\n" \ + "\t-t\t\tprint internal hardware table\n" \ "\t-p policy\tforce all maps to specified policy :\n" \ "\t failover\t\t1 path per priority group\n" \ "\t multibus\t\tall paths in 1 priority group\n" \ @@ -307,6 +308,55 @@ out: return r; } +static int +dump_config (void) +{ + char * c; + char * reply; + unsigned int maxlen = 256; + int again = 1; + + reply = MALLOC(maxlen); + + while (again) { + if (!reply) + return 1; + c = reply; + c += snprint_defaults(c, reply + maxlen - c); + again = ((c - reply) == maxlen); + if (again) { + reply = REALLOC(reply, maxlen *= 2); + continue; + } + c += snprint_blacklist(c, reply + maxlen - c); + again = ((c - reply) == maxlen); + if (again) { + reply = REALLOC(reply, maxlen *= 2); + continue; + } + c += snprint_blacklist_except(c, reply + maxlen - c); + again = ((c - reply) == maxlen); + if (again) { + reply = REALLOC(reply, maxlen *= 2); + continue; + } + c += snprint_hwtable(c, reply + maxlen - c, conf->hwtable); + again = ((c - reply) == maxlen); + if (again) { + reply = REALLOC(reply, maxlen *= 2); + continue; + } + c += snprint_mptable(c, reply + maxlen - c, conf->mptable); + again = ((c - reply) == maxlen); + if (again) + reply = REALLOC(reply, maxlen *= 2); + } + + printf("%s", reply); + FREE(reply); + return 0; +} + int main (int argc, char *argv[]) { @@ -330,7 +380,7 @@ main (int argc, char *argv[]) condlog(0, "multipath tools need sysfs mounted"); exit(1); } - while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:")) != EOF ) { + while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:t")) != EOF ) { switch(arg) { case 1: printf("optarg : %s\n",optarg); break; @@ -373,6 +423,9 @@ main (int argc, char *argv[]) usage(argv[0]); } break; + case 't': + dump_config(); + goto out; case 'h': usage(argv[0]); case ':': diff --git a/multipath/multipath.8 b/multipath/multipath.8 index 693872b..e72cc45 100644 --- a/multipath/multipath.8 +++ b/multipath/multipath.8 @@ -6,7 +6,7 @@ multipath \- Device mapper target autoconfig .RB [\| \-v\ \c .IR verbosity \|] .RB [\| \-d \|] -.RB [\| \-h | \-l | \-ll | \-f | \-F \|] +.RB [\| \-h | \-l | \-ll | \-f | \-t | \-F \|] .RB [\| \-p\ \c .BR failover | multibus | group_by_serial | group_by_prio | group_by_node_name \|] .RB [\| device \|] @@ -47,6 +47,9 @@ flush a multipath device map specified as parameter, if unused .B \-F flush all unused multipath device maps .TP +.B \-t +print internal hardware table to stdout +.TP .BI \-p " policy" force maps to specified policy: .RS 1.2i @@ -76,6 +79,9 @@ is in the /dev/sdb (as shown by udev in the $DEVNAME variable) or major:minor fo .I device may alternatively be a multipath mapname .SH "SEE ALSO" +.BR multipathd (8), +.BR multipath.conf (5), +.BR kpartx (8), .BR udev (8), .BR dmsetup (8) .BR hotplug (8) diff --git a/multipath/multipath.init.suse b/multipath/multipath.init.suse new file mode 100755 index 0000000..daea61f --- /dev/null +++ b/multipath/multipath.init.suse @@ -0,0 +1,130 @@ +#! /bin/sh +# Copyright (c) 2005 SuSE GmbH Nuernberg, Germany. +# +# Author: Hannes Reinecke +# +# init.d/boot.multipath +# +### BEGIN INIT INFO +# Provides: boot.multipath +# Required-Start: boot.device-mapper boot.udev +# Required-Stop: +# Default-Start: B +# Default-Stop: +# Short-Description: Create multipath device targets +# Description: Setup initial multipath device-mapper targets +### END INIT INFO + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +PROGRAM=/sbin/multipath + +# Set the maximum number of open files +MAX_OPEN_FDS=4096 + +test -x $PROGRAM || exit 5 + +# Shell functions sourced from /etc/rc.status: +# rc_check check and set local and overall rc status +# rc_status check and set local and overall rc status +# rc_status -v ditto but be verbose in local rc status +# rc_status -v -r ditto and clear the local rc status +# rc_failed set local and overall rc status to failed +# rc_reset clear local rc status (overall remains) +# rc_exit exit appropriate to overall rc status +. /etc/rc.status + +# First reset status of this service +rc_reset + +# Return values acc. to LSB for all commands but status: +# 0 - success +# 1 - misc error +# 2 - invalid or excess args +# 3 - unimplemented feature (e.g. reload) +# 4 - insufficient privilege +# 5 - program not installed +# 6 - program not configured +# 7 - program is not running +# +# Note that starting an already running service, stopping +# or restarting a not-running service as well as the restart +# with force-reload (in case signalling is not supported) are +# considered a success. + +maplist=$(/sbin/dmsetup ls --target multipath | sed '/No devices/d' | cut -f 1) + +case "$1" in + start) + echo -n "Creating multipath targets:" + # Check whether multipath daemon is already running + if /sbin/multipathd -k"list paths" > /dev/null 2>&1 ; then + echo -n " (multipathd running)" + rc_status -v + rc_exit + fi + + # Load prerequisite module + modprobe dm-multipath + + # Be a chicken and flush all existing maps + for map in $maplist ; do + $PROGRAM -f $map + done + + # Clear /dev/disk/by-name/ prior to start-up; multipath will + # recreate them. + rm -f /dev/disk/by-name/* 2>&1 >/dev/null + + # Set the maximum number of open files + if [ -n "$MAX_OPEN_FDS" ] ; then + ulimit -n $MAX_OPEN_FDS + fi + + # Start the program directly as checkproc doesn't work here + $PROGRAM -v 0 + + # Create all partitions which might have been missing + /sbin/dmsetup ls --target multipath --exec "/sbin/kpartx -a -p -part" + + # Remember status and be verbose + rc_status -v + sleep 1 + ;; + stop) + echo -n "Removing multipath targets:" + + # Remove all partition mappings + if /sbin/dmsetup ls | sed '/No devices/d' | grep -q -- -part; then + /sbin/dmsetup ls --target multipath --exec "/sbin/kpartx -d -p -part" 2> /dev/null + fi + + # Flush all existing maps + for map in $maplist ; do + $PROGRAM -f $map + done + + rc_failed 0 + rc_status -v + ;; + status) + echo -n "Checking multipath targets: " + # Display active multipath tables + tblnum=$(/sbin/dmsetup ls --target multipath | sed '/No devices/d' | wc --lines) + if [ "$tblnum" ] && [ $tblnum -gt 0 ] ; then + echo -n "($tblnum multipath devices) " + rc_failed 0 + else + rc_failed 3 + fi + rc_status -v + ;; + reload) + $0 stop + $0 start + ;; + *) + echo "Usage: $0 {start|stop|status}" + exit 1 + ;; +esac +rc_exit diff --git a/multipathd/Makefile b/multipathd/Makefile index b430b94..e076d56 100644 --- a/multipathd/Makefile +++ b/multipathd/Makefile @@ -35,7 +35,6 @@ klibc: $(EXEC): clean $(OBJS) $(CC) $(OBJS) -o $(EXEC) $(LDFLAGS) - $(GZIP) $(EXEC).8 > $(EXEC).8.gz $(CHECKERSLIB)-glibc.a: $(MAKE) -C $(checkersdir) BUILD=glibc glibc @@ -48,14 +47,13 @@ install: $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir) install -d $(DESTDIR)$(rcdir) install -d $(DESTDIR)$(mandir) - install -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) + install -m 644 $(EXEC).8 $(DESTDIR)$(mandir) uninstall: rm -f $(DESTDIR)$(bindir)/$(EXEC) rm -f $(DESTDIR)$(rcdir)/$(EXEC) - rm -f $(DESTDIR)$(mandir)/$(EXEC).8.gz clean: $(MAKE) -C $(multipathdir) prepare DAEMON=1 - rm -f core *.o $(EXEC) *.gz + rm -f core *.o $(EXEC) diff --git a/multipathd/multipathd.init.suse b/multipathd/multipathd.init.suse new file mode 100755 index 0000000..c850896 --- /dev/null +++ b/multipathd/multipathd.init.suse @@ -0,0 +1,133 @@ +#! /bin/sh +# Copyright (c) 1995-2001 SuSE GmbH Nuernberg, Germany. +# +# Author: Hannes Reinecke +# +# init.d/routed +# +# and symbolic its link +# +# /usr/sbin/rcrouted +# +### BEGIN INIT INFO +# Provides: multipathd +# Required-Start: $syslog +# Required-Stop: +# Default-Start: 3 5 +# Default-Stop: 0 1 2 4 6 +# Short-Description: Starts multipath daemon +# Description: Starts the multipath daemon +### END INIT INFO + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +DAEMON=/sbin/multipathd +PIDFILE=/var/run/multipathd.pid + +# Set the maximum number of open files +MAX_OPEN_FDS=4096 + +test -x $DAEMON || exit 5 + +. /etc/rc.status + +# First reset status of this service +rc_reset + +case "$1" in + start) + echo -n "Starting multipathd" + + modprobe dm-multipath + + # Set the maximum number of open files + if [ -n "$MAX_OPEN_FDS" ] ; then + ulimit -n $MAX_OPEN_FDS + fi + + if [ -f $PIDFILE ]; then + PID="$(cat $PIDFILE)" + PROCNAME="$(ps -o cmd --no-headers $PID)" + fi + + if [ "$PROCNAME" != "$DAEMON" ]; then + $DAEMON + fi + + # Remember status and be verbose + rc_status -v + sleep 1 + ;; + stop) + echo -n "Shutting down multipathd" + # Because of the way how multipathd sets up its own namespace + # and chroots to it, killproc cannot be used with this process. + # So implement a cruder version: + if [ -f $PIDFILE ]; then + PID="$(cat $PIDFILE)" + PROCNAME="$(ps -o cmd --no-headers $PID)" + fi + + if [ "$PROCNAME" == "$DAEMON" ]; then + kill -TERM $PID + fi + + # Remember status and be verbose + rc_status -v + ;; + try-restart) + ## Stop the service and if this succeeds (i.e. the + ## service was running before), start it again. + $0 status >/dev/null && $0 restart + + # Remember status and be quiet + rc_status + ;; + restart|force-reload) + ## Stop the service and regardless of whether it was + ## running or not, start it again. + $0 stop + $0 start + + # Remember status and be quiet + rc_status + ;; + reload) + ## Like force-reload, but if daemon does not support + ## signalling, do nothing (!) + + # If it does not support reload: + exit 3 + ;; + status) + echo -n "Checking for multipathd: " + + # Status has a slightly different for the status command: + # 0 - service running + # 1 - service dead, but /var/run/ pid file exists + # 2 - service dead, but /var/lock/ lock file exists + # 3 - service not running + + if [ -f $PIDFILE ]; then + PID="$(cat $PIDFILE)" + PROCNAME="$(ps -o cmd --no-headers $PID)" + if [ "$PROCNAME" == "$DAEMON" ]; then + (exit 0) + else + (exit 1) + fi + else + (exit 3) + fi + + rc_status -v + ;; + probe) + ## Optional: Probe for the necessity of a reload, + ## give out the argument which is required for a reload. + ;; + *) + echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}" + exit 1 + ;; +esac +rc_exit diff --git a/path_priority/pp_alua/Makefile b/path_priority/pp_alua/Makefile index 6f356a1..ce78455 100644 --- a/path_priority/pp_alua/Makefile +++ b/path_priority/pp_alua/Makefile @@ -35,19 +35,15 @@ glibc: $(OBJS) klibc: $(OBJS) $(CC) -static -o $(EXEC) $(OBJS) -install: $(EXEC) $(EXEC).8.gz +install: $(EXEC) $(EXEC).8 $(INSTALL) -s -m 755 $(EXEC) $(DESTDIR)$(bindir)/$(EXEC) - $(INSTALL) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)/$(EXEC).8.gz + $(INSTALL) -m 644 $(EXEC).8 $(DESTDIR)$(mandir)/$(EXEC).8 uninstall: rm $(DESTDIR)$(bindir)/$(EXEC) - rm $(DESTDIR)$(mandir)/$(EXEC).8.gz clean: - rm -f *.o *.gz $(EXEC) - -$(EXEC).8.gz: $(EXEC).8 - $(GZIP) $< >$@ + rm -f *.o $(EXEC) main.o: main.c rtpg.h spc3.h diff --git a/path_priority/pp_balance_units/Makefile b/path_priority/pp_balance_units/Makefile index cb1e6c6..43a0fc2 100644 --- a/path_priority/pp_balance_units/Makefile +++ b/path_priority/pp_balance_units/Makefile @@ -22,7 +22,7 @@ EXEC = mpath_prio_balance_units all: $(BUILD) prepare: - rm -f core *.o *.gz + rm -f core *.o glibc: prepare $(OBJS) $(CC) -o $(EXEC) $(OBJS) $(LDFLAGS) @@ -41,4 +41,4 @@ uninstall: rm $(DESTDIR)$(bindir)/$(EXEC) clean: - rm -f core *.o $(EXEC) *.gz + rm -f core *.o $(EXEC) diff --git a/path_priority/pp_hds_modular/pp_hds_modular.c b/path_priority/pp_hds_modular/pp_hds_modular.c index 7411508..10b28b8 100644 --- a/path_priority/pp_hds_modular/pp_hds_modular.c +++ b/path_priority/pp_hds_modular/pp_hds_modular.c @@ -120,7 +120,7 @@ int main (int argc, char **argv) int hds_modular_prio (const char *dev) { int sg_fd, k; - char vendor[8]; + char vendor[9]; char product[32]; char serial[32]; char ldev[32];