From mboxrd@z Thu Jan 1 00:00:00 1970 From: Arnd Bergmann Date: Fri, 27 Feb 2004 13:02:06 +0000 Subject: hotplug for klibc utils Message-Id: <200402271402.06890.arnd@arndb.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: linux-hotplug@vger.kernel.org Several people have run into problems when attaching large disk arrays to a mainframe because of running /sbin/hotplug as a bash script takes far longer than the interval between hotplug events. Attaching more than 300 devices at once will cause an out-of-memory condition and the kernel starts killing random processes. Running only udev instead of hotplug from the kernel is fast enough. Christian Borntr=E4ger was so kind to reimplement the Gregs hotplug=20 shell script in C and verify that this solves the problem. The shell version currently does: > DIR=3D"/etc/hotplug.d" > for I in "${DIR}/$1/"*.hotplug "${DIR}/"default/*.hotplug ; do > if [ -f $I ]; then test -x $I && $I $1 ; fi > done > exit 1; Arnd <>< diff -urN klibc-0.115/utils/Makefile klibc-0.115-hotplug/utils/Makefile --- klibc-0.115/utils/Makefile 2004-02-22 01:57:32.000000000 +0100 +++ klibc-0.115-hotplug/utils/Makefile 2004-02-27 11:00:40.000000000 +0100 @@ -6,7 +6,7 @@ CFLAGS =3D $(MAKEDEPS) $(OPTFLAGS) $(REQFLAGS) -W -Wall LIBS =3D $(KLIBC) $(LIBGCC) PROGS :=3D chroot dd fstype mkdir mkfifo mount pivot_root umount \ - true false sleep ln + true false sleep ln hotplug STATICPROGS :=3D $(patsubst %,static/%,$(PROGS)) SHAREDPROGS :=3D $(patsubst %,shared/%,$(PROGS)) LIBOBJS =3D file_mode.o diff -urN klibc-0.115/utils/hotplug.c klibc-0.115-hotplug/utils/hotplug.c --- klibc-0.115/utils/hotplug.c 1970-01-01 01:00:00.000000000 +0100 +++ klibc-0.115-hotplug/utils/hotplug.c 2004-02-27 11:00:28.000000000 +0100 @@ -0,0 +1,80 @@ +/* + * Hotplug Multiplexer + * Author(s) Christian Borntraeger + */ + +#include +#include +#include +#include +#include +#include +#include + +#define HOTPLUGDIR "/etc/hotplug.d" +#define SUFFIX ".hotplug" + +static inline void run_agent(char *name, char *parm) +{ + pid_t pid; + + if (strlen(name) < sizeof (SUFFIX)) + return; + + if (strcmp(name + strlen(name) - sizeof (".hotplug") + 1, ".hotplug") != =3D 0) + return; + + pid =3D fork(); + + if (pid < 0) { + perror("fork"); + return; + }=20 +=09 + if (pid > 0){ + wait(NULL); + return; + } + + execlp(name, name, parm, NULL); + exit(1); +} + +/* + * enters the given directory and execute the *.hotplug files + */ +static void execute_dir (char *dirname, char *parm) +{ + DIR *directory; + struct dirent *entry; + char filename[256]; + + directory =3D opendir(dirname); + if (!directory) + return; + + while ((entry =3D readdir(directory))) { + snprintf(filename, sizeof (filename), + "%s%s", dirname, entry->d_name); + filename[sizeof (filename)-1] =3D '\0'; + run_agent(filename, parm); + } + + closedir(directory); +} + +int main (int argc, char **argv) +{ + char dirname[256]; + + if (argc =3D 1) + return 0; + + snprintf(dirname, sizeof (dirname), HOTPLUGDIR "/%s/", argv[1]); + dirname[sizeof (dirname)-1] =3D '\0'; + execute_dir(dirname, argv[1]); + + strcpy(dirname, HOTPLUGDIR "/default/"); + execute_dir(dirname, argv[1]); + return 0; +} ------------------------------------------------------- SF.Net is sponsored by: Speed Start Your Linux Apps Now. Build and deploy apps & Web services for Linux with a free DVD software kit from IBM. Click Now! http://ads.osdn.com/?ad_id=1356&alloc_id438&op=CCk _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel