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