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

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

  • Next message: Steve Snyder: "Why the CPU bias in SMP interrupt handling?"

    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 : Sat Jun 10 2000 - 23:56:11 EDT