/* Disk protection for HP/DELL machines. * * Copyright 2008 Eric Piel * Copyright 2009 Pavel Machek * Copyright 2012 Sonal Santan * Copyright 2014 Pali Rohár * * GPLv2. */ #include #include #include #include #include #include #include #include #include #include #include #include #include static int noled; static char unload_heads_path[64]; static char device_path[32]; static const char app_name[] = "FREE FALL"; static int set_unload_heads_path(char *device) { if (strlen(device) <= 5 || strncmp(device, "/dev/", 5) != 0) return -EINVAL; strncpy(device_path, device, sizeof(device_path) - 1); snprintf(unload_heads_path, sizeof(unload_heads_path) - 1, "/sys/block/%s/device/unload_heads", device+5); return 0; } static int valid_disk(void) { int fd = open(unload_heads_path, O_RDONLY); if (fd < 0) { perror(unload_heads_path); return 0; } close(fd); return 1; } static void write_int(char *path, int i) { char buf[1024]; int fd = open(path, O_RDWR); if (fd < 0) { perror("open"); exit(1); } sprintf(buf, "%d", i); if (write(fd, buf, strlen(buf)) != strlen(buf)) { perror("write"); exit(1); } close(fd); } static void set_led(int on) { if (noled) return; write_int("/sys/class/leds/hp::hddprotect/brightness", on); } static void protect(int seconds) { const char *str = (seconds == 0) ? "Unparked" : "Parked"; write_int(unload_heads_path, seconds*1000); syslog(LOG_INFO, "%s %s disk head\n", str, device_path); } static int on_ac(void) { /* /sys/class/power_supply/AC0/online */ return 1; } static int lid_open(void) { /* /proc/acpi/button/lid/LID/state */ return 1; } static void ignore_me(int signum) { protect(0); set_led(0); } int main(int argc, char **argv) { int fd, ret; struct stat st; struct sched_param param; if (argc == 1) ret = set_unload_heads_path("/dev/sda"); else if (argc == 2) ret = set_unload_heads_path(argv[1]); else ret = -EINVAL; if (ret || !valid_disk()) { fprintf(stderr, "usage: %s (default: /dev/sda)\n", argv[0]); exit(1); } fd = open("/dev/freefall", O_RDONLY); if (fd < 0) { perror("/dev/freefall"); return EXIT_FAILURE; } if (stat("/sys/class/leds/hp::hddprotect/brightness", &st)) noled = 1; if (daemon(0, 0) != 0) { perror("daemon"); return EXIT_FAILURE; } openlog(app_name, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); param.sched_priority = sched_get_priority_max(SCHED_FIFO); sched_setscheduler(0, SCHED_FIFO, ¶m); mlockall(MCL_CURRENT|MCL_FUTURE); signal(SIGALRM, ignore_me); for (;;) { unsigned char count; ret = read(fd, &count, sizeof(count)); alarm(0); if ((ret == -1) && (errno == EINTR)) { /* Alarm expired, time to unpark the heads */ continue; } if (ret != sizeof(count)) { perror("read"); break; } protect(21); set_led(1); if (1 || on_ac() || lid_open()) alarm(2); else alarm(20); } closelog(); close(fd); return EXIT_SUCCESS; } den' name='id' value='433e19cf33d34bb6751c874a9c00980552fe508c'/>
context:
space:
mode:
authorDexuan Cui <decui@microsoft.com>2017-01-28 11:46:02 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-31 10:59:48 +0100
commit433e19cf33d34bb6751c874a9c00980552fe508c (patch)
treece6547ef2987fbb289fa28f03536328a42781651 /net/ax25/Kconfig
parent191e885a2e130e639bb0c8ee350d7047294f2ce6 (diff)
Drivers: hv: vmbus: finally fix hv_need_to_signal_on_read()
Commit a389fcfd2cb5 ("Drivers: hv: vmbus: Fix signaling logic in hv_need_to_signal_on_read()") added the proper mb(), but removed the test "prev_write_sz < pending_sz" when making the signal decision. As a result, the guest can signal the host unnecessarily, and then the host can throttle the guest because the host thinks the guest is buggy or malicious; finally the user running stress test can perceive intermittent freeze of the guest. This patch brings back the test, and properly handles the in-place consumption APIs used by NetVSC (see get_next_pkt_raw(), put_pkt_raw() and commit_rd_index()). Fixes: a389fcfd2cb5 ("Drivers: hv: vmbus: Fix signaling logic in hv_need_to_signal_on_read()") Signed-off-by: Dexuan Cui <decui@microsoft.com> Reported-by: Rolf Neugebauer <rolf.neugebauer@docker.com> Tested-by: Rolf Neugebauer <rolf.neugebauer@docker.com> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Haiyang Zhang <haiyangz@microsoft.com> Cc: Stephen Hemminger <sthemmin@microsoft.com> Cc: <stable@vger.kernel.org> Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net/ax25/Kconfig')