fs: add a vfs_fchown helper
authorChristoph Hellwig <hch@lst.de>
Tue, 14 Jul 2020 06:47:43 +0000 (08:47 +0200)
committerChristoph Hellwig <hch@lst.de>
Thu, 16 Jul 2020 13:33:00 +0000 (15:33 +0200)
Add a helper for struct file based chown operations.  To be used by
the initramfs code soon.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/open.c
include/linux/fs.h

index 6cd48a6..103c663 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -740,23 +740,28 @@ SYSCALL_DEFINE3(lchown, const char __user *, filename, uid_t, user, gid_t, group
                           AT_SYMLINK_NOFOLLOW);
 }
 
+int vfs_fchown(struct file *file, uid_t user, gid_t group)
+{
+       int error;
+
+       error = mnt_want_write_file(file);
+       if (error)
+               return error;
+       audit_file(file);
+       error = chown_common(&file->f_path, user, group);
+       mnt_drop_write_file(file);
+       return error;
+}
+
 int ksys_fchown(unsigned int fd, uid_t user, gid_t group)
 {
        struct fd f = fdget(fd);
        int error = -EBADF;
 
-       if (!f.file)
-               goto out;
-
-       error = mnt_want_write_file(f.file);
-       if (error)
-               goto out_fput;
-       audit_file(f.file);
-       error = chown_common(&f.file->f_path, user, group);
-       mnt_drop_write_file(f.file);
-out_fput:
-       fdput(f);
-out:
+       if (f.file) {
+               error = vfs_fchown(f.file, user, group);
+               fdput(f);
+       }
        return error;
 }
 
index f5abba8..0ddd64c 100644 (file)
@@ -1744,6 +1744,8 @@ int vfs_mkobj(struct dentry *, umode_t,
                int (*f)(struct dentry *, umode_t, void *),
                void *);
 
+int vfs_fchown(struct file *file, uid_t user, gid_t group);
+
 extern long vfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
 
 #ifdef CONFIG_COMPAT