ide: fix barriers support
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Sat, 18 Apr 2009 15:42:20 +0000 (17:42 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Sat, 18 Apr 2009 15:42:20 +0000 (17:42 +0200)
Freeing non-slab objects is bad and results in an oops.  Fix it.

Reported-and-tested-by: Andrew Price <andy@andrewprice.me.uk>
Cc: Theodore Tso <tytso@mit.edu>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-io.c

index 2ae02b8d7f8e06e7551f352f0336ea8089db97ad..35dc38d3b2c58d2f40e3a299f5b6c0832f88da82 100644 (file)
@@ -102,11 +102,14 @@ void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err)
                        drive->dev_flags |= IDE_DFLAG_PARKED;
        }
 
-       if (rq && rq->cmd_type == REQ_TYPE_ATA_TASKFILE)
-               memcpy(rq->special, cmd, sizeof(*cmd));
+       if (rq && rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
+               struct ide_cmd *orig_cmd = rq->special;
 
-       if (cmd->tf_flags & IDE_TFLAG_DYN)
-               kfree(cmd);
+               if (cmd->tf_flags & IDE_TFLAG_DYN)
+                       kfree(orig_cmd);
+               else
+                       memcpy(orig_cmd, cmd, sizeof(*cmd));
+       }
 }
 
 /* obsolete, blk_rq_bytes() should be used instead */