|
@@ -2743,6 +2743,13 @@ static int stop_queued_cmnd(struct scsi_cmnd *cmnd)
|
|
if (test_bit(k, queued_in_use_bm)) {
|
|
if (test_bit(k, queued_in_use_bm)) {
|
|
sqcp = &queued_arr[k];
|
|
sqcp = &queued_arr[k];
|
|
if (cmnd == sqcp->a_cmnd) {
|
|
if (cmnd == sqcp->a_cmnd) {
|
|
|
|
+ devip = (struct sdebug_dev_info *)
|
|
|
|
+ cmnd->device->hostdata;
|
|
|
|
+ if (devip)
|
|
|
|
+ atomic_dec(&devip->num_in_q);
|
|
|
|
+ sqcp->a_cmnd = NULL;
|
|
|
|
+ spin_unlock_irqrestore(&queued_arr_lock,
|
|
|
|
+ iflags);
|
|
if (scsi_debug_ndelay > 0) {
|
|
if (scsi_debug_ndelay > 0) {
|
|
if (sqcp->sd_hrtp)
|
|
if (sqcp->sd_hrtp)
|
|
hrtimer_cancel(
|
|
hrtimer_cancel(
|
|
@@ -2755,18 +2762,13 @@ static int stop_queued_cmnd(struct scsi_cmnd *cmnd)
|
|
if (sqcp->tletp)
|
|
if (sqcp->tletp)
|
|
tasklet_kill(sqcp->tletp);
|
|
tasklet_kill(sqcp->tletp);
|
|
}
|
|
}
|
|
- __clear_bit(k, queued_in_use_bm);
|
|
|
|
- devip = (struct sdebug_dev_info *)
|
|
|
|
- cmnd->device->hostdata;
|
|
|
|
- if (devip)
|
|
|
|
- atomic_dec(&devip->num_in_q);
|
|
|
|
- sqcp->a_cmnd = NULL;
|
|
|
|
- break;
|
|
|
|
|
|
+ clear_bit(k, queued_in_use_bm);
|
|
|
|
+ return 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
spin_unlock_irqrestore(&queued_arr_lock, iflags);
|
|
spin_unlock_irqrestore(&queued_arr_lock, iflags);
|
|
- return (k < qmax) ? 1 : 0;
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/* Deletes (stops) timers or tasklets of all queued commands */
|
|
/* Deletes (stops) timers or tasklets of all queued commands */
|
|
@@ -2782,6 +2784,13 @@ static void stop_all_queued(void)
|
|
if (test_bit(k, queued_in_use_bm)) {
|
|
if (test_bit(k, queued_in_use_bm)) {
|
|
sqcp = &queued_arr[k];
|
|
sqcp = &queued_arr[k];
|
|
if (sqcp->a_cmnd) {
|
|
if (sqcp->a_cmnd) {
|
|
|
|
+ devip = (struct sdebug_dev_info *)
|
|
|
|
+ sqcp->a_cmnd->device->hostdata;
|
|
|
|
+ if (devip)
|
|
|
|
+ atomic_dec(&devip->num_in_q);
|
|
|
|
+ sqcp->a_cmnd = NULL;
|
|
|
|
+ spin_unlock_irqrestore(&queued_arr_lock,
|
|
|
|
+ iflags);
|
|
if (scsi_debug_ndelay > 0) {
|
|
if (scsi_debug_ndelay > 0) {
|
|
if (sqcp->sd_hrtp)
|
|
if (sqcp->sd_hrtp)
|
|
hrtimer_cancel(
|
|
hrtimer_cancel(
|
|
@@ -2794,12 +2803,8 @@ static void stop_all_queued(void)
|
|
if (sqcp->tletp)
|
|
if (sqcp->tletp)
|
|
tasklet_kill(sqcp->tletp);
|
|
tasklet_kill(sqcp->tletp);
|
|
}
|
|
}
|
|
- __clear_bit(k, queued_in_use_bm);
|
|
|
|
- devip = (struct sdebug_dev_info *)
|
|
|
|
- sqcp->a_cmnd->device->hostdata;
|
|
|
|
- if (devip)
|
|
|
|
- atomic_dec(&devip->num_in_q);
|
|
|
|
- sqcp->a_cmnd = NULL;
|
|
|
|
|
|
+ clear_bit(k, queued_in_use_bm);
|
|
|
|
+ spin_lock_irqsave(&queued_arr_lock, iflags);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|