mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
ide-tape: remove pipeline-specific code in idetape_space_over_filemarks()
Since we don't do pipeline read-ahead anymore, we don't have to look for filemarks we have crossed. Therefore, remove the code chunk that does that and pass on the command to the tape. As a side effect, remove unused idetape_wait_first_stage(). Signed-off-by: Borislav Petkov <petkovbb@gmail.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
parent
8646c88f15
commit
7f5e72f471
@ -2051,19 +2051,6 @@ static void idetape_create_space_cmd(struct ide_atapi_pc *pc, int count, u8 cmd)
|
||||
pc->idetape_callback = &idetape_pc_callback;
|
||||
}
|
||||
|
||||
static void idetape_wait_first_stage(ide_drive_t *drive)
|
||||
{
|
||||
idetape_tape_t *tape = drive->driver_data;
|
||||
unsigned long flags;
|
||||
|
||||
if (tape->first_stage == NULL)
|
||||
return;
|
||||
spin_lock_irqsave(&tape->lock, flags);
|
||||
if (tape->active_stage == tape->first_stage)
|
||||
idetape_wait_for_request(drive, tape->active_data_rq);
|
||||
spin_unlock_irqrestore(&tape->lock, flags);
|
||||
}
|
||||
|
||||
/* Queue up a character device originated write request. */
|
||||
static int idetape_add_chrdev_write_request(ide_drive_t *drive, int blocks)
|
||||
{
|
||||
@ -2363,19 +2350,11 @@ static int idetape_blkdev_ioctl(ide_drive_t *drive, unsigned int cmd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The function below is now a bit more complicated than just passing the
|
||||
* command to the tape since we may have crossed some filemarks during our
|
||||
* pipelined read-ahead mode. As a minor side effect, the pipeline enables us to
|
||||
* support MTFSFM when the filemark is in our internal pipeline even if the tape
|
||||
* doesn't support spacing over filemarks in the reverse direction.
|
||||
*/
|
||||
static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op,
|
||||
int mt_count)
|
||||
{
|
||||
idetape_tape_t *tape = drive->driver_data;
|
||||
struct ide_atapi_pc pc;
|
||||
unsigned long flags;
|
||||
int retval, count = 0;
|
||||
int sprev = !!(tape->caps[4] & 0x20);
|
||||
|
||||
@ -2388,41 +2367,9 @@ static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op,
|
||||
}
|
||||
|
||||
if (tape->chrdev_dir == IDETAPE_DIR_READ) {
|
||||
/* its a read-ahead buffer, scan it for crossed filemarks. */
|
||||
tape->merge_stage_size = 0;
|
||||
if (test_and_clear_bit(IDETAPE_FLAG_FILEMARK, &tape->flags))
|
||||
++count;
|
||||
while (tape->first_stage != NULL) {
|
||||
if (count == mt_count) {
|
||||
if (mt_op == MTFSFM)
|
||||
set_bit(IDETAPE_FLAG_FILEMARK,
|
||||
&tape->flags);
|
||||
return 0;
|
||||
}
|
||||
spin_lock_irqsave(&tape->lock, flags);
|
||||
if (tape->first_stage == tape->active_stage) {
|
||||
/*
|
||||
* We have reached the active stage in the read
|
||||
* pipeline. There is no point in allowing the
|
||||
* drive to continue reading any farther, so we
|
||||
* stop the pipeline.
|
||||
*
|
||||
* This section should be moved to a separate
|
||||
* subroutine because similar operations are
|
||||
* done in __idetape_discard_read_pipeline(),
|
||||
* for example.
|
||||
*/
|
||||
tape->next_stage = NULL;
|
||||
spin_unlock_irqrestore(&tape->lock, flags);
|
||||
idetape_wait_first_stage(drive);
|
||||
tape->next_stage = tape->first_stage->next;
|
||||
} else
|
||||
spin_unlock_irqrestore(&tape->lock, flags);
|
||||
if (tape->first_stage->rq.errors ==
|
||||
IDETAPE_ERROR_FILEMARK)
|
||||
++count;
|
||||
idetape_remove_stage_head(drive);
|
||||
}
|
||||
idetape_discard_read_pipeline(drive, 0);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user