diff options
| -rw-r--r-- | drivers/ide/ide-tape.c | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 8b6af1e0ed2d..73f06c859301 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
| @@ -184,11 +184,13 @@ enum { | |||
| 184 | /* | 184 | /* |
| 185 | * For general magnetic tape device compatibility. | 185 | * For general magnetic tape device compatibility. |
| 186 | */ | 186 | */ |
| 187 | typedef enum { | 187 | |
| 188 | idetape_direction_none, | 188 | /* tape directions */ |
| 189 | idetape_direction_read, | 189 | enum { |
| 190 | idetape_direction_write | 190 | IDETAPE_DIR_NONE = (1 << 0), |
| 191 | } idetape_chrdev_direction_t; | 191 | IDETAPE_DIR_READ = (1 << 1), |
| 192 | IDETAPE_DIR_WRITE = (1 << 2), | ||
| 193 | }; | ||
| 192 | 194 | ||
| 193 | struct idetape_bh { | 195 | struct idetape_bh { |
| 194 | u32 b_size; | 196 | u32 b_size; |
| @@ -324,7 +326,7 @@ typedef struct ide_tape_obj { | |||
| 324 | /* device name */ | 326 | /* device name */ |
| 325 | char name[4]; | 327 | char name[4]; |
| 326 | /* Current character device data transfer direction */ | 328 | /* Current character device data transfer direction */ |
| 327 | idetape_chrdev_direction_t chrdev_direction; | 329 | u8 chrdev_dir; |
| 328 | 330 | ||
| 329 | /* | 331 | /* |
| 330 | * Device information | 332 | * Device information |
| @@ -1916,7 +1918,7 @@ static void idetape_init_merge_stage (idetape_tape_t *tape) | |||
| 1916 | struct idetape_bh *bh = tape->merge_stage->bh; | 1918 | struct idetape_bh *bh = tape->merge_stage->bh; |
| 1917 | 1919 | ||
| 1918 | tape->bh = bh; | 1920 | tape->bh = bh; |
| 1919 | if (tape->chrdev_direction == idetape_direction_write) | 1921 | if (tape->chrdev_dir == IDETAPE_DIR_WRITE) |
| 1920 | atomic_set(&bh->b_count, 0); | 1922 | atomic_set(&bh->b_count, 0); |
| 1921 | else { | 1923 | else { |
| 1922 | tape->b_data = bh->b_data; | 1924 | tape->b_data = bh->b_data; |
| @@ -2186,7 +2188,7 @@ static int __idetape_discard_read_pipeline (ide_drive_t *drive) | |||
| 2186 | unsigned long flags; | 2188 | unsigned long flags; |
| 2187 | int cnt; | 2189 | int cnt; |
| 2188 | 2190 | ||
| 2189 | if (tape->chrdev_direction != idetape_direction_read) | 2191 | if (tape->chrdev_dir != IDETAPE_DIR_READ) |
| 2190 | return 0; | 2192 | return 0; |
| 2191 | 2193 | ||
| 2192 | /* Remove merge stage. */ | 2194 | /* Remove merge stage. */ |
| @@ -2201,7 +2203,7 @@ static int __idetape_discard_read_pipeline (ide_drive_t *drive) | |||
| 2201 | 2203 | ||
| 2202 | /* Clear pipeline flags. */ | 2204 | /* Clear pipeline flags. */ |
| 2203 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); | 2205 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); |
| 2204 | tape->chrdev_direction = idetape_direction_none; | 2206 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
| 2205 | 2207 | ||
| 2206 | /* Remove pipeline stages. */ | 2208 | /* Remove pipeline stages. */ |
| 2207 | if (tape->first_stage == NULL) | 2209 | if (tape->first_stage == NULL) |
| @@ -2241,7 +2243,7 @@ static int idetape_position_tape (ide_drive_t *drive, unsigned int block, u8 par | |||
| 2241 | int retval; | 2243 | int retval; |
| 2242 | idetape_pc_t pc; | 2244 | idetape_pc_t pc; |
| 2243 | 2245 | ||
| 2244 | if (tape->chrdev_direction == idetape_direction_read) | 2246 | if (tape->chrdev_dir == IDETAPE_DIR_READ) |
| 2245 | __idetape_discard_read_pipeline(drive); | 2247 | __idetape_discard_read_pipeline(drive); |
| 2246 | idetape_wait_ready(drive, 60 * 5 * HZ); | 2248 | idetape_wait_ready(drive, 60 * 5 * HZ); |
| 2247 | idetape_create_locate_cmd(drive, &pc, block, partition, skip); | 2249 | idetape_create_locate_cmd(drive, &pc, block, partition, skip); |
| @@ -2468,7 +2470,7 @@ static void idetape_empty_write_pipeline (ide_drive_t *drive) | |||
| 2468 | int blocks, min; | 2470 | int blocks, min; |
| 2469 | struct idetape_bh *bh; | 2471 | struct idetape_bh *bh; |
| 2470 | 2472 | ||
| 2471 | if (tape->chrdev_direction != idetape_direction_write) { | 2473 | if (tape->chrdev_dir != IDETAPE_DIR_WRITE) { |
| 2472 | printk(KERN_ERR "ide-tape: bug: Trying to empty write pipeline, but we are not writing.\n"); | 2474 | printk(KERN_ERR "ide-tape: bug: Trying to empty write pipeline, but we are not writing.\n"); |
| 2473 | return; | 2475 | return; |
| 2474 | } | 2476 | } |
| @@ -2511,7 +2513,7 @@ static void idetape_empty_write_pipeline (ide_drive_t *drive) | |||
| 2511 | tape->merge_stage = NULL; | 2513 | tape->merge_stage = NULL; |
| 2512 | } | 2514 | } |
| 2513 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); | 2515 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); |
| 2514 | tape->chrdev_direction = idetape_direction_none; | 2516 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
| 2515 | 2517 | ||
| 2516 | /* | 2518 | /* |
| 2517 | * On the next backup, perform the feedback loop again. | 2519 | * On the next backup, perform the feedback loop again. |
| @@ -2555,8 +2557,8 @@ static int idetape_initiate_read (ide_drive_t *drive, int max_stages) | |||
| 2555 | u16 blocks = *(u16 *)&tape->caps[12]; | 2557 | u16 blocks = *(u16 *)&tape->caps[12]; |
| 2556 | 2558 | ||
| 2557 | /* Initialize read operation */ | 2559 | /* Initialize read operation */ |
| 2558 | if (tape->chrdev_direction != idetape_direction_read) { | 2560 | if (tape->chrdev_dir != IDETAPE_DIR_READ) { |
| 2559 | if (tape->chrdev_direction == idetape_direction_write) { | 2561 | if (tape->chrdev_dir == IDETAPE_DIR_WRITE) { |
| 2560 | idetape_empty_write_pipeline(drive); | 2562 | idetape_empty_write_pipeline(drive); |
| 2561 | idetape_flush_tape_buffers(drive); | 2563 | idetape_flush_tape_buffers(drive); |
| 2562 | } | 2564 | } |
| @@ -2566,7 +2568,7 @@ static int idetape_initiate_read (ide_drive_t *drive, int max_stages) | |||
| 2566 | } | 2568 | } |
| 2567 | if ((tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0)) == NULL) | 2569 | if ((tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0)) == NULL) |
| 2568 | return -ENOMEM; | 2570 | return -ENOMEM; |
| 2569 | tape->chrdev_direction = idetape_direction_read; | 2571 | tape->chrdev_dir = IDETAPE_DIR_READ; |
| 2570 | 2572 | ||
| 2571 | /* | 2573 | /* |
| 2572 | * Issue a read 0 command to ensure that DSC handshake | 2574 | * Issue a read 0 command to ensure that DSC handshake |
| @@ -2580,7 +2582,7 @@ static int idetape_initiate_read (ide_drive_t *drive, int max_stages) | |||
| 2580 | if (bytes_read < 0) { | 2582 | if (bytes_read < 0) { |
| 2581 | __idetape_kfree_stage(tape->merge_stage); | 2583 | __idetape_kfree_stage(tape->merge_stage); |
| 2582 | tape->merge_stage = NULL; | 2584 | tape->merge_stage = NULL; |
| 2583 | tape->chrdev_direction = idetape_direction_none; | 2585 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
| 2584 | return bytes_read; | 2586 | return bytes_read; |
| 2585 | } | 2587 | } |
| 2586 | } | 2588 | } |
| @@ -2801,7 +2803,7 @@ static int idetape_space_over_filemarks (ide_drive_t *drive,short mt_op,int mt_c | |||
| 2801 | mt_count = - mt_count; | 2803 | mt_count = - mt_count; |
| 2802 | } | 2804 | } |
| 2803 | 2805 | ||
| 2804 | if (tape->chrdev_direction == idetape_direction_read) { | 2806 | if (tape->chrdev_dir == IDETAPE_DIR_READ) { |
| 2805 | /* | 2807 | /* |
| 2806 | * We have a read-ahead buffer. Scan it for crossed | 2808 | * We have a read-ahead buffer. Scan it for crossed |
| 2807 | * filemarks. | 2809 | * filemarks. |
| @@ -2891,7 +2893,7 @@ static ssize_t idetape_chrdev_read (struct file *file, char __user *buf, | |||
| 2891 | 2893 | ||
| 2892 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); | 2894 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); |
| 2893 | 2895 | ||
| 2894 | if (tape->chrdev_direction != idetape_direction_read) { | 2896 | if (tape->chrdev_dir != IDETAPE_DIR_READ) { |
| 2895 | if (test_bit(IDETAPE_DETECT_BS, &tape->flags)) | 2897 | if (test_bit(IDETAPE_DETECT_BS, &tape->flags)) |
| 2896 | if (count > tape->tape_block_size && | 2898 | if (count > tape->tape_block_size && |
| 2897 | (count % tape->tape_block_size) == 0) | 2899 | (count % tape->tape_block_size) == 0) |
| @@ -2956,8 +2958,8 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf, | |||
| 2956 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); | 2958 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); |
| 2957 | 2959 | ||
| 2958 | /* Initialize write operation */ | 2960 | /* Initialize write operation */ |
| 2959 | if (tape->chrdev_direction != idetape_direction_write) { | 2961 | if (tape->chrdev_dir != IDETAPE_DIR_WRITE) { |
| 2960 | if (tape->chrdev_direction == idetape_direction_read) | 2962 | if (tape->chrdev_dir == IDETAPE_DIR_READ) |
| 2961 | idetape_discard_read_pipeline(drive, 1); | 2963 | idetape_discard_read_pipeline(drive, 1); |
| 2962 | if (tape->merge_stage || tape->merge_stage_size) { | 2964 | if (tape->merge_stage || tape->merge_stage_size) { |
| 2963 | printk(KERN_ERR "ide-tape: merge_stage_size " | 2965 | printk(KERN_ERR "ide-tape: merge_stage_size " |
| @@ -2966,7 +2968,7 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf, | |||
| 2966 | } | 2968 | } |
| 2967 | if ((tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0)) == NULL) | 2969 | if ((tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0)) == NULL) |
| 2968 | return -ENOMEM; | 2970 | return -ENOMEM; |
| 2969 | tape->chrdev_direction = idetape_direction_write; | 2971 | tape->chrdev_dir = IDETAPE_DIR_WRITE; |
| 2970 | idetape_init_merge_stage(tape); | 2972 | idetape_init_merge_stage(tape); |
| 2971 | 2973 | ||
| 2972 | /* | 2974 | /* |
| @@ -2981,7 +2983,7 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf, | |||
| 2981 | if (retval < 0) { | 2983 | if (retval < 0) { |
| 2982 | __idetape_kfree_stage(tape->merge_stage); | 2984 | __idetape_kfree_stage(tape->merge_stage); |
| 2983 | tape->merge_stage = NULL; | 2985 | tape->merge_stage = NULL; |
| 2984 | tape->chrdev_direction = idetape_direction_none; | 2986 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
| 2985 | return retval; | 2987 | return retval; |
| 2986 | } | 2988 | } |
| 2987 | } | 2989 | } |
| @@ -3187,7 +3189,7 @@ static int idetape_chrdev_ioctl(struct inode *inode, struct file *file, | |||
| 3187 | debug_log(DBG_CHRDEV, "Enter %s, cmd=%u\n", __func__, cmd); | 3189 | debug_log(DBG_CHRDEV, "Enter %s, cmd=%u\n", __func__, cmd); |
| 3188 | 3190 | ||
| 3189 | tape->restart_speed_control_req = 1; | 3191 | tape->restart_speed_control_req = 1; |
| 3190 | if (tape->chrdev_direction == idetape_direction_write) { | 3192 | if (tape->chrdev_dir == IDETAPE_DIR_WRITE) { |
| 3191 | idetape_empty_write_pipeline(drive); | 3193 | idetape_empty_write_pipeline(drive); |
| 3192 | idetape_flush_tape_buffers(drive); | 3194 | idetape_flush_tape_buffers(drive); |
| 3193 | } | 3195 | } |
| @@ -3218,7 +3220,7 @@ static int idetape_chrdev_ioctl(struct inode *inode, struct file *file, | |||
| 3218 | return -EFAULT; | 3220 | return -EFAULT; |
| 3219 | return 0; | 3221 | return 0; |
| 3220 | default: | 3222 | default: |
| 3221 | if (tape->chrdev_direction == idetape_direction_read) | 3223 | if (tape->chrdev_dir == IDETAPE_DIR_READ) |
| 3222 | idetape_discard_read_pipeline(drive, 1); | 3224 | idetape_discard_read_pipeline(drive, 1); |
| 3223 | return idetape_blkdev_ioctl(drive, cmd, arg); | 3225 | return idetape_blkdev_ioctl(drive, cmd, arg); |
| 3224 | } | 3226 | } |
| @@ -3296,7 +3298,7 @@ static int idetape_chrdev_open (struct inode *inode, struct file *filp) | |||
| 3296 | if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags)) | 3298 | if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags)) |
| 3297 | (void)idetape_rewind_tape(drive); | 3299 | (void)idetape_rewind_tape(drive); |
| 3298 | 3300 | ||
| 3299 | if (tape->chrdev_direction != idetape_direction_read) | 3301 | if (tape->chrdev_dir != IDETAPE_DIR_READ) |
| 3300 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); | 3302 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); |
| 3301 | 3303 | ||
| 3302 | /* Read block size and write protect status from drive. */ | 3304 | /* Read block size and write protect status from drive. */ |
| @@ -3321,7 +3323,7 @@ static int idetape_chrdev_open (struct inode *inode, struct file *filp) | |||
| 3321 | /* | 3323 | /* |
| 3322 | * Lock the tape drive door so user can't eject. | 3324 | * Lock the tape drive door so user can't eject. |
| 3323 | */ | 3325 | */ |
| 3324 | if (tape->chrdev_direction == idetape_direction_none) { | 3326 | if (tape->chrdev_dir == IDETAPE_DIR_NONE) { |
| 3325 | if (idetape_create_prevent_cmd(drive, &pc, 1)) { | 3327 | if (idetape_create_prevent_cmd(drive, &pc, 1)) { |
| 3326 | if (!idetape_queue_pc_tail(drive, &pc)) { | 3328 | if (!idetape_queue_pc_tail(drive, &pc)) { |
| 3327 | if (tape->door_locked != DOOR_EXPLICITLY_LOCKED) | 3329 | if (tape->door_locked != DOOR_EXPLICITLY_LOCKED) |
| @@ -3369,9 +3371,9 @@ static int idetape_chrdev_release (struct inode *inode, struct file *filp) | |||
| 3369 | 3371 | ||
| 3370 | debug_log(DBG_CHRDEV, "Enter %s\n", __func__); | 3372 | debug_log(DBG_CHRDEV, "Enter %s\n", __func__); |
| 3371 | 3373 | ||
| 3372 | if (tape->chrdev_direction == idetape_direction_write) | 3374 | if (tape->chrdev_dir == IDETAPE_DIR_WRITE) |
| 3373 | idetape_write_release(drive, minor); | 3375 | idetape_write_release(drive, minor); |
| 3374 | if (tape->chrdev_direction == idetape_direction_read) { | 3376 | if (tape->chrdev_dir == IDETAPE_DIR_READ) { |
| 3375 | if (minor < 128) | 3377 | if (minor < 128) |
| 3376 | idetape_discard_read_pipeline(drive, 1); | 3378 | idetape_discard_read_pipeline(drive, 1); |
| 3377 | else | 3379 | else |
| @@ -3383,7 +3385,7 @@ static int idetape_chrdev_release (struct inode *inode, struct file *filp) | |||
| 3383 | } | 3385 | } |
| 3384 | if (minor < 128 && test_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags)) | 3386 | if (minor < 128 && test_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags)) |
| 3385 | (void) idetape_rewind_tape(drive); | 3387 | (void) idetape_rewind_tape(drive); |
| 3386 | if (tape->chrdev_direction == idetape_direction_none) { | 3388 | if (tape->chrdev_dir == IDETAPE_DIR_NONE) { |
| 3387 | if (tape->door_locked == DOOR_LOCKED) { | 3389 | if (tape->door_locked == DOOR_LOCKED) { |
| 3388 | if (idetape_create_prevent_cmd(drive, &pc, 0)) { | 3390 | if (idetape_create_prevent_cmd(drive, &pc, 0)) { |
| 3389 | if (!idetape_queue_pc_tail(drive, &pc)) | 3391 | if (!idetape_queue_pc_tail(drive, &pc)) |
| @@ -3577,7 +3579,7 @@ static void idetape_setup (ide_drive_t *drive, idetape_tape_t *tape, int minor) | |||
| 3577 | tape->name[0] = 'h'; | 3579 | tape->name[0] = 'h'; |
| 3578 | tape->name[1] = 't'; | 3580 | tape->name[1] = 't'; |
| 3579 | tape->name[2] = '0' + minor; | 3581 | tape->name[2] = '0' + minor; |
| 3580 | tape->chrdev_direction = idetape_direction_none; | 3582 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
| 3581 | tape->pc = tape->pc_stack; | 3583 | tape->pc = tape->pc_stack; |
| 3582 | tape->max_insert_speed = 10000; | 3584 | tape->max_insert_speed = 10000; |
| 3583 | tape->speed_control = 1; | 3585 | tape->speed_control = 1; |
