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