Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: watchdog: Fix ioctl SET* error paths to take oneshot exit path

When ioctls for WDIOC_SETOPTIONS (WDIOS_DISABLECARD or WDIOS_ENABLECARD),
WDIOC_SETTIMEOUT, and WDIOC_SETPRETIMEOUT fail, the error path continues
to handler watchdog timer until user terminates it. When ioctl returns
error, it might not be safe to let the watchdog tick. The error could be
due an unsupported ioctl command or some other error.

Fix it to handle error paths as oneshot to stop the watchdog ticks and
exit right away.

Signed-off-by: Shuah Khan (Samsung OSG) <shuah@kernel.org>

+12 -4
+12 -4
tools/testing/selftests/watchdog/watchdog-test.c
··· 123 123 ret = ioctl(fd, WDIOC_SETOPTIONS, &flags); 124 124 if (!ret) 125 125 printf("Watchdog card disabled.\n"); 126 - else 126 + else { 127 127 printf("WDIOS_DISABLECARD error '%s'\n", strerror(errno)); 128 + oneshot = 1; 129 + } 128 130 break; 129 131 case 'e': 130 132 flags = WDIOS_ENABLECARD; 131 133 ret = ioctl(fd, WDIOC_SETOPTIONS, &flags); 132 134 if (!ret) 133 135 printf("Watchdog card enabled.\n"); 134 - else 136 + else { 135 137 printf("WDIOS_ENABLECARD error '%s'\n", strerror(errno)); 138 + oneshot = 1; 139 + } 136 140 break; 137 141 case 'p': 138 142 ping_rate = strtoul(optarg, NULL, 0); ··· 149 145 ret = ioctl(fd, WDIOC_SETTIMEOUT, &flags); 150 146 if (!ret) 151 147 printf("Watchdog timeout set to %u seconds.\n", flags); 152 - else 148 + else { 153 149 printf("WDIOC_SETTIMEOUT error '%s'\n", strerror(errno)); 150 + oneshot = 1; 151 + } 154 152 break; 155 153 case 'T': 156 154 oneshot = 1; ··· 167 161 ret = ioctl(fd, WDIOC_SETPRETIMEOUT, &flags); 168 162 if (!ret) 169 163 printf("Watchdog pretimeout set to %u seconds.\n", flags); 170 - else 164 + else { 171 165 printf("WDIOC_SETPRETIMEOUT error '%s'\n", strerror(errno)); 166 + oneshot = 1; 167 + } 172 168 break; 173 169 case 'N': 174 170 oneshot = 1;