[SCSI] Merge branch 'linus'
Conflicts: drivers/message/fusion/mptsas.c fixed up conflict between req->data_len accessors and mptsas driver updates. Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Esse commit está contido em:
@@ -240,11 +240,11 @@ int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd,
|
||||
* is invalid. Prevent the garbage from being misinterpreted
|
||||
* and prevent security leaks by zeroing out the excess data.
|
||||
*/
|
||||
if (unlikely(req->data_len > 0 && req->data_len <= bufflen))
|
||||
memset(buffer + (bufflen - req->data_len), 0, req->data_len);
|
||||
if (unlikely(req->resid_len > 0 && req->resid_len <= bufflen))
|
||||
memset(buffer + (bufflen - req->resid_len), 0, req->resid_len);
|
||||
|
||||
if (resid)
|
||||
*resid = req->data_len;
|
||||
*resid = req->resid_len;
|
||||
ret = req->errors;
|
||||
out:
|
||||
blk_put_request(req);
|
||||
@@ -546,14 +546,9 @@ static struct scsi_cmnd *scsi_end_request(struct scsi_cmnd *cmd, int error,
|
||||
* to queue the remainder of them.
|
||||
*/
|
||||
if (blk_end_request(req, error, bytes)) {
|
||||
int leftover = (req->hard_nr_sectors << 9);
|
||||
|
||||
if (blk_pc_request(req))
|
||||
leftover = req->data_len;
|
||||
|
||||
/* kill remainder if no retrys */
|
||||
if (error && scsi_noretry_cmd(cmd))
|
||||
blk_end_request(req, error, leftover);
|
||||
blk_end_request_all(req, error);
|
||||
else {
|
||||
if (requeue) {
|
||||
/*
|
||||
@@ -672,34 +667,6 @@ void scsi_release_buffers(struct scsi_cmnd *cmd)
|
||||
}
|
||||
EXPORT_SYMBOL(scsi_release_buffers);
|
||||
|
||||
/*
|
||||
* Bidi commands Must be complete as a whole, both sides at once.
|
||||
* If part of the bytes were written and lld returned
|
||||
* scsi_in()->resid and/or scsi_out()->resid this information will be left
|
||||
* in req->data_len and req->next_rq->data_len. The upper-layer driver can
|
||||
* decide what to do with this information.
|
||||
*/
|
||||
static void scsi_end_bidi_request(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct request *req = cmd->request;
|
||||
unsigned int dlen = req->data_len;
|
||||
unsigned int next_dlen = req->next_rq->data_len;
|
||||
|
||||
req->data_len = scsi_out(cmd)->resid;
|
||||
req->next_rq->data_len = scsi_in(cmd)->resid;
|
||||
|
||||
/* The req and req->next_rq have not been completed */
|
||||
BUG_ON(blk_end_bidi_request(req, 0, dlen, next_dlen));
|
||||
|
||||
scsi_release_buffers(cmd);
|
||||
|
||||
/*
|
||||
* This will goose the queue request function at the end, so we don't
|
||||
* need to worry about launching another command.
|
||||
*/
|
||||
scsi_next_command(cmd);
|
||||
}
|
||||
|
||||
/*
|
||||
* Function: scsi_io_completion()
|
||||
*
|
||||
@@ -739,7 +706,6 @@ static void scsi_end_bidi_request(struct scsi_cmnd *cmd)
|
||||
void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||
{
|
||||
int result = cmd->result;
|
||||
int this_count;
|
||||
struct request_queue *q = cmd->device->request_queue;
|
||||
struct request *req = cmd->request;
|
||||
int error = 0;
|
||||
@@ -773,12 +739,22 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||
if (!sense_deferred)
|
||||
error = -EIO;
|
||||
}
|
||||
|
||||
req->resid_len = scsi_get_resid(cmd);
|
||||
|
||||
if (scsi_bidi_cmnd(cmd)) {
|
||||
/* will also release_buffers */
|
||||
scsi_end_bidi_request(cmd);
|
||||
/*
|
||||
* Bidi commands Must be complete as a whole,
|
||||
* both sides at once.
|
||||
*/
|
||||
req->next_rq->resid_len = scsi_in(cmd)->resid;
|
||||
|
||||
blk_end_request_all(req, 0);
|
||||
|
||||
scsi_release_buffers(cmd);
|
||||
scsi_next_command(cmd);
|
||||
return;
|
||||
}
|
||||
req->data_len = scsi_get_resid(cmd);
|
||||
}
|
||||
|
||||
BUG_ON(blk_bidi_rq(req)); /* bidi not support for !blk_pc_request yet */
|
||||
@@ -787,9 +763,9 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||
* Next deal with any sectors which we were able to correctly
|
||||
* handle.
|
||||
*/
|
||||
SCSI_LOG_HLCOMPLETE(1, printk("%ld sectors total, "
|
||||
SCSI_LOG_HLCOMPLETE(1, printk("%u sectors total, "
|
||||
"%d bytes done.\n",
|
||||
req->nr_sectors, good_bytes));
|
||||
blk_rq_sectors(req), good_bytes));
|
||||
|
||||
/*
|
||||
* Recovered errors need reporting, but they're always treated
|
||||
@@ -812,7 +788,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||
*/
|
||||
if (scsi_end_request(cmd, error, good_bytes, result == 0) == NULL)
|
||||
return;
|
||||
this_count = blk_rq_bytes(req);
|
||||
|
||||
error = -EIO;
|
||||
|
||||
@@ -922,7 +897,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||
if (driver_byte(result) & DRIVER_SENSE)
|
||||
scsi_print_sense("", cmd);
|
||||
}
|
||||
blk_end_request(req, -EIO, blk_rq_bytes(req));
|
||||
blk_end_request_all(req, -EIO);
|
||||
scsi_next_command(cmd);
|
||||
break;
|
||||
case ACTION_REPREP:
|
||||
@@ -965,10 +940,7 @@ static int scsi_init_sgtable(struct request *req, struct scsi_data_buffer *sdb,
|
||||
count = blk_rq_map_sg(req->q, req, sdb->table.sgl);
|
||||
BUG_ON(count > sdb->table.nents);
|
||||
sdb->table.nents = count;
|
||||
if (blk_pc_request(req))
|
||||
sdb->length = req->data_len;
|
||||
else
|
||||
sdb->length = req->nr_sectors << 9;
|
||||
sdb->length = blk_rq_bytes(req);
|
||||
return BLKPREP_OK;
|
||||
}
|
||||
|
||||
@@ -1087,22 +1059,21 @@ int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req)
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
} else {
|
||||
BUG_ON(req->data_len);
|
||||
BUG_ON(req->data);
|
||||
BUG_ON(blk_rq_bytes(req));
|
||||
|
||||
memset(&cmd->sdb, 0, sizeof(cmd->sdb));
|
||||
req->buffer = NULL;
|
||||
}
|
||||
|
||||
cmd->cmd_len = req->cmd_len;
|
||||
if (!req->data_len)
|
||||
if (!blk_rq_bytes(req))
|
||||
cmd->sc_data_direction = DMA_NONE;
|
||||
else if (rq_data_dir(req) == WRITE)
|
||||
cmd->sc_data_direction = DMA_TO_DEVICE;
|
||||
else
|
||||
cmd->sc_data_direction = DMA_FROM_DEVICE;
|
||||
|
||||
cmd->transfersize = req->data_len;
|
||||
cmd->transfersize = blk_rq_bytes(req);
|
||||
cmd->allowed = req->retries;
|
||||
return BLKPREP_OK;
|
||||
}
|
||||
@@ -1212,7 +1183,7 @@ int scsi_prep_return(struct request_queue *q, struct request *req, int ret)
|
||||
break;
|
||||
case BLKPREP_DEFER:
|
||||
/*
|
||||
* If we defer, the elv_next_request() returns NULL, but the
|
||||
* If we defer, the blk_peek_request() returns NULL, but the
|
||||
* queue must be restarted, so we plug here if no returning
|
||||
* command will automatically do that.
|
||||
*/
|
||||
@@ -1388,7 +1359,7 @@ static void scsi_kill_request(struct request *req, struct request_queue *q)
|
||||
struct scsi_target *starget = scsi_target(sdev);
|
||||
struct Scsi_Host *shost = sdev->host;
|
||||
|
||||
blkdev_dequeue_request(req);
|
||||
blk_start_request(req);
|
||||
|
||||
if (unlikely(cmd == NULL)) {
|
||||
printk(KERN_CRIT "impossible request in %s.\n",
|
||||
@@ -1480,7 +1451,7 @@ static void scsi_request_fn(struct request_queue *q)
|
||||
|
||||
if (!sdev) {
|
||||
printk("scsi: killing requests for dead queue\n");
|
||||
while ((req = elv_next_request(q)) != NULL)
|
||||
while ((req = blk_peek_request(q)) != NULL)
|
||||
scsi_kill_request(req, q);
|
||||
return;
|
||||
}
|
||||
@@ -1501,7 +1472,7 @@ static void scsi_request_fn(struct request_queue *q)
|
||||
* that the request is fully prepared even if we cannot
|
||||
* accept it.
|
||||
*/
|
||||
req = elv_next_request(q);
|
||||
req = blk_peek_request(q);
|
||||
if (!req || !scsi_dev_queue_ready(q, sdev))
|
||||
break;
|
||||
|
||||
@@ -1517,7 +1488,7 @@ static void scsi_request_fn(struct request_queue *q)
|
||||
* Remove the request from the request list.
|
||||
*/
|
||||
if (!(blk_queue_tagged(q) && !blk_queue_start_tag(q, req)))
|
||||
blkdev_dequeue_request(req);
|
||||
blk_start_request(req);
|
||||
sdev->device_busy++;
|
||||
|
||||
spin_unlock(q->queue_lock);
|
||||
|
Referência em uma nova issue
Block a user