Unionfs: update ->permission prototye and code for new iperm flag
authorErez Zadok <ezk@cs.sunysb.edu>
Sun, 6 Mar 2011 21:27:08 +0000 (16:27 -0500)
committerErez Zadok <ezk@cs.sunysb.edu>
Wed, 30 Mar 2011 23:31:56 +0000 (19:31 -0400)
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/inode.c

index cc994bdb348cb253c684123ad4350ef66698949c..00662387d45d23cd8e47f1b80630d707a82135ee 100644 (file)
@@ -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