Commit f770e4c1 authored by Al Viro's avatar Al Viro
Browse files

do_fchownat(): unspaghettify a bit...



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 7f583ad9
Loading
Loading
Loading
Loading
+12 −16
Original line number Diff line number Diff line
@@ -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;
	if (!error) {
		error = mnt_want_write(path.mnt);
	if (error)
		goto out_release;
		if (!error) {
			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;
		}
out:
	putname(name);
	}
	return error;
}