1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20static const char *verstr = "20080221";
21
22#include <linux/module.h>
23
24#include <linux/fs.h>
25#include <linux/kernel.h>
26#include <linux/sched.h>
27#include <linux/mm.h>
28#include <linux/init.h>
29#include <linux/string.h>
30#include <linux/errno.h>
31#include <linux/mtio.h>
32#include <linux/cdrom.h>
33#include <linux/ioctl.h>
34#include <linux/fcntl.h>
35#include <linux/spinlock.h>
36#include <linux/blkdev.h>
37#include <linux/moduleparam.h>
38#include <linux/cdev.h>
39#include <linux/delay.h>
40#include <linux/mutex.h>
41
42#include <asm/uaccess.h>
43#include <asm/dma.h>
44#include <asm/system.h>
45
46#include <scsi/scsi.h>
47#include <scsi/scsi_dbg.h>
48#include <scsi/scsi_device.h>
49#include <scsi/scsi_driver.h>
50#include <scsi/scsi_eh.h>
51#include <scsi/scsi_host.h>
52#include <scsi/scsi_ioctl.h>
53#include <scsi/sg.h>
54
55
56
57
58#define DEBUG 0
59
60#if DEBUG
61
62
63
64#define ST_DEB_MSG KERN_NOTICE
65#define DEB(a) a
66#define DEBC(a) if (debugging) { a ; }
67#else
68#define DEB(a)
69#define DEBC(a)
70#endif
71
72#define ST_KILOBYTE 1024
73
74#include "st_options.h"
75#include "st.h"
76
77static int buffer_kbs;
78static int max_sg_segs;
79static int try_direct_io = TRY_DIRECT_IO;
80static int try_rdio = 1;
81static int try_wdio = 1;
82
83static int st_dev_max;
84static int st_nr_dev;
85
86static struct class *st_sysfs_class;
87
88MODULE_AUTHOR("Kai Makisara");
89MODULE_DESCRIPTION("SCSI tape (st) driver");
90MODULE_LICENSE("GPL");
91MODULE_ALIAS_CHARDEV_MAJOR(SCSI_TAPE_MAJOR);
92MODULE_ALIAS_SCSI_DEVICE(TYPE_TAPE);
93
94
95
96
97
98module_param_named(buffer_kbs, buffer_kbs, int, 0);
99MODULE_PARM_DESC(buffer_kbs, "Default driver buffer size for fixed block mode (KB; 32)");
100module_param_named(max_sg_segs, max_sg_segs, int, 0);
101MODULE_PARM_DESC(max_sg_segs, "Maximum number of scatter/gather segments to use (256)");
102module_param_named(try_direct_io, try_direct_io, int, 0);
103MODULE_PARM_DESC(try_direct_io, "Try direct I/O between user buffer and tape drive (1)");
104
105
106module_param_named(try_rdio, try_rdio, int, 0);
107MODULE_PARM_DESC(try_rdio, "Try direct read i/o when possible");
108module_param_named(try_wdio, try_wdio, int, 0);
109MODULE_PARM_DESC(try_wdio, "Try direct write i/o when possible");
110
111#ifndef MODULE
112static int write_threshold_kbs;
113static struct st_dev_parm {
114 char *name;
115 int *val;
116} parms[] __initdata = {
117 {
118 "buffer_kbs", &buffer_kbs
119 },
120 {
121 "write_threshold_kbs", &write_threshold_kbs
122 },
123 {
124 "max_sg_segs", NULL
125 },
126 {
127 "try_direct_io", &try_direct_io
128 }
129};
130#endif
131
132
133#if ST_NBR_MODES > 16
134#error "Maximum number of modes is 16"
135#endif
136
137
138static const char *st_formats[] = {
139 "", "r", "k", "s", "l", "t", "o", "u",
140 "m", "v", "p", "x", "a", "y", "q", "z"};
141
142
143
144#define ST_FIXED_BUFFER_SIZE (ST_FIXED_BUFFER_BLOCKS * ST_KILOBYTE)
145
146
147
148#if ST_FIXED_BUFFER_SIZE >= (2 << 24 - 1)
149#error "Buffer size should not exceed (2 << 24 - 1) bytes!"
150#endif
151
152static int debugging = DEBUG;
153
154#define MAX_RETRIES 0
155#define MAX_WRITE_RETRIES 0
156#define MAX_READY_RETRIES 0
157#define NO_TAPE NOT_READY
158
159#define ST_TIMEOUT (900 * HZ)
160#define ST_LONG_TIMEOUT (14000 * HZ)
161
162
163#define TAPE_NR(x) ( ((iminor(x) & ~255) >> (ST_NBR_MODE_BITS + 1)) | \
164 (iminor(x) & ~(-1 << ST_MODE_SHIFT)) )
165#define TAPE_MODE(x) ((iminor(x) & ST_MODE_MASK) >> ST_MODE_SHIFT)
166
167
168#define TAPE_MINOR(d, m, n) (((d & ~(255 >> (ST_NBR_MODE_BITS + 1))) << (ST_NBR_MODE_BITS + 1)) | \
169 (d & (255 >> (ST_NBR_MODE_BITS + 1))) | (m << ST_MODE_SHIFT) | ((n != 0) << 7) )
170
171
172
173#define SET_DENS_AND_BLK 0x10001
174
175static DEFINE_RWLOCK(st_dev_arr_lock);
176
177static int st_fixed_buffer_size = ST_FIXED_BUFFER_SIZE;
178static int st_max_sg_segs = ST_MAX_SG;
179
180static struct scsi_tape **scsi_tapes = NULL;
181
182static int modes_defined;
183
184static struct st_buffer *new_tape_buffer(int, int, int);
185static int enlarge_buffer(struct st_buffer *, int, int);
186static void normalize_buffer(struct st_buffer *);
187static int append_to_buffer(const char __user *, struct st_buffer *, int);
188static int from_buffer(struct st_buffer *, char __user *, int);
189static void move_buffer_data(struct st_buffer *, int);
190static void buf_to_sg(struct st_buffer *, unsigned int);
191
192static int sgl_map_user_pages(struct scatterlist *, const unsigned int,
193 unsigned long, size_t, int);
194static int sgl_unmap_user_pages(struct scatterlist *, const unsigned int, int);
195
196static int st_probe(struct device *);
197static int st_remove(struct device *);
198
199static int do_create_sysfs_files(void);
200static void do_remove_sysfs_files(void);
201static int do_create_class_files(struct scsi_tape *, int, int);
202
203static struct scsi_driver st_template = {
204 .owner = THIS_MODULE,
205 .gendrv = {
206 .name = "st",
207 .probe = st_probe,
208 .remove = st_remove,
209 },
210};
211
212static int st_compression(struct scsi_tape *, int);
213
214static int find_partition(struct scsi_tape *);
215static int switch_partition(struct scsi_tape *);
216
217static int st_int_ioctl(struct scsi_tape *, unsigned int, unsigned long);
218
219static void scsi_tape_release(struct kref *);
220
221#define to_scsi_tape(obj) container_of(obj, struct scsi_tape, kref)
222
223static DEFINE_MUTEX(st_ref_mutex);
224
225
226#include "osst_detect.h"
227#ifndef SIGS_FROM_OSST
228#define SIGS_FROM_OSST \
229 {"OnStream", "SC-", "", "osst"}, \
230 {"OnStream", "DI-", "", "osst"}, \
231 {"OnStream", "DP-", "", "osst"}, \
232 {"OnStream", "USB", "", "osst"}, \
233 {"OnStream", "FW-", "", "osst"}
234#endif
235
236static struct scsi_tape *scsi_tape_get(int dev)
237{
238 struct scsi_tape *STp = NULL;
239
240 mutex_lock(&st_ref_mutex);
241 write_lock(&st_dev_arr_lock);
242
243 if (dev < st_dev_max && scsi_tapes != NULL)
244 STp = scsi_tapes[dev];
245 if (!STp) goto out;
246
247 kref_get(&STp->kref);
248
249 if (!STp->device)
250 goto out_put;
251
252 if (scsi_device_get(STp->device))
253 goto out_put;
254
255 goto out;
256
257out_put:
258 kref_put(&STp->kref, scsi_tape_release);
259 STp = NULL;
260out:
261 write_unlock(&st_dev_arr_lock);
262 mutex_unlock(&st_ref_mutex);
263 return STp;
264}
265
266static void scsi_tape_put(struct scsi_tape *STp)
267{
268 struct scsi_device *sdev = STp->device;
269
270 mutex_lock(&st_ref_mutex);
271 kref_put(&STp->kref, scsi_tape_release);
272 scsi_device_put(sdev);
273 mutex_unlock(&st_ref_mutex);
274}
275
276struct st_reject_data {
277 char *vendor;
278 char *model;
279 char *rev;
280 char *driver_hint;
281};
282
283static struct st_reject_data reject_list[] = {
284
285 SIGS_FROM_OSST,
286 {NULL, }};
287
288
289
290static char * st_incompatible(struct scsi_device* SDp)
291{
292 struct st_reject_data *rp;
293
294 for (rp=&(reject_list[0]); rp->vendor != NULL; rp++)
295 if (!strncmp(rp->vendor, SDp->vendor, strlen(rp->vendor)) &&
296 !strncmp(rp->model, SDp->model, strlen(rp->model)) &&
297 !strncmp(rp->rev, SDp->rev, strlen(rp->rev))) {
298 if (rp->driver_hint)
299 return rp->driver_hint;
300 else
301 return "unknown";
302 }
303 return NULL;
304}
305
306
307static inline char *tape_name(struct scsi_tape *tape)
308{
309 return tape->disk->disk_name;
310}
311
312
313static void st_analyze_sense(struct st_request *SRpnt, struct st_cmdstatus *s)
314{
315 const u8 *ucp;
316 const u8 *sense = SRpnt->sense;
317
318 s->have_sense = scsi_normalize_sense(SRpnt->sense,
319 SCSI_SENSE_BUFFERSIZE, &s->sense_hdr);
320 s->flags = 0;
321
322 if (s->have_sense) {
323 s->deferred = 0;
324 s->remainder_valid =
325 scsi_get_sense_info_fld(sense, SCSI_SENSE_BUFFERSIZE, &s->uremainder64);
326 switch (sense[0] & 0x7f) {
327 case 0x71:
328 s->deferred = 1;
329 case 0x70:
330 s->fixed_format = 1;
331 s->flags = sense[2] & 0xe0;
332 break;
333 case 0x73:
334 s->deferred = 1;
335 case 0x72:
336 s->fixed_format = 0;
337 ucp = scsi_sense_desc_find(sense, SCSI_SENSE_BUFFERSIZE, 4);
338 s->flags = ucp ? (ucp[3] & 0xe0) : 0;
339 break;
340 }
341 }
342}
343
344
345
346static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
347{
348 int result = SRpnt->result;
349 u8 scode;
350 DEB(const char *stp;)
351 char *name = tape_name(STp);
352 struct st_cmdstatus *cmdstatp;
353
354 if (!result)
355 return 0;
356
357 cmdstatp = &STp->buffer->cmdstat;
358 st_analyze_sense(SRpnt, cmdstatp);
359
360 if (cmdstatp->have_sense)
361 scode = STp->buffer->cmdstat.sense_hdr.sense_key;
362 else
363 scode = 0;
364
365 DEB(
366 if (debugging) {
367 printk(ST_DEB_MSG "%s: Error: %x, cmd: %x %x %x %x %x %x\n",
368 name, result,
369 SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2],
370 SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]);
371 if (cmdstatp->have_sense)
372 __scsi_print_sense(name, SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
373 } )
374 if (!debugging) {
375 if (!cmdstatp->have_sense)
376 printk(KERN_WARNING
377 "%s: Error %x (sugg. bt 0x%x, driver bt 0x%x, host bt 0x%x).\n",
378 name, result, suggestion(result),
379 driver_byte(result) & DRIVER_MASK, host_byte(result));
380 else if (cmdstatp->have_sense &&
381 scode != NO_SENSE &&
382 scode != RECOVERED_ERROR &&
383
384 scode != BLANK_CHECK &&
385 scode != VOLUME_OVERFLOW &&
386 SRpnt->cmd[0] != MODE_SENSE &&
387 SRpnt->cmd[0] != TEST_UNIT_READY) {
388
389 __scsi_print_sense(name, SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
390 }
391 }
392
393 if (cmdstatp->fixed_format &&
394 STp->cln_mode >= EXTENDED_SENSE_START) {
395 if (STp->cln_sense_value)
396 STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] &
397 STp->cln_sense_mask) == STp->cln_sense_value);
398 else
399 STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] &
400 STp->cln_sense_mask) != 0);
401 }
402 if (cmdstatp->have_sense &&
403 cmdstatp->sense_hdr.asc == 0 && cmdstatp->sense_hdr.ascq == 0x17)
404 STp->cleaning_req = 1;
405
406 STp->pos_unknown |= STp->device->was_reset;
407
408 if (cmdstatp->have_sense &&
409 scode == RECOVERED_ERROR
410#if ST_RECOVERED_WRITE_FATAL
411 && SRpnt->cmd[0] != WRITE_6
412 && SRpnt->cmd[0] != WRITE_FILEMARKS
413#endif
414 ) {
415 STp->recover_count++;
416 STp->recover_reg++;
417
418 DEB(
419 if (debugging) {
420 if (SRpnt->cmd[0] == READ_6)
421 stp = "read";
422 else if (SRpnt->cmd[0] == WRITE_6)
423 stp = "write";
424 else
425 stp = "ioctl";
426 printk(ST_DEB_MSG "%s: Recovered %s error (%d).\n", name, stp,
427 STp->recover_count);
428 } )
429
430 if (cmdstatp->flags == 0)
431 return 0;
432 }
433 return (-EIO);
434}
435
436
437
438static void st_sleep_done(void *data, char *sense, int result, int resid)
439{
440 struct st_request *SRpnt = data;
441 struct scsi_tape *STp = SRpnt->stp;
442
443 memcpy(SRpnt->sense, sense, SCSI_SENSE_BUFFERSIZE);
444 (STp->buffer)->cmdstat.midlevel_result = SRpnt->result = result;
445 DEB( STp->write_pending = 0; )
446
447 if (SRpnt->waiting)
448 complete(SRpnt->waiting);
449}
450
451static struct st_request *st_allocate_request(void)
452{
453 return kzalloc(sizeof(struct st_request), GFP_KERNEL);
454}
455
456static void st_release_request(struct st_request *streq)
457{
458 kfree(streq);
459}
460
461
462
463
464static struct st_request *
465st_do_scsi(struct st_request * SRpnt, struct scsi_tape * STp, unsigned char *cmd,
466 int bytes, int direction, int timeout, int retries, int do_wait)
467{
468 struct completion *waiting;
469
470
471 if (!do_wait && ((STp->buffer)->last_SRpnt)) {
472 printk(KERN_ERR "%s: Async command already active.\n",
473 tape_name(STp));
474 if (signal_pending(current))
475 (STp->buffer)->syscall_result = (-EINTR);
476 else
477 (STp->buffer)->syscall_result = (-EBUSY);
478 return NULL;
479 }
480
481 if (SRpnt == NULL) {
482 SRpnt = st_allocate_request();
483 if (SRpnt == NULL) {
484 DEBC( printk(KERN_ERR "%s: Can't get SCSI request.\n",
485 tape_name(STp)); );
486 if (signal_pending(current))
487 (STp->buffer)->syscall_result = (-EINTR);
488 else
489 (STp->buffer)->syscall_result = (-EBUSY);
490 return NULL;
491 }
492 SRpnt->stp = STp;
493 }
494
495
496
497 if (!do_wait)
498 (STp->buffer)->last_SRpnt = SRpnt;
499
500 waiting = &STp->wait;
501 init_completion(waiting);
502 SRpnt->waiting = waiting;
503
504 if (!STp->buffer->do_dio)
505 buf_to_sg(STp->buffer, bytes);
506
507 memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd));
508 STp->buffer->cmdstat.have_sense = 0;
509 STp->buffer->syscall_result = 0;
510
511 if (scsi_execute_async(STp->device, cmd, COMMAND_SIZE(cmd[0]), direction,
512 &((STp->buffer)->sg[0]), bytes, (STp->buffer)->sg_segs,
513 timeout, retries, SRpnt, st_sleep_done, GFP_KERNEL)) {
514
515 (STp->buffer)->syscall_result = (-EBUSY);
516 (STp->buffer)->last_SRpnt = NULL;
517 }
518 else if (do_wait) {
519 wait_for_completion(waiting);
520 SRpnt->waiting = NULL;
521 (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt);
522 }
523
524 return SRpnt;
525}
526
527
528
529
530
531
532static int write_behind_check(struct scsi_tape * STp)
533{
534 int retval = 0;
535 struct st_buffer *STbuffer;
536 struct st_partstat *STps;
537 struct st_cmdstatus *cmdstatp;
538 struct st_request *SRpnt;
539
540 STbuffer = STp->buffer;
541 if (!STbuffer->writing)
542 return 0;
543
544 DEB(
545 if (STp->write_pending)
546 STp->nbr_waits++;
547 else
548 STp->nbr_finished++;
549 )
550
551 wait_for_completion(&(STp->wait));
552 SRpnt = STbuffer->last_SRpnt;
553 STbuffer->last_SRpnt = NULL;
554 SRpnt->waiting = NULL;
555
556 (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt);
557 st_release_request(SRpnt);
558
559 STbuffer->buffer_bytes -= STbuffer->writing;
560 STps = &(STp->ps[STp->partition]);
561 if (STps->drv_block >= 0) {
562 if (STp->block_size == 0)
563 STps->drv_block++;
564 else
565 STps->drv_block += STbuffer->writing / STp->block_size;
566 }
567
568 cmdstatp = &STbuffer->cmdstat;
569 if (STbuffer->syscall_result) {
570 retval = -EIO;
571 if (cmdstatp->have_sense && !cmdstatp->deferred &&
572 (cmdstatp->flags & SENSE_EOM) &&
573 (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
574 cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR)) {
575
576 if (!cmdstatp->remainder_valid ||
577 cmdstatp->uremainder64 == 0)
578 retval = -ENOSPC;
579 }
580 if (retval == -EIO)
581 STps->drv_block = -1;
582 }
583 STbuffer->writing = 0;
584
585 DEB(if (debugging && retval)
586 printk(ST_DEB_MSG "%s: Async write error %x, return value %d.\n",
587 tape_name(STp), STbuffer->cmdstat.midlevel_result, retval);)
588
589 return retval;
590}
591
592
593
594
595static int cross_eof(struct scsi_tape * STp, int forward)
596{
597 struct st_request *SRpnt;
598 unsigned char cmd[MAX_COMMAND_SIZE];
599
600 cmd[0] = SPACE;
601 cmd[1] = 0x01;
602 if (forward) {
603 cmd[2] = cmd[3] = 0;
604 cmd[4] = 1;
605 } else
606 cmd[2] = cmd[3] = cmd[4] = 0xff;
607 cmd[5] = 0;
608
609 DEBC(printk(ST_DEB_MSG "%s: Stepping over filemark %s.\n",
610 tape_name(STp), forward ? "forward" : "backward"));
611
612 SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
613 STp->device->timeout, MAX_RETRIES, 1);
614 if (!SRpnt)
615 return (STp->buffer)->syscall_result;
616
617 st_release_request(SRpnt);
618 SRpnt = NULL;
619
620 if ((STp->buffer)->cmdstat.midlevel_result != 0)
621 printk(KERN_ERR "%s: Stepping over filemark %s failed.\n",
622 tape_name(STp), forward ? "forward" : "backward");
623
624 return (STp->buffer)->syscall_result;
625}
626
627
628
629static int flush_write_buffer(struct scsi_tape * STp)
630{
631 int offset, transfer, blks;
632 int result;
633 unsigned char cmd[MAX_COMMAND_SIZE];
634 struct st_request *SRpnt;
635 struct st_partstat *STps;
636
637 result = write_behind_check(STp);
638 if (result)
639 return result;
640
641 result = 0;
642 if (STp->dirty == 1) {
643
644 offset = (STp->buffer)->buffer_bytes;
645 transfer = ((offset + STp->block_size - 1) /
646 STp->block_size) * STp->block_size;
647 DEBC(printk(ST_DEB_MSG "%s: Flushing %d bytes.\n",
648 tape_name(STp), transfer));
649
650 memset((STp->buffer)->b_data + offset, 0, transfer - offset);
651
652 memset(cmd, 0, MAX_COMMAND_SIZE);
653 cmd[0] = WRITE_6;
654 cmd[1] = 1;
655 blks = transfer / STp->block_size;
656 cmd[2] = blks >> 16;
657 cmd[3] = blks >> 8;
658 cmd[4] = blks;
659
660 SRpnt = st_do_scsi(NULL, STp, cmd, transfer, DMA_TO_DEVICE,
661 STp->device->timeout, MAX_WRITE_RETRIES, 1);
662 if (!SRpnt)
663 return (STp->buffer)->syscall_result;
664
665 STps = &(STp->ps[STp->partition]);
666 if ((STp->buffer)->syscall_result != 0) {
667 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
668
669 if (cmdstatp->have_sense && !cmdstatp->deferred &&
670 (cmdstatp->flags & SENSE_EOM) &&
671 (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
672 cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) &&
673 (!cmdstatp->remainder_valid ||
674 cmdstatp->uremainder64 == 0)) {
675 STp->dirty = 0;
676 (STp->buffer)->buffer_bytes = 0;
677 if (STps->drv_block >= 0)
678 STps->drv_block += blks;
679 result = (-ENOSPC);
680 } else {
681 printk(KERN_ERR "%s: Error on flush.\n",
682 tape_name(STp));
683 STps->drv_block = (-1);
684 result = (-EIO);
685 }
686 } else {
687 if (STps->drv_block >= 0)
688 STps->drv_block += blks;
689 STp->dirty = 0;
690 (STp->buffer)->buffer_bytes = 0;
691 }
692 st_release_request(SRpnt);
693 SRpnt = NULL;
694 }
695 return result;
696}
697
698
699
700
701static int flush_buffer(struct scsi_tape *STp, int seek_next)
702{
703 int backspace, result;
704 struct st_buffer *STbuffer;
705 struct st_partstat *STps;
706
707 STbuffer = STp->buffer;
708
709
710
711
712
713 if (STp->pos_unknown)
714 return (-EIO);
715
716 if (STp->ready != ST_READY)
717 return 0;
718 STps = &(STp->ps[STp->partition]);
719 if (STps->rw == ST_WRITING)
720 return flush_write_buffer(STp);
721
722 if (STp->block_size == 0)
723 return 0;
724
725 backspace = ((STp->buffer)->buffer_bytes +
726 (STp->buffer)->read_pointer) / STp->block_size -
727 ((STp->buffer)->read_pointer + STp->block_size - 1) /
728 STp->block_size;
729 (STp->buffer)->buffer_bytes = 0;
730 (STp->buffer)->read_pointer = 0;
731 result = 0;
732 if (!seek_next) {
733 if (STps->eof == ST_FM_HIT) {
734 result = cross_eof(STp, 0);
735 if (!result)
736 STps->eof = ST_NOEOF;
737 else {
738 if (STps->drv_file >= 0)
739 STps->drv_file++;
740 STps->drv_block = 0;
741 }
742 }
743 if (!result && backspace > 0)
744 result = st_int_ioctl(STp, MTBSR, backspace);
745 } else if (STps->eof == ST_FM_HIT) {
746 if (STps->drv_file >= 0)
747 STps->drv_file++;
748 STps->drv_block = 0;
749 STps->eof = ST_NOEOF;
750 }
751 return result;
752
753}
754
755
756static int set_mode_densblk(struct scsi_tape * STp, struct st_modedef * STm)
757{
758 int set_it = 0;
759 unsigned long arg;
760 char *name = tape_name(STp);
761
762 if (!STp->density_changed &&
763 STm->default_density >= 0 &&
764 STm->default_density != STp->density) {
765 arg = STm->default_density;
766 set_it = 1;
767 } else
768 arg = STp->density;
769 arg <<= MT_ST_DENSITY_SHIFT;
770 if (!STp->blksize_changed &&
771 STm->default_blksize >= 0 &&
772 STm->default_blksize != STp->block_size) {
773 arg |= STm->default_blksize;
774 set_it = 1;
775 } else
776 arg |= STp->block_size;
777 if (set_it &&
778 st_int_ioctl(STp, SET_DENS_AND_BLK, arg)) {
779 printk(KERN_WARNING
780 "%s: Can't set default block size to %d bytes and density %x.\n",
781 name, STm->default_blksize, STm->default_density);
782 if (modes_defined)
783 return (-EINVAL);
784 }
785 return 0;
786}
787
788
789
790static int do_door_lock(struct scsi_tape * STp, int do_lock)
791{
792 int retval, cmd;
793 DEB(char *name = tape_name(STp);)
794
795
796 cmd = do_lock ? SCSI_IOCTL_DOORLOCK : SCSI_IOCTL_DOORUNLOCK;
797 DEBC(printk(ST_DEB_MSG "%s: %socking drive door.\n", name,
798 do_lock ? "L" : "Unl"));
799 retval = scsi_ioctl(STp->device, cmd, NULL);
800 if (!retval) {
801 STp->door_locked = do_lock ? ST_LOCKED_EXPLICIT : ST_UNLOCKED;
802 }
803 else {
804 STp->door_locked = ST_LOCK_FAILS;
805 }
806 return retval;
807}
808
809
810
811static void reset_state(struct scsi_tape *STp)
812{
813 int i;
814 struct st_partstat *STps;
815
816 STp->pos_unknown = 0;
817 for (i = 0; i < ST_NBR_PARTITIONS; i++) {
818 STps = &(STp->ps[i]);
819 STps->rw = ST_IDLE;
820 STps->eof = ST_NOEOF;
821 STps->at_sm = 0;
822 STps->last_block_valid = 0;
823 STps->drv_block = -1;
824 STps->drv_file = -1;
825 }
826 if (STp->can_partitions) {
827 STp->partition = find_partition(STp);
828 if (STp->partition < 0)
829 STp->partition = 0;
830 STp->new_partition = STp->partition;
831 }
832}
833
834
835
836#define CHKRES_READY 0
837#define CHKRES_NEW_SESSION 1
838#define CHKRES_NOT_READY 2
839#define CHKRES_NO_TAPE 3
840
841#define MAX_ATTENTIONS 10
842
843static int test_ready(struct scsi_tape *STp, int do_wait)
844{
845 int attentions, waits, max_wait, scode;
846 int retval = CHKRES_READY, new_session = 0;
847 unsigned char cmd[MAX_COMMAND_SIZE];
848 struct st_request *SRpnt = NULL;
849 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
850
851 max_wait = do_wait ? ST_BLOCK_SECONDS : 0;
852
853 for (attentions=waits=0; ; ) {
854 memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
855 cmd[0] = TEST_UNIT_READY;
856 SRpnt = st_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE,
857 STp->long_timeout, MAX_READY_RETRIES, 1);
858
859 if (!SRpnt) {
860 retval = (STp->buffer)->syscall_result;
861 break;
862 }
863
864 if (cmdstatp->have_sense) {
865
866 scode = cmdstatp->sense_hdr.sense_key;
867
868 if (scode == UNIT_ATTENTION) {
869 new_session = 1;
870 if (attentions < MAX_ATTENTIONS) {
871 attentions++;
872 continue;
873 }
874 else {
875 retval = (-EIO);
876 break;
877 }
878 }
879
880 if (scode == NOT_READY) {
881 if (waits < max_wait) {
882 if (msleep_interruptible(1000)) {
883 retval = (-EINTR);
884 break;
885 }
886 waits++;
887 continue;
888 }
889 else {
890 if ((STp->device)->scsi_level >= SCSI_2 &&
891 cmdstatp->sense_hdr.asc == 0x3a)
892 retval = CHKRES_NO_TAPE;
893 else
894 retval = CHKRES_NOT_READY;
895 break;
896 }
897 }
898 }
899
900 retval = (STp->buffer)->syscall_result;
901 if (!retval)
902 retval = new_session ? CHKRES_NEW_SESSION : CHKRES_READY;
903 break;
904 }
905
906 if (SRpnt != NULL)
907 st_release_request(SRpnt);
908 return retval;
909}
910
911
912
913
914
915
916
917static int check_tape(struct scsi_tape *STp, struct file *filp)
918{
919 int i, retval, new_session = 0, do_wait;
920 unsigned char cmd[MAX_COMMAND_SIZE], saved_cleaning;
921 unsigned short st_flags = filp->f_flags;
922 struct st_request *SRpnt = NULL;
923 struct st_modedef *STm;
924 struct st_partstat *STps;
925 char *name = tape_name(STp);
926 struct inode *inode = filp->f_path.dentry->d_inode;
927 int mode = TAPE_MODE(inode);
928
929 STp->ready = ST_READY;
930
931 if (mode != STp->current_mode) {
932 DEBC(printk(ST_DEB_MSG "%s: Mode change from %d to %d.\n",
933 name, STp->current_mode, mode));
934 new_session = 1;
935 STp->current_mode = mode;
936 }
937 STm = &(STp->modes[STp->current_mode]);
938
939 saved_cleaning = STp->cleaning_req;
940 STp->cleaning_req = 0;
941
942 do_wait = ((filp->f_flags & O_NONBLOCK) == 0);
943 retval = test_ready(STp, do_wait);
944
945 if (retval < 0)
946 goto err_out;
947
948 if (retval == CHKRES_NEW_SESSION) {
949 STp->pos_unknown = 0;
950 STp->partition = STp->new_partition = 0;
951 if (STp->can_partitions)
952 STp->nbr_partitions = 1;
953
954 for (i = 0; i < ST_NBR_PARTITIONS; i++) {
955 STps = &(STp->ps[i]);
956 STps->rw = ST_IDLE;
957 STps->eof = ST_NOEOF;
958 STps->at_sm = 0;
959 STps->last_block_valid = 0;
960 STps->drv_block = 0;
961 STps->drv_file = 0;
962 }
963 new_session = 1;
964 }
965 else {
966 STp->cleaning_req |= saved_cleaning;
967
968 if (retval == CHKRES_NOT_READY || retval == CHKRES_NO_TAPE) {
969 if (retval == CHKRES_NO_TAPE)
970 STp->ready = ST_NO_TAPE;
971 else
972 STp->ready = ST_NOT_READY;
973
974 STp->density = 0;
975 STp->write_prot = 0;
976 STp->block_size = 0;
977 STp->ps[0].drv_file = STp->ps[0].drv_block = (-1);
978 STp->partition = STp->new_partition = 0;
979 STp->door_locked = ST_UNLOCKED;
980 return CHKRES_NOT_READY;
981 }
982 }
983
984 if (STp->omit_blklims)
985 STp->min_block = STp->max_block = (-1);
986 else {
987 memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
988 cmd[0] = READ_BLOCK_LIMITS;
989
990 SRpnt = st_do_scsi(SRpnt, STp, cmd, 6, DMA_FROM_DEVICE,
991 STp->device->timeout, MAX_READY_RETRIES, 1);
992 if (!SRpnt) {
993 retval = (STp->buffer)->syscall_result;
994 goto err_out;
995 }
996
997 if (!SRpnt->result && !STp->buffer->cmdstat.have_sense) {
998 STp->max_block = ((STp->buffer)->b_data[1] << 16) |
999 ((STp->buffer)->b_data[2] << 8) | (STp->buffer)->b_data[3];
1000 STp->min_block = ((STp->buffer)->b_data[4] << 8) |
1001 (STp->buffer)->b_data[5];
1002 if ( DEB( debugging || ) !STp->inited)
1003 printk(KERN_INFO
1004 "%s: Block limits %d - %d bytes.\n", name,
1005 STp->min_block, STp->max_block);
1006 } else {
1007 STp->min_block = STp->max_block = (-1);
1008 DEBC(printk(ST_DEB_MSG "%s: Can't read block limits.\n",
1009 name));
1010 }
1011 }
1012
1013 memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
1014 cmd[0] = MODE_SENSE;
1015 cmd[4] = 12;
1016
1017 SRpnt = st_do_scsi(SRpnt, STp, cmd, 12, DMA_FROM_DEVICE,
1018 STp->device->timeout, MAX_READY_RETRIES, 1);
1019 if (!SRpnt) {
1020 retval = (STp->buffer)->syscall_result;
1021 goto err_out;
1022 }
1023
1024 if ((STp->buffer)->syscall_result != 0) {
1025 DEBC(printk(ST_DEB_MSG "%s: No Mode Sense.\n", name));
1026 STp->block_size = ST_DEFAULT_BLOCK;
1027 (STp->buffer)->syscall_result = 0;
1028 STp->drv_write_prot = 0;
1029 } else {
1030 DEBC(printk(ST_DEB_MSG
1031 "%s: Mode sense. Length %d, medium %x, WBS %x, BLL %d\n",
1032 name,
1033 (STp->buffer)->b_data[0], (STp->buffer)->b_data[1],
1034 (STp->buffer)->b_data[2], (STp->buffer)->b_data[3]));
1035
1036 if ((STp->buffer)->b_data[3] >= 8) {
1037 STp->drv_buffer = ((STp->buffer)->b_data[2] >> 4) & 7;
1038 STp->density = (STp->buffer)->b_data[4];
1039 STp->block_size = (STp->buffer)->b_data[9] * 65536 +
1040 (STp->buffer)->b_data[10] * 256 + (STp->buffer)->b_data[11];
1041 DEBC(printk(ST_DEB_MSG
1042 "%s: Density %x, tape length: %x, drv buffer: %d\n",
1043 name, STp->density, (STp->buffer)->b_data[5] * 65536 +
1044 (STp->buffer)->b_data[6] * 256 + (STp->buffer)->b_data[7],
1045 STp->drv_buffer));
1046 }
1047 STp->drv_write_prot = ((STp->buffer)->b_data[2] & 0x80) != 0;
1048 }
1049 st_release_request(SRpnt);
1050 SRpnt = NULL;
1051 STp->inited = 1;
1052
1053 if (STp->block_size > 0)
1054 (STp->buffer)->buffer_blocks =
1055 (STp->buffer)->buffer_size / STp->block_size;
1056 else
1057 (STp->buffer)->buffer_blocks = 1;
1058 (STp->buffer)->buffer_bytes = (STp->buffer)->read_pointer = 0;
1059
1060 DEBC(printk(ST_DEB_MSG
1061 "%s: Block size: %d, buffer size: %d (%d blocks).\n", name,
1062 STp->block_size, (STp->buffer)->buffer_size,
1063 (STp->buffer)->buffer_blocks));
1064
1065 if (STp->drv_write_prot) {
1066 STp->write_prot = 1;
1067
1068 DEBC(printk(ST_DEB_MSG "%s: Write protected\n", name));
1069
1070 if (do_wait &&
1071 ((st_flags & O_ACCMODE) == O_WRONLY ||
1072 (st_flags & O_ACCMODE) == O_RDWR)) {
1073 retval = (-EROFS);
1074 goto err_out;
1075 }
1076 }
1077
1078 if (STp->can_partitions && STp->nbr_partitions < 1) {
1079
1080
1081
1082 DEBC(printk(ST_DEB_MSG
1083 "%s: Updating partition number in status.\n", name));
1084 if ((STp->partition = find_partition(STp)) < 0) {
1085 retval = STp->partition;
1086 goto err_out;
1087 }
1088 STp->new_partition = STp->partition;
1089 STp->nbr_partitions = 1;
1090 }
1091
1092 if (new_session) {
1093 STp->density_changed = STp->blksize_changed = 0;
1094 STp->compression_changed = 0;
1095 if (!(STm->defaults_for_writes) &&
1096 (retval = set_mode_densblk(STp, STm)) < 0)
1097 goto err_out;
1098
1099 if (STp->default_drvbuffer != 0xff) {
1100 if (st_int_ioctl(STp, MTSETDRVBUFFER, STp->default_drvbuffer))
1101 printk(KERN_WARNING
1102 "%s: Can't set default drive buffering to %d.\n",
1103 name, STp->default_drvbuffer);
1104 }
1105 }
1106
1107 return CHKRES_READY;
1108
1109 err_out:
1110 return retval;
1111}
1112
1113
1114
1115
1116static int st_open(struct inode *inode, struct file *filp)
1117{
1118 int i, retval = (-EIO);
1119 struct scsi_tape *STp;
1120 struct st_partstat *STps;
1121 int dev = TAPE_NR(inode);
1122 char *name;
1123
1124
1125
1126
1127
1128
1129 filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);
1130
1131 if (!(STp = scsi_tape_get(dev)))
1132 return -ENXIO;
1133
1134 write_lock(&st_dev_arr_lock);
1135 filp->private_data = STp;
1136 name = tape_name(STp);
1137
1138 if (STp->in_use) {
1139 write_unlock(&st_dev_arr_lock);
1140 scsi_tape_put(STp);
1141 DEB( printk(ST_DEB_MSG "%s: Device already in use.\n", name); )
1142 return (-EBUSY);
1143 }
1144
1145 STp->in_use = 1;
1146 write_unlock(&st_dev_arr_lock);
1147 STp->rew_at_close = STp->autorew_dev = (iminor(inode) & 0x80) == 0;
1148
1149 if (!scsi_block_when_processing_errors(STp->device)) {
1150 retval = (-ENXIO);
1151 goto err_out;
1152 }
1153
1154
1155 if (!enlarge_buffer(STp->buffer, PAGE_SIZE, STp->restr_dma)) {
1156 printk(KERN_WARNING "%s: Can't allocate one page tape buffer.\n",
1157 name);
1158 retval = (-EOVERFLOW);
1159 goto err_out;
1160 }
1161
1162 (STp->buffer)->writing = 0;
1163 (STp->buffer)->syscall_result = 0;
1164
1165 STp->write_prot = ((filp->f_flags & O_ACCMODE) == O_RDONLY);
1166
1167 STp->dirty = 0;
1168 for (i = 0; i < ST_NBR_PARTITIONS; i++) {
1169 STps = &(STp->ps[i]);
1170 STps->rw = ST_IDLE;
1171 }
1172 STp->try_dio_now = STp->try_dio;
1173 STp->recover_count = 0;
1174 DEB( STp->nbr_waits = STp->nbr_finished = 0;
1175 STp->nbr_requests = STp->nbr_dio = STp->nbr_pages = 0; )
1176
1177 retval = check_tape(STp, filp);
1178 if (retval < 0)
1179 goto err_out;
1180 if ((filp->f_flags & O_NONBLOCK) == 0 &&
1181 retval != CHKRES_READY) {
1182 if (STp->ready == NO_TAPE)
1183 retval = (-ENOMEDIUM);
1184 else
1185 retval = (-EIO);
1186 goto err_out;
1187 }
1188 return 0;
1189
1190 err_out:
1191 normalize_buffer(STp->buffer);
1192 STp->in_use = 0;
1193 scsi_tape_put(STp);
1194 return retval;
1195
1196}
1197
1198
1199
1200static int st_flush(struct file *filp, fl_owner_t id)
1201{
1202 int result = 0, result2;
1203 unsigned char cmd[MAX_COMMAND_SIZE];
1204 struct st_request *SRpnt;
1205 struct scsi_tape *STp = filp->private_data;
1206 struct st_modedef *STm = &(STp->modes[STp->current_mode]);
1207 struct st_partstat *STps = &(STp->ps[STp->partition]);
1208 char *name = tape_name(STp);
1209
1210 if (file_count(filp) > 1)
1211 return 0;
1212
1213 if (STps->rw == ST_WRITING && !STp->pos_unknown) {
1214 result = flush_write_buffer(STp);
1215 if (result != 0 && result != (-ENOSPC))
1216 goto out;
1217 }
1218
1219 if (STp->can_partitions &&
1220 (result2 = switch_partition(STp)) < 0) {
1221 DEBC(printk(ST_DEB_MSG
1222 "%s: switch_partition at close failed.\n", name));
1223 if (result == 0)
1224 result = result2;
1225 goto out;
1226 }
1227
1228 DEBC( if (STp->nbr_requests)
1229 printk(KERN_DEBUG "%s: Number of r/w requests %d, dio used in %d, pages %d.\n",
1230 name, STp->nbr_requests, STp->nbr_dio, STp->nbr_pages));
1231
1232 if (STps->rw == ST_WRITING && !STp->pos_unknown) {
1233 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
1234
1235 DEBC(printk(ST_DEB_MSG "%s: Async write waits %d, finished %d.\n",
1236 name, STp->nbr_waits, STp->nbr_finished);
1237 )
1238
1239 memset(cmd, 0, MAX_COMMAND_SIZE);
1240 cmd[0] = WRITE_FILEMARKS;
1241 cmd[4] = 1 + STp->two_fm;
1242
1243 SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
1244 STp->device->timeout, MAX_WRITE_RETRIES, 1);
1245 if (!SRpnt) {
1246 result = (STp->buffer)->syscall_result;
1247 goto out;
1248 }
1249
1250 if (STp->buffer->syscall_result == 0 ||
1251 (cmdstatp->have_sense && !cmdstatp->deferred &&
1252 (cmdstatp->flags & SENSE_EOM) &&
1253 (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
1254 cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) &&
1255 (!cmdstatp->remainder_valid || cmdstatp->uremainder64 == 0))) {
1256
1257 st_release_request(SRpnt);
1258 SRpnt = NULL;
1259 if (STps->drv_file >= 0)
1260 STps->drv_file++;
1261 STps->drv_block = 0;
1262 if (STp->two_fm)
1263 cross_eof(STp, 0);
1264 STps->eof = ST_FM;
1265 }
1266 else {
1267 st_release_request(SRpnt);
1268 SRpnt = NULL;
1269 printk(KERN_ERR "%s: Error on write filemark.\n", name);
1270 if (result == 0)
1271 result = (-EIO);
1272 }
1273
1274 DEBC(printk(ST_DEB_MSG "%s: Buffer flushed, %d EOF(s) written\n",
1275 name, cmd[4]));
1276 } else if (!STp->rew_at_close) {
1277 STps = &(STp->ps[STp->partition]);
1278 if (!STm->sysv || STps->rw != ST_READING) {
1279 if (STp->can_bsr)
1280 result = flush_buffer(STp, 0);
1281 else if (STps->eof == ST_FM_HIT) {
1282 result = cross_eof(STp, 0);
1283 if (result) {
1284 if (STps->drv_file >= 0)
1285 STps->drv_file++;
1286 STps->drv_block = 0;
1287 STps->eof = ST_FM;
1288 } else
1289 STps->eof = ST_NOEOF;
1290 }
1291 } else if ((STps->eof == ST_NOEOF &&
1292 !(result = cross_eof(STp, 1))) ||
1293 STps->eof == ST_FM_HIT) {
1294 if (STps->drv_file >= 0)
1295 STps->drv_file++;
1296 STps->drv_block = 0;
1297 STps->eof = ST_FM;
1298 }
1299 }
1300
1301 out:
1302 if (STp->rew_at_close) {
1303 result2 = st_int_ioctl(STp, MTREW, 1);
1304 if (result == 0)
1305 result = result2;
1306 }
1307 return result;
1308}
1309
1310
1311
1312
1313static int st_release(struct inode *inode, struct file *filp)
1314{
1315 int result = 0;
1316 struct scsi_tape *STp = filp->private_data;
1317
1318 if (STp->door_locked == ST_LOCKED_AUTO)
1319 do_door_lock(STp, 0);
1320
1321 normalize_buffer(STp->buffer);
1322 write_lock(&st_dev_arr_lock);
1323 STp->in_use = 0;
1324 write_unlock(&st_dev_arr_lock);
1325 scsi_tape_put(STp);
1326
1327 return result;
1328}
1329
1330
1331static ssize_t rw_checks(struct scsi_tape *STp, struct file *filp, size_t count)
1332{
1333 ssize_t retval = 0;
1334
1335
1336
1337
1338
1339
1340
1341 if (!scsi_block_when_processing_errors(STp->device)) {
1342 retval = (-ENXIO);
1343 goto out;
1344 }
1345
1346 if (STp->ready != ST_READY) {
1347 if (STp->ready == ST_NO_TAPE)
1348 retval = (-ENOMEDIUM);
1349 else
1350 retval = (-EIO);
1351 goto out;
1352 }
1353
1354 if (! STp->modes[STp->current_mode].defined) {
1355 retval = (-ENXIO);
1356 goto out;
1357 }
1358
1359
1360
1361
1362
1363
1364 if (STp->pos_unknown) {
1365 retval = (-EIO);
1366 goto out;
1367 }
1368
1369 if (count == 0)
1370 goto out;
1371
1372 DEB(
1373 if (!STp->in_use) {
1374 printk(ST_DEB_MSG "%s: Incorrect device.\n", tape_name(STp));
1375 retval = (-EIO);
1376 goto out;
1377 } )
1378
1379 if (STp->can_partitions &&
1380 (retval = switch_partition(STp)) < 0)
1381 goto out;
1382
1383 if (STp->block_size == 0 && STp->max_block > 0 &&
1384 (count < STp->min_block || count > STp->max_block)) {
1385 retval = (-EINVAL);
1386 goto out;
1387 }
1388
1389 if (STp->do_auto_lock && STp->door_locked == ST_UNLOCKED &&
1390 !do_door_lock(STp, 1))
1391 STp->door_locked = ST_LOCKED_AUTO;
1392
1393 out:
1394 return retval;
1395}
1396
1397
1398static int setup_buffering(struct scsi_tape *STp, const char __user *buf,
1399 size_t count, int is_read)
1400{
1401 int i, bufsize, retval = 0;
1402 struct st_buffer *STbp = STp->buffer;
1403
1404 if (is_read)
1405 i = STp->try_dio_now && try_rdio;
1406 else
1407 i = STp->try_dio_now && try_wdio;
1408
1409 if (i && ((unsigned long)buf & queue_dma_alignment(
1410 STp->device->request_queue)) == 0) {
1411 i = sgl_map_user_pages(&(STbp->sg[0]), STbp->use_sg,
1412 (unsigned long)buf, count, (is_read ? READ : WRITE));
1413 if (i > 0) {
1414 STbp->do_dio = i;
1415 STbp->buffer_bytes = 0;
1416 }
1417 else
1418 STbp->do_dio = 0;
1419 STbp->sg_segs = STbp->do_dio;
1420 STbp->frp_sg_current = 0;
1421 DEB(
1422 if (STbp->do_dio) {
1423 STp->nbr_dio++;
1424 STp->nbr_pages += STbp->do_dio;
1425 }
1426 )
1427 } else
1428 STbp->do_dio = 0;
1429 DEB( STp->nbr_requests++; )
1430
1431 if (!STbp->do_dio) {
1432 if (STp->block_size)
1433 bufsize = STp->block_size > st_fixed_buffer_size ?
1434 STp->block_size : st_fixed_buffer_size;
1435 else
1436 bufsize = count;
1437 if (bufsize > STbp->buffer_size &&
1438 !enlarge_buffer(STbp, bufsize, STp->restr_dma)) {
1439 printk(KERN_WARNING "%s: Can't allocate %d byte tape buffer.\n",
1440 tape_name(STp), bufsize);
1441 retval = (-EOVERFLOW);
1442 goto out;
1443 }
1444 if (STp->block_size)
1445 STbp->buffer_blocks = bufsize / STp->block_size;
1446 }
1447
1448 out:
1449 return retval;
1450}
1451
1452
1453
1454static void release_buffering(struct scsi_tape *STp, int is_read)
1455{
1456 struct st_buffer *STbp;
1457
1458 STbp = STp->buffer;
1459 if (STbp->do_dio) {
1460 sgl_unmap_user_pages(&(STbp->sg[0]), STbp->do_dio, is_read);
1461 STbp->do_dio = 0;
1462 STbp->sg_segs = 0;
1463 }
1464}
1465
1466
1467
1468static ssize_t
1469st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
1470{
1471 ssize_t total;
1472 ssize_t i, do_count, blks, transfer;
1473 ssize_t retval;
1474 int undone, retry_eot = 0, scode;
1475 int async_write;
1476 unsigned char cmd[MAX_COMMAND_SIZE];
1477 const char __user *b_point;
1478 struct st_request *SRpnt = NULL;
1479 struct scsi_tape *STp = filp->private_data;
1480 struct st_modedef *STm;
1481 struct st_partstat *STps;
1482 struct st_buffer *STbp;
1483 char *name = tape_name(STp);
1484
1485 if (mutex_lock_interruptible(&STp->lock))
1486 return -ERESTARTSYS;
1487
1488 retval = rw_checks(STp, filp, count);
1489 if (retval || count == 0)
1490 goto out;
1491
1492
1493 if (STp->block_size != 0 && (count % STp->block_size) != 0) {
1494 printk(KERN_WARNING "%s: Write not multiple of tape block size.\n",
1495 name);
1496 retval = (-EINVAL);
1497 goto out;
1498 }
1499
1500 STm = &(STp->modes[STp->current_mode]);
1501 STps = &(STp->ps[STp->partition]);
1502
1503 if (STp->write_prot) {
1504 retval = (-EACCES);
1505 goto out;
1506 }
1507
1508
1509 if (STps->rw == ST_READING) {
1510 retval = flush_buffer(STp, 0);
1511 if (retval)
1512 goto out;
1513 STps->rw = ST_WRITING;
1514 } else if (STps->rw != ST_WRITING &&
1515 STps->drv_file == 0 && STps->drv_block == 0) {
1516 if ((retval = set_mode_densblk(STp, STm)) < 0)
1517 goto out;
1518 if (STm->default_compression != ST_DONT_TOUCH &&
1519 !(STp->compression_changed)) {
1520 if (st_compression(STp, (STm->default_compression == ST_YES))) {
1521 printk(KERN_WARNING "%s: Can't set default compression.\n",
1522 name);
1523 if (modes_defined) {
1524 retval = (-EINVAL);
1525 goto out;
1526 }
1527 }
1528 }
1529 }
1530
1531 STbp = STp->buffer;
1532 i = write_behind_check(STp);
1533 if (i) {
1534 if (i == -ENOSPC)
1535 STps->eof = ST_EOM_OK;
1536 else
1537 STps->eof = ST_EOM_ERROR;
1538 }
1539
1540 if (STps->eof == ST_EOM_OK) {
1541 STps->eof = ST_EOD_1;
1542 retval = (-ENOSPC);
1543 goto out;
1544 }
1545 else if (STps->eof == ST_EOM_ERROR) {
1546 retval = (-EIO);
1547 goto out;
1548 }
1549
1550
1551
1552 if (STp->block_size != 0 &&
1553 !STbp->do_dio &&
1554 (copy_from_user(&i, buf, 1) != 0 ||
1555 copy_from_user(&i, buf + count - 1, 1) != 0)) {
1556 retval = (-EFAULT);
1557 goto out;
1558 }
1559
1560 retval = setup_buffering(STp, buf, count, 0);
1561 if (retval)
1562 goto out;
1563
1564 total = count;
1565
1566 memset(cmd, 0, MAX_COMMAND_SIZE);
1567 cmd[0] = WRITE_6;
1568 cmd[1] = (STp->block_size != 0);
1569
1570 STps->rw = ST_WRITING;
1571
1572 b_point = buf;
1573 while (count > 0 && !retry_eot) {
1574
1575 if (STbp->do_dio) {
1576 do_count = count;
1577 }
1578 else {
1579 if (STp->block_size == 0)
1580 do_count = count;
1581 else {
1582 do_count = STbp->buffer_blocks * STp->block_size -
1583 STbp->buffer_bytes;
1584 if (do_count > count)
1585 do_count = count;
1586 }
1587
1588 i = append_to_buffer(b_point, STbp, do_count);
1589 if (i) {
1590 retval = i;
1591 goto out;
1592 }
1593 }
1594 count -= do_count;
1595 b_point += do_count;
1596
1597 async_write = STp->block_size == 0 && !STbp->do_dio &&
1598 STm->do_async_writes && STps->eof < ST_EOM_OK;
1599
1600 if (STp->block_size != 0 && STm->do_buffer_writes &&
1601 !(STp->try_dio_now && try_wdio) && STps->eof < ST_EOM_OK &&
1602 STbp->buffer_bytes < STbp->buffer_size) {
1603 STp->dirty = 1;
1604
1605 if (!async_write && count == 0)
1606 break;
1607 }
1608
1609 retry_write:
1610 if (STp->block_size == 0)
1611 blks = transfer = do_count;
1612 else {
1613 if (!STbp->do_dio)
1614 blks = STbp->buffer_bytes;
1615 else
1616 blks = do_count;
1617 blks /= STp->block_size;
1618 transfer = blks * STp->block_size;
1619 }
1620 cmd[2] = blks >> 16;
1621 cmd[3] = blks >> 8;
1622 cmd[4] = blks;
1623
1624 SRpnt = st_do_scsi(SRpnt, STp, cmd, transfer, DMA_TO_DEVICE,
1625 STp->device->timeout, MAX_WRITE_RETRIES, !async_write);
1626 if (!SRpnt) {
1627 retval = STbp->syscall_result;
1628 goto out;
1629 }
1630 if (async_write && !STbp->syscall_result) {
1631 STbp->writing = transfer;
1632 STp->dirty = !(STbp->writing ==
1633 STbp->buffer_bytes);
1634 SRpnt = NULL;
1635 DEB( STp->write_pending = 1; )
1636 break;
1637 }
1638
1639 if (STbp->syscall_result != 0) {
1640 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
1641
1642 DEBC(printk(ST_DEB_MSG "%s: Error on write:\n", name));
1643 if (cmdstatp->have_sense && (cmdstatp->flags & SENSE_EOM)) {
1644 scode = cmdstatp->sense_hdr.sense_key;
1645 if (cmdstatp->remainder_valid)
1646 undone = (int)cmdstatp->uremainder64;
1647 else if (STp->block_size == 0 &&
1648 scode == VOLUME_OVERFLOW)
1649 undone = transfer;
1650 else
1651 undone = 0;
1652 if (STp->block_size != 0)
1653 undone *= STp->block_size;
1654 if (undone <= do_count) {
1655
1656 count += undone;
1657 do_count -= undone;
1658 if (STp->block_size)
1659 blks = (transfer - undone) / STp->block_size;
1660 STps->eof = ST_EOM_OK;
1661
1662
1663
1664
1665 if (STp->block_size == 0 ||
1666 undone > 0 || count == 0)
1667 retval = (-ENOSPC);
1668 DEBC(printk(ST_DEB_MSG
1669 "%s: EOM with %d bytes unwritten.\n",
1670 name, (int)count));
1671 } else {
1672
1673
1674 if (!retry_eot && !cmdstatp->deferred &&
1675 (scode == NO_SENSE || scode == RECOVERED_ERROR)) {
1676 move_buffer_data(STp->buffer, transfer - undone);
1677 retry_eot = 1;
1678 if (STps->drv_block >= 0) {
1679 STps->drv_block += (transfer - undone) /
1680 STp->block_size;
1681 }
1682 STps->eof = ST_EOM_OK;
1683 DEBC(printk(ST_DEB_MSG
1684 "%s: Retry write of %d bytes at EOM.\n",
1685 name, STp->buffer->buffer_bytes));
1686 goto retry_write;
1687 }
1688 else {
1689
1690
1691 count -= do_count;
1692 blks = do_count = 0;
1693 STps->eof = ST_EOM_ERROR;
1694 STps->drv_block = (-1);
1695 retval = (-EIO);
1696 DEBC(printk(ST_DEB_MSG
1697 "%s: EOM with lost data.\n",
1698 name));
1699 }
1700 }
1701 } else {
1702 count += do_count;
1703 STps->drv_block = (-1);
1704 retval = STbp->syscall_result;
1705 }
1706
1707 }
1708
1709 if (STps->drv_block >= 0) {
1710 if (STp->block_size == 0)
1711 STps->drv_block += (do_count > 0);
1712 else
1713 STps->drv_block += blks;
1714 }
1715
1716 STbp->buffer_bytes = 0;
1717 STp->dirty = 0;
1718
1719 if (retval || retry_eot) {
1720 if (count < total)
1721 retval = total - count;
1722 goto out;
1723 }
1724 }
1725
1726 if (STps->eof == ST_EOD_1)
1727 STps->eof = ST_EOM_OK;
1728 else if (STps->eof != ST_EOM_OK)
1729 STps->eof = ST_NOEOF;
1730 retval = total - count;
1731
1732 out:
1733 if (SRpnt != NULL)
1734 st_release_request(SRpnt);
1735 release_buffering(STp, 0);
1736 mutex_unlock(&STp->lock);
1737
1738 return retval;
1739}
1740
1741
1742
1743
1744
1745
1746
1747static long read_tape(struct scsi_tape *STp, long count,
1748 struct st_request ** aSRpnt)
1749{
1750 int transfer, blks, bytes;
1751 unsigned char cmd[MAX_COMMAND_SIZE];
1752 struct st_request *SRpnt;
1753 struct st_modedef *STm;
1754 struct st_partstat *STps;
1755 struct st_buffer *STbp;
1756 int retval = 0;
1757 char *name = tape_name(STp);
1758
1759 if (count == 0)
1760 return 0;
1761
1762 STm = &(STp->modes[STp->current_mode]);
1763 STps = &(STp->ps[STp->partition]);
1764 if (STps->eof == ST_FM_HIT)
1765 return 1;
1766 STbp = STp->buffer;
1767
1768 if (STp->block_size == 0)
1769 blks = bytes = count;
1770 else {
1771 if (!(STp->try_dio_now && try_rdio) && STm->do_read_ahead) {
1772 blks = (STp->buffer)->buffer_blocks;
1773 bytes = blks * STp->block_size;
1774 } else {
1775 bytes = count;
1776 if (!STbp->do_dio && bytes > (STp->buffer)->buffer_size)
1777 bytes = (STp->buffer)->buffer_size;
1778 blks = bytes / STp->block_size;
1779 bytes = blks * STp->block_size;
1780 }
1781 }
1782
1783 memset(cmd, 0, MAX_COMMAND_SIZE);
1784 cmd[0] = READ_6;
1785 cmd[1] = (STp->block_size != 0);
1786 cmd[2] = blks >> 16;
1787 cmd[3] = blks >> 8;
1788 cmd[4] = blks;
1789
1790 SRpnt = *aSRpnt;
1791 SRpnt = st_do_scsi(SRpnt, STp, cmd, bytes, DMA_FROM_DEVICE,
1792 STp->device->timeout, MAX_RETRIES, 1);
1793 release_buffering(STp, 1);
1794 *aSRpnt = SRpnt;
1795 if (!SRpnt)
1796 return STbp->syscall_result;
1797
1798 STbp->read_pointer = 0;
1799 STps->at_sm = 0;
1800
1801
1802 if (STbp->syscall_result) {
1803 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
1804
1805 retval = 1;
1806 DEBC(printk(ST_DEB_MSG "%s: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n",
1807 name,
1808 SRpnt->sense[0], SRpnt->sense[1],
1809 SRpnt->sense[2], SRpnt->sense[3],
1810 SRpnt->sense[4], SRpnt->sense[5],
1811 SRpnt->sense[6], SRpnt->sense[7]));
1812 if (cmdstatp->have_sense) {
1813
1814 if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK)
1815 cmdstatp->flags &= 0xcf;
1816
1817 if (cmdstatp->flags != 0) {
1818
1819 if (cmdstatp->remainder_valid)
1820 transfer = (int)cmdstatp->uremainder64;
1821 else
1822 transfer = 0;
1823 if (STp->block_size == 0 &&
1824 cmdstatp->sense_hdr.sense_key == MEDIUM_ERROR)
1825 transfer = bytes;
1826
1827 if (cmdstatp->flags & SENSE_ILI) {
1828 if (STp->block_size == 0) {
1829 if (transfer <= 0) {
1830 if (transfer < 0)
1831 printk(KERN_NOTICE
1832 "%s: Failed to read %d byte block with %d byte transfer.\n",
1833 name, bytes - transfer, bytes);
1834 if (STps->drv_block >= 0)
1835 STps->drv_block += 1;
1836 STbp->buffer_bytes = 0;
1837 return (-ENOMEM);
1838 }
1839 STbp->buffer_bytes = bytes - transfer;
1840 } else {
1841 st_release_request(SRpnt);
1842 SRpnt = *aSRpnt = NULL;
1843 if (transfer == blks) {
1844 printk(KERN_NOTICE "%s: Incorrect block size.\n", name);
1845 if (STps->drv_block >= 0)
1846 STps->drv_block += blks - transfer + 1;
1847 st_int_ioctl(STp, MTBSR, 1);
1848 return (-EIO);
1849 }
1850
1851 STbp->buffer_bytes = (blks - transfer) *
1852 STp->block_size;
1853 DEBC(printk(ST_DEB_MSG
1854 "%s: ILI but enough data received %ld %d.\n",
1855 name, count, STbp->buffer_bytes));
1856 if (STps->drv_block >= 0)
1857 STps->drv_block += 1;
1858 if (st_int_ioctl(STp, MTBSR, 1))
1859 return (-EIO);
1860 }
1861 } else if (cmdstatp->flags & SENSE_FMK) {
1862 if (STps->eof != ST_FM_HIT)
1863 STps->eof = ST_FM_HIT;
1864 else
1865 STps->eof = ST_EOD_2;
1866 if (STp->block_size == 0)
1867 STbp->buffer_bytes = 0;
1868 else
1869 STbp->buffer_bytes =
1870 bytes - transfer * STp->block_size;
1871 DEBC(printk(ST_DEB_MSG
1872 "%s: EOF detected (%d bytes read).\n",
1873 name, STbp->buffer_bytes));
1874 } else if (cmdstatp->flags & SENSE_EOM) {
1875 if (STps->eof == ST_FM)
1876 STps->eof = ST_EOD_1;
1877 else
1878 STps->eof = ST_EOM_OK;
1879 if (STp->block_size == 0)
1880 STbp->buffer_bytes = bytes - transfer;
1881 else
1882 STbp->buffer_bytes =
1883 bytes - transfer * STp->block_size;
1884
1885 DEBC(printk(ST_DEB_MSG "%s: EOM detected (%d bytes read).\n",
1886 name, STbp->buffer_bytes));
1887 }
1888 }
1889
1890 else {
1891 DEBC(printk(ST_DEB_MSG
1892 "%s: Tape error while reading.\n", name));
1893 STps->drv_block = (-1);
1894 if (STps->eof == ST_FM &&
1895 cmdstatp->sense_hdr.sense_key == BLANK_CHECK) {
1896 DEBC(printk(ST_DEB_MSG
1897 "%s: Zero returned for first BLANK CHECK after EOF.\n",
1898 name));
1899 STps->eof = ST_EOD_2;
1900 } else
1901 retval = (-EIO);
1902 }
1903
1904 if (STbp->buffer_bytes < 0)
1905 STbp->buffer_bytes = 0;
1906 }
1907
1908 else {
1909 retval = STbp->syscall_result;
1910 }
1911
1912 }
1913
1914 else
1915 STbp->buffer_bytes = bytes;
1916
1917 if (STps->drv_block >= 0) {
1918 if (STp->block_size == 0)
1919 STps->drv_block++;
1920 else
1921 STps->drv_block += STbp->buffer_bytes / STp->block_size;
1922 }
1923 return retval;
1924}
1925
1926
1927
1928static ssize_t
1929st_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
1930{
1931 ssize_t total;
1932 ssize_t retval = 0;
1933 ssize_t i, transfer;
1934 int special, do_dio = 0;
1935 struct st_request *SRpnt = NULL;
1936 struct scsi_tape *STp = filp->private_data;
1937 struct st_modedef *STm;
1938 struct st_partstat *STps;
1939 struct st_buffer *STbp = STp->buffer;
1940 DEB( char *name = tape_name(STp); )
1941
1942 if (mutex_lock_interruptible(&STp->lock))
1943 return -ERESTARTSYS;
1944
1945 retval = rw_checks(STp, filp, count);
1946 if (retval || count == 0)
1947 goto out;
1948
1949 STm = &(STp->modes[STp->current_mode]);
1950 if (STp->block_size != 0 && (count % STp->block_size) != 0) {
1951 if (!STm->do_read_ahead) {
1952 retval = (-EINVAL);
1953 goto out;
1954 }
1955 STp->try_dio_now = 0;
1956 }
1957
1958 STps = &(STp->ps[STp->partition]);
1959 if (STps->rw == ST_WRITING) {
1960 retval = flush_buffer(STp, 0);
1961 if (retval)
1962 goto out;
1963 STps->rw = ST_READING;
1964 }
1965 DEB(
1966 if (debugging && STps->eof != ST_NOEOF)
1967 printk(ST_DEB_MSG "%s: EOF/EOM flag up (%d). Bytes %d\n", name,
1968 STps->eof, STbp->buffer_bytes);
1969 )
1970
1971 retval = setup_buffering(STp, buf, count, 1);
1972 if (retval)
1973 goto out;
1974 do_dio = STbp->do_dio;
1975
1976 if (STbp->buffer_bytes == 0 &&
1977 STps->eof >= ST_EOD_1) {
1978 if (STps->eof < ST_EOD) {
1979 STps->eof += 1;
1980 retval = 0;
1981 goto out;
1982 }
1983 retval = (-EIO);
1984 goto out;
1985 }
1986
1987 if (do_dio) {
1988
1989
1990 if (copy_from_user(&i, buf, 1) != 0 ||
1991 copy_to_user(buf, &i, 1) != 0 ||
1992 copy_from_user(&i, buf + count - 1, 1) != 0 ||
1993 copy_to_user(buf + count - 1, &i, 1) != 0) {
1994 retval = (-EFAULT);
1995 goto out;
1996 }
1997 }
1998
1999 STps->rw = ST_READING;
2000
2001
2002
2003 for (total = 0, special = 0; total < count && !special;) {
2004
2005
2006 if (STbp->buffer_bytes == 0) {
2007 special = read_tape(STp, count - total, &SRpnt);
2008 if (special < 0) {
2009 retval = special;
2010 goto out;
2011 }
2012 }
2013
2014
2015 if (STbp->buffer_bytes > 0) {
2016 DEB(
2017 if (debugging && STps->eof != ST_NOEOF)
2018 printk(ST_DEB_MSG
2019 "%s: EOF up (%d). Left %d, needed %d.\n", name,
2020 STps->eof, STbp->buffer_bytes,
2021 (int)(count - total));
2022 )
2023 transfer = STbp->buffer_bytes < count - total ?
2024 STbp->buffer_bytes : count - total;
2025 if (!do_dio) {
2026 i = from_buffer(STbp, buf, transfer);
2027 if (i) {
2028 retval = i;
2029 goto out;
2030 }
2031 }
2032 buf += transfer;
2033 total += transfer;
2034 }
2035
2036 if (STp->block_size == 0)
2037 break;
2038
2039 }
2040
2041
2042
2043 if (total == 0) {
2044 if (STps->eof == ST_FM_HIT) {
2045 STps->eof = ST_FM;
2046 STps->drv_block = 0;
2047 if (STps->drv_file >= 0)
2048 STps->drv_file++;
2049 } else if (STps->eof == ST_EOD_1) {
2050 STps->eof = ST_EOD_2;
2051 STps->drv_block = 0;
2052 if (STps->drv_file >= 0)
2053 STps->drv_file++;
2054 } else if (STps->eof == ST_EOD_2)
2055 STps->eof = ST_EOD;
2056 } else if (STps->eof == ST_FM)
2057 STps->eof = ST_NOEOF;
2058 retval = total;
2059
2060 out:
2061 if (SRpnt != NULL) {
2062 st_release_request(SRpnt);
2063 SRpnt = NULL;
2064 }
2065 if (do_dio) {
2066 release_buffering(STp, 1);
2067 STbp->buffer_bytes = 0;
2068 }
2069 mutex_unlock(&STp->lock);
2070
2071 return retval;
2072}
2073
2074
2075
2076DEB(
2077
2078static void st_log_options(struct scsi_tape * STp, struct st_modedef * STm, char *name)
2079{
2080 if (debugging) {
2081 printk(KERN_INFO
2082 "%s: Mode %d options: buffer writes: %d, async writes: %d, read ahead: %d\n",
2083 name, STp->current_mode, STm->do_buffer_writes, STm->do_async_writes,
2084 STm->do_read_ahead);
2085 printk(KERN_INFO
2086 "%s: can bsr: %d, two FMs: %d, fast mteom: %d, auto lock: %d,\n",
2087 name, STp->can_bsr, STp->two_fm, STp->fast_mteom, STp->do_auto_lock);
2088 printk(KERN_INFO
2089 "%s: defs for wr: %d, no block limits: %d, partitions: %d, s2 log: %d\n",
2090 name, STm->defaults_for_writes, STp->omit_blklims, STp->can_partitions,
2091 STp->scsi2_logical);
2092 printk(KERN_INFO
2093 "%s: sysv: %d nowait: %d\n", name, STm->sysv, STp->immediate);
2094 printk(KERN_INFO "%s: debugging: %d\n",
2095 name, debugging);
2096 }
2097}
2098 )
2099
2100
2101static int st_set_options(struct scsi_tape *STp, long options)
2102{
2103 int value;
2104 long code;
2105 struct st_modedef *STm;
2106 char *name = tape_name(STp);
2107 struct cdev *cd0, *cd1;
2108
2109 STm = &(STp->modes[STp->current_mode]);
2110 if (!STm->defined) {
2111 cd0 = STm->cdevs[0]; cd1 = STm->cdevs[1];
2112 memcpy(STm, &(STp->modes[0]), sizeof(struct st_modedef));
2113 STm->cdevs[0] = cd0; STm->cdevs[1] = cd1;
2114 modes_defined = 1;
2115 DEBC(printk(ST_DEB_MSG
2116 "%s: Initialized mode %d definition from mode 0\n",
2117 name, STp->current_mode));
2118 }
2119
2120 code = options & MT_ST_OPTIONS;
2121 if (code == MT_ST_BOOLEANS) {
2122 STm->do_buffer_writes = (options & MT_ST_BUFFER_WRITES) != 0;
2123 STm->do_async_writes = (options & MT_ST_ASYNC_WRITES) != 0;
2124 STm->defaults_for_writes = (options & MT_ST_DEF_WRITES) != 0;
2125 STm->do_read_ahead = (options & MT_ST_READ_AHEAD) != 0;
2126 STp->two_fm = (options & MT_ST_TWO_FM) != 0;
2127 STp->fast_mteom = (options & MT_ST_FAST_MTEOM) != 0;
2128 STp->do_auto_lock = (options & MT_ST_AUTO_LOCK) != 0;
2129 STp->can_bsr = (options & MT_ST_CAN_BSR) != 0;
2130 STp->omit_blklims = (options & MT_ST_NO_BLKLIMS) != 0;
2131 if ((STp->device)->scsi_level >= SCSI_2)
2132 STp->can_partitions = (options & MT_ST_CAN_PARTITIONS) != 0;
2133 STp->scsi2_logical = (options & MT_ST_SCSI2LOGICAL) != 0;
2134 STp->immediate = (options & MT_ST_NOWAIT) != 0;
2135 STm->sysv = (options & MT_ST_SYSV) != 0;
2136 DEB( debugging = (options & MT_ST_DEBUGGING) != 0;
2137 st_log_options(STp, STm, name); )
2138 } else if (code == MT_ST_SETBOOLEANS || code == MT_ST_CLEARBOOLEANS) {
2139 value = (code == MT_ST_SETBOOLEANS);
2140 if ((options & MT_ST_BUFFER_WRITES) != 0)
2141 STm->do_buffer_writes = value;
2142 if ((options & MT_ST_ASYNC_WRITES) != 0)
2143 STm->do_async_writes = value;
2144 if ((options & MT_ST_DEF_WRITES) != 0)
2145 STm->defaults_for_writes = value;
2146 if ((options & MT_ST_READ_AHEAD) != 0)
2147 STm->do_read_ahead = value;
2148 if ((options & MT_ST_TWO_FM) != 0)
2149 STp->two_fm = value;
2150 if ((options & MT_ST_FAST_MTEOM) != 0)
2151 STp->fast_mteom = value;
2152 if ((options & MT_ST_AUTO_LOCK) != 0)
2153 STp->do_auto_lock = value;
2154 if ((options & MT_ST_CAN_BSR) != 0)
2155 STp->can_bsr = value;
2156 if ((options & MT_ST_NO_BLKLIMS) != 0)
2157 STp->omit_blklims = value;
2158 if ((STp->device)->scsi_level >= SCSI_2 &&
2159 (options & MT_ST_CAN_PARTITIONS) != 0)
2160 STp->can_partitions = value;
2161 if ((options & MT_ST_SCSI2LOGICAL) != 0)
2162 STp->scsi2_logical = value;
2163 if ((options & MT_ST_NOWAIT) != 0)
2164 STp->immediate = value;
2165 if ((options & MT_ST_SYSV) != 0)
2166 STm->sysv = value;
2167 DEB(
2168 if ((options & MT_ST_DEBUGGING) != 0)
2169 debugging = value;
2170 st_log_options(STp, STm, name); )
2171 } else if (code == MT_ST_WRITE_THRESHOLD) {
2172
2173 } else if (code == MT_ST_DEF_BLKSIZE) {
2174 value = (options & ~MT_ST_OPTIONS);
2175 if (value == ~MT_ST_OPTIONS) {
2176 STm->default_blksize = (-1);
2177 DEBC( printk(KERN_INFO "%s: Default block size disabled.\n", name));
2178 } else {
2179 STm->default_blksize = value;
2180 DEBC( printk(KERN_INFO "%s: Default block size set to %d bytes.\n",
2181 name, STm->default_blksize));
2182 if (STp->ready == ST_READY) {
2183 STp->blksize_changed = 0;
2184 set_mode_densblk(STp, STm);
2185 }
2186 }
2187 } else if (code == MT_ST_TIMEOUTS) {
2188 value = (options & ~MT_ST_OPTIONS);
2189 if ((value & MT_ST_SET_LONG_TIMEOUT) != 0) {
2190 STp->long_timeout = (value & ~MT_ST_SET_LONG_TIMEOUT) * HZ;
2191 DEBC( printk(KERN_INFO "%s: Long timeout set to %d seconds.\n", name,
2192 (value & ~MT_ST_SET_LONG_TIMEOUT)));
2193 } else {
2194 STp->device->timeout = value * HZ;
2195 DEBC( printk(KERN_INFO "%s: Normal timeout set to %d seconds.\n",
2196 name, value) );
2197 }
2198 } else if (code == MT_ST_SET_CLN) {
2199 value = (options & ~MT_ST_OPTIONS) & 0xff;
2200 if (value != 0 &&
2201 value < EXTENDED_SENSE_START && value >= SCSI_SENSE_BUFFERSIZE)
2202 return (-EINVAL);
2203 STp->cln_mode = value;
2204 STp->cln_sense_mask = (options >> 8) & 0xff;
2205 STp->cln_sense_value = (options >> 16) & 0xff;
2206 printk(KERN_INFO
2207 "%s: Cleaning request mode %d, mask %02x, value %02x\n",
2208 name, value, STp->cln_sense_mask, STp->cln_sense_value);
2209 } else if (code == MT_ST_DEF_OPTIONS) {
2210 code = (options & ~MT_ST_CLEAR_DEFAULT);
2211 value = (options & MT_ST_CLEAR_DEFAULT);
2212 if (code == MT_ST_DEF_DENSITY) {
2213 if (value == MT_ST_CLEAR_DEFAULT) {
2214 STm->default_density = (-1);
2215 DEBC( printk(KERN_INFO "%s: Density default disabled.\n",
2216 name));
2217 } else {
2218 STm->default_density = value & 0xff;
2219 DEBC( printk(KERN_INFO "%s: Density default set to %x\n",
2220 name, STm->default_density));
2221 if (STp->ready == ST_READY) {
2222 STp->density_changed = 0;
2223 set_mode_densblk(STp, STm);
2224 }
2225 }
2226 } else if (code == MT_ST_DEF_DRVBUFFER) {
2227 if (value == MT_ST_CLEAR_DEFAULT) {
2228 STp->default_drvbuffer = 0xff;
2229 DEBC( printk(KERN_INFO
2230 "%s: Drive buffer default disabled.\n", name));
2231 } else {
2232 STp->default_drvbuffer = value & 7;
2233 DEBC( printk(KERN_INFO
2234 "%s: Drive buffer default set to %x\n",
2235 name, STp->default_drvbuffer));
2236 if (STp->ready == ST_READY)
2237 st_int_ioctl(STp, MTSETDRVBUFFER, STp->default_drvbuffer);
2238 }
2239 } else if (code == MT_ST_DEF_COMPRESSION) {
2240 if (value == MT_ST_CLEAR_DEFAULT) {
2241 STm->default_compression = ST_DONT_TOUCH;
2242 DEBC( printk(KERN_INFO
2243 "%s: Compression default disabled.\n", name));
2244 } else {
2245 if ((value & 0xff00) != 0) {
2246 STp->c_algo = (value & 0xff00) >> 8;
2247 DEBC( printk(KERN_INFO "%s: Compression algorithm set to 0x%x.\n",
2248 name, STp->c_algo));
2249 }
2250 if ((value & 0xff) != 0xff) {
2251 STm->default_compression = (value & 1 ? ST_YES : ST_NO);
2252 DEBC( printk(KERN_INFO "%s: Compression default set to %x\n",
2253 name, (value & 1)));
2254 if (STp->ready == ST_READY) {
2255 STp->compression_changed = 0;
2256 st_compression(STp, (STm->default_compression == ST_YES));
2257 }
2258 }
2259 }
2260 }
2261 } else
2262 return (-EIO);
2263
2264 return 0;
2265}
2266
2267#define MODE_HEADER_LENGTH 4
2268
2269
2270#define MH_OFF_DATA_LENGTH 0
2271#define MH_OFF_MEDIUM_TYPE 1
2272#define MH_OFF_DEV_SPECIFIC 2
2273#define MH_OFF_BDESCS_LENGTH 3
2274#define MP_OFF_PAGE_NBR 0
2275#define MP_OFF_PAGE_LENGTH 1
2276
2277
2278#define MH_BIT_WP 0x80
2279#define MP_MSK_PAGE_NBR 0x3f
2280
2281
2282#define MODE_SENSE_OMIT_BDESCS 0x08
2283
2284#define MODE_SELECT_PAGE_FORMAT 0x10
2285
2286
2287
2288
2289static int read_mode_page(struct scsi_tape *STp, int page, int omit_block_descs)
2290{
2291 unsigned char cmd[MAX_COMMAND_SIZE];
2292 struct st_request *SRpnt = NULL;
2293
2294 memset(cmd, 0, MAX_COMMAND_SIZE);
2295 cmd[0] = MODE_SENSE;
2296 if (omit_block_descs)
2297 cmd[1] = MODE_SENSE_OMIT_BDESCS;
2298 cmd[2] = page;
2299 cmd[4] = 255;
2300
2301 SRpnt = st_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_FROM_DEVICE,
2302 STp->device->timeout, 0, 1);
2303 if (SRpnt == NULL)
2304 return (STp->buffer)->syscall_result;
2305
2306 st_release_request(SRpnt);
2307
2308 return (STp->buffer)->syscall_result;
2309}
2310
2311
2312
2313
2314static int write_mode_page(struct scsi_tape *STp, int page, int slow)
2315{
2316 int pgo;
2317 unsigned char cmd[MAX_COMMAND_SIZE];
2318 struct st_request *SRpnt = NULL;
2319
2320 memset(cmd, 0, MAX_COMMAND_SIZE);
2321 cmd[0] = MODE_SELECT;
2322 cmd[1] = MODE_SELECT_PAGE_FORMAT;
2323 pgo = MODE_HEADER_LENGTH + (STp->buffer)->b_data[MH_OFF_BDESCS_LENGTH];
2324 cmd[4] = pgo + (STp->buffer)->b_data[pgo + MP_OFF_PAGE_LENGTH] + 2;
2325
2326
2327 (STp->buffer)->b_data[MH_OFF_DATA_LENGTH] = 0;
2328 (STp->buffer)->b_data[MH_OFF_MEDIUM_TYPE] = 0;
2329 (STp->buffer)->b_data[MH_OFF_DEV_SPECIFIC] &= ~MH_BIT_WP;
2330 (STp->buffer)->b_data[pgo + MP_OFF_PAGE_NBR] &= MP_MSK_PAGE_NBR;
2331
2332 SRpnt = st_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_TO_DEVICE,
2333 (slow ? STp->long_timeout : STp->device->timeout), 0, 1);
2334 if (SRpnt == NULL)
2335 return (STp->buffer)->syscall_result;
2336
2337 st_release_request(SRpnt);
2338
2339 return (STp->buffer)->syscall_result;
2340}
2341
2342
2343#define COMPRESSION_PAGE 0x0f
2344#define COMPRESSION_PAGE_LENGTH 16
2345
2346#define CP_OFF_DCE_DCC 2
2347#define CP_OFF_C_ALGO 7
2348
2349#define DCE_MASK 0x80
2350#define DCC_MASK 0x40
2351#define RED_MASK 0x60
2352
2353
2354
2355
2356
2357
2358
2359
2360static int st_compression(struct scsi_tape * STp, int state)
2361{
2362 int retval;
2363 int mpoffs;
2364 unsigned char *b_data = (STp->buffer)->b_data;
2365 DEB( char *name = tape_name(STp); )
2366
2367 if (STp->ready != ST_READY)
2368 return (-EIO);
2369
2370
2371 retval = read_mode_page(STp, COMPRESSION_PAGE, 0);
2372 if (retval) {
2373 DEBC(printk(ST_DEB_MSG "%s: Compression mode page not supported.\n",
2374 name));
2375 return (-EIO);
2376 }
2377
2378 mpoffs = MODE_HEADER_LENGTH + b_data[MH_OFF_BDESCS_LENGTH];
2379 DEBC(printk(ST_DEB_MSG "%s: Compression state is %d.\n", name,
2380 (b_data[mpoffs + CP_OFF_DCE_DCC] & DCE_MASK ? 1 : 0)));
2381
2382
2383 if ((b_data[mpoffs + CP_OFF_DCE_DCC] & DCC_MASK) == 0) {
2384 DEBC(printk(ST_DEB_MSG "%s: Compression not supported.\n", name));
2385 return (-EIO);
2386 }
2387
2388
2389 if (state) {
2390 b_data[mpoffs + CP_OFF_DCE_DCC] |= DCE_MASK;
2391 if (STp->c_algo != 0)
2392 b_data[mpoffs + CP_OFF_C_ALGO] = STp->c_algo;
2393 }
2394 else {
2395 b_data[mpoffs + CP_OFF_DCE_DCC] &= ~DCE_MASK;
2396 if (STp->c_algo != 0)
2397 b_data[mpoffs + CP_OFF_C_ALGO] = 0;
2398 }
2399
2400 retval = write_mode_page(STp, COMPRESSION_PAGE, 0);
2401 if (retval) {
2402 DEBC(printk(ST_DEB_MSG "%s: Compression change failed.\n", name));
2403 return (-EIO);
2404 }
2405 DEBC(printk(ST_DEB_MSG "%s: Compression state changed to %d.\n",
2406 name, state));
2407
2408 STp->compression_changed = 1;
2409 return 0;
2410}
2411
2412
2413
2414static int do_load_unload(struct scsi_tape *STp, struct file *filp, int load_code)
2415{
2416 int retval = (-EIO), timeout;
2417 DEB( char *name = tape_name(STp); )
2418 unsigned char cmd[MAX_COMMAND_SIZE];
2419 struct st_partstat *STps;
2420 struct st_request *SRpnt;
2421
2422 if (STp->ready != ST_READY && !load_code) {
2423 if (STp->ready == ST_NO_TAPE)
2424 return (-ENOMEDIUM);
2425 else
2426 return (-EIO);
2427 }
2428
2429 memset(cmd, 0, MAX_COMMAND_SIZE);
2430 cmd[0] = START_STOP;
2431 if (load_code)
2432 cmd[4] |= 1;
2433
2434
2435
2436 if (load_code >= 1 + MT_ST_HPLOADER_OFFSET
2437 && load_code <= 6 + MT_ST_HPLOADER_OFFSET) {
2438 DEBC(printk(ST_DEB_MSG "%s: Enhanced %sload slot %2d.\n",
2439 name, (cmd[4]) ? "" : "un",
2440 load_code - MT_ST_HPLOADER_OFFSET));
2441 cmd[3] = load_code - MT_ST_HPLOADER_OFFSET;
2442 }
2443 if (STp->immediate) {
2444 cmd[1] = 1;
2445 timeout = STp->device->timeout;
2446 }
2447 else
2448 timeout = STp->long_timeout;
2449
2450 DEBC(
2451 if (!load_code)
2452 printk(ST_DEB_MSG "%s: Unloading tape.\n", name);
2453 else
2454 printk(ST_DEB_MSG "%s: Loading tape.\n", name);
2455 );
2456
2457 SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
2458 timeout, MAX_RETRIES, 1);
2459 if (!SRpnt)
2460 return (STp->buffer)->syscall_result;
2461
2462 retval = (STp->buffer)->syscall_result;
2463 st_release_request(SRpnt);
2464
2465 if (!retval) {
2466
2467 if (!load_code) {
2468 STp->rew_at_close = 0;
2469 STp->ready = ST_NO_TAPE;
2470 }
2471 else {
2472 STp->rew_at_close = STp->autorew_dev;
2473 retval = check_tape(STp, filp);
2474 if (retval > 0)
2475 retval = 0;
2476 }
2477 }
2478 else {
2479 STps = &(STp->ps[STp->partition]);
2480 STps->drv_file = STps->drv_block = (-1);
2481 }
2482
2483 return retval;
2484}
2485
2486#if DEBUG
2487#define ST_DEB_FORWARD 0
2488#define ST_DEB_BACKWARD 1
2489static void deb_space_print(char *name, int direction, char *units, unsigned char *cmd)
2490{
2491 s32 sc;
2492
2493 sc = cmd[2] & 0x80 ? 0xff000000 : 0;
2494 sc |= (cmd[2] << 16) | (cmd[3] << 8) | cmd[4];
2495 if (direction)
2496 sc = -sc;
2497 printk(ST_DEB_MSG "%s: Spacing tape %s over %d %s.\n", name,
2498 direction ? "backward" : "forward", sc, units);
2499}
2500#endif
2501
2502
2503
2504static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned long arg)
2505{
2506 int timeout;
2507 long ltmp;
2508 int ioctl_result;
2509 int chg_eof = 1;
2510 unsigned char cmd[MAX_COMMAND_SIZE];
2511 struct st_request *SRpnt;
2512 struct st_partstat *STps;
2513 int fileno, blkno, at_sm, undone;
2514 int datalen = 0, direction = DMA_NONE;
2515 char *name = tape_name(STp);
2516
2517 WARN_ON(STp->buffer->do_dio != 0);
2518 if (STp->ready != ST_READY) {
2519 if (STp->ready == ST_NO_TAPE)
2520 return (-ENOMEDIUM);
2521 else
2522 return (-EIO);
2523 }
2524 timeout = STp->long_timeout;
2525 STps = &(STp->ps[STp->partition]);
2526 fileno = STps->drv_file;
2527 blkno = STps->drv_block;
2528 at_sm = STps->at_sm;
2529
2530 memset(cmd, 0, MAX_COMMAND_SIZE);
2531 switch (cmd_in) {
2532 case MTFSFM:
2533 chg_eof = 0;
2534 case MTFSF:
2535 cmd[0] = SPACE;
2536 cmd[1] = 0x01;
2537 cmd[2] = (arg >> 16);
2538 cmd[3] = (arg >> 8);
2539 cmd[4] = arg;
2540 DEBC(deb_space_print(name, ST_DEB_FORWARD, "filemarks", cmd);)
2541 if (fileno >= 0)
2542 fileno += arg;
2543 blkno = 0;
2544 at_sm &= (arg == 0);
2545 break;
2546 case MTBSFM:
2547 chg_eof = 0;
2548 case MTBSF:
2549 cmd[0] = SPACE;
2550 cmd[1] = 0x01;
2551 ltmp = (-arg);
2552 cmd[2] = (ltmp >> 16);
2553 cmd[3] = (ltmp >> 8);
2554 cmd[4] = ltmp;
2555 DEBC(deb_space_print(name, ST_DEB_BACKWARD, "filemarks", cmd);)
2556 if (fileno >= 0)
2557 fileno -= arg;
2558 blkno = (-1);
2559 at_sm &= (arg == 0);
2560 break;
2561 case MTFSR:
2562 cmd[0] = SPACE;
2563 cmd[1] = 0x00;
2564 cmd[2] = (arg >> 16);
2565 cmd[3] = (arg >> 8);
2566 cmd[4] = arg;
2567 DEBC(deb_space_print(name, ST_DEB_FORWARD, "blocks", cmd);)
2568 if (blkno >= 0)
2569 blkno += arg;
2570 at_sm &= (arg == 0);
2571 break;
2572 case MTBSR:
2573 cmd[0] = SPACE;
2574 cmd[1] = 0x00;
2575 ltmp = (-arg);
2576 cmd[2] = (ltmp >> 16);
2577 cmd[3] = (ltmp >> 8);
2578 cmd[4] = ltmp;
2579 DEBC(deb_space_print(name, ST_DEB_BACKWARD, "blocks", cmd);)
2580 if (blkno >= 0)
2581 blkno -= arg;
2582 at_sm &= (arg == 0);
2583 break;
2584 case MTFSS:
2585 cmd[0] = SPACE;
2586 cmd[1] = 0x04;
2587 cmd[2] = (arg >> 16);
2588 cmd[3] = (arg >> 8);
2589 cmd[4] = arg;
2590 DEBC(deb_space_print(name, ST_DEB_FORWARD, "setmarks", cmd);)
2591 if (arg != 0) {
2592 blkno = fileno = (-1);
2593 at_sm = 1;
2594 }
2595 break;
2596 case MTBSS:
2597 cmd[0] = SPACE;
2598 cmd[1] = 0x04;
2599 ltmp = (-arg);
2600 cmd[2] = (ltmp >> 16);
2601 cmd[3] = (ltmp >> 8);
2602 cmd[4] = ltmp;
2603 DEBC(deb_space_print(name, ST_DEB_BACKWARD, "setmarks", cmd);)
2604 if (arg != 0) {
2605 blkno = fileno = (-1);
2606 at_sm = 1;
2607 }
2608 break;
2609 case MTWEOF:
2610 case MTWSM:
2611 if (STp->write_prot)
2612 return (-EACCES);
2613 cmd[0] = WRITE_FILEMARKS;
2614 if (cmd_in == MTWSM)
2615 cmd[1] = 2;
2616 cmd[2] = (arg >> 16);
2617 cmd[3] = (arg >> 8);
2618 cmd[4] = arg;
2619 timeout = STp->device->timeout;
2620 DEBC(
2621 if (cmd_in == MTWEOF)
2622 printk(ST_DEB_MSG "%s: Writing %d filemarks.\n", name,
2623 cmd[2] * 65536 + cmd[3] * 256 + cmd[4]);
2624 else
2625 printk(ST_DEB_MSG "%s: Writing %d setmarks.\n", name,
2626 cmd[2] * 65536 + cmd[3] * 256 + cmd[4]);
2627 )
2628 if (fileno >= 0)
2629 fileno += arg;
2630 blkno = 0;
2631 at_sm = (cmd_in == MTWSM);
2632 break;
2633 case MTREW:
2634 cmd[0] = REZERO_UNIT;
2635 if (STp->immediate) {
2636 cmd[1] = 1;
2637 timeout = STp->device->timeout;
2638 }
2639 DEBC(printk(ST_DEB_MSG "%s: Rewinding tape.\n", name));
2640 fileno = blkno = at_sm = 0;
2641 break;
2642 case MTNOP:
2643 DEBC(printk(ST_DEB_MSG "%s: No op on tape.\n", name));
2644 return 0;
2645 break;
2646 case MTRETEN:
2647 cmd[0] = START_STOP;
2648 if (STp->immediate) {
2649 cmd[1] = 1;
2650 timeout = STp->device->timeout;
2651 }
2652 cmd[4] = 3;
2653 DEBC(printk(ST_DEB_MSG "%s: Retensioning tape.\n", name));
2654 fileno = blkno = at_sm = 0;
2655 break;
2656 case MTEOM:
2657 if (!STp->fast_mteom) {
2658
2659 ioctl_result = st_int_ioctl(STp, MTFSF, 0x7fffff);
2660 fileno = STps->drv_file;
2661 if (STps->eof >= ST_EOD_1)
2662 return 0;
2663
2664
2665
2666
2667 } else
2668 fileno = (-1);
2669 cmd[0] = SPACE;
2670 cmd[1] = 3;
2671 DEBC(printk(ST_DEB_MSG "%s: Spacing to end of recorded medium.\n",
2672 name));
2673 blkno = -1;
2674 at_sm = 0;
2675 break;
2676 case MTERASE:
2677 if (STp->write_prot)
2678 return (-EACCES);
2679 cmd[0] = ERASE;
2680 cmd[1] = (arg ? 1 : 0);
2681 if (STp->immediate) {
2682 cmd[1] |= 2;
2683 timeout = STp->device->timeout;
2684 }
2685 else
2686 timeout = STp->long_timeout * 8;
2687
2688 DEBC(printk(ST_DEB_MSG "%s: Erasing tape.\n", name));
2689 fileno = blkno = at_sm = 0;
2690 break;
2691 case MTSETBLK:
2692 case MTSETDENSITY:
2693 case MTSETDRVBUFFER:
2694 case SET_DENS_AND_BLK:
2695 chg_eof = 0;
2696 if (STp->dirty || (STp->buffer)->buffer_bytes != 0)
2697 return (-EIO);
2698 if ((cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) &&
2699 (arg & MT_ST_BLKSIZE_MASK) != 0 &&
2700 STp->max_block > 0 &&
2701 ((arg & MT_ST_BLKSIZE_MASK) < STp->min_block ||
2702 (arg & MT_ST_BLKSIZE_MASK) > STp->max_block)) {
2703 printk(KERN_WARNING "%s: Illegal block size.\n", name);
2704 return (-EINVAL);
2705 }
2706 cmd[0] = MODE_SELECT;
2707 if ((STp->use_pf & USE_PF))
2708 cmd[1] = MODE_SELECT_PAGE_FORMAT;
2709 cmd[4] = datalen = 12;
2710 direction = DMA_TO_DEVICE;
2711
2712 memset((STp->buffer)->b_data, 0, 12);
2713 if (cmd_in == MTSETDRVBUFFER)
2714 (STp->buffer)->b_data[2] = (arg & 7) << 4;
2715 else
2716 (STp->buffer)->b_data[2] =
2717 STp->drv_buffer << 4;
2718 (STp->buffer)->b_data[3] = 8;
2719 if (cmd_in == MTSETDENSITY) {
2720 (STp->buffer)->b_data[4] = arg;
2721 STp->density_changed = 1;
2722 } else if (cmd_in == SET_DENS_AND_BLK)
2723 (STp->buffer)->b_data[4] = arg >> 24;
2724 else
2725 (STp->buffer)->b_data[4] = STp->density;
2726 if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) {
2727 ltmp = arg & MT_ST_BLKSIZE_MASK;
2728 if (cmd_in == MTSETBLK)
2729 STp->blksize_changed = 1;
2730 } else
2731 ltmp = STp->block_size;
2732 (STp->buffer)->b_data[9] = (ltmp >> 16);
2733 (STp->buffer)->b_data[10] = (ltmp >> 8);
2734 (STp->buffer)->b_data[11] = ltmp;
2735 timeout = STp->device->timeout;
2736 DEBC(
2737 if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK)
2738 printk(ST_DEB_MSG
2739 "%s: Setting block size to %d bytes.\n", name,
2740 (STp->buffer)->b_data[9] * 65536 +
2741 (STp->buffer)->b_data[10] * 256 +
2742 (STp->buffer)->b_data[11]);
2743 if (cmd_in == MTSETDENSITY || cmd_in == SET_DENS_AND_BLK)
2744 printk(ST_DEB_MSG
2745 "%s: Setting density code to %x.\n", name,
2746 (STp->buffer)->b_data[4]);
2747 if (cmd_in == MTSETDRVBUFFER)
2748 printk(ST_DEB_MSG
2749 "%s: Setting drive buffer code to %d.\n", name,
2750 ((STp->buffer)->b_data[2] >> 4) & 7);
2751 )
2752 break;
2753 default:
2754 return (-ENOSYS);
2755 }
2756
2757 SRpnt = st_do_scsi(NULL, STp, cmd, datalen, direction,
2758 timeout, MAX_RETRIES, 1);
2759 if (!SRpnt)
2760 return (STp->buffer)->syscall_result;
2761
2762 ioctl_result = (STp->buffer)->syscall_result;
2763
2764 if (!ioctl_result) {
2765 st_release_request(SRpnt);
2766 SRpnt = NULL;
2767 STps->drv_block = blkno;
2768 STps->drv_file = fileno;
2769 STps->at_sm = at_sm;
2770
2771 if (cmd_in == MTBSFM)
2772 ioctl_result = st_int_ioctl(STp, MTFSF, 1);
2773 else if (cmd_in == MTFSFM)
2774 ioctl_result = st_int_ioctl(STp, MTBSF, 1);
2775
2776 if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) {
2777 int old_block_size = STp->block_size;
2778 STp->block_size = arg & MT_ST_BLKSIZE_MASK;
2779 if (STp->block_size != 0) {
2780 if (old_block_size == 0)
2781 normalize_buffer(STp->buffer);
2782 (STp->buffer)->buffer_blocks =
2783 (STp->buffer)->buffer_size / STp->block_size;
2784 }
2785 (STp->buffer)->buffer_bytes = (STp->buffer)->read_pointer = 0;
2786 if (cmd_in == SET_DENS_AND_BLK)
2787 STp->density = arg >> MT_ST_DENSITY_SHIFT;
2788 } else if (cmd_in == MTSETDRVBUFFER)
2789 STp->drv_buffer = (arg & 7);
2790 else if (cmd_in == MTSETDENSITY)
2791 STp->density = arg;
2792
2793 if (cmd_in == MTEOM)
2794 STps->eof = ST_EOD;
2795 else if (cmd_in == MTFSF)
2796 STps->eof = ST_FM;
2797 else if (chg_eof)
2798 STps->eof = ST_NOEOF;
2799
2800 if (cmd_in == MTWEOF)
2801 STps->rw = ST_IDLE;
2802 } else {
2803
2804 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
2805
2806 if (cmdstatp->flags & SENSE_EOM) {
2807 if (cmd_in != MTBSF && cmd_in != MTBSFM &&
2808 cmd_in != MTBSR && cmd_in != MTBSS)
2809 STps->eof = ST_EOM_OK;
2810 STps->drv_block = 0;
2811 }
2812
2813 if (cmdstatp->remainder_valid)
2814 undone = (int)cmdstatp->uremainder64;
2815 else
2816 undone = 0;
2817
2818 if (cmd_in == MTWEOF &&
2819 cmdstatp->have_sense &&
2820 (cmdstatp->flags & SENSE_EOM)) {
2821 if (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
2822 cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) {
2823 ioctl_result = 0;
2824 STps->eof = ST_NOEOF;
2825 } else {
2826 if (fileno >= 0)
2827 fileno -= undone;
2828 if (undone < arg)
2829 STps->eof = ST_NOEOF;
2830 }
2831 STps->drv_file = fileno;
2832 } else if ((cmd_in == MTFSF) || (cmd_in == MTFSFM)) {
2833 if (fileno >= 0)
2834 STps->drv_file = fileno - undone;
2835 else
2836 STps->drv_file = fileno;
2837 STps->drv_block = -1;
2838 STps->eof = ST_NOEOF;
2839 } else if ((cmd_in == MTBSF) || (cmd_in == MTBSFM)) {
2840 if (arg > 0 && undone < 0)
2841 undone = (-undone);
2842 if (STps->drv_file >= 0)
2843 STps->drv_file = fileno + undone;
2844 STps->drv_block = 0;
2845 STps->eof = ST_NOEOF;
2846 } else if (cmd_in == MTFSR) {
2847 if (cmdstatp->flags & SENSE_FMK) {
2848 if (STps->drv_file >= 0)
2849 STps->drv_file++;
2850 STps->drv_block = 0;
2851 STps->eof = ST_FM;
2852 } else {
2853 if (blkno >= undone)
2854 STps->drv_block = blkno - undone;
2855 else
2856 STps->drv_block = (-1);
2857 STps->eof = ST_NOEOF;
2858 }
2859 } else if (cmd_in == MTBSR) {
2860 if (cmdstatp->flags & SENSE_FMK) {
2861 STps->drv_file--;
2862 STps->drv_block = (-1);
2863 } else {
2864 if (arg > 0 && undone < 0)
2865 undone = (-undone);
2866 if (STps->drv_block >= 0)
2867 STps->drv_block = blkno + undone;
2868 }
2869 STps->eof = ST_NOEOF;
2870 } else if (cmd_in == MTEOM) {
2871 STps->drv_file = (-1);
2872 STps->drv_block = (-1);
2873 STps->eof = ST_EOD;
2874 } else if (cmd_in == MTSETBLK ||
2875 cmd_in == MTSETDENSITY ||
2876 cmd_in == MTSETDRVBUFFER ||
2877 cmd_in == SET_DENS_AND_BLK) {
2878 if (cmdstatp->sense_hdr.sense_key == ILLEGAL_REQUEST &&
2879 !(STp->use_pf & PF_TESTED)) {
2880
2881
2882 STp->use_pf = !STp->use_pf | PF_TESTED;
2883 st_release_request(SRpnt);
2884 SRpnt = NULL;
2885 return st_int_ioctl(STp, cmd_in, arg);
2886 }
2887 } else if (chg_eof)
2888 STps->eof = ST_NOEOF;
2889
2890 if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK)
2891 STps->eof = ST_EOD;
2892
2893 st_release_request(SRpnt);
2894 SRpnt = NULL;
2895 }
2896
2897 return ioctl_result;
2898}
2899
2900
2901
2902
2903
2904static int get_location(struct scsi_tape *STp, unsigned int *block, int *partition,
2905 int logical)
2906{
2907 int result;
2908 unsigned char scmd[MAX_COMMAND_SIZE];
2909 struct st_request *SRpnt;
2910 DEB( char *name = tape_name(STp); )
2911
2912 if (STp->ready != ST_READY)
2913 return (-EIO);
2914
2915 memset(scmd, 0, MAX_COMMAND_SIZE);
2916 if ((STp->device)->scsi_level < SCSI_2) {
2917 scmd[0] = QFA_REQUEST_BLOCK;
2918 scmd[4] = 3;
2919 } else {
2920 scmd[0] = READ_POSITION;
2921 if (!logical && !STp->scsi2_logical)
2922 scmd[1] = 1;
2923 }
2924 SRpnt = st_do_scsi(NULL, STp, scmd, 20, DMA_FROM_DEVICE,
2925 STp->device->timeout, MAX_READY_RETRIES, 1);
2926 if (!SRpnt)
2927 return (STp->buffer)->syscall_result;
2928
2929 if ((STp->buffer)->syscall_result != 0 ||
2930 (STp->device->scsi_level >= SCSI_2 &&
2931 ((STp->buffer)->b_data[0] & 4) != 0)) {
2932 *block = *partition = 0;
2933 DEBC(printk(ST_DEB_MSG "%s: Can't read tape position.\n", name));
2934 result = (-EIO);
2935 } else {
2936 result = 0;
2937 if ((STp->device)->scsi_level < SCSI_2) {
2938 *block = ((STp->buffer)->b_data[0] << 16)
2939 + ((STp->buffer)->b_data[1] << 8)
2940 + (STp->buffer)->b_data[2];
2941 *partition = 0;
2942 } else {
2943 *block = ((STp->buffer)->b_data[4] << 24)
2944 + ((STp->buffer)->b_data[5] << 16)
2945 + ((STp->buffer)->b_data[6] << 8)
2946 + (STp->buffer)->b_data[7];
2947 *partition = (STp->buffer)->b_data[1];
2948 if (((STp->buffer)->b_data[0] & 0x80) &&
2949 (STp->buffer)->b_data[1] == 0)
2950 STp->ps[0].drv_block = STp->ps[0].drv_file = 0;
2951 }
2952 DEBC(printk(ST_DEB_MSG "%s: Got tape pos. blk %d part %d.\n", name,
2953 *block, *partition));
2954 }
2955 st_release_request(SRpnt);
2956 SRpnt = NULL;
2957
2958 return result;
2959}
2960
2961
2962
2963
2964static int set_location(struct scsi_tape *STp, unsigned int block, int partition,
2965 int logical)
2966{
2967 struct st_partstat *STps;
2968 int result, p;
2969 unsigned int blk;
2970 int timeout;
2971 unsigned char scmd[MAX_COMMAND_SIZE];
2972 struct st_request *SRpnt;
2973 DEB( char *name = tape_name(STp); )
2974
2975 if (STp->ready != ST_READY)
2976 return (-EIO);
2977 timeout = STp->long_timeout;
2978 STps = &(STp->ps[STp->partition]);
2979
2980 DEBC(printk(ST_DEB_MSG "%s: Setting block to %d and partition to %d.\n",
2981 name, block, partition));
2982 DEB(if (partition < 0)
2983 return (-EIO); )
2984
2985
2986 if ((!STp->can_partitions && partition != 0) ||
2987 partition >= ST_NBR_PARTITIONS)
2988 return (-EINVAL);
2989 if (partition != STp->partition) {
2990 if (get_location(STp, &blk, &p, 1))
2991 STps->last_block_valid = 0;
2992 else {
2993 STps->last_block_valid = 1;
2994 STps->last_block_visited = blk;
2995 DEBC(printk(ST_DEB_MSG
2996 "%s: Visited block %d for partition %d saved.\n",
2997 name, blk, STp->partition));
2998 }
2999 }
3000
3001 memset(scmd, 0, MAX_COMMAND_SIZE);
3002 if ((STp->device)->scsi_level < SCSI_2) {
3003 scmd[0] = QFA_SEEK_BLOCK;
3004 scmd[2] = (block >> 16);
3005 scmd[3] = (block >> 8);
3006 scmd[4] = block;
3007 scmd[5] = 0;
3008 } else {
3009 scmd[0] = SEEK_10;
3010 scmd[3] = (block >> 24);
3011 scmd[4] = (block >> 16);
3012 scmd[5] = (block >> 8);
3013 scmd[6] = block;
3014 if (!logical && !STp->scsi2_logical)
3015 scmd[1] = 4;
3016 if (STp->partition != partition) {
3017 scmd[1] |= 2;
3018 scmd[8] = partition;
3019 DEBC(printk(ST_DEB_MSG
3020 "%s: Trying to change partition from %d to %d\n",
3021 name, STp->partition, partition));
3022 }
3023 }
3024 if (STp->immediate) {
3025 scmd[1] |= 1;
3026 timeout = STp->device->timeout;
3027 }
3028
3029 SRpnt = st_do_scsi(NULL, STp, scmd, 0, DMA_NONE,
3030 timeout, MAX_READY_RETRIES, 1);
3031 if (!SRpnt)
3032 return (STp->buffer)->syscall_result;
3033
3034 STps->drv_block = STps->drv_file = (-1);
3035 STps->eof = ST_NOEOF;
3036 if ((STp->buffer)->syscall_result != 0) {
3037 result = (-EIO);
3038 if (STp->can_partitions &&
3039 (STp->device)->scsi_level >= SCSI_2 &&
3040 (p = find_partition(STp)) >= 0)
3041 STp->partition = p;
3042 } else {
3043 if (STp->can_partitions) {
3044 STp->partition = partition;
3045 STps = &(STp->ps[partition]);
3046 if (!STps->last_block_valid ||
3047 STps->last_block_visited != block) {
3048 STps->at_sm = 0;
3049 STps->rw = ST_IDLE;
3050 }
3051 } else
3052 STps->at_sm = 0;
3053 if (block == 0)
3054 STps->drv_block = STps->drv_file = 0;
3055 result = 0;
3056 }
3057
3058 st_release_request(SRpnt);
3059 SRpnt = NULL;
3060
3061 return result;
3062}
3063
3064
3065
3066
3067static int find_partition(struct scsi_tape *STp)
3068{
3069 int i, partition;
3070 unsigned int block;
3071
3072 if ((i = get_location(STp, &block, &partition, 1)) < 0)
3073 return i;
3074 if (partition >= ST_NBR_PARTITIONS)
3075 return (-EIO);
3076 return partition;
3077}
3078
3079
3080
3081static int switch_partition(struct scsi_tape *STp)
3082{
3083 struct st_partstat *STps;
3084
3085 if (STp->partition == STp->new_partition)
3086 return 0;
3087 STps = &(STp->ps[STp->new_partition]);
3088 if (!STps->last_block_valid)
3089 STps->last_block_visited = 0;
3090 return set_location(STp, STps->last_block_visited, STp->new_partition, 1);
3091}
3092
3093
3094
3095#define PART_PAGE 0x11
3096#define PART_PAGE_FIXED_LENGTH 8
3097
3098#define PP_OFF_MAX_ADD_PARTS 2
3099#define PP_OFF_NBR_ADD_PARTS 3
3100#define PP_OFF_FLAGS 4
3101#define PP_OFF_PART_UNITS 6
3102#define PP_OFF_RESERVED 7
3103
3104#define PP_BIT_IDP 0x20
3105#define PP_MSK_PSUM_MB 0x10
3106
3107
3108
3109static int nbr_partitions(struct scsi_tape *STp)
3110{
3111 int result;
3112 DEB( char *name = tape_name(STp); )
3113
3114 if (STp->ready != ST_READY)
3115 return (-EIO);
3116
3117 result = read_mode_page(STp, PART_PAGE, 1);
3118
3119 if (result) {
3120 DEBC(printk(ST_DEB_MSG "%s: Can't read medium partition page.\n",
3121 name));
3122 result = (-EIO);
3123 } else {
3124 result = (STp->buffer)->b_data[MODE_HEADER_LENGTH +
3125 PP_OFF_NBR_ADD_PARTS] + 1;
3126 DEBC(printk(ST_DEB_MSG "%s: Number of partitions %d.\n", name, result));
3127 }
3128
3129 return result;
3130}
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152static int partition_tape(struct scsi_tape *STp, int size)
3153{
3154 char *name = tape_name(STp);
3155 int result;
3156 int pgo, psd_cnt, psdo;
3157 unsigned char *bp;
3158
3159 result = read_mode_page(STp, PART_PAGE, 0);
3160 if (result) {
3161 DEBC(printk(ST_DEB_MSG "%s: Can't read partition mode page.\n", name));
3162 return result;
3163 }
3164
3165 bp = (STp->buffer)->b_data;
3166 pgo = MODE_HEADER_LENGTH + bp[MH_OFF_BDESCS_LENGTH];
3167 DEBC(printk(ST_DEB_MSG "%s: Partition page length is %d bytes.\n",
3168 name, bp[pgo + MP_OFF_PAGE_LENGTH] + 2));
3169
3170 psd_cnt = (bp[pgo + MP_OFF_PAGE_LENGTH] + 2 - PART_PAGE_FIXED_LENGTH) / 2;
3171 psdo = pgo + PART_PAGE_FIXED_LENGTH;
3172 if (psd_cnt > bp[pgo + PP_OFF_MAX_ADD_PARTS]) {
3173 bp[psdo] = bp[psdo + 1] = 0xff;
3174 psdo += 2;
3175 }
3176 memset(bp + psdo, 0, bp[pgo + PP_OFF_NBR_ADD_PARTS] * 2);
3177
3178 DEBC(printk("%s: psd_cnt %d, max.parts %d, nbr_parts %d\n", name,
3179 psd_cnt, bp[pgo + PP_OFF_MAX_ADD_PARTS],
3180 bp[pgo + PP_OFF_NBR_ADD_PARTS]));
3181
3182 if (size <= 0) {
3183 bp[pgo + PP_OFF_NBR_ADD_PARTS] = 0;
3184 if (psd_cnt <= bp[pgo + PP_OFF_MAX_ADD_PARTS])
3185 bp[pgo + MP_OFF_PAGE_LENGTH] = 6;
3186 DEBC(printk(ST_DEB_MSG "%s: Formatting tape with one partition.\n",
3187 name));
3188 } else {
3189 bp[psdo] = (size >> 8) & 0xff;
3190 bp[psdo + 1] = size & 0xff;
3191 bp[pgo + 3] = 1;
3192 if (bp[pgo + MP_OFF_PAGE_LENGTH] < 8)
3193 bp[pgo + MP_OFF_PAGE_LENGTH] = 8;
3194 DEBC(printk(ST_DEB_MSG
3195 "%s: Formatting tape with two partitions (1 = %d MB).\n",
3196 name, size));
3197 }
3198 bp[pgo + PP_OFF_PART_UNITS] = 0;
3199 bp[pgo + PP_OFF_RESERVED] = 0;
3200 bp[pgo + PP_OFF_FLAGS] = PP_BIT_IDP | PP_MSK_PSUM_MB;
3201
3202 result = write_mode_page(STp, PART_PAGE, 1);
3203 if (result) {
3204 printk(KERN_INFO "%s: Partitioning of tape failed.\n", name);
3205 result = (-EIO);
3206 }
3207
3208 return result;
3209}
3210
3211
3212
3213
3214static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
3215{
3216 int i, cmd_nr, cmd_type, bt;
3217 int retval = 0;
3218 unsigned int blk;
3219 struct scsi_tape *STp = file->private_data;
3220 struct st_modedef *STm;
3221 struct st_partstat *STps;
3222 char *name = tape_name(STp);
3223 void __user *p = (void __user *)arg;
3224
3225 if (mutex_lock_interruptible(&STp->lock))
3226 return -ERESTARTSYS;
3227
3228 DEB(
3229 if (debugging && !STp->in_use) {
3230 printk(ST_DEB_MSG "%s: Incorrect device.\n", name);
3231 retval = (-EIO);
3232 goto out;
3233 } )
3234
3235 STm = &(STp->modes[STp->current_mode]);
3236 STps = &(STp->ps[STp->partition]);
3237
3238
3239
3240
3241
3242
3243
3244 retval = scsi_nonblockable_ioctl(STp->device, cmd_in, p, file);
3245 if (!scsi_block_when_processing_errors(STp->device) || retval != -ENODEV)
3246 goto out;
3247 retval = 0;
3248
3249 cmd_type = _IOC_TYPE(cmd_in);
3250 cmd_nr = _IOC_NR(cmd_in);
3251
3252 if (cmd_type == _IOC_TYPE(MTIOCTOP) && cmd_nr == _IOC_NR(MTIOCTOP)) {
3253 struct mtop mtc;
3254
3255 if (_IOC_SIZE(cmd_in) != sizeof(mtc)) {
3256 retval = (-EINVAL);
3257 goto out;
3258 }
3259
3260 i = copy_from_user(&mtc, p, sizeof(struct mtop));
3261 if (i) {
3262 retval = (-EFAULT);
3263 goto out;
3264 }
3265
3266 if (mtc.mt_op == MTSETDRVBUFFER && !capable(CAP_SYS_ADMIN)) {
3267 printk(KERN_WARNING
3268 "%s: MTSETDRVBUFFER only allowed for root.\n", name);
3269 retval = (-EPERM);
3270 goto out;
3271 }
3272 if (!STm->defined &&
3273 (mtc.mt_op != MTSETDRVBUFFER &&
3274 (mtc.mt_count & MT_ST_OPTIONS) == 0)) {
3275 retval = (-ENXIO);
3276 goto out;
3277 }
3278
3279 if (!STp->pos_unknown) {
3280
3281 if (STps->eof == ST_FM_HIT) {
3282 if (mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
3283 mtc.mt_op == MTEOM) {
3284 mtc.mt_count -= 1;
3285 if (STps->drv_file >= 0)
3286 STps->drv_file += 1;
3287 } else if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM) {
3288 mtc.mt_count += 1;
3289 if (STps->drv_file >= 0)
3290 STps->drv_file += 1;
3291 }
3292 }
3293
3294 if (mtc.mt_op == MTSEEK) {
3295
3296
3297 i = !STp->can_partitions ||
3298 (STp->new_partition != STp->partition);
3299 } else {
3300 i = mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
3301 mtc.mt_op == MTRETEN || mtc.mt_op == MTEOM ||
3302 mtc.mt_op == MTLOCK || mtc.mt_op == MTLOAD ||
3303 mtc.mt_op == MTFSF || mtc.mt_op == MTFSFM ||
3304 mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM ||
3305 mtc.mt_op == MTCOMPRESSION;
3306 }
3307 i = flush_buffer(STp, i);
3308 if (i < 0) {
3309 retval = i;
3310 goto out;
3311 }
3312 if (STps->rw == ST_WRITING &&
3313 (mtc.mt_op == MTREW || mtc.mt_op == MTOFFL ||
3314 mtc.mt_op == MTSEEK ||
3315 mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)) {
3316 i = st_int_ioctl(STp, MTWEOF, 1);
3317 if (i < 0) {
3318 retval = i;
3319 goto out;
3320 }
3321 if (mtc.mt_op == MTBSF || mtc.mt_op == MTBSFM)
3322 mtc.mt_count++;
3323 STps->rw = ST_IDLE;
3324 }
3325
3326 } else {
3327
3328
3329
3330
3331
3332 if (mtc.mt_op != MTREW &&
3333 mtc.mt_op != MTOFFL &&
3334 mtc.mt_op != MTRETEN &&
3335 mtc.mt_op != MTERASE &&
3336 mtc.mt_op != MTSEEK &&
3337 mtc.mt_op != MTEOM) {
3338 retval = (-EIO);
3339 goto out;
3340 }
3341 reset_state(STp);
3342
3343 STp->device->was_reset = 0;
3344 }
3345
3346 if (mtc.mt_op != MTNOP && mtc.mt_op != MTSETBLK &&
3347 mtc.mt_op != MTSETDENSITY && mtc.mt_op != MTWSM &&
3348 mtc.mt_op != MTSETDRVBUFFER && mtc.mt_op != MTSETPART)
3349 STps->rw = ST_IDLE;
3350
3351 if (mtc.mt_op == MTOFFL && STp->door_locked != ST_UNLOCKED)
3352 do_door_lock(STp, 0);
3353
3354 if (mtc.mt_op == MTSETDRVBUFFER &&
3355 (mtc.mt_count & MT_ST_OPTIONS) != 0) {
3356 retval = st_set_options(STp, mtc.mt_count);
3357 goto out;
3358 }
3359
3360 if (mtc.mt_op == MTSETPART) {
3361 if (!STp->can_partitions ||
3362 mtc.mt_count < 0 || mtc.mt_count >= ST_NBR_PARTITIONS) {
3363 retval = (-EINVAL);
3364 goto out;
3365 }
3366 if (mtc.mt_count >= STp->nbr_partitions &&
3367 (STp->nbr_partitions = nbr_partitions(STp)) < 0) {
3368 retval = (-EIO);
3369 goto out;
3370 }
3371 if (mtc.mt_count >= STp->nbr_partitions) {
3372 retval = (-EINVAL);
3373 goto out;
3374 }
3375 STp->new_partition = mtc.mt_count;
3376 retval = 0;
3377 goto out;
3378 }
3379
3380 if (mtc.mt_op == MTMKPART) {
3381 if (!STp->can_partitions) {
3382 retval = (-EINVAL);
3383 goto out;
3384 }
3385 if ((i = st_int_ioctl(STp, MTREW, 0)) < 0 ||
3386 (i = partition_tape(STp, mtc.mt_count)) < 0) {
3387 retval = i;
3388 goto out;
3389 }
3390 for (i = 0; i < ST_NBR_PARTITIONS; i++) {
3391 STp->ps[i].rw = ST_IDLE;
3392 STp->ps[i].at_sm = 0;
3393 STp->ps[i].last_block_valid = 0;
3394 }
3395 STp->partition = STp->new_partition = 0;
3396 STp->nbr_partitions = 1;
3397 STps->drv_block = STps->drv_file = 0;
3398 retval = 0;
3399 goto out;
3400 }
3401
3402 if (mtc.mt_op == MTSEEK) {
3403 i = set_location(STp, mtc.mt_count, STp->new_partition, 0);
3404 if (!STp->can_partitions)
3405 STp->ps[0].rw = ST_IDLE;
3406 retval = i;
3407 goto out;
3408 }
3409
3410 if (mtc.mt_op == MTUNLOAD || mtc.mt_op == MTOFFL) {
3411 retval = do_load_unload(STp, file, 0);
3412 goto out;
3413 }
3414
3415 if (mtc.mt_op == MTLOAD) {
3416 retval = do_load_unload(STp, file, max(1, mtc.mt_count));
3417 goto out;
3418 }
3419
3420 if (mtc.mt_op == MTLOCK || mtc.mt_op == MTUNLOCK) {
3421 retval = do_door_lock(STp, (mtc.mt_op == MTLOCK));
3422 goto out;
3423 }
3424
3425 if (STp->can_partitions && STp->ready == ST_READY &&
3426 (i = switch_partition(STp)) < 0) {
3427 retval = i;
3428 goto out;
3429 }
3430
3431 if (mtc.mt_op == MTCOMPRESSION)
3432 retval = st_compression(STp, (mtc.mt_count & 1));
3433 else
3434 retval = st_int_ioctl(STp, mtc.mt_op, mtc.mt_count);
3435 goto out;
3436 }
3437 if (!STm->defined) {
3438 retval = (-ENXIO);
3439 goto out;
3440 }
3441
3442 if ((i = flush_buffer(STp, 0)) < 0) {
3443 retval = i;
3444 goto out;
3445 }
3446 if (STp->can_partitions &&
3447 (i = switch_partition(STp)) < 0) {
3448 retval = i;
3449 goto out;
3450 }
3451
3452 if (cmd_type == _IOC_TYPE(MTIOCGET) && cmd_nr == _IOC_NR(MTIOCGET)) {
3453 struct mtget mt_status;
3454
3455 if (_IOC_SIZE(cmd_in) != sizeof(struct mtget)) {
3456 retval = (-EINVAL);
3457 goto out;
3458 }
3459
3460 mt_status.mt_type = STp->tape_type;
3461 mt_status.mt_dsreg =
3462 ((STp->block_size << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK) |
3463 ((STp->density << MT_ST_DENSITY_SHIFT) & MT_ST_DENSITY_MASK);
3464 mt_status.mt_blkno = STps->drv_block;
3465 mt_status.mt_fileno = STps->drv_file;
3466 if (STp->block_size != 0) {
3467 if (STps->rw == ST_WRITING)
3468 mt_status.mt_blkno +=
3469 (STp->buffer)->buffer_bytes / STp->block_size;
3470 else if (STps->rw == ST_READING)
3471 mt_status.mt_blkno -=
3472 ((STp->buffer)->buffer_bytes +
3473 STp->block_size - 1) / STp->block_size;
3474 }
3475
3476 mt_status.mt_gstat = 0;
3477 if (STp->drv_write_prot)
3478 mt_status.mt_gstat |= GMT_WR_PROT(0xffffffff);
3479 if (mt_status.mt_blkno == 0) {
3480 if (mt_status.mt_fileno == 0)
3481 mt_status.mt_gstat |= GMT_BOT(0xffffffff);
3482 else
3483 mt_status.mt_gstat |= GMT_EOF(0xffffffff);
3484 }
3485 mt_status.mt_erreg = (STp->recover_reg << MT_ST_SOFTERR_SHIFT);
3486 mt_status.mt_resid = STp->partition;
3487 if (STps->eof == ST_EOM_OK || STps->eof == ST_EOM_ERROR)
3488 mt_status.mt_gstat |= GMT_EOT(0xffffffff);
3489 else if (STps->eof >= ST_EOM_OK)
3490 mt_status.mt_gstat |= GMT_EOD(0xffffffff);
3491 if (STp->density == 1)
3492 mt_status.mt_gstat |= GMT_D_800(0xffffffff);
3493 else if (STp->density == 2)
3494 mt_status.mt_gstat |= GMT_D_1600(0xffffffff);
3495 else if (STp->density == 3)
3496 mt_status.mt_gstat |= GMT_D_6250(0xffffffff);
3497 if (STp->ready == ST_READY)
3498 mt_status.mt_gstat |= GMT_ONLINE(0xffffffff);
3499 if (STp->ready == ST_NO_TAPE)
3500 mt_status.mt_gstat |= GMT_DR_OPEN(0xffffffff);
3501 if (STps->at_sm)
3502 mt_status.mt_gstat |= GMT_SM(0xffffffff);
3503 if (STm->do_async_writes ||
3504 (STm->do_buffer_writes && STp->block_size != 0) ||
3505 STp->drv_buffer != 0)
3506 mt_status.mt_gstat |= GMT_IM_REP_EN(0xffffffff);
3507 if (STp->cleaning_req)
3508 mt_status.mt_gstat |= GMT_CLN(0xffffffff);
3509
3510 i = copy_to_user(p, &mt_status, sizeof(struct mtget));
3511 if (i) {
3512 retval = (-EFAULT);
3513 goto out;
3514 }
3515
3516 STp->recover_reg = 0;
3517 retval = 0;
3518 goto out;
3519 }
3520 if (cmd_type == _IOC_TYPE(MTIOCPOS) && cmd_nr == _IOC_NR(MTIOCPOS)) {
3521 struct mtpos mt_pos;
3522 if (_IOC_SIZE(cmd_in) != sizeof(struct mtpos)) {
3523 retval = (-EINVAL);
3524 goto out;
3525 }
3526 if ((i = get_location(STp, &blk, &bt, 0)) < 0) {
3527 retval = i;
3528 goto out;
3529 }
3530 mt_pos.mt_blkno = blk;
3531 i = copy_to_user(p, &mt_pos, sizeof(struct mtpos));
3532 if (i)
3533 retval = (-EFAULT);
3534 goto out;
3535 }
3536 mutex_unlock(&STp->lock);
3537 switch (cmd_in) {
3538 case SCSI_IOCTL_GET_IDLUN:
3539 case SCSI_IOCTL_GET_BUS_NUMBER:
3540 break;
3541 default:
3542 if ((cmd_in == SG_IO ||
3543 cmd_in == SCSI_IOCTL_SEND_COMMAND ||
3544 cmd_in == CDROM_SEND_PACKET) &&
3545 !capable(CAP_SYS_RAWIO))
3546 i = -EPERM;
3547 else
3548 i = scsi_cmd_ioctl(file, STp->disk->queue,
3549 STp->disk, cmd_in, p);
3550 if (i != -ENOTTY)
3551 return i;
3552 break;
3553 }
3554 retval = scsi_ioctl(STp->device, cmd_in, p);
3555 if (!retval && cmd_in == SCSI_IOCTL_STOP_UNIT) {
3556 STp->rew_at_close = 0;
3557 STp->ready = ST_NO_TAPE;
3558 }
3559 return retval;
3560
3561 out:
3562 mutex_unlock(&STp->lock);
3563 return retval;
3564}
3565
3566#ifdef CONFIG_COMPAT
3567static long st_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
3568{
3569 struct scsi_tape *STp = file->private_data;
3570 struct scsi_device *sdev = STp->device;
3571 int ret = -ENOIOCTLCMD;
3572 if (sdev->host->hostt->compat_ioctl) {
3573
3574 ret = sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);
3575
3576 }
3577 return ret;
3578}
3579#endif
3580
3581
3582
3583
3584
3585static struct st_buffer *
3586 new_tape_buffer(int from_initialization, int need_dma, int max_sg)
3587{
3588 int i, got = 0;
3589 gfp_t priority;
3590 struct st_buffer *tb;
3591
3592 if (from_initialization)
3593 priority = GFP_ATOMIC;
3594 else
3595 priority = GFP_KERNEL;
3596
3597 i = sizeof(struct st_buffer) + (max_sg - 1) * sizeof(struct scatterlist) +
3598 max_sg * sizeof(struct st_buf_fragment);
3599 tb = kzalloc(i, priority);
3600 if (!tb) {
3601 printk(KERN_NOTICE "st: Can't allocate new tape buffer.\n");
3602 return NULL;
3603 }
3604 tb->frp_segs = tb->orig_frp_segs = 0;
3605 tb->use_sg = max_sg;
3606 tb->frp = (struct st_buf_fragment *)(&(tb->sg[0]) + max_sg);
3607
3608 tb->dma = need_dma;
3609 tb->buffer_size = got;
3610 sg_init_table(tb->sg, max_sg);
3611
3612 return tb;
3613}
3614
3615
3616
3617static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dma)
3618{
3619 int segs, nbr, max_segs, b_size, order, got;
3620 gfp_t priority;
3621
3622 if (new_size <= STbuffer->buffer_size)
3623 return 1;
3624
3625 if (STbuffer->buffer_size <= PAGE_SIZE)
3626 normalize_buffer(STbuffer);
3627
3628 max_segs = STbuffer->use_sg;
3629 nbr = max_segs - STbuffer->frp_segs;
3630 if (nbr <= 0)
3631 return 0;
3632
3633 priority = GFP_KERNEL | __GFP_NOWARN;
3634 if (need_dma)
3635 priority |= GFP_DMA;
3636 for (b_size = PAGE_SIZE, order=0; order <= 6 &&
3637 b_size < new_size - STbuffer->buffer_size;
3638 order++, b_size *= 2)
3639 ;
3640
3641 for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size;
3642 segs < max_segs && got < new_size;) {
3643 STbuffer->frp[segs].page = alloc_pages(priority, order);
3644 if (STbuffer->frp[segs].page == NULL) {
3645 if (new_size - got <= (max_segs - segs) * b_size / 2) {
3646 b_size /= 2;
3647 order--;
3648 continue;
3649 }
3650 DEB(STbuffer->buffer_size = got);
3651 normalize_buffer(STbuffer);
3652 return 0;
3653 }
3654 STbuffer->frp[segs].length = b_size;
3655 STbuffer->frp_segs += 1;
3656 got += b_size;
3657 STbuffer->buffer_size = got;
3658 segs++;
3659 }
3660 STbuffer->b_data = page_address(STbuffer->frp[0].page);
3661
3662 return 1;
3663}
3664
3665
3666
3667static void normalize_buffer(struct st_buffer * STbuffer)
3668{
3669 int i, order;
3670
3671 for (i = STbuffer->orig_frp_segs; i < STbuffer->frp_segs; i++) {
3672 order = get_order(STbuffer->frp[i].length);
3673 __free_pages(STbuffer->frp[i].page, order);
3674 STbuffer->buffer_size -= STbuffer->frp[i].length;
3675 }
3676 STbuffer->frp_segs = STbuffer->orig_frp_segs;
3677 STbuffer->frp_sg_current = 0;
3678 STbuffer->sg_segs = 0;
3679}
3680
3681
3682
3683
3684static int append_to_buffer(const char __user *ubp, struct st_buffer * st_bp, int do_count)
3685{
3686 int i, cnt, res, offset;
3687
3688 for (i = 0, offset = st_bp->buffer_bytes;
3689 i < st_bp->frp_segs && offset >= st_bp->frp[i].length; i++)
3690 offset -= st_bp->frp[i].length;
3691 if (i == st_bp->frp_segs) {
3692 printk(KERN_WARNING "st: append_to_buffer offset overflow.\n");
3693 return (-EIO);
3694 }
3695 for (; i < st_bp->frp_segs && do_count > 0; i++) {
3696 cnt = st_bp->frp[i].length - offset < do_count ?
3697 st_bp->frp[i].length - offset : do_count;
3698 res = copy_from_user(page_address(st_bp->frp[i].page) + offset, ubp, cnt);
3699 if (res)
3700 return (-EFAULT);
3701 do_count -= cnt;
3702 st_bp->buffer_bytes += cnt;
3703 ubp += cnt;
3704 offset = 0;
3705 }
3706 if (do_count)
3707 return (-EIO);
3708
3709 return 0;
3710}
3711
3712
3713
3714
3715static int from_buffer(struct st_buffer * st_bp, char __user *ubp, int do_count)
3716{
3717 int i, cnt, res, offset;
3718
3719 for (i = 0, offset = st_bp->read_pointer;
3720 i < st_bp->frp_segs && offset >= st_bp->frp[i].length; i++)
3721 offset -= st_bp->frp[i].length;
3722 if (i == st_bp->frp_segs) {
3723 printk(KERN_WARNING "st: from_buffer offset overflow.\n");
3724 return (-EIO);
3725 }
3726 for (; i < st_bp->frp_segs && do_count > 0; i++) {
3727 cnt = st_bp->frp[i].length - offset < do_count ?
3728 st_bp->frp[i].length - offset : do_count;
3729 res = copy_to_user(ubp, page_address(st_bp->frp[i].page) + offset, cnt);
3730 if (res)
3731 return (-EFAULT);
3732 do_count -= cnt;
3733 st_bp->buffer_bytes -= cnt;
3734 st_bp->read_pointer += cnt;
3735 ubp += cnt;
3736 offset = 0;
3737 }
3738 if (do_count)
3739 return (-EIO);
3740
3741 return 0;
3742}
3743
3744
3745
3746static void move_buffer_data(struct st_buffer * st_bp, int offset)
3747{
3748 int src_seg, dst_seg, src_offset = 0, dst_offset;
3749 int count, total;
3750
3751 if (offset == 0)
3752 return;
3753
3754 total=st_bp->buffer_bytes - offset;
3755 for (src_seg=0; src_seg < st_bp->frp_segs; src_seg++) {
3756 src_offset = offset;
3757 if (src_offset < st_bp->frp[src_seg].length)
3758 break;
3759 offset -= st_bp->frp[src_seg].length;
3760 }
3761
3762 st_bp->buffer_bytes = st_bp->read_pointer = total;
3763 for (dst_seg=dst_offset=0; total > 0; ) {
3764 count = min(st_bp->frp[dst_seg].length - dst_offset,
3765 st_bp->frp[src_seg].length - src_offset);
3766 memmove(page_address(st_bp->frp[dst_seg].page) + dst_offset,
3767 page_address(st_bp->frp[src_seg].page) + src_offset, count);
3768 src_offset += count;
3769 if (src_offset >= st_bp->frp[src_seg].length) {
3770 src_seg++;
3771 src_offset = 0;
3772 }
3773 dst_offset += count;
3774 if (dst_offset >= st_bp->frp[dst_seg].length) {
3775 dst_seg++;
3776 dst_offset = 0;
3777 }
3778 total -= count;
3779 }
3780}
3781
3782
3783
3784static void buf_to_sg(struct st_buffer *STbp, unsigned int length)
3785{
3786 int i;
3787 unsigned int count;
3788 struct scatterlist *sg;
3789 struct st_buf_fragment *frp;
3790
3791 if (length == STbp->frp_sg_current)
3792 return;
3793
3794 sg = &(STbp->sg[0]);
3795 frp = STbp->frp;
3796 for (i=count=0; count < length; i++) {
3797 if (length - count > frp[i].length)
3798 sg_set_page(&sg[i], frp[i].page, frp[i].length, 0);
3799 else
3800 sg_set_page(&sg[i], frp[i].page, length - count, 0);
3801 count += sg[i].length;
3802 }
3803 STbp->sg_segs = i;
3804 STbp->frp_sg_current = length;
3805}
3806
3807
3808
3809static void validate_options(void)
3810{
3811 if (buffer_kbs > 0)
3812 st_fixed_buffer_size = buffer_kbs * ST_KILOBYTE;
3813 if (max_sg_segs >= ST_FIRST_SG)
3814 st_max_sg_segs = max_sg_segs;
3815}
3816
3817#ifndef MODULE
3818
3819
3820static int __init st_setup(char *str)
3821{
3822 int i, len, ints[5];
3823 char *stp;
3824
3825 stp = get_options(str, ARRAY_SIZE(ints), ints);
3826
3827 if (ints[0] > 0) {
3828 for (i = 0; i < ints[0] && i < ARRAY_SIZE(parms); i++)
3829 if (parms[i].val)
3830 *parms[i].val = ints[i + 1];
3831 } else {
3832 while (stp != NULL) {
3833 for (i = 0; i < ARRAY_SIZE(parms); i++) {
3834 len = strlen(parms[i].name);
3835 if (!strncmp(stp, parms[i].name, len) &&
3836 (*(stp + len) == ':' || *(stp + len) == '=')) {
3837 if (parms[i].val)
3838 *parms[i].val =
3839 simple_strtoul(stp + len + 1, NULL, 0);
3840 else
3841 printk(KERN_WARNING "st: Obsolete parameter %s\n",
3842 parms[i].name);
3843 break;
3844 }
3845 }
3846 if (i >= ARRAY_SIZE(parms))
3847 printk(KERN_WARNING "st: invalid parameter in '%s'\n",
3848 stp);
3849 stp = strchr(stp, ',');
3850 if (stp)
3851 stp++;
3852 }
3853 }
3854
3855 validate_options();
3856
3857 return 1;
3858}
3859
3860__setup("st=", st_setup);
3861
3862#endif
3863
3864static const struct file_operations st_fops =
3865{
3866 .owner = THIS_MODULE,
3867 .read = st_read,
3868 .write = st_write,
3869 .unlocked_ioctl = st_ioctl,
3870#ifdef CONFIG_COMPAT
3871 .compat_ioctl = st_compat_ioctl,
3872#endif
3873 .open = st_open,
3874 .flush = st_flush,
3875 .release = st_release,
3876};
3877
3878static int st_probe(struct device *dev)
3879{
3880 struct scsi_device *SDp = to_scsi_device(dev);
3881 struct gendisk *disk = NULL;
3882 struct cdev *cdev = NULL;
3883 struct scsi_tape *tpnt = NULL;
3884 struct st_modedef *STm;
3885 struct st_partstat *STps;
3886 struct st_buffer *buffer;
3887 int i, j, mode, dev_num, error;
3888 char *stp;
3889
3890 if (SDp->type != TYPE_TAPE)
3891 return -ENODEV;
3892 if ((stp = st_incompatible(SDp))) {
3893 sdev_printk(KERN_INFO, SDp, "Found incompatible tape\n");
3894 printk(KERN_INFO "st: The suggested driver is %s.\n", stp);
3895 return -ENODEV;
3896 }
3897
3898 i = min(SDp->request_queue->max_hw_segments,
3899 SDp->request_queue->max_phys_segments);
3900 if (st_max_sg_segs < i)
3901 i = st_max_sg_segs;
3902 buffer = new_tape_buffer(1, (SDp->host)->unchecked_isa_dma, i);
3903 if (buffer == NULL) {
3904 printk(KERN_ERR
3905 "st: Can't allocate new tape buffer. Device not attached.\n");
3906 goto out;
3907 }
3908
3909 disk = alloc_disk(1);
3910 if (!disk) {
3911 printk(KERN_ERR "st: out of memory. Device not attached.\n");
3912 goto out_buffer_free;
3913 }
3914
3915 write_lock(&st_dev_arr_lock);
3916 if (st_nr_dev >= st_dev_max) {
3917 struct scsi_tape **tmp_da;
3918 int tmp_dev_max;
3919
3920 tmp_dev_max = max(st_nr_dev * 2, 8);
3921 if (tmp_dev_max > ST_MAX_TAPES)
3922 tmp_dev_max = ST_MAX_TAPES;
3923 if (tmp_dev_max <= st_nr_dev) {
3924 write_unlock(&st_dev_arr_lock);
3925 printk(KERN_ERR "st: Too many tape devices (max. %d).\n",
3926 ST_MAX_TAPES);
3927 goto out_put_disk;
3928 }
3929
3930 tmp_da = kzalloc(tmp_dev_max * sizeof(struct scsi_tape *), GFP_ATOMIC);
3931 if (tmp_da == NULL) {
3932 write_unlock(&st_dev_arr_lock);
3933 printk(KERN_ERR "st: Can't extend device array.\n");
3934 goto out_put_disk;
3935 }
3936
3937 if (scsi_tapes != NULL) {
3938 memcpy(tmp_da, scsi_tapes,
3939 st_dev_max * sizeof(struct scsi_tape *));
3940 kfree(scsi_tapes);
3941 }
3942 scsi_tapes = tmp_da;
3943
3944 st_dev_max = tmp_dev_max;
3945 }
3946
3947 for (i = 0; i < st_dev_max; i++)
3948 if (scsi_tapes[i] == NULL)
3949 break;
3950 if (i >= st_dev_max)
3951 panic("scsi_devices corrupt (st)");
3952
3953 tpnt = kzalloc(sizeof(struct scsi_tape), GFP_ATOMIC);
3954 if (tpnt == NULL) {
3955 write_unlock(&st_dev_arr_lock);
3956 printk(KERN_ERR "st: Can't allocate device descriptor.\n");
3957 goto out_put_disk;
3958 }
3959 kref_init(&tpnt->kref);
3960 tpnt->disk = disk;
3961 sprintf(disk->disk_name, "st%d", i);
3962 disk->private_data = &tpnt->driver;
3963 disk->queue = SDp->request_queue;
3964 tpnt->driver = &st_template;
3965 scsi_tapes[i] = tpnt;
3966 dev_num = i;
3967
3968 tpnt->device = SDp;
3969 if (SDp->scsi_level <= 2)
3970 tpnt->tape_type = MT_ISSCSI1;
3971 else
3972 tpnt->tape_type = MT_ISSCSI2;
3973
3974 tpnt->buffer = buffer;
3975 tpnt->buffer->last_SRpnt = NULL;
3976
3977 tpnt->inited = 0;
3978 tpnt->dirty = 0;
3979 tpnt->in_use = 0;
3980 tpnt->drv_buffer = 1;
3981 tpnt->restr_dma = (SDp->host)->unchecked_isa_dma;
3982 tpnt->use_pf = (SDp->scsi_level >= SCSI_2);
3983 tpnt->density = 0;
3984 tpnt->do_auto_lock = ST_AUTO_LOCK;
3985 tpnt->can_bsr = (SDp->scsi_level > 2 ? 1 : ST_IN_FILE_POS);
3986 tpnt->can_partitions = 0;
3987 tpnt->two_fm = ST_TWO_FM;
3988 tpnt->fast_mteom = ST_FAST_MTEOM;
3989 tpnt->scsi2_logical = ST_SCSI2LOGICAL;
3990 tpnt->immediate = ST_NOWAIT;
3991 tpnt->default_drvbuffer = 0xff;
3992 tpnt->partition = 0;
3993 tpnt->new_partition = 0;
3994 tpnt->nbr_partitions = 0;
3995 tpnt->device->timeout = ST_TIMEOUT;
3996 tpnt->long_timeout = ST_LONG_TIMEOUT;
3997 tpnt->try_dio = try_direct_io && !SDp->host->unchecked_isa_dma;
3998
3999 for (i = 0; i < ST_NBR_MODES; i++) {
4000 STm = &(tpnt->modes[i]);
4001 STm->defined = 0;
4002 STm->sysv = ST_SYSV;
4003 STm->defaults_for_writes = 0;
4004 STm->do_async_writes = ST_ASYNC_WRITES;
4005 STm->do_buffer_writes = ST_BUFFER_WRITES;
4006 STm->do_read_ahead = ST_READ_AHEAD;
4007 STm->default_compression = ST_DONT_TOUCH;
4008 STm->default_blksize = (-1);
4009 STm->default_density = (-1);
4010 }
4011
4012 for (i = 0; i < ST_NBR_PARTITIONS; i++) {
4013 STps = &(tpnt->ps[i]);
4014 STps->rw = ST_IDLE;
4015 STps->eof = ST_NOEOF;
4016 STps->at_sm = 0;
4017 STps->last_block_valid = 0;
4018 STps->drv_block = (-1);
4019 STps->drv_file = (-1);
4020 }
4021
4022 tpnt->current_mode = 0;
4023 tpnt->modes[0].defined = 1;
4024
4025 tpnt->density_changed = tpnt->compression_changed =
4026 tpnt->blksize_changed = 0;
4027 mutex_init(&tpnt->lock);
4028
4029 st_nr_dev++;
4030 write_unlock(&st_dev_arr_lock);
4031
4032 for (mode = 0; mode < ST_NBR_MODES; ++mode) {
4033 STm = &(tpnt->modes[mode]);
4034 for (j=0; j < 2; j++) {
4035 cdev = cdev_alloc();
4036 if (!cdev) {
4037 printk(KERN_ERR
4038 "st%d: out of memory. Device not attached.\n",
4039 dev_num);
4040 goto out_free_tape;
4041 }
4042 cdev->owner = THIS_MODULE;
4043 cdev->ops = &st_fops;
4044
4045 error = cdev_add(cdev,
4046 MKDEV(SCSI_TAPE_MAJOR, TAPE_MINOR(dev_num, mode, j)),
4047 1);
4048 if (error) {
4049 printk(KERN_ERR "st%d: Can't add %s-rewind mode %d\n",
4050 dev_num, j ? "non" : "auto", mode);
4051 printk(KERN_ERR "st%d: Device not attached.\n", dev_num);
4052 goto out_free_tape;
4053 }
4054 STm->cdevs[j] = cdev;
4055
4056 }
4057 error = do_create_class_files(tpnt, dev_num, mode);
4058 if (error)
4059 goto out_free_tape;
4060 }
4061
4062 sdev_printk(KERN_NOTICE, SDp,
4063 "Attached scsi tape %s\n", tape_name(tpnt));
4064 sdev_printk(KERN_INFO, SDp, "%s: try direct i/o: %s (alignment %d B)\n",
4065 tape_name(tpnt), tpnt->try_dio ? "yes" : "no",
4066 queue_dma_alignment(SDp->request_queue) + 1);
4067
4068 return 0;
4069
4070out_free_tape:
4071 for (mode=0; mode < ST_NBR_MODES; mode++) {
4072 STm = &(tpnt->modes[mode]);
4073 sysfs_remove_link(&tpnt->device->sdev_gendev.kobj,
4074 "tape");
4075 for (j=0; j < 2; j++) {
4076 if (STm->cdevs[j]) {
4077 if (cdev == STm->cdevs[j])
4078 cdev = NULL;
4079 class_device_destroy(st_sysfs_class,
4080 MKDEV(SCSI_TAPE_MAJOR,
4081 TAPE_MINOR(i, mode, j)));
4082 cdev_del(STm->cdevs[j]);
4083 }
4084 }
4085 }
4086 if (cdev)
4087 cdev_del(cdev);
4088 write_lock(&st_dev_arr_lock);
4089 scsi_tapes[dev_num] = NULL;
4090 st_nr_dev--;
4091 write_unlock(&st_dev_arr_lock);
4092out_put_disk:
4093 put_disk(disk);
4094 kfree(tpnt);
4095out_buffer_free:
4096 kfree(buffer);
4097out:
4098 return -ENODEV;
4099};
4100
4101
4102static int st_remove(struct device *dev)
4103{
4104 struct scsi_device *SDp = to_scsi_device(dev);
4105 struct scsi_tape *tpnt;
4106 int i, j, mode;
4107
4108 write_lock(&st_dev_arr_lock);
4109 for (i = 0; i < st_dev_max; i++) {
4110 tpnt = scsi_tapes[i];
4111 if (tpnt != NULL && tpnt->device == SDp) {
4112 scsi_tapes[i] = NULL;
4113 st_nr_dev--;
4114 write_unlock(&st_dev_arr_lock);
4115 sysfs_remove_link(&tpnt->device->sdev_gendev.kobj,
4116 "tape");
4117 for (mode = 0; mode < ST_NBR_MODES; ++mode) {
4118 for (j=0; j < 2; j++) {
4119 class_device_destroy(st_sysfs_class,
4120 MKDEV(SCSI_TAPE_MAJOR,
4121 TAPE_MINOR(i, mode, j)));
4122 cdev_del(tpnt->modes[mode].cdevs[j]);
4123 tpnt->modes[mode].cdevs[j] = NULL;
4124 }
4125 }
4126
4127 mutex_lock(&st_ref_mutex);
4128 kref_put(&tpnt->kref, scsi_tape_release);
4129 mutex_unlock(&st_ref_mutex);
4130 return 0;
4131 }
4132 }
4133
4134 write_unlock(&st_dev_arr_lock);
4135 return 0;
4136}
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147static void scsi_tape_release(struct kref *kref)
4148{
4149 struct scsi_tape *tpnt = to_scsi_tape(kref);
4150 struct gendisk *disk = tpnt->disk;
4151
4152 tpnt->device = NULL;
4153
4154 if (tpnt->buffer) {
4155 tpnt->buffer->orig_frp_segs = 0;
4156 normalize_buffer(tpnt->buffer);
4157 kfree(tpnt->buffer);
4158 }
4159
4160 disk->private_data = NULL;
4161 put_disk(disk);
4162 kfree(tpnt);
4163 return;
4164}
4165
4166static int __init init_st(void)
4167{
4168 int err;
4169
4170 validate_options();
4171
4172 printk(KERN_INFO "st: Version %s, fixed bufsize %d, s/g segs %d\n",
4173 verstr, st_fixed_buffer_size, st_max_sg_segs);
4174
4175 st_sysfs_class = class_create(THIS_MODULE, "scsi_tape");
4176 if (IS_ERR(st_sysfs_class)) {
4177 printk(KERN_ERR "Unable create sysfs class for SCSI tapes\n");
4178 return PTR_ERR(st_sysfs_class);
4179 }
4180
4181 err = register_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
4182 ST_MAX_TAPE_ENTRIES, "st");
4183 if (err) {
4184 printk(KERN_ERR "Unable to get major %d for SCSI tapes\n",
4185 SCSI_TAPE_MAJOR);
4186 goto err_class;
4187 }
4188
4189 err = scsi_register_driver(&st_template.gendrv);
4190 if (err)
4191 goto err_chrdev;
4192
4193 err = do_create_sysfs_files();
4194 if (err)
4195 goto err_scsidrv;
4196
4197 return 0;
4198
4199err_scsidrv:
4200 scsi_unregister_driver(&st_template.gendrv);
4201err_chrdev:
4202 unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
4203 ST_MAX_TAPE_ENTRIES);
4204err_class:
4205 class_destroy(st_sysfs_class);
4206 return err;
4207}
4208
4209static void __exit exit_st(void)
4210{
4211 do_remove_sysfs_files();
4212 scsi_unregister_driver(&st_template.gendrv);
4213 unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
4214 ST_MAX_TAPE_ENTRIES);
4215 class_destroy(st_sysfs_class);
4216 kfree(scsi_tapes);
4217 printk(KERN_INFO "st: Unloaded.\n");
4218}
4219
4220module_init(init_st);
4221module_exit(exit_st);
4222
4223
4224
4225static ssize_t st_try_direct_io_show(struct device_driver *ddp, char *buf)
4226{
4227 return snprintf(buf, PAGE_SIZE, "%d\n", try_direct_io);
4228}
4229static DRIVER_ATTR(try_direct_io, S_IRUGO, st_try_direct_io_show, NULL);
4230
4231static ssize_t st_fixed_buffer_size_show(struct device_driver *ddp, char *buf)
4232{
4233 return snprintf(buf, PAGE_SIZE, "%d\n", st_fixed_buffer_size);
4234}
4235static DRIVER_ATTR(fixed_buffer_size, S_IRUGO, st_fixed_buffer_size_show, NULL);
4236
4237static ssize_t st_max_sg_segs_show(struct device_driver *ddp, char *buf)
4238{
4239 return snprintf(buf, PAGE_SIZE, "%d\n", st_max_sg_segs);
4240}
4241static DRIVER_ATTR(max_sg_segs, S_IRUGO, st_max_sg_segs_show, NULL);
4242
4243static ssize_t st_version_show(struct device_driver *ddd, char *buf)
4244{
4245 return snprintf(buf, PAGE_SIZE, "[%s]\n", verstr);
4246}
4247static DRIVER_ATTR(version, S_IRUGO, st_version_show, NULL);
4248
4249static int do_create_sysfs_files(void)
4250{
4251 struct device_driver *sysfs = &st_template.gendrv;
4252 int err;
4253
4254 err = driver_create_file(sysfs, &driver_attr_try_direct_io);
4255 if (err)
4256 return err;
4257 err = driver_create_file(sysfs, &driver_attr_fixed_buffer_size);
4258 if (err)
4259 goto err_try_direct_io;
4260 err = driver_create_file(sysfs, &driver_attr_max_sg_segs);
4261 if (err)
4262 goto err_attr_fixed_buf;
4263 err = driver_create_file(sysfs, &driver_attr_version);
4264 if (err)
4265 goto err_attr_max_sg;
4266
4267 return 0;
4268
4269err_attr_max_sg:
4270 driver_remove_file(sysfs, &driver_attr_max_sg_segs);
4271err_attr_fixed_buf:
4272 driver_remove_file(sysfs, &driver_attr_fixed_buffer_size);
4273err_try_direct_io:
4274 driver_remove_file(sysfs, &driver_attr_try_direct_io);
4275 return err;
4276}
4277
4278static void do_remove_sysfs_files(void)
4279{
4280 struct device_driver *sysfs = &st_template.gendrv;
4281
4282 driver_remove_file(sysfs, &driver_attr_version);
4283 driver_remove_file(sysfs, &driver_attr_max_sg_segs);
4284 driver_remove_file(sysfs, &driver_attr_fixed_buffer_size);
4285 driver_remove_file(sysfs, &driver_attr_try_direct_io);
4286}
4287
4288
4289
4290static ssize_t st_defined_show(struct class_device *class_dev, char *buf)
4291{
4292 struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
4293 ssize_t l = 0;
4294
4295 l = snprintf(buf, PAGE_SIZE, "%d\n", STm->defined);
4296 return l;
4297}
4298
4299CLASS_DEVICE_ATTR(defined, S_IRUGO, st_defined_show, NULL);
4300
4301static ssize_t st_defblk_show(struct class_device *class_dev, char *buf)
4302{
4303 struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
4304 ssize_t l = 0;
4305
4306 l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_blksize);
4307 return l;
4308}
4309
4310CLASS_DEVICE_ATTR(default_blksize, S_IRUGO, st_defblk_show, NULL);
4311
4312static ssize_t st_defdensity_show(struct class_device *class_dev, char *buf)
4313{
4314 struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
4315 ssize_t l = 0;
4316 char *fmt;
4317
4318 fmt = STm->default_density >= 0 ? "0x%02x\n" : "%d\n";
4319 l = snprintf(buf, PAGE_SIZE, fmt, STm->default_density);
4320 return l;
4321}
4322
4323CLASS_DEVICE_ATTR(default_density, S_IRUGO, st_defdensity_show, NULL);
4324
4325static ssize_t st_defcompression_show(struct class_device *class_dev, char *buf)
4326{
4327 struct st_modedef *STm = (struct st_modedef *)class_get_devdata(class_dev);
4328 ssize_t l = 0;
4329
4330 l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_compression - 1);
4331 return l;
4332}
4333
4334CLASS_DEVICE_ATTR(default_compression, S_IRUGO, st_defcompression_show, NULL);
4335
4336static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
4337{
4338 int i, rew, error;
4339 char name[10];
4340 struct class_device *st_class_member;
4341
4342 for (rew=0; rew < 2; rew++) {
4343
4344
4345 i = mode << (4 - ST_NBR_MODE_BITS);
4346 snprintf(name, 10, "%s%s%s", rew ? "n" : "",
4347 STp->disk->disk_name, st_formats[i]);
4348 st_class_member =
4349 class_device_create(st_sysfs_class, NULL,
4350 MKDEV(SCSI_TAPE_MAJOR,
4351 TAPE_MINOR(dev_num, mode, rew)),
4352 &STp->device->sdev_gendev, "%s", name);
4353 if (IS_ERR(st_class_member)) {
4354 printk(KERN_WARNING "st%d: class_device_create failed\n",
4355 dev_num);
4356 error = PTR_ERR(st_class_member);
4357 goto out;
4358 }
4359 class_set_devdata(st_class_member, &STp->modes[mode]);
4360
4361 error = class_device_create_file(st_class_member,
4362 &class_device_attr_defined);
4363 if (error) goto out;
4364 error = class_device_create_file(st_class_member,
4365 &class_device_attr_default_blksize);
4366 if (error) goto out;
4367 error = class_device_create_file(st_class_member,
4368 &class_device_attr_default_density);
4369 if (error) goto out;
4370 error = class_device_create_file(st_class_member,
4371 &class_device_attr_default_compression);
4372 if (error) goto out;
4373
4374 if (mode == 0 && rew == 0) {
4375 error = sysfs_create_link(&STp->device->sdev_gendev.kobj,
4376 &st_class_member->kobj,
4377 "tape");
4378 if (error) {
4379 printk(KERN_ERR
4380 "st%d: Can't create sysfs link from SCSI device.\n",
4381 dev_num);
4382 goto out;
4383 }
4384 }
4385 }
4386
4387 return 0;
4388
4389out:
4390 return error;
4391}
4392
4393
4394static int sgl_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages,
4395 unsigned long uaddr, size_t count, int rw)
4396{
4397 unsigned long end = (uaddr + count + PAGE_SIZE - 1) >> PAGE_SHIFT;
4398 unsigned long start = uaddr >> PAGE_SHIFT;
4399 const int nr_pages = end - start;
4400 int res, i, j;
4401 struct page **pages;
4402
4403
4404 if ((uaddr + count) < uaddr)
4405 return -EINVAL;
4406
4407
4408 if (nr_pages > max_pages)
4409 return -ENOMEM;
4410
4411
4412 if (count == 0)
4413 return 0;
4414
4415 if ((pages = kmalloc(max_pages * sizeof(*pages), GFP_KERNEL)) == NULL)
4416 return -ENOMEM;
4417
4418
4419 down_read(¤t->mm->mmap_sem);
4420
4421 res = get_user_pages(
4422 current,
4423 current->mm,
4424 uaddr,
4425 nr_pages,
4426 rw == READ,
4427 0,
4428 pages,
4429 NULL);
4430 up_read(¤t->mm->mmap_sem);
4431
4432
4433 if (res < nr_pages)
4434 goto out_unmap;
4435
4436 for (i=0; i < nr_pages; i++) {
4437
4438
4439
4440 flush_dcache_page(pages[i]);
4441 }
4442
4443
4444 sg_set_page(&sgl[0], pages[0], 0, uaddr & ~PAGE_MASK);
4445 if (nr_pages > 1) {
4446 sgl[0].length = PAGE_SIZE - sgl[0].offset;
4447 count -= sgl[0].length;
4448 for (i=1; i < nr_pages ; i++) {
4449 sg_set_page(&sgl[i], pages[i],
4450 count < PAGE_SIZE ? count : PAGE_SIZE, 0);;
4451 count -= PAGE_SIZE;
4452 }
4453 }
4454 else {
4455 sgl[0].length = count;
4456 }
4457
4458 kfree(pages);
4459 return nr_pages;
4460
4461 out_unmap:
4462 if (res > 0) {
4463 for (j=0; j < res; j++)
4464 page_cache_release(pages[j]);
4465 res = 0;
4466 }
4467 kfree(pages);
4468 return res;
4469}
4470
4471
4472
4473static int sgl_unmap_user_pages(struct scatterlist *sgl, const unsigned int nr_pages,
4474 int dirtied)
4475{
4476 int i;
4477
4478 for (i=0; i < nr_pages; i++) {
4479 struct page *page = sg_page(&sgl[i]);
4480
4481 if (dirtied)
4482 SetPageDirty(page);
4483
4484
4485
4486 page_cache_release(page);
4487 }
4488
4489 return 0;
4490}
4491