[PATCH] flags parameter for linkat
authorUlrich Drepper <drepper@redhat.com>
Fri, 24 Feb 2006 21:04:21 +0000 (13:04 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 24 Feb 2006 22:31:39 +0000 (14:31 -0800)
I'm currently at the POSIX meeting and one thing covered was the
incompatibility of Linux's link() with the POSIX definition.  The name.
Linux does not follow symlinks, POSIX requires it does.

Even if somebody thinks this is a good default behavior we cannot change this
because it would break the ABI.  But the fact remains that some application
might want this behavior.

We have one chance to help implementing this without breaking the behavior.
 For this we could use the new linkat interface which would need a new
flags parameter.  If the new parameter is AT_SYMLINK_FOLLOW the new
behavior could be invoked.

I do not want to introduce such a patch now.  But we could add the
parameter now, just don't use it.  The patch below would do this.  Can we
get this late patch applied before the release more or less fixes the
syscall API?

Signed-off-by: Ulrich Drepper <drepper@redhat.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/mips/kernel/scall32-o32.S
arch/s390/kernel/compat_wrapper.S
fs/namei.c
include/linux/syscalls.h

index d83e033dbc87ec6cb7fc8a731753208df5f95b21..2f2dc54b2e267bce6ed09d31a0d1cc8738f81491 100644 (file)
@@ -626,7 +626,7 @@ einval:     li      v0, -EINVAL
        sys     sys_fstatat64           4
        sys     sys_unlinkat            3
        sys     sys_renameat            4       /* 4295 */
-       sys     sys_linkat              4
+       sys     sys_linkat              5
        sys     sys_symlinkat           3
        sys     sys_readlinkat          4
        sys     sys_fchmodat            3
index 615964cca15f8ec7e76d442d247502d5f66278a9..50e80138e7adeeaabb34aef7d879bbb69139a1e8 100644 (file)
@@ -1552,6 +1552,7 @@ sys_linkat_wrapper:
        llgtr   %r3,%r3                 # const char *
        lgfr    %r4,%r4                 # int
        llgtr   %r5,%r5                 # const char *
+       lgfr    %r6,%r6                 # int
        jg      sys_linkat
 
        .globl sys_symlinkat_wrapper
index e28de846c5919f84ba0f45ea464a4ee91913f7a9..557dcf395ca122c1d30ca53b4b36293dab78da1f 100644 (file)
@@ -2224,13 +2224,17 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de
  * and other special files.  --ADM
  */
 asmlinkage long sys_linkat(int olddfd, const char __user *oldname,
-                          int newdfd, const char __user *newname)
+                          int newdfd, const char __user *newname,
+                          int flags)
 {
        struct dentry *new_dentry;
        struct nameidata nd, old_nd;
        int error;
        char * to;
 
+       if (flags != 0)
+               return -EINVAL;
+
        to = getname(newname);
        if (IS_ERR(to))
                return PTR_ERR(to);
@@ -2263,7 +2267,7 @@ exit:
 
 asmlinkage long sys_link(const char __user *oldname, const char __user *newname)
 {
-       return sys_linkat(AT_FDCWD, oldname, AT_FDCWD, newname);
+       return sys_linkat(AT_FDCWD, oldname, AT_FDCWD, newname, 0);
 }
 
 /*
index d73501ba7e441ac7496f3cbf110c9cb95c718495..b9ea44ac0ddbb7df23a0600387d39df529fe4593 100644 (file)
@@ -543,7 +543,7 @@ asmlinkage long sys_unlinkat(int dfd, const char __user * pathname, int flag);
 asmlinkage long sys_symlinkat(const char __user * oldname,
                              int newdfd, const char __user * newname);
 asmlinkage long sys_linkat(int olddfd, const char __user *oldname,
-                          int newdfd, const char __user *newname);
+                          int newdfd, const char __user *newname, int flags);
 asmlinkage long sys_renameat(int olddfd, const char __user * oldname,
                             int newdfd, const char __user * newname);
 asmlinkage long sys_futimesat(int dfd, char __user *filename,