smb311: Add support for lookup with posix extensions query info
[linux-2.6-microblaze.git] / fs / namei.c
index a320371..d81f73f 100644 (file)
@@ -3505,12 +3505,14 @@ EXPORT_SYMBOL(user_path_create);
 
 int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
 {
+       bool is_whiteout = S_ISCHR(mode) && dev == WHITEOUT_DEV;
        int error = may_create(dir, dentry);
 
        if (error)
                return error;
 
-       if ((S_ISCHR(mode) || S_ISBLK(mode)) && !capable(CAP_MKNOD))
+       if ((S_ISCHR(mode) || S_ISBLK(mode)) && !is_whiteout &&
+           !capable(CAP_MKNOD))
                return -EPERM;
 
        if (!dir->i_op->mknod)
@@ -4345,9 +4347,6 @@ static int do_renameat2(int olddfd, const char __user *oldname, int newdfd,
            (flags & RENAME_EXCHANGE))
                return -EINVAL;
 
-       if ((flags & RENAME_WHITEOUT) && !capable(CAP_MKNOD))
-               return -EPERM;
-
        if (flags & RENAME_EXCHANGE)
                target_flags = 0;
 
@@ -4483,20 +4482,6 @@ SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newna
        return do_renameat2(AT_FDCWD, oldname, AT_FDCWD, newname, 0);
 }
 
-int vfs_whiteout(struct inode *dir, struct dentry *dentry)
-{
-       int error = may_create(dir, dentry);
-       if (error)
-               return error;
-
-       if (!dir->i_op->mknod)
-               return -EPERM;
-
-       return dir->i_op->mknod(dir, dentry,
-                               S_IFCHR | WHITEOUT_MODE, WHITEOUT_DEV);
-}
-EXPORT_SYMBOL(vfs_whiteout);
-
 int readlink_copy(char __user *buffer, int buflen, const char *link)
 {
        int len = PTR_ERR(link);