From: Al Viro Date: Fri, 31 Oct 2025 17:50:33 +0000 (-0400) Subject: do_fchownat(): unspaghettify a bit... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f770e4c1a488edb5ea96cce67f41607c259d704c;p=thirdparty%2Fkernel%2Flinux.git do_fchownat(): unspaghettify a bit... Signed-off-by: Al Viro --- diff --git a/fs/open.c b/fs/open.c index 7254eda9f4a58..425c09d83d7f4 100644 --- a/fs/open.c +++ b/fs/open.c @@ -810,30 +810,26 @@ int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group, struct path path; int error; int lookup_flags; - struct filename *name; if ((flag & ~(AT_SYMLINK_NOFOLLOW | AT_EMPTY_PATH)) != 0) return -EINVAL; lookup_flags = (flag & AT_SYMLINK_NOFOLLOW) ? 0 : LOOKUP_FOLLOW; - name = getname_uflags(filename, flag); + CLASS(filename_uflags, name)(filename, flag); retry: error = filename_lookup(dfd, name, lookup_flags, &path, NULL); - if (error) - goto out; - error = mnt_want_write(path.mnt); - if (error) - goto out_release; - error = chown_common(&path, user, group); - mnt_drop_write(path.mnt); -out_release: - path_put(&path); - if (retry_estale(error, lookup_flags)) { - lookup_flags |= LOOKUP_REVAL; - goto retry; + if (!error) { + error = mnt_want_write(path.mnt); + if (!error) { + error = chown_common(&path, user, group); + mnt_drop_write(path.mnt); + } + path_put(&path); + if (retry_estale(error, lookup_flags)) { + lookup_flags |= LOOKUP_REVAL; + goto retry; + } } -out: - putname(name); return error; }