This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / fs / ext2 / ioctl.c
index 101055b..67a0c6b 100644 (file)
@@ -25,7 +25,7 @@ int ext2_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
        switch (cmd) {
        case EXT2_IOC_GETFLAGS:
                flags = ei->i_flags & EXT2_FL_USER_VISIBLE;
-               return put_user(flags, (int *) arg);
+               return put_user(flags, (int __user *) arg);
        case EXT2_IOC_SETFLAGS: {
                unsigned int oldflags;
 
@@ -35,7 +35,7 @@ int ext2_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
                if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
                        return -EACCES;
 
-               if (get_user(flags, (int *) arg))
+               if (get_user(flags, (int __user *) arg))
                        return -EFAULT;
 
                if (!S_ISDIR(inode->i_mode))
@@ -49,7 +49,9 @@ int ext2_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
                 *
                 * This test looks nicer. Thanks to Pauline Middelink
                 */
-               if ((flags ^ oldflags) & (EXT2_APPEND_FL | EXT2_IMMUTABLE_FL)) {
+               if ((oldflags & EXT2_IMMUTABLE_FL) ||
+                       ((flags ^ oldflags) & (EXT2_APPEND_FL |
+                       EXT2_IMMUTABLE_FL | EXT2_IUNLINK_FL))) {
                        if (!capable(CAP_LINUX_IMMUTABLE))
                                return -EPERM;
                }
@@ -59,20 +61,20 @@ int ext2_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
                ei->i_flags = flags;
 
                ext2_set_inode_flags(inode);
-               inode->i_ctime = CURRENT_TIME;
+               inode->i_ctime = CURRENT_TIME_SEC;
                mark_inode_dirty(inode);
                return 0;
        }
        case EXT2_IOC_GETVERSION:
-               return put_user(inode->i_generation, (int *) arg);
+               return put_user(inode->i_generation, (int __user *) arg);
        case EXT2_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;
+               inode->i_ctime = CURRENT_TIME_SEC;
                mark_inode_dirty(inode);
                return 0;
        default: