|
@@ -424,7 +424,9 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf,
|
|
|
|
|
|
rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
|
|
|
rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
|
|
|
- rq->buffer = buf;
|
|
|
+
|
|
|
+ if (cmd->tf_flags & IDE_TFLAG_WRITE)
|
|
|
+ rq->cmd_flags |= REQ_RW;
|
|
|
|
|
|
/*
|
|
|
* (ks) We transfer currently only whole sectors.
|
|
@@ -432,18 +434,20 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf,
|
|
|
* if we would find a solution to transfer any size.
|
|
|
* To support special commands like READ LONG.
|
|
|
*/
|
|
|
- rq->hard_nr_sectors = rq->nr_sectors = nsect;
|
|
|
- rq->hard_cur_sectors = rq->current_nr_sectors = nsect;
|
|
|
-
|
|
|
- if (cmd->tf_flags & IDE_TFLAG_WRITE)
|
|
|
- rq->cmd_flags |= REQ_RW;
|
|
|
+ if (nsect) {
|
|
|
+ error = blk_rq_map_kern(drive->queue, rq, buf,
|
|
|
+ nsect * SECTOR_SIZE, __GFP_WAIT);
|
|
|
+ if (error)
|
|
|
+ goto put_req;
|
|
|
+ }
|
|
|
|
|
|
rq->special = cmd;
|
|
|
cmd->rq = rq;
|
|
|
|
|
|
error = blk_execute_rq(drive->queue, NULL, rq, 0);
|
|
|
- blk_put_request(rq);
|
|
|
|
|
|
+put_req:
|
|
|
+ blk_put_request(rq);
|
|
|
return error;
|
|
|
}
|
|
|
|