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