From aa10421df605b1ecb08ec9702a77b8da31bd9ca6 Mon Sep 17 00:00:00 2001 From: Erez Zadok Date: Sat, 30 Apr 2011 01:32:17 -0400 Subject: [PATCH] Unionfs: update ->permission prototye and code for new iperm flag Signed-off-by: Erez Zadok --- fs/unionfs/inode.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/fs/unionfs/inode.c b/fs/unionfs/inode.c index cc994bdb348..00662387d45 100644 --- a/fs/unionfs/inode.c +++ b/fs/unionfs/inode.c @@ -743,7 +743,7 @@ static void unionfs_put_link(struct dentry *dentry, struct nameidata *nd, * This is a variant of fs/namei.c:permission() or inode_permission() which * skips over EROFS tests (because we perform copyup on EROFS). */ -static int __inode_permission(struct inode *inode, int mask) +static int __inode_permission(struct inode *inode, int mask, unsigned int flags) { int retval; @@ -753,7 +753,7 @@ static int __inode_permission(struct inode *inode, int mask) /* Ordinary permission routines do not understand MAY_APPEND. */ if (inode->i_op && inode->i_op->permission) { - retval = inode->i_op->permission(inode, mask); + retval = inode->i_op->permission(inode, mask, flags); if (!retval) { /* * Exec permission on a regular file is denied if none @@ -767,7 +767,7 @@ static int __inode_permission(struct inode *inode, int mask) return -EACCES; } } else { - retval = generic_permission(inode, mask, NULL); + retval = generic_permission(inode, mask, flags, NULL); } if (retval) return retval; @@ -784,7 +784,7 @@ static int __inode_permission(struct inode *inode, int mask) * unionfs_permission, or anything it calls, will use stale branch * information. */ -static int unionfs_permission(struct inode *inode, int mask) +static int unionfs_permission(struct inode *inode, int mask, unsigned int flags) { struct inode *lower_inode = NULL; int err = 0; @@ -794,6 +794,9 @@ static int unionfs_permission(struct inode *inode, int mask) struct inode *inode_grabbed = igrab(inode); struct dentry *dentry = d_find_alias(inode); + if (flags & IPERM_FLAG_RCU) + return -ECHILD; + if (dentry) unionfs_lock_dentry(dentry, UNIONFS_DMUTEX_CHILD); @@ -837,7 +840,7 @@ static int unionfs_permission(struct inode *inode, int mask) * copyup taking place later on. However, if user never had * access to the file, then no copyup could ever take place. */ - err = __inode_permission(lower_inode, mask); + err = __inode_permission(lower_inode, mask, flags); if (err && err != -EACCES && err != EPERM && bindex > 0) { umode_t mode = lower_inode->i_mode; if ((is_robranch_super(inode->i_sb, bindex) || @@ -860,7 +863,7 @@ static int unionfs_permission(struct inode *inode, int mask) if (err && err == -EACCES && is_robranch_super(inode->i_sb, bindex) && lower_inode->i_sb->s_magic == NFS_SUPER_MAGIC) - err = generic_permission(lower_inode, mask, NULL); + err = generic_permission(lower_inode, mask, flags, NULL); /* * The permissions are an intersection of the overall directory -- 2.34.1