diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2026-01-07 07:23:05 +0300 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2026-01-16 20:47:42 +0300 |
| commit | 037193b0ae833c922881f0bf188b4ed49874e6c9 (patch) | |
| tree | 2707e3c7065edbb3267d04146a7800d22279cf67 /fs | |
| parent | e6d50234ccb9ff54addd579032a146aef52e7541 (diff) | |
| download | linux-037193b0ae833c922881f0bf188b4ed49874e6c9.tar.xz | |
non-consuming variant of do_linkat()
similar to previous commit; replacement is filename_linkat()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/init.c | 5 | ||||
| -rw-r--r-- | fs/internal.h | 2 | ||||
| -rw-r--r-- | fs/namei.c | 27 |
3 files changed, 16 insertions, 18 deletions
diff --git a/fs/init.c b/fs/init.c index da6500d2ee98..f46e54552931 100644 --- a/fs/init.c +++ b/fs/init.c @@ -145,8 +145,9 @@ int __init init_mknod(const char *filename, umode_t mode, unsigned int dev) int __init init_link(const char *oldname, const char *newname) { - return do_linkat(AT_FDCWD, getname_kernel(oldname), - AT_FDCWD, getname_kernel(newname), 0); + CLASS(filename_kernel, old)(oldname); + CLASS(filename_kernel, new)(newname); + return filename_linkat(AT_FDCWD, old, AT_FDCWD, new, 0); } int __init init_symlink(const char *oldname, const char *newname) diff --git a/fs/internal.h b/fs/internal.h index 5047cfbb8c93..c9b70c2716d1 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -62,7 +62,7 @@ int filename_renameat2(int olddfd, struct filename *oldname, int newdfd, int do_mkdirat(int dfd, struct filename *name, umode_t mode); int do_mknodat(int dfd, struct filename *name, umode_t mode, unsigned int dev); int do_symlinkat(struct filename *from, int newdfd, struct filename *to); -int do_linkat(int olddfd, struct filename *old, int newdfd, +int filename_linkat(int olddfd, struct filename *old, int newdfd, struct filename *new, int flags); int vfs_tmpfile(struct mnt_idmap *idmap, const struct path *parentpath, diff --git a/fs/namei.c b/fs/namei.c index 5354f240b86a..e5d494610c2c 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -5729,9 +5729,9 @@ EXPORT_SYMBOL(vfs_link); * We don't follow them on the oldname either to be compatible * with linux 2.0, and to avoid hard-linking to directories * and other special files. --ADM - */ -int do_linkat(int olddfd, struct filename *old, int newdfd, - struct filename *new, int flags) +*/ +int filename_linkat(int olddfd, struct filename *old, + int newdfd, struct filename *new, int flags) { struct mnt_idmap *idmap; struct dentry *new_dentry; @@ -5740,10 +5740,8 @@ int do_linkat(int olddfd, struct filename *old, int newdfd, int how = 0; int error; - if ((flags & ~(AT_SYMLINK_FOLLOW | AT_EMPTY_PATH)) != 0) { - error = -EINVAL; - goto out_putnames; - } + if ((flags & ~(AT_SYMLINK_FOLLOW | AT_EMPTY_PATH)) != 0) + return -EINVAL; /* * To use null names we require CAP_DAC_READ_SEARCH or * that the open-time creds of the dfd matches current. @@ -5758,7 +5756,7 @@ int do_linkat(int olddfd, struct filename *old, int newdfd, retry: error = filename_lookup(olddfd, old, how, &old_path, NULL); if (error) - goto out_putnames; + return error; new_dentry = filename_create(newdfd, new, &new_path, (how & LOOKUP_REVAL)); @@ -5794,23 +5792,22 @@ out_dput: } out_putpath: path_put(&old_path); -out_putnames: - putname(old); - putname(new); - return error; } SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags) { - return do_linkat(olddfd, getname_uflags(oldname, flags), - newdfd, getname(newname), flags); + CLASS(filename_uflags, old)(oldname, flags); + CLASS(filename, new)(newname); + return filename_linkat(olddfd, old, newdfd, new, flags); } SYSCALL_DEFINE2(link, const char __user *, oldname, const char __user *, newname) { - return do_linkat(AT_FDCWD, getname(oldname), AT_FDCWD, getname(newname), 0); + CLASS(filename, old)(oldname); + CLASS(filename, new)(newname); + return filename_linkat(AT_FDCWD, old, AT_FDCWD, new, 0); } /** |
