@@ -173,9 +173,9 @@ void blk_dump_rq_flags(struct request *rq, char *msg)
{
int bit;
- printk(KERN_INFO "%s: dev %s: type=%x, flags=%x\n", msg,
+ printk(KERN_INFO "%s: dev %s: type=%x, flags=%x, ref_count: %d\n", msg,
rq->rq_disk ? rq->rq_disk->disk_name : "?", rq->cmd_type,
- rq->cmd_flags);
+ rq->cmd_flags, rq->ref_count);
printk(KERN_INFO " sector %llu, nr/cnr %u/%u\n",
(unsigned long long)blk_rq_pos(rq),
@@ -448,6 +448,7 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd,
int error;
rq = blk_get_request(drive->queue, write, __GFP_WAIT);
+ blk_dump_rq_flags(rq, "ide_cd_queue_pc got rq");
memcpy(rq->cmd, cmd, BLK_MAX_CDB);
rq->cmd_type = REQ_TYPE_ATA_PC;
@@ -464,12 +465,14 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd,
}
error = blk_execute_rq(drive->queue, info->disk, rq, 0);
+ blk_dump_rq_flags(rq, "ide_cd_queue_pc exec rq");
if (buffer)
*bufflen = rq->resid_len;
flags = rq->cmd_flags;
blk_put_request(rq);
+ blk_dump_rq_flags(rq, "ide_cd_queue_pc put rq");
/*
* FIXME: we should probably abort/retry or something in case of
@@ -506,15 +509,22 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd,
return (flags & REQ_FAILED) ? -EIO : 0;
}
-static void ide_cd_error_cmd(ide_drive_t *drive, struct ide_cmd *cmd)
+/*
+ * notify callers that we ended the rq by returning a true value
+ */
+static bool ide_cd_error_cmd(ide_drive_t *drive, struct ide_cmd *cmd)
{
unsigned int nr_bytes = cmd->nbytes - cmd->nleft;
if (cmd->tf_flags & IDE_TFLAG_WRITE)
nr_bytes -= cmd->last_xfer_len;
- if (nr_bytes > 0)
+ if (nr_bytes > 0) {
ide_complete_rq(drive, 0, nr_bytes);
+ return true;
+ }
+
+ return false;
}
static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
@@ -552,8 +562,10 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
if (!OK_STAT(stat, 0, BAD_R_STAT)) {
rc = cdrom_decode_status(drive, stat);
if (rc) {
- if (rc == 2)
+ if (rc == 2) {
+ printk(KERN_EMERG "%s: bad status with a sense rq: %p\n", __func__, rq);
goto out_end;
+ }
return ide_stopped;
}
}
@@ -667,8 +679,10 @@ out_end:
blk_end_request_all(rq, 0);
hwif->rq = NULL;
} else {
- if (sense && uptodate)
+ if (sense && uptodate) {
+ printk(KERN_EMERG "%s: complete failed rq: %p\n", __func__, rq);
ide_cd_complete_failed_rq(drive, rq);
+ }
if (blk_fs_request(rq)) {
if (cmd->nleft == 0)
@@ -679,7 +693,10 @@ out_end:
}
if (uptodate == 0 && rq->bio)
- ide_cd_error_cmd(drive, cmd);
+ if (ide_cd_error_cmd(drive, cmd)) {
+ blk_dump_rq_flags(rq, "ide_cd_error_cmd completes rq");
+ return ide_stopped;
+ }
/* make sure it's fully ended */
if (blk_fs_request(rq) == 0) {
@@ -688,10 +705,13 @@ out_end:
rq->resid_len += cmd->last_xfer_len;
}
+ printk(KERN_EMERG "%s: completing rq %p\n", __func__, rq);
ide_complete_rq(drive, uptodate ? 0 : -EIO, blk_rq_bytes(rq));
- if (sense && rc == 2)
+ if (sense && rc == 2) {
+ printk(KERN_EMERG "%s: request sense failure, rq: %p\n", __func__, rq);
ide_error(drive, "request sense failure", stat);
+ }
}
return ide_stopped;
}
@@ -128,6 +128,9 @@ int ide_complete_rq(ide_drive_t *drive, int error, unsigned int nr_bytes)
rc = ide_end_rq(drive, rq, error, nr_bytes);
if (rc == 0)
hwif->rq = NULL;
+ else
+ blk_dump_rq_flags(rq, "still buffers pending for this rq");
+
return rc;
}