From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752050AbcGRQSb (ORCPT ); Mon, 18 Jul 2016 12:18:31 -0400 Received: from mx2.suse.de ([195.135.220.15]:54907 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751784AbcGRQSY (ORCPT ); Mon, 18 Jul 2016 12:18:24 -0400 From: Aleksa Sarai To: Greg Kroah-Hartman , Tejun Heo , Li Zefan , Johannes Weiner , "Serge E. Hallyn" , Aditya Kali , Chris Wilson Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, Christian Brauner , Aleksa Sarai , dev@opencontainers.org Subject: [PATCH v1 1/3] kernfs: add support for custom per-sb permission hooks Date: Tue, 19 Jul 2016 02:18:14 +1000 Message-Id: <20160718161816.13040-2-asarai@suse.de> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20160718161816.13040-1-asarai@suse.de> References: <20160718161816.13040-1-asarai@suse.de> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This allows for users of kernfs to create custom (and possibly less restrictive) permission checks for kernfs_nodes. The default is unchanged. This patch is part of the cgroupns unprivileged subtree management patchset. Cc: dev@opencontainers.org Signed-off-by: Aleksa Sarai --- fs/kernfs/inode.c | 13 ++++++++++++- include/linux/kernfs.h | 3 +++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c index 63b925d5ba1e..e82b8e5aa643 100644 --- a/fs/kernfs/inode.c +++ b/fs/kernfs/inode.c @@ -364,15 +364,26 @@ void kernfs_evict_inode(struct inode *inode) int kernfs_iop_permission(struct inode *inode, int mask) { struct kernfs_node *kn; + struct kernfs_syscall_ops *scops; + int ret; if (mask & MAY_NOT_BLOCK) return -ECHILD; kn = inode->i_private; + if (!kernfs_get_active(kn)) + return -ENODEV; mutex_lock(&kernfs_mutex); kernfs_refresh_inode(kn, inode); mutex_unlock(&kernfs_mutex); - return generic_permission(inode, mask); + scops = kernfs_root(kn)->syscall_ops; + if (unlikely(scops && scops->permission)) + ret = scops->permission(inode, kn, mask); + else + ret = generic_permission(inode, mask); + + kernfs_put_active(kn); + return ret; } diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index 96356ef012de..373b5a888a81 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h @@ -16,6 +16,7 @@ #include #include #include +#include struct file; struct dentry; @@ -154,6 +155,8 @@ struct kernfs_syscall_ops { const char *new_name); int (*show_path)(struct seq_file *sf, struct kernfs_node *kn, struct kernfs_root *root); + int (*permission)(struct inode *inode, struct kernfs_node *kn, + int mask); }; struct kernfs_root { -- 2.9.0