aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide')
-rw-r--r--drivers/ide/ide-tape.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index f43fd070f1b6..cac14b22506f 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -1605,14 +1605,6 @@ out:
1605} 1605}
1606 1606
1607/* Pipeline related functions */ 1607/* Pipeline related functions */
1608static inline int idetape_pipeline_active(idetape_tape_t *tape)
1609{
1610 int rc1, rc2;
1611
1612 rc1 = test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags);
1613 rc2 = (tape->active_data_rq != NULL);
1614 return rc1;
1615}
1616 1608
1617/* 1609/*
1618 * The function below uses __get_free_page to allocate a pipeline stage, along 1610 * The function below uses __get_free_page to allocate a pipeline stage, along
@@ -2058,7 +2050,7 @@ static int __idetape_discard_read_pipeline(ide_drive_t *drive)
2058 2050
2059 spin_lock_irqsave(&tape->lock, flags); 2051 spin_lock_irqsave(&tape->lock, flags);
2060 tape->next_stage = NULL; 2052 tape->next_stage = NULL;
2061 if (idetape_pipeline_active(tape)) 2053 if (test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags))
2062 idetape_wait_for_request(drive, tape->active_data_rq); 2054 idetape_wait_for_request(drive, tape->active_data_rq);
2063 spin_unlock_irqrestore(&tape->lock, flags); 2055 spin_unlock_irqrestore(&tape->lock, flags);
2064 2056
@@ -2131,7 +2123,7 @@ static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks,
2131 2123
2132 debug_log(DBG_SENSE, "%s: cmd=%d\n", __func__, cmd); 2124 debug_log(DBG_SENSE, "%s: cmd=%d\n", __func__, cmd);
2133 2125
2134 if (idetape_pipeline_active(tape)) { 2126 if (test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags)) {
2135 printk(KERN_ERR "ide-tape: bug: the pipeline is active in %s\n", 2127 printk(KERN_ERR "ide-tape: bug: the pipeline is active in %s\n",
2136 __func__); 2128 __func__);
2137 return (0); 2129 return (0);
@@ -2162,8 +2154,7 @@ static void idetape_plug_pipeline(ide_drive_t *drive)
2162 2154
2163 if (tape->next_stage == NULL) 2155 if (tape->next_stage == NULL)
2164 return; 2156 return;
2165 if (!idetape_pipeline_active(tape)) { 2157 if (!test_and_set_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags)) {
2166 set_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags);
2167 idetape_activate_next_stage(drive); 2158 idetape_activate_next_stage(drive);
2168 (void) ide_do_drive_cmd(drive, tape->active_data_rq, ide_end); 2159 (void) ide_do_drive_cmd(drive, tape->active_data_rq, ide_end);
2169 } 2160 }
@@ -2242,13 +2233,14 @@ static int idetape_add_chrdev_write_request(ide_drive_t *drive, int blocks)
2242 /* Attempt to allocate a new stage. Beware possible race conditions. */ 2233 /* Attempt to allocate a new stage. Beware possible race conditions. */
2243 while ((new_stage = idetape_kmalloc_stage(tape)) == NULL) { 2234 while ((new_stage = idetape_kmalloc_stage(tape)) == NULL) {
2244 spin_lock_irqsave(&tape->lock, flags); 2235 spin_lock_irqsave(&tape->lock, flags);
2245 if (idetape_pipeline_active(tape)) { 2236 if (test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags)) {
2246 idetape_wait_for_request(drive, tape->active_data_rq); 2237 idetape_wait_for_request(drive, tape->active_data_rq);
2247 spin_unlock_irqrestore(&tape->lock, flags); 2238 spin_unlock_irqrestore(&tape->lock, flags);
2248 } else { 2239 } else {
2249 spin_unlock_irqrestore(&tape->lock, flags); 2240 spin_unlock_irqrestore(&tape->lock, flags);
2250 idetape_plug_pipeline(drive); 2241 idetape_plug_pipeline(drive);
2251 if (idetape_pipeline_active(tape)) 2242 if (test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE,
2243 &tape->flags))
2252 continue; 2244 continue;
2253 /* 2245 /*
2254 * The machine is short on memory. Fallback to non- 2246 * The machine is short on memory. Fallback to non-
@@ -2277,7 +2269,7 @@ static int idetape_add_chrdev_write_request(ide_drive_t *drive, int blocks)
2277 * starting to service requests, so that we will be able to keep up with 2269 * starting to service requests, so that we will be able to keep up with
2278 * the higher speeds of the tape. 2270 * the higher speeds of the tape.
2279 */ 2271 */
2280 if (!idetape_pipeline_active(tape)) { 2272 if (!test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags)) {
2281 if (tape->nr_stages >= tape->max_stages * 9 / 10 || 2273 if (tape->nr_stages >= tape->max_stages * 9 / 10 ||
2282 tape->nr_stages >= tape->max_stages - 2274 tape->nr_stages >= tape->max_stages -
2283 tape->uncontrolled_pipeline_head_speed * 3 * 1024 / 2275 tape->uncontrolled_pipeline_head_speed * 3 * 1024 /
@@ -2304,10 +2296,11 @@ static void idetape_wait_for_pipeline(ide_drive_t *drive)
2304 idetape_tape_t *tape = drive->driver_data; 2296 idetape_tape_t *tape = drive->driver_data;
2305 unsigned long flags; 2297 unsigned long flags;
2306 2298
2307 while (tape->next_stage || idetape_pipeline_active(tape)) { 2299 while (tape->next_stage || test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE,
2300 &tape->flags)) {
2308 idetape_plug_pipeline(drive); 2301 idetape_plug_pipeline(drive);
2309 spin_lock_irqsave(&tape->lock, flags); 2302 spin_lock_irqsave(&tape->lock, flags);
2310 if (idetape_pipeline_active(tape)) 2303 if (test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags))
2311 idetape_wait_for_request(drive, tape->active_data_rq); 2304 idetape_wait_for_request(drive, tape->active_data_rq);
2312 spin_unlock_irqrestore(&tape->lock, flags); 2305 spin_unlock_irqrestore(&tape->lock, flags);
2313 } 2306 }
@@ -2464,7 +2457,7 @@ static int idetape_init_read(ide_drive_t *drive, int max_stages)
2464 new_stage = idetape_kmalloc_stage(tape); 2457 new_stage = idetape_kmalloc_stage(tape);
2465 } 2458 }
2466 } 2459 }
2467 if (!idetape_pipeline_active(tape)) { 2460 if (!test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags)) {
2468 if (tape->nr_pending_stages >= 3 * max_stages / 4) { 2461 if (tape->nr_pending_stages >= 3 * max_stages / 4) {
2469 tape->measure_insert_time = 1; 2462 tape->measure_insert_time = 1;
2470 tape->insert_time = jiffies; 2463 tape->insert_time = jiffies;