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