Re: flock(2) cannot block other process which try to get sameflock?

From: Minoru Usui
Date: Tue Oct 04 2011 - 21:11:41 EST


I'm really sorry. I have to apologize to everyone.
This is my fault. It's TP bug.

I was fixed the bug, flock(2) worked fine.

---------------------------------------------------------
# diff -uNp flock.c.org flock.c
--- flock.c.org 2011-10-05 09:48:03.000000000 +0900
+++ flock.c 2011-10-04 11:36:11.000000000 +0900
@@ -15,7 +15,7 @@ int main(void)
int pid = getpid();

while(1) {
- if ((fd = open(LOCKFILE, O_RDONLY) < 0)) {
+ if ((fd = open(LOCKFILE, O_RDONLY)) < 0) {
perror("open");
exit(1);
---------------------------------------------------------


On Fri, 30 Sep 2011 20:09:38 +0900
Minoru Usui <usui@xxxxxxxxxxxxxxxxx> wrote:

> Hi,
>
> I faced strange behaviour of flock(2) in upstream kernel(3.1.0-rc8+).
> It seems flock cannot block other processes which try to get same flock.
> If someone know the cause of this behaviour, please let me know.
>
> My test is very very simple.
> It tries to get flock against same file by 5 processes.
> The result is following.
>
> -----------------------------------------------------------------
> # ./flock.sh
> lock(pid:2384)
> # unlock(pid:2384)
> lock(pid:2385) --- lock(a)
> lock(pid:2384) --- lock(b)
> unlock(pid:2385) --- unlock(a)
> unlock(pid:2384) --- unlock(b)
> :
> -----------------------------------------------------------------
>
> I setup auditd and check audit.log, it indicated same behaviour.
>
> -----------------------------------------------------------------
> type=SYSCALL msg=audit(1317375911.187:105): arch=c000003e syscall=73 success=yes exit=0 a0=0 a1=2 a2=0 a3=7fffe664f920 items=0 ppid=2382 pid=2384 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=1 comm="flock" exe="/home/usui/devel/tp/flock" key=(null)
>
> type=SYSCALL msg=audit(1317375912.187:106): arch=c000003e syscall=73 success=yes exit=0 a0=0 a1=8 a2=0 a3=8 items=0 ppid=1 pid=2384 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=1 comm="flock" exe="/home/usui/devel/tp/flock" key=(null)
>
> type=SYSCALL msg=audit(1317375911.187:107): arch=c000003e syscall=73 success=yes exit=0 a0=0 a1=2 a2=0 a3=7fffdc2e2c70 items=0 ppid=1 pid=2385 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=1 comm="flock" exe="/home/usui/devel/tp/flock" key=(null)
> -> lock(a) (pid=2385, a1=2)
>
> type=SYSCALL msg=audit(1317375912.187:108): arch=c000003e syscall=73 success=yes exit=0 a0=0 a1=2 a2=0 a3=7fffe664f920 items=0 ppid=1 pid=2384 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=1 comm="flock" exe="/home/usui/devel/tp/flock" key=(null)
> -> lock(b) (pid=2384, a1=2)
>
> type=SYSCALL msg=audit(1317375913.187:109): arch=c000003e syscall=73 success=yes exit=0 a0=0 a1=8 a2=0 a3=8 items=0 ppid=1 pid=2384 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=1 comm="flock" exe="/home/usui/devel/tp/flock" key=(null)
> -> unlock(a) (pid=2385, a1=8)
>
> type=SYSCALL msg=audit(1317375913.187:110): arch=c000003e syscall=73 success=yes exit=0 a0=0 a1=8 a2=0 a3=8 items=0 ppid=1 pid=2385 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=1 comm="flock" exe="/home/usui/devel/tp/flock" key=(null)
> -> unlock(b) (pid=2384, a1=8)
> -----------------------------------------------------------------
>
>
>
> Test programs are following.
> -----------------------------------------------------------------
> # cat -n flock.sh
> 1 #! /bin/sh
> 2
> 3 CNT=5
> 4
> 5 if [ $# -ne 0 ]
> 6 then
> 7 CNT=$1
> 8 fi
> 9
> 10 for i in `seq 1 $CNT`
> 11 do
> 12 ./flock &
> 13 done
>
> # cat -n flock.c
> 1 #include <stdio.h>
> 2 #include <sys/file.h>
> 3 #include <sys/types.h>
> 4 #include <sys/stat.h>
> 5 #include <fcntl.h>
> 6 #include <errno.h>
> 7 #include <unistd.h>
> 8 #include <stdlib.h>
> 9
> 10 #define LOCKFILE "/tmp/flocktest"
> 11 int main(void)
> 12 {
> 13 int fd;
> 14 int ret;
> 15 int pid = getpid();
> 16
> 17 while(1) {
> 18 if ((fd = open(LOCKFILE, O_RDONLY) < 0)) {
> 19 perror("open()");
> 20 exit(1);
> 21 }
> 22
> 23 if (ret = flock(fd, LOCK_EX) < 0) {
> 24 perror("flock(LOCK_EX)");
> 25 exit(1);
> 26 }
> 27 printf("lock(pid:%d)\n", pid);
> 28 fflush(stdout);
> 29
> 30 sleep(1);
> 31
> 32 printf("unlock(pid:%d)\n", pid);
> 33 fflush(stdout);
> 34 if (ret = flock(fd, LOCK_UN) < 0) {
> 35 perror("flock(LOCK_UN)");
> 36 exit(1);
> 37 }
> 38
> 39 if (close(fd) < 0) {
> 40 perror("flock(LOCK_UN)");
> 41 exit(1);
> 42 }
> 43 }
> 44
> 45 return 0;
> 46 }
> -----------------------------------------------------------------
> --
> Minoru Usui <usui@xxxxxxxxxxxxxxxxx>


--
Minoru Usui <usui@xxxxxxxxxxxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/