[Problem] ash: Errorneus write() retries when kernel returns -EBUSY

Denis Kuzmenko linux at solonet.org.ua
Tue Nov 15 22:18:51 UTC 2011


Hi All,

Such retries are seen when issuing in ash:
echo 37 > /sys/class/gpio/export

strace shows:

execve("./test-gpio.sh", ["./test-gpio.sh"], [/* 15 vars */]) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x40071000
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=244456, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x40148000
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0 \204\0\0004\0\0\0"..., 4096) = 4096
mmap2(NULL, 294912, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40174000
mmap2(0x40174000, 237612, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x40174000
mmap2(0x401b6000, 4848, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x3a) = 0x401b6000
mmap2(0x401b8000, 12940, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x401b8000
close(3)                                = 0
munmap(0x40148000, 4096)                = 0
stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=21200, ...}) = 0
mprotect(0x401b6000, 4096, PROT_READ)   = 0
mprotect(0x400c7000, 4096, PROT_READ)   = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo ...}) = 0
getuid32()                              = 0
brk(0)                                  = 0x86d000
brk(0x86e000)                           = 0x86e000
brk(0x86f000)                           = 0x86f000
getpid()                                = 545
rt_sigaction(SIGCHLD, {SIG_DFL, [CHLD], SA_RESTART|0x4000000}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGHUP, {SIG_DFL, [HUP], SA_RESTART|0x4000000}, {SIG_DFL, [], 0}, 8) = 0
getppid()                               = 544
stat64("/root", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat64(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("./test-gpio.sh", O_RDONLY|O_LARGEFILE) = 3
fcntl64(3, F_DUPFD, 10)                 = 10
close(3)                                = 0
fcntl64(10, F_SETFD, FD_CLOEXEC)        = 0
rt_sigaction(SIGINT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGINT, {0x2f724, ~[], 0x4000000 /* SA_??? */}, NULL, 8) = 0
rt_sigaction(SIGQUIT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], 0x4000000 /* SA_??? */}, NULL, 8) = 0
rt_sigaction(SIGTERM, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGTERM, {SIG_DFL, [], 0x4000000 /* SA_??? */}, NULL, 8) = 0
read(10, "#!/bin/sh\necho 37 > /sys/class/g"..., 1023) = 43
open("/sys/class/gpio/export", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
fcntl64(1, F_DUPFD, 10)                 = 11
dup2(3, 1)                              = 1
close(3)                                = 0
wait4(-1, 0xbe82f8d4, WNOHANG, NULL)    = -1 ECHILD (No child processes)
fcntl64(1, F_GETFL)                     = 0x20001 (flags O_WRONLY|O_LARGEFILE)
write(1, "37\n", 3)                     = -1 EBUSY (Device or resource busy)
write(1, "3", 1)                        = -1 EBUSY (Device or resource busy)
write(1, "3", 1)                        = -1 EBUSY (Device or resource busy)
dup2(11, 1)                             = 1
close(11)                               = 0
write(1, "3", 13)                        = 1
read(10, "", 1023)                      = 0
exit(255)                               = ?

specially:

write(1, "37\n", 3)                     = -1 EBUSY (Device or resource busy)
write(1, "3", 1)                        = -1 EBUSY (Device or resource busy)
write(1, "3", 1)                        = -1 EBUSY (Device or resource busy)

Busybox version used v1.18.4, compiled by Buildroot 2011.05 for 
arm-unknown-linux-uclibcgnueabi target using GCC 4.6.0.

Can someone suggest me a way to track that?

-- 
Best regards, Denis Kuzmenko.


More information about the busybox mailing list