diff --git a/sysvinit-2.86-hddown.patch b/sysvinit-2.86-hddown.patch index 37414e4..a2275b0 100644 --- a/sysvinit-2.86-hddown.patch +++ b/sysvinit-2.86-hddown.patch @@ -1,6 +1,16 @@ --- src/hddown.c -+++ src/hddown.c 2007-06-05 14:37:50.248140535 +0200 -@@ -18,6 +18,106 @@ char *v_hddown = "@(#)hddown.c 1.02 22 ++++ src/hddown.c 2007-06-06 15:42:04.799454093 +0200 +@@ -5,6 +5,9 @@ + */ + char *v_hddown = "@(#)hddown.c 1.02 22-Apr-2003 miquels@cistron.nl"; + ++#ifndef _GNU_SOURCE ++#define _GNU_SOURCE ++#endif + #include + #include + #include +@@ -18,6 +21,198 @@ char *v_hddown = "@(#)hddown.c 1.02 22 #include #include @@ -9,8 +19,13 @@ + +#include +#include ++#include ++#include ++ +#define SYS_BLK "/sys/block" ++#define SYS_CLASS "/sys/class/scsi_disk" +#define DEV_BASE "/dev" ++#define ISSPACE(c) (((c)==' ')||((c)=='\n')||((c)=='\t')||((c)=='\v')||((c)=='\r')||((c)=='\f')) + +/* + * Find all disks through /sys/block. @@ -21,28 +36,102 @@ + + while ((d = readdir(blk))) { + if (d->d_name[1] == 'd' && (d->d_name[0] == 'h' || d->d_name[0] == 's')) { -+ char buf[NAME_MAX+1]; ++ char buf[NAME_MAX+1], lnk[NAME_MAX+1], *ptr; ++ struct stat st; + int fd, ret; ++ size_t len; + FILE *fp; + + ret = snprintf(buf, sizeof(buf), SYS_BLK "/%s/removable", d->d_name); + if ((ret >= sizeof(buf)) || (ret < 0)) -+ goto empty; ++ goto empty; /* error */ + + fd = open(buf, O_RDONLY|O_NOCTTY); -+ if ((fd < 0) && (errno != ENOENT)) -+ goto empty; ++ if (fd < 0) { ++ if (errno != ENOENT) ++ goto empty; /* error */ ++ continue; /* no entry `removable' */ ++ } + + fp = fdopen(fd, "r"); + if (fp == (FILE*)0) { + close(fd); -+ goto empty; ++ goto empty; /* error */ + } + + ret = getc(fp); + fclose(fp); + -+ if (ret == '0') break; /* found disk, out here */ ++ if (ret != '0') ++ continue; /* not a hard disk */ ++ ++ if (d->d_name[0] == 'h') ++ break; /* old IDE disk not managed by kernel, out here */ ++ ++ ret = snprintf(buf, sizeof(buf), SYS_BLK "/%s/device", d->d_name); ++ if ((ret >= sizeof(buf)) || (ret < 0)) ++ goto empty; /* error */ ++ ++ ret = readlink(buf, lnk, sizeof(lnk)); ++ if (ret >= sizeof(lnk)) ++ goto empty; /* error */ ++ if (ret < 0) { ++ if (errno != ENOENT) ++ goto empty; /* error */ ++ continue; /* no entry `device' */ ++ } ++ lnk[ret] = '\0'; ++ ++ ptr = basename(lnk); ++ if (!ptr || !*ptr) ++ continue; /* should not happen */ ++ ++ ret = snprintf(buf, sizeof(buf), SYS_CLASS "/%s/manage_start_stop", ptr); ++ if ((ret >= sizeof(buf)) || (ret < 0)) ++ goto empty; /* error */ ++ ++ ret = stat(buf, &st); ++ if (ret == 0) ++ continue; /* disk found but managed by kernel */ ++ ++ if (errno != ENOENT) ++ goto empty; /* error */ ++ ++ ++ ret = snprintf(buf, sizeof(buf), SYS_BLK "/%s/device/vendor", d->d_name); ++ if ((ret >= sizeof(buf)) || (ret < 0)) ++ goto empty; /* error */ ++ ++ fd = open(buf, O_RDONLY|O_NOCTTY); ++ if (fd < 0) { ++ if (errno != ENOENT) ++ goto empty; /* error */ ++ continue; /* no entry `device/vendor' */ ++ } ++ ++ fp = fdopen(fd, "r"); ++ if (fp == (FILE*)0) { ++ close(fd); ++ goto empty; /* error */ ++ } ++ ++ ptr = fgets(buf, sizeof(buf), fp); ++ fclose(fp); ++ if (ptr == (char*)0) ++ continue; /* should not happen */ ++ ++ if ((len = strlen(buf)) == 0) ++ continue; /* should not happen */ ++ ++ ptr = &buf[0] + len - 1; ++ while ((ptr != &buf[0]) && ISSPACE(*ptr)) ++ ptr--; ++ *(ptr + 1) = '\0'; /* remove trailing white spaces */ ++ ++ if (strncmp(buf, "ATA", sizeof(buf))) ++ continue; /* no SATA but a real SCSI disk */ ++ ++ break; /* new SATA disk to shutdown, out here */ + } + } + if (d == (struct dirent*)0) @@ -59,13 +148,21 @@ +static int do_standby_idedisk(char *device) +{ +#ifndef WIN_STANDBYNOW1 -+#define WIN_STANDBYNOW1 0xE0 ++#define WIN_STANDBYNOW1 0xE0 +#endif +#ifndef WIN_STANDBYNOW2 -+#define WIN_STANDBYNOW2 0x94 ++#define WIN_STANDBYNOW2 0x94 +#endif -+ unsigned char args1[4] = {WIN_STANDBYNOW1,0,0,0}; -+ unsigned char args2[4] = {WIN_STANDBYNOW2,0,0,0}; ++#ifndef WIN_FLUSH_CACHE_EXT ++#define WIN_FLUSH_CACHE_EXT 0xEA ++#endif ++#ifndef WIN_FLUSH_CACHE ++#define WIN_FLUSH_CACHE 0xE7 ++#endif ++ unsigned char flush1[4] = {WIN_FLUSH_CACHE_EXT,0,0,0}; ++ unsigned char flush2[4] = {WIN_FLUSH_CACHE,0,0,0}; ++ unsigned char stdby1[4] = {WIN_STANDBYNOW1,0,0,0}; ++ unsigned char stdby2[4] = {WIN_STANDBYNOW2,0,0,0}; + char buf[NAME_MAX+1]; + int fd, ret; + @@ -76,8 +173,13 @@ + if ((fd = open(buf, O_RDWR)) < 0) + return -1; + -+ ret = ioctl(fd, HDIO_DRIVE_CMD, &args1) && -+ ioctl(fd, HDIO_DRIVE_CMD, &args2); ++ if (ioctl(fd, HDIO_DRIVE_CMD, &flush1)) { ++ /* Extend flush rejected, try standard flush */ ++ ioctl(fd, HDIO_DRIVE_CMD, &flush2); ++ } ++ ++ ret = ioctl(fd, HDIO_DRIVE_CMD, &stdby1) && ++ ioctl(fd, HDIO_DRIVE_CMD, &stdby2); + close(fd); + + if (ret) @@ -107,7 +209,7 @@ #define MAX_DISKS 64 #define PROC_IDE "/proc/ide" #define DEV_BASE "/dev" -@@ -104,7 +204,7 @@ int hddown(void) +@@ -104,7 +299,7 @@ int hddown(void) return 0; } diff --git a/sysvinit.changes b/sysvinit.changes index 7a0dea9..bea7ae6 100644 --- a/sysvinit.changes +++ b/sysvinit.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Wed Jun 6 15:56:46 CEST 2007 - werner@suse.de + +- For bug #229210: skip real SCSI disks, also flush disk cache for + SATA and ATA disks. + +------------------------------------------------------------------- +Wed Jun 6 13:01:25 CEST 2007 - werner@suse.de + +- More on bug #229210: do not shutdown allready managed disks + ------------------------------------------------------------------- Tue Jun 5 14:45:21 CEST 2007 - werner@suse.de diff --git a/sysvinit.spec b/sysvinit.spec index 764b876..83dafaf 100644 --- a/sysvinit.spec +++ b/sysvinit.spec @@ -22,7 +22,7 @@ Group: System/Base PreReq: coreutils Autoreqprov: on Version: 2.86 -Release: 74 +Release: 76 Summary: SysV-Style init BuildRoot: %{_tmppath}/%{name}-%{version}-build Source: sysvinit-2.86.tar.bz2 @@ -282,6 +282,11 @@ rm -rf ${RPM_BUILD_ROOT} %doc %{_mandir}/man8/startpar.8.gz %changelog +* Wed Jun 06 2007 - werner@suse.de +- For bug #229210: skip real SCSI disks, also flush disk cache for + SATA and ATA disks. +* Wed Jun 06 2007 - werner@suse.de +- More on bug #229210: do not shutdown allready managed disks * Tue Jun 05 2007 - werner@suse.de - /sbin/halt: list and powerdown all disks even SATA/SCSI (bug #229210)