vserver 1.9.3
[linux-2.6.git] / fs / reiserfs / ioctl.c
index eaddaf9..286d812 100644 (file)
@@ -37,7 +37,7 @@ int reiserfs_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
                flags = REISERFS_I(inode) -> i_attrs;
                i_attrs_to_sd_attrs( inode, ( __u16 * ) &flags );
                flags &= REISERFS_FL_USER_VISIBLE;
-               return put_user(flags, (int *) arg);
+               return put_user(flags, (int __user *) arg);
        case REISERFS_IOC_SETFLAGS: {
                if (IS_RDONLY(inode))
                        return -EROFS;
@@ -45,13 +45,15 @@ int reiserfs_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
                if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
                        return -EPERM;
 
-               if (get_user(flags, (int *) arg))
+               if (get_user(flags, (int __user *) arg))
                        return -EFAULT;
 
                oldflags = REISERFS_I(inode) -> i_attrs;
-               if ( ( ( flags ^ oldflags) &
-                  ( REISERFS_IMMUTABLE_FL | REISERFS_IUNLINK_FL | REISERFS_APPEND_FL)) &&
-                    !capable( CAP_LINUX_IMMUTABLE ) )
+               if ( ( (oldflags & REISERFS_IMMUTABLE_FL) ||
+                       ( (flags ^ oldflags) &
+                       (REISERFS_IMMUTABLE_FL | REISERFS_IUNLINK_FL |
+                        REISERFS_APPEND_FL) ) ) &&
+                       !capable( CAP_LINUX_IMMUTABLE ) )
                        return -EPERM;
                        
                if( ( flags & REISERFS_NOTAIL_FL ) &&
@@ -62,7 +64,7 @@ int reiserfs_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
                                if( result )
                                        return result;
                }
-               
+
                flags = flags & REISERFS_FL_USER_MODIFYABLE;
                flags |= oldflags & ~REISERFS_FL_USER_MODIFYABLE;
                sd_attrs_to_i_attrs( flags, inode );
@@ -72,13 +74,13 @@ int reiserfs_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
                return 0;
        }
        case REISERFS_IOC_GETVERSION:
-               return put_user(inode->i_generation, (int *) arg);
+               return put_user(inode->i_generation, (int __user *) arg);
        case REISERFS_IOC_SETVERSION:
                if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
                        return -EPERM;
                if (IS_RDONLY(inode))
                        return -EROFS;
-               if (get_user(inode->i_generation, (int *) arg))
+               if (get_user(inode->i_generation, (int __user *) arg))
                        return -EFAULT; 
                inode->i_ctime = CURRENT_TIME;
                mark_inode_dirty(inode);