diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2025-10-31 13:50:33 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2026-01-16 12:52:03 -0500 |
| commit | f770e4c1a488edb5ea96cce67f41607c259d704c (patch) | |
| tree | 7315b3e3f31204bf2b47efda35d400ca5f157544 | |
| parent | 7f583ad97c6a87e8ea7b7b875dabe2f84fedfd5e (diff) | |
do_fchownat(): unspaghettify a bit...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| -rw-r--r-- | fs/open.c | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/fs/open.c b/fs/open.c index 7254eda9f4a5..425c09d83d7f 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; } |
