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