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