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