Skip to content

Commit

Permalink
[PATCH] flags parameter for linkat
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Ralf Baechle <[email protected]>
Cc: Heiko Carstens <[email protected]>
Cc: Martin Schwidefsky <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Ulrich Drepper authored and Linus Torvalds committed Feb 24, 2006
1 parent ee71305 commit c04030e
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 4 deletions.
2 changes: 1 addition & 1 deletion arch/mips/kernel/scall32-o32.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions arch/s390/kernel/compat_wrapper.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 6 additions & 2 deletions fs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -2263,7 +2267,7 @@ asmlinkage long sys_linkat(int olddfd, const char __user *oldname,

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);
}

/*
Expand Down
2 changes: 1 addition & 1 deletion include/linux/syscalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit c04030e

Please sign in to comment.