fs: remove the unused SB_I_MULTIROOT flag
[linux-2.6-microblaze.git] / fs / namei.c
index fde8fe0..f1eb8cc 100644 (file)
@@ -568,8 +568,8 @@ static bool path_connected(struct vfsmount *mnt, struct dentry *dentry)
 {
        struct super_block *sb = mnt->mnt_sb;
 
-       /* Bind mounts and multi-root filesystems can have disconnected paths */
-       if (!(sb->s_iflags & SB_I_MULTIROOT) && (mnt->mnt_root == sb->s_root))
+       /* Bind mounts can have disconnected paths */
+       if (mnt->mnt_root == sb->s_root)
                return true;
 
        return is_subdir(dentry, mnt->mnt_root);
@@ -2851,16 +2851,24 @@ static int may_open(const struct path *path, int acc_mode, int flag)
        case S_IFDIR:
                if (acc_mode & MAY_WRITE)
                        return -EISDIR;
+               if (acc_mode & MAY_EXEC)
+                       return -EACCES;
                break;
        case S_IFBLK:
        case S_IFCHR:
                if (!may_open_dev(path))
                        return -EACCES;
-               /*FALLTHRU*/
+               fallthrough;
        case S_IFIFO:
        case S_IFSOCK:
+               if (acc_mode & MAY_EXEC)
+                       return -EACCES;
                flag &= ~O_TRUNC;
                break;
+       case S_IFREG:
+               if ((acc_mode & MAY_EXEC) && path_noexec(path))
+                       return -EACCES;
+               break;
        }
 
        error = inode_permission(inode, MAY_OPEN | acc_mode);
@@ -3770,11 +3778,11 @@ exit2:
        mnt_drop_write(path.mnt);
 exit1:
        path_put(&path);
-       putname(name);
        if (retry_estale(error, lookup_flags)) {
                lookup_flags |= LOOKUP_REVAL;
                goto retry;
        }
+       putname(name);
        return error;
 }