]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - fs/inode.c
Merge branch 'slab/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg...
[mirror_ubuntu-bionic-kernel.git] / fs / inode.c
index 16fefd373fc2570449c97a34697f315536022f19..0b3da4a777042236c69024df1031f32b044e71c9 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/async.h>
 #include <linux/posix_acl.h>
 #include <linux/ima.h>
+#include <linux/cred.h>
 
 /*
  * This is needed for the following functions:
@@ -1733,3 +1734,22 @@ void inode_init_owner(struct inode *inode, const struct inode *dir,
        inode->i_mode = mode;
 }
 EXPORT_SYMBOL(inode_init_owner);
+
+/**
+ * inode_owner_or_capable - check current task permissions to inode
+ * @inode: inode being checked
+ *
+ * Return true if current either has CAP_FOWNER to the inode, or
+ * owns the file.
+ */
+bool inode_owner_or_capable(const struct inode *inode)
+{
+       struct user_namespace *ns = inode_userns(inode);
+
+       if (current_user_ns() == ns && current_fsuid() == inode->i_uid)
+               return true;
+       if (ns_capable(ns, CAP_FOWNER))
+               return true;
+       return false;
+}
+EXPORT_SYMBOL(inode_owner_or_capable);