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