lkml.org 
[lkml]   [2000]   [Aug]   [21]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [FIX] Make deadlock detection work for file locking
DateTue, 22 Aug 2000 10:45:27 +1000
FromStephen Rothwell <>
Hi,

Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de> writes:
> 
> Mostly curious: What kind of problems did you have with deadlock
> detection? AFAICS your patch looks ok, but deadlock detections seems
> to be functionally equivilent with or without the patch.

Well, actually the following program just hangs on 2.4.0-test7pre4
and reports EDEADLOCK after the patch is applied.

Cheers,
Stephen
-- 
Stephen Rothwell, Open Source Researcher, Linuxcare, Inc.
+61-2-62628990 tel, +61-2-62628991 fax 
sfr@linuxcare.com, http://www.linuxcare.com/ 
Linuxcare. Support for the revolution.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
	struct flock	fl;
	int		fd;
	unsigned char	c;
	int		pipe_fd[2];
	if (pipe(pipe_fd) == -1) {
		perror("pipe");
		return 1;
	}
	switch (fork()) {
	case -1:
		perror("fork");
		return 1;
	case 0:
		if (read(pipe_fd[0], &c, 1) == -1) {
			perror("read pipe child");
			return 1;
		}
		fd = open("deadlock.testfile", O_RDWR);
		if (fd == -1) {
			perror("open child");
			return 1;
		}
		fl.l_type = F_WRLCK;
		fl.l_whence = 0;
		fl.l_start = 20;
		fl.l_len = 10;
		if (fcntl(fd, F_SETLK, &fl) == -1) {
			perror("fcntl child 1");
			return 1;
		}
		fl.l_type = F_WRLCK;
		fl.l_whence = 0;
		fl.l_start = 10;
		fl.l_len = 10;
		if (fcntl(fd, F_SETLKW, &fl) == -1) {
			perror("fcntl child 2");
			return 1;
		}
		break;
	default:
		fd = open("deadlock.testfile", O_RDWR|O_CREAT, 0600);
		if (fd == -1) {
			perror("open parent 1");
			return 1;
		}
		fl.l_type = F_WRLCK;
		fl.l_whence = 0;
		fl.l_start = 10;
		fl.l_len = 10;
		if (fcntl(fd, F_SETLK, &fl) == -1) {
			perror("fcntl parent 1");
			return 1;
		}
		if (write(pipe_fd[1], "x", 1) == -1) {
			perror("write pipe parent 1");
			return 1;
		}
		sleep(5);
		fl.l_type = F_WRLCK;
		fl.l_whence = 0;
		fl.l_start = 20;
		fl.l_len = 10;
		if (fcntl(fd, F_SETLKW, &fl) == -1) {
			perror("fcntl parent 2");
			return 1;
		}
		break;
	}
	return 0;
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 12:37    [from the cache]
©2003-2008