[BUG] Kernel 2.4.0-test1-ac10 changes open of symlink behavior.

From: Daniel Pittman (daniel@danann.net)
Date: Sat Jun 10 2000 - 22:41:02 EST


I recently build and tested a 2.4.0 kernel and noticed one very painful
kernel difference between 2.2.15pre19 and 2.4.0-test1-ac10.

In 2.4.0, when I edited a file through a symlink with XEmacs, trying to
save the file resulted in an error. Under 2.2.15, this works just fine.

I have tested this today with the *only* difference being the kernel
version - everything else was identical. The difference still exists.

The failure occurs when XEmacs does:

open("/home/daniel/.gnus.el", O_WRONLY|O_CREAT|O_TRUNC, 0666).

The .gnus.el file is a symlink to another file on the local disk (same
filesystem, even). The result of this call under 2.2.15 is success,
2.4.0 returns -ENOENT.

Now, at the point the open call is issued, '.gnus.el' is a symlink to a
non-existing file. I think, however, that the O_CREAT should cause it to
be created, yes?

The system is running GLIBC 2.1.3 and XEmacs 21.2.b34, if that matters.

Attached is the relevant 'diff -u' output from strace of the process
under 2.2.15 and 2.4.0. I can provide the whole strace outputs and
.config on request.

        Daniel


--- xemacs.2.2 Sun Jun 11 13:10:55 2000
+++ xemacs.2.4 Sun Jun 11 13:15:58 2000
@@ -6410,158 +6470,438 @@
 readlink("/home/daniel/.gnus.el", "elisp/init.d/dot-gnus.el", 100) = 24
 getegid() = 1000
 readlink("/home/daniel/.gnus.el", "elisp/init.d/dot-gnus.el", 100) = 24
-readlink("/home/daniel/elisp/init.d/dot-gnus.el", 0x8573598, 100) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel/elisp/init.d/dot-gnus.el", 0x85d0870, 100) = -1 EINVAL (Invalid argument)
 open("/home/daniel/elisp/init.d", O_RDONLY|O_NONBLOCK|0x10000) = 7
 fstat(7, {st_mode=S_IFDIR|0755, st_size=2048, ...}) = 0
 fcntl(7, F_SETFD, FD_CLOEXEC) = 0
-getdents(7, /* 36 entries */, 3933) = 820
+getdents(7, /* 37 entries */, 3933) = 848
 getdents(7, /* 0 entries */, 3933) = 0
 close(7) = 0
 stat("/home/daniel/elisp/init.d/dot-gnus.el~", {st_mode=S_IFREG|0644, st_size=18815, ...}) = 0
 rename("/home/daniel/elisp/init.d/dot-gnus.el", "/home/daniel/elisp/init.d/dot-gnus.el~") = 0
 stat("/home/daniel/elisp/init.d/dot-gnus.el~", {st_mode=S_IFREG|0644, st_size=18815, ...}) = 0
-readlink("/home", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel/elisp", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel/elisp/init.d", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel/elisp/init.d/dot-gnus.el", 0xbfffb904, 4094) = -1 ENOENT (No such file or directory)
-readlink("/home", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel/elisp", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel/elisp", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel/elisp/init.d", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel/elisp", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel/elisp/init.d", 0xbfffb904, 4094) = -1 EINVAL (Invalid argument)
-readlink("/home/daniel/elisp/init.d/dot-gnus.el", 0xbfffb904, 4094) = -1 ENOENT (No such file or directory)
-stat("/home/daniel/.gnus.el", 0xbfffe92c) = -1 ENOENT (No such file or directory)
-stat("/home/daniel/elisp/init.d/dot-gnus.el", 0xbfffe90c) = -1 ENOENT (No such file or directory)
-getpid() = 2457
-symlink("daniel@inanna.danann.net.2457", "/home/daniel/elisp/init.d/.#dot-gnus.el") = -1 EEXIST (File exists)
-readlink("/home/daniel/elisp/init.d/.#dot-gnus.el", "daniel@inanna.danann.net.2457", 100) = 29
-getpid() = 2457
-open("/home/daniel/.gnus.el", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 7
-lseek(7, 0, SEEK_CUR) = 0
-brk(0x85fd000) = 0x85fd000
-brk(0x8606000) = 0x8606000
-write(7, ";;; Gnus configuration\n;;; Ver: "..., 18815) = 18815
-fsync(7) = 0
-close(7) = 0
-stat("/home/daniel/.gnus.el", {st_mode=S_IFREG|0644, st_size=18815, ...}) = 0
-readlink("/home/daniel/elisp/init.d/.#dot-gnus.el", "daniel@inanna.danann.net.2457", 100) = 29
-getpid() = 2457
+readlink("/home", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel/elisp", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel/elisp/init.d", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel/elisp/init.d/dot-gnus.el", 0xbfffb8e4, 4094) = -1 ENOENT (No such file or directory)
+readlink("/home", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel/elisp", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel/elisp", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel/elisp/init.d", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel/elisp", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel/elisp/init.d", 0xbfffb8e4, 4094) = -1 EINVAL (Invalid argument)
+readlink("/home/daniel/elisp/init.d/dot-gnus.el", 0xbfffb8e4, 4094) = -1 ENOENT (No such file or directory)
+stat("/home/daniel/.gnus.el", 0xbfffe90c) = -1 ENOENT (No such file or directory)
+stat("/home/daniel/elisp/init.d/dot-gnus.el", 0xbfffe8ec) = -1 ENOENT (No such file or directory)
+getpid() = 574
+symlink("daniel@inanna.danann.net.574", "/home/daniel/elisp/init.d/.#dot-gnus.el") = -1 EEXIST (File exists)
+readlink("/home/daniel/elisp/init.d/.#dot-gnus.el", "daniel@inanna.danann.net.574", 100) = 28
+getpid() = 574
+open("/home/daniel/.gnus.el", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 ENOENT (No such file or directory)
+readlink("/home/daniel/elisp/init.d/.#dot-gnus.el", "daniel@inanna.danann.net.574", 100) = 28
+getpid() = 574
 unlink("/home/daniel/elisp/init.d/.#dot-gnus.el") = 0
-readlink("/home/daniel/.gnus.el", "elisp/init.d/dot-gnus.el", 100) = 24
-write(6, "LA\25\0&\0\0\5>\0\0\5\4\0\30\2Wrote /home/dani"..., 124) = 124
-lstat("/home/daniel/.gnus.el", {st_mode=S_IFLNK|0777, st_size=24, ...}) = 0
-readlink("/home/daniel/.gnus.el", "elisp/init.d/dot-gnus.el", 100) = 24
-getegid() = 1000
-chmod("/home/daniel/.gnus.el", 0644) = 0
 select(1024, [], NULL, NULL, {0, 0}) = 0 (Timeout)
 ioctl(6, FIONREAD, [0]) = 0
 ioctl(6, FIONREAD, [0]) = 0


-- 
Dreams are true while they last, and do we not live in dreams?
        -- Alfred Lord Tennyson, _The Higher Pantheism_

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Jun 15 2000 - 21:00:22 EST