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