Skip to contentSkip to conversation

ide-floppy cleanups/media change detection (3/5)

PATCH New Kevin P. Fleming 1 participant 1 message Jan 13, 2002

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ide-floppy cleanups/media change detection (3/5)

Patch 3 follows:

diff -X dontdiff -urN linux-2/drivers/ide/ide-floppy.c linux-3/drivers/ide/ide-floppy.c

drivers/ide/ide-floppy.c Sat Jan 12 17:26:13 2002 renamed from drivers/ide/ide-floppy.c Sat Jan 12 16:48:05 2002 +1 -2
@@ -1284,17 +1284,23 @@
 static int idefloppy_get_flexible_disk_page (ide_drive_t *drive)
 {
  idefloppy_floppy_t *floppy = drive->driver_data;
- idefloppy_pc_t pc;
+ idefloppy_pc_t *pc;
  idefloppy_mode_parameter_header_t *header;
  idefloppy_flexible_disk_page_t *page;
  int capacity, lba_capacity;
 
- idefloppy_create_mode_sense_cmd (&pc, IDEFLOPPY_FLEXIBLE_DISK_PAGE,

MODE_SENSE_CURRENT);
- if (idefloppy_queue_pc_tail (drive,&pc)) {
+ if ((pc = (idefloppy_pc_t *) kmalloc (sizeof (idefloppy_pc_t), GFP_KERNEL)) == NULL) {
+ printk (KERN_ERR "ide-floppy: %s: Can't allocate a packet command structure\n", drive->name);
+ return 1;
+ }
+ memset (pc, 0, sizeof (idefloppy_pc_t));
+ idefloppy_create_mode_sense_cmd (pc, IDEFLOPPY_FLEXIBLE_DISK_PAGE, MODE_SENSE_CURRENT);
+ if (idefloppy_queue_pc_tail (drive,pc)) {
printk (KERN_ERR "ide-floppy: Can't get flexible disk page
parameters\n");
+ kfree (pc);
return 1;
}
- header = (idefloppy_mode_parameter_header_t *) pc.buffer;
+ header = (idefloppy_mode_parameter_header_t *) pc->buffer; floppy->wp = header->wp;
page = (idefloppy_flexible_disk_page_t *) (header + 1);

@@ -1319,28 +1325,36 @@

    drive->name, lba_capacity, capacity);

floppy->blocks = floppy->block_size ? capacity / floppy->block_size : 0;
}
+ kfree (pc);
return 0;
}

static int idefloppy_get_capability_page(ide_drive_t *drive) {
idefloppy_floppy_t *floppy = drive->driver_data;
- idefloppy_pc_t pc;
+ idefloppy_pc_t *pc; idefloppy_mode_parameter_header_t *header; idefloppy_capabilities_page_t *page;

+ if ((pc = (idefloppy_pc_t *) kmalloc (sizeof (idefloppy_pc_t), GFP_KERNEL)) == NULL) {
+ printk (KERN_ERR "ide-floppy: %s: Can't allocate a packet command structure\n", drive->name);
+ return 1;
+ }
+ memset (pc, 0, sizeof (idefloppy_pc_t)); floppy->srfp=0;
- idefloppy_create_mode_sense_cmd (&pc, IDEFLOPPY_CAPABILITIES_PAGE,
+ idefloppy_create_mode_sense_cmd (pc, IDEFLOPPY_CAPABILITIES_PAGE,

        MODE_SENSE_CURRENT);

- set_bit(PC_SUPPRESS_ERROR, &pc.flags);
- if (idefloppy_queue_pc_tail (drive,&pc)) {
+ set_bit(PC_SUPPRESS_ERROR, &pc->flags);
+ if (idefloppy_queue_pc_tail (drive,pc)) {
+ kfree (pc);
return 1;
}

- header = (idefloppy_mode_parameter_header_t *) pc.buffer;
+ header = (idefloppy_mode_parameter_header_t *) pc->buffer; page= (idefloppy_capabilities_page_t *)(header+1); floppy->srfp=page->srfp;
+ kfree (pc);
return (0);
}

@@ -1351,7 +1365,7 @@
static int idefloppy_get_capacity (ide_drive_t *drive) {
idefloppy_floppy_t *floppy = drive->driver_data;
- idefloppy_pc_t pc;
+ idefloppy_pc_t *pc; idefloppy_capacity_header_t *header; idefloppy_capacity_descriptor_t *descriptor; int i, descriptors, rc = 1, blocks, length;
@@ -1361,12 +1375,18 @@
floppy->blocks = floppy->bs_factor = 0; drive->part[0].nr_sects = 0;

- idefloppy_create_read_capacity_cmd (&pc);
- if (idefloppy_queue_pc_tail (drive, &pc)) {
+ if ((pc = (idefloppy_pc_t *) kmalloc (sizeof (idefloppy_pc_t), GFP_KERNEL)) == NULL) {
+ printk (KERN_ERR "ide-floppy: %s: Can't allocate a packet command structure\n", drive->name);
+ return 1;
+ }
+ memset (pc, 0, sizeof (idefloppy_pc_t));
+ idefloppy_create_read_capacity_cmd (pc);
+ if (idefloppy_queue_pc_tail (drive, pc)) {
printk (KERN_ERR "ide-floppy: Can't get floppy parameters\n");
+ kfree (pc);
return 1;
}
- header = (idefloppy_capacity_header_t *) pc.buffer;
+ header = (idefloppy_capacity_header_t *) pc->buffer; descriptors = header->length / sizeof (idefloppy_capacity_descriptor_t); descriptor = (idefloppy_capacity_descriptor_t *) (header + 1);

@@ -1416,6 +1436,7 @@
}

drive->part[0].nr_sects = floppy->blocks * floppy->bs_factor;
+ kfree (pc);
return rc;
}

@@ -1445,7 +1466,7 @@
struct file *file,
int *arg) /* Cheater */
{
- idefloppy_pc_t pc;
+ idefloppy_pc_t *pc;

  idefloppy_capacity_header_t *header;
         idefloppy_capacity_descriptor_t *descriptor;

int i, descriptors, blocks, length;
@@ -1459,12 +1480,18 @@
if (u_array_size <= 0)
return (-EINVAL);

- idefloppy_create_read_capacity_cmd (&pc);
- if (idefloppy_queue_pc_tail (drive, &pc)) {
+ if ((pc = (idefloppy_pc_t *) kmalloc (sizeof (idefloppy_pc_t), GFP_KERNEL)) == NULL) {
+ printk (KERN_ERR "ide-floppy: %s: Can't allocate a packet command structure\n", drive->name);
+ return (-EIO);
+ }
+ memset (pc, 0, sizeof (idefloppy_pc_t));
+ idefloppy_create_read_capacity_cmd (pc);
+ if (idefloppy_queue_pc_tail (drive, pc)) {
printk (KERN_ERR "ide-floppy: Can't get floppy parameters\n");

+  kfree (pc);
                 return (-EIO);
         }
-        header = (idefloppy_capacity_header_t *) pc.buffer;
+        header = (idefloppy_capacity_header_t *) pc->buffer;
         descriptors = header->length /

sizeof (idefloppy_capacity_descriptor_t);
descriptor = (idefloppy_capacity_descriptor_t *) (header + 1);
@@ -1488,19 +1515,26 @@
blocks = ntohl (descriptor->blocks);
length = ntohs (descriptor->length);

- if (put_user(blocks, argp))
+ if (put_user(blocks, argp)) {

+   kfree (pc);
    return (-EFAULT);

+ }
++argp;

- if (put_user(length, argp))
+ if (put_user(length, argp)) {

+   kfree (pc);
    return (-EFAULT);

+ }
++argp;

   ++u_index;
  }

- if (put_user(u_index, arg))
+ if (put_user(u_index, arg)) {
+ kfree (pc);
return (-EFAULT);
+ }
+ kfree (pc);
return (0);
}

@@ -1528,7 +1562,7 @@
int blocks;
int length;
int flags;
- idefloppy_pc_t pc;
+ idefloppy_pc_t *pc;

if (get_user(blocks, arg)

      || get_user(length, arg+1)

@@ -1538,11 +1572,18 @@
}

(void) idefloppy_get_capability_page (drive); /* Get the SFRP bit */
- idefloppy_create_format_unit_cmd(&pc, blocks, length, flags);
- if (idefloppy_queue_pc_tail (drive, &pc))
+ if ((pc = (idefloppy_pc_t *) kmalloc (sizeof (idefloppy_pc_t), GFP_KERNEL)) == NULL) {
+ printk (KERN_ERR "ide-floppy: %s: Can't allocate a packet command structure\n", drive->name);
+ return (-EIO);
+ }
+ memset (pc, 0, sizeof (idefloppy_pc_t));
+ idefloppy_create_format_unit_cmd(pc, blocks, length, flags);
+ if (idefloppy_queue_pc_tail (drive, pc))
{

+  kfree (pc);
                 return (-EIO);
         }

+ kfree (pc);
return (0);
}

@@ -1562,14 +1603,20 @@
int *arg)
{
idefloppy_floppy_t *floppy = drive->driver_data;
- idefloppy_pc_t pc;
+ idefloppy_pc_t *pc;
int progress_indication=0x10000;

if (floppy->srfp)
{

-  idefloppy_create_request_sense_cmd(&pc);
-  if (idefloppy_queue_pc_tail (drive, &pc))
+  if ((pc = (idefloppy_pc_t *) kmalloc (sizeof (idefloppy_pc_t),

GFP_KERNEL)) == NULL) {
+ printk (KERN_ERR "ide-floppy: %s: Can't allocate a packet command
structure\n", drive->name);
+ return (-EIO);

+  }
+  memset (pc, 0, sizeof (idefloppy_pc_t));
+  idefloppy_create_request_sense_cmd(pc);
+  if (idefloppy_queue_pc_tail (drive, pc))
   {
+   kfree (pc);
    return (-EIO);

}

@@ -1580,6 +1627,7 @@
}
/* Else assume format_unit has finished, and we're
** at 0x10000 */
+ kfree (pc);
}
else
{
@@ -1607,7 +1655,7 @@
static int idefloppy_ioctl (ide_drive_t *drive, struct inode *inode, struct
file *file,
unsigned int cmd, unsigned long arg)
{
- idefloppy_pc_t pc;
+ idefloppy_pc_t *pc;
idefloppy_floppy_t *floppy = drive->driver_data;
int prevent = (arg) ? 1 : 0;

@@ -1619,15 +1667,21 @@
if (drive->usage > 1)

    return -EBUSY;

+ if ((pc = (idefloppy_pc_t *) kmalloc (sizeof (idefloppy_pc_t), GFP_KERNEL)) == NULL) {
+ printk (KERN_ERR "ide-floppy: %s: Can't allocate a packet command
structure\n", drive->name);
+ return (-EIO);
+ }
+ memset (pc, 0, sizeof (idefloppy_pc_t));
/* The IOMEGA Clik! Drive doesn't support this command - no room for an
eject mechanism */

                 if (!test_bit(IDEFLOPPY_CLIK_DRIVE, &floppy->flags)) {
-   idefloppy_create_prevent_cmd (&pc, prevent);
-   (void) idefloppy_queue_pc_tail (drive, &pc);
+   idefloppy_create_prevent_cmd (pc, prevent);
+   (void) idefloppy_queue_pc_tail (drive, pc);
   }
   if (cmd == CDROMEJECT) {
-   idefloppy_create_start_stop_cmd (&pc, 2);
-   (void) idefloppy_queue_pc_tail (drive, &pc);
+   idefloppy_create_start_stop_cmd (pc, 2);
+   (void) idefloppy_queue_pc_tail (drive, pc);

}
+ kfree (pc);
return 0;
case IDEFLOPPY_IOCTL_FORMAT_SUPPORTED:
return (0);
@@ -1687,7 +1741,7 @@
static int idefloppy_open (struct inode *inode, struct file *filp,
ide_drive_t *drive)
{
idefloppy_floppy_t *floppy = drive->driver_data;
- idefloppy_pc_t pc;
+ idefloppy_pc_t *pc;

#if IDEFLOPPY_DEBUG_LOG
printk (KERN_INFO "Reached idefloppy_open\n");
@@ -1698,10 +1752,15 @@
clear_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, &floppy->flags); /* Just in case */

- idefloppy_create_test_unit_ready_cmd(&pc);
- if (idefloppy_queue_pc_tail(drive, &pc)) {
- idefloppy_create_start_stop_cmd (&pc, 1);
- (void) idefloppy_queue_pc_tail (drive, &pc);
+ if ((pc = (idefloppy_pc_t *) kmalloc (sizeof (idefloppy_pc_t), GFP_KERNEL)) == NULL) {
+ printk (KERN_ERR "ide-floppy: %s: Can't allocate a packet command
structure\n", drive->name);
+ return (-EIO);

+  }
+  memset (pc, 0, sizeof (idefloppy_pc_t));
+  idefloppy_create_test_unit_ready_cmd(pc);
+  if (idefloppy_queue_pc_tail(drive, pc)) {

+ idefloppy_create_start_stop_cmd (pc, 1);
+ (void) idefloppy_queue_pc_tail (drive, pc);
}

if (idefloppy_get_capacity (drive)
@@ -1713,22 +1772,25 @@

       */
       ) {
    drive->usage--;
+   kfree (pc);
    MOD_DEC_USE_COUNT;
    return -EIO;

}

   if (floppy->wp && (filp->f_mode & 2)) {
    drive->usage--;
+   kfree (pc);
    MOD_DEC_USE_COUNT;
    return -EROFS;
   }
   set_bit (IDEFLOPPY_MEDIA_CHANGED, &floppy->flags);
   /* IOMEGA Clik! drives do not support lock/unlock commands */
                 if (!test_bit(IDEFLOPPY_CLIK_DRIVE, &floppy->flags)) {
-   idefloppy_create_prevent_cmd (&pc, 1);
-   (void) idefloppy_queue_pc_tail (drive, &pc);
+   idefloppy_create_prevent_cmd (pc, 1);
+   (void) idefloppy_queue_pc_tail (drive, pc);

}
check_disk_change(inode->i_rdev);
+ kfree (pc);
}
else if (test_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, &floppy->flags)) {
@@ -1741,7 +1803,7 @@

static void idefloppy_release (struct inode *inode, struct file *filp,
ide_drive_t *drive)
{
- idefloppy_pc_t pc;
+ idefloppy_pc_t *pc;

#if IDEFLOPPY_DEBUG_LOG
printk (KERN_INFO "Reached idefloppy_release\n");
@@ -1754,8 +1816,14 @@

/* IOMEGA Clik! drives do not support lock/unlock commands */

                 if (!test_bit(IDEFLOPPY_CLIK_DRIVE, &floppy->flags)) {
-   idefloppy_create_prevent_cmd (&pc, 0);
-   (void) idefloppy_queue_pc_tail (drive, &pc);
+   if ((pc = (idefloppy_pc_t *) kmalloc (sizeof (idefloppy_pc_t),

GFP_KERNEL)) == NULL) {
+ printk (KERN_ERR "ide-floppy: %s: Can't allocate a packet command
structure\n", drive->name);
+ } else {

+    memset (pc, 0, sizeof (idefloppy_pc_t));
+    idefloppy_create_prevent_cmd (pc, 0);
+    (void) idefloppy_queue_pc_tail (drive, pc);
+    kfree (pc);

+ }
}

   clear_bit(IDEFLOPPY_FORMAT_IN_PROGRESS, &floppy->flags);