Merge to Fedora kernel-2.6.7-1.494 and VServer 1.9.1.12. Fix some previous merge...
[linux-2.6.git] / drivers / block / DAC960.c
index 29035dd..040acbb 100644 (file)
@@ -97,7 +97,8 @@ static int DAC960_ioctl(struct inode *inode, struct file *file,
        struct gendisk *disk = inode->i_bdev->bd_disk;
        DAC960_Controller_T *p = disk->queue->queuedata;
        int drive_nr = (long)disk->private_data;
-       struct hd_geometry g, *loc = (struct hd_geometry *)arg;
+       struct hd_geometry g;
+       struct hd_geometry __user *loc = (struct hd_geometry __user *)arg;
 
        if (cmd != HDIO_GETGEO || !loc)
                return -EINVAL;
@@ -6125,6 +6126,9 @@ static boolean DAC960_V2_ExecuteUserCommand(DAC960_Controller_T *Controller,
   unsigned long flags;
   unsigned char Channel, TargetID, LogicalDriveNumber;
   unsigned short LogicalDeviceNumber;
+  wait_queue_t __wait;
+  
+  init_waitqueue_entry(&__wait, current);
 
   spin_lock_irqsave(&Controller->queue_lock, flags);
   while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
@@ -6307,11 +6311,18 @@ static boolean DAC960_V2_ExecuteUserCommand(DAC960_Controller_T *Controller,
                                        .SegmentByteCount =
            CommandMailbox->ControllerInfo.DataTransferSize;
          DAC960_ExecuteCommand(Command);
+         add_wait_queue(&Controller->CommandWaitQueue, &__wait);
+         set_current_state(TASK_UNINTERRUPTIBLE);
+         
          while (Controller->V2.NewControllerInformation->PhysicalScanActive)
            {
              DAC960_ExecuteCommand(Command);
-             sleep_on_timeout(&Controller->CommandWaitQueue, HZ);
+             schedule_timeout(HZ);
+             set_current_state(TASK_UNINTERRUPTIBLE);
            }
+         current->state = TASK_RUNNING;
+         remove_wait_queue(&Controller->CommandWaitQueue, &__wait);
+          
          DAC960_UserCritical("Discovery Completed\n", Controller);
        }
     }
@@ -6455,7 +6466,8 @@ static int DAC960_ProcReadUserCommand(char *Page, char **Start, off_t Offset,
   DAC960_ProcWriteUserCommand implements writing /proc/rd/cN/user_command.
 */
 
-static int DAC960_ProcWriteUserCommand(struct file *file, const char *Buffer,
+static int DAC960_ProcWriteUserCommand(struct file *file,
+                                      const char __user *Buffer,
                                       unsigned long Count, void *Data)
 {
   DAC960_Controller_T *Controller = (DAC960_Controller_T *) Data;
@@ -6543,8 +6555,8 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file,
       return DAC960_ControllerCount;
     case DAC960_IOCTL_GET_CONTROLLER_INFO:
       {
-       DAC960_ControllerInfo_T *UserSpaceControllerInfo =
-         (DAC960_ControllerInfo_T *) Argument;
+       DAC960_ControllerInfo_T __user *UserSpaceControllerInfo =
+         (DAC960_ControllerInfo_T __user *) Argument;
        DAC960_ControllerInfo_T ControllerInfo;
        DAC960_Controller_T *Controller;
        int ControllerNumber;
@@ -6574,8 +6586,8 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file,
       }
     case DAC960_IOCTL_V1_EXECUTE_COMMAND:
       {
-       DAC960_V1_UserCommand_T *UserSpaceUserCommand =
-         (DAC960_V1_UserCommand_T *) Argument;
+       DAC960_V1_UserCommand_T __user *UserSpaceUserCommand =
+         (DAC960_V1_UserCommand_T __user *) Argument;
        DAC960_V1_UserCommand_T UserCommand;
        DAC960_Controller_T *Controller;
        DAC960_Command_T *Command = NULL;
@@ -6734,8 +6746,8 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file,
       }
     case DAC960_IOCTL_V2_EXECUTE_COMMAND:
       {
-       DAC960_V2_UserCommand_T *UserSpaceUserCommand =
-         (DAC960_V2_UserCommand_T *) Argument;
+       DAC960_V2_UserCommand_T __user *UserSpaceUserCommand =
+         (DAC960_V2_UserCommand_T __user *) Argument;
        DAC960_V2_UserCommand_T UserCommand;
        DAC960_Controller_T *Controller;
        DAC960_Command_T *Command = NULL;
@@ -6888,8 +6900,8 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file,
       }
     case DAC960_IOCTL_V2_GET_HEALTH_STATUS:
       {
-       DAC960_V2_GetHealthStatus_T *UserSpaceGetHealthStatus =
-         (DAC960_V2_GetHealthStatus_T *) Argument;
+       DAC960_V2_GetHealthStatus_T __user *UserSpaceGetHealthStatus =
+         (DAC960_V2_GetHealthStatus_T __user *) Argument;
        DAC960_V2_GetHealthStatus_T GetHealthStatus;
        DAC960_V2_HealthStatusBuffer_T HealthStatusBuffer;
        DAC960_Controller_T *Controller;