linux/drivers/scsi/st.c
<<
>>
Prefs
   1/*
   2   SCSI Tape Driver for Linux version 1.1 and newer. See the accompanying
   3   file Documentation/scsi/st.txt for more information.
   4
   5   History:
   6   Rewritten from Dwayne Forsyth's SCSI tape driver by Kai Makisara.
   7   Contribution and ideas from several people including (in alphabetical
   8   order) Klaus Ehrenfried, Eugene Exarevsky, Eric Lee Green, Wolfgang Denk,
   9   Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky,
  10   Michael Schaefer, J"org Weule, and Eric Youngdale.
  11
  12   Copyright 1992 - 2016 Kai Makisara
  13   email Kai.Makisara@kolumbus.fi
  14
  15   Some small formal changes - aeb, 950809
  16
  17   Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
  18 */
  19
  20static const char *verstr = "20160209";
  21
  22#include <linux/module.h>
  23
  24#include <linux/fs.h>
  25#include <linux/kernel.h>
  26#include <linux/sched/signal.h>
  27#include <linux/mm.h>
  28#include <linux/init.h>
  29#include <linux/string.h>
  30#include <linux/slab.h>
  31#include <linux/errno.h>
  32#include <linux/mtio.h>
  33#include <linux/cdrom.h>
  34#include <linux/ioctl.h>
  35#include <linux/fcntl.h>
  36#include <linux/spinlock.h>
  37#include <linux/blkdev.h>
  38#include <linux/moduleparam.h>
  39#include <linux/cdev.h>
  40#include <linux/idr.h>
  41#include <linux/delay.h>
  42#include <linux/mutex.h>
  43
  44#include <linux/uaccess.h>
  45#include <asm/dma.h>
  46
  47#include <scsi/scsi.h>
  48#include <scsi/scsi_dbg.h>
  49#include <scsi/scsi_device.h>
  50#include <scsi/scsi_driver.h>
  51#include <scsi/scsi_eh.h>
  52#include <scsi/scsi_host.h>
  53#include <scsi/scsi_ioctl.h>
  54#include <scsi/sg.h>
  55
  56
  57/* The driver prints some debugging information on the console if DEBUG
  58   is defined and non-zero. */
  59#define DEBUG 1
  60#define NO_DEBUG 0
  61
  62#define ST_DEB_MSG  KERN_NOTICE
  63#if DEBUG
  64/* The message level for the debug messages is currently set to KERN_NOTICE
  65   so that people can easily see the messages. Later when the debugging messages
  66   in the drivers are more widely classified, this may be changed to KERN_DEBUG. */
  67#define DEB(a) a
  68#define DEBC(a) if (debugging) { a ; }
  69#else
  70#define DEB(a)
  71#define DEBC(a)
  72#endif
  73
  74#define ST_KILOBYTE 1024
  75
  76#include "st_options.h"
  77#include "st.h"
  78
  79static int buffer_kbs;
  80static int max_sg_segs;
  81static int try_direct_io = TRY_DIRECT_IO;
  82static int try_rdio = 1;
  83static int try_wdio = 1;
  84static int debug_flag;
  85
  86static struct class st_sysfs_class;
  87static const struct attribute_group *st_dev_groups[];
  88static const struct attribute_group *st_drv_groups[];
  89
  90MODULE_AUTHOR("Kai Makisara");
  91MODULE_DESCRIPTION("SCSI tape (st) driver");
  92MODULE_LICENSE("GPL");
  93MODULE_ALIAS_CHARDEV_MAJOR(SCSI_TAPE_MAJOR);
  94MODULE_ALIAS_SCSI_DEVICE(TYPE_TAPE);
  95
  96/* Set 'perm' (4th argument) to 0 to disable module_param's definition
  97 * of sysfs parameters (which module_param doesn't yet support).
  98 * Sysfs parameters defined explicitly later.
  99 */
 100module_param_named(buffer_kbs, buffer_kbs, int, 0);
 101MODULE_PARM_DESC(buffer_kbs, "Default driver buffer size for fixed block mode (KB; 32)");
 102module_param_named(max_sg_segs, max_sg_segs, int, 0);
 103MODULE_PARM_DESC(max_sg_segs, "Maximum number of scatter/gather segments to use (256)");
 104module_param_named(try_direct_io, try_direct_io, int, 0);
 105MODULE_PARM_DESC(try_direct_io, "Try direct I/O between user buffer and tape drive (1)");
 106module_param_named(debug_flag, debug_flag, int, 0);
 107MODULE_PARM_DESC(debug_flag, "Enable DEBUG, same as setting debugging=1");
 108
 109
 110/* Extra parameters for testing */
 111module_param_named(try_rdio, try_rdio, int, 0);
 112MODULE_PARM_DESC(try_rdio, "Try direct read i/o when possible");
 113module_param_named(try_wdio, try_wdio, int, 0);
 114MODULE_PARM_DESC(try_wdio, "Try direct write i/o when possible");
 115
 116#ifndef MODULE
 117static int write_threshold_kbs;  /* retained for compatibility */
 118static struct st_dev_parm {
 119        char *name;
 120        int *val;
 121} parms[] __initdata = {
 122        {
 123                "buffer_kbs", &buffer_kbs
 124        },
 125        {       /* Retained for compatibility with 2.4 */
 126                "write_threshold_kbs", &write_threshold_kbs
 127        },
 128        {
 129                "max_sg_segs", NULL
 130        },
 131        {
 132                "try_direct_io", &try_direct_io
 133        },
 134        {
 135                "debug_flag", &debug_flag
 136        }
 137};
 138#endif
 139
 140/* Restrict the number of modes so that names for all are assigned */
 141#if ST_NBR_MODES > 16
 142#error "Maximum number of modes is 16"
 143#endif
 144/* Bit reversed order to get same names for same minors with all
 145   mode counts */
 146static const char *st_formats[] = {
 147        "",  "r", "k", "s", "l", "t", "o", "u",
 148        "m", "v", "p", "x", "a", "y", "q", "z"}; 
 149
 150/* The default definitions have been moved to st_options.h */
 151
 152#define ST_FIXED_BUFFER_SIZE (ST_FIXED_BUFFER_BLOCKS * ST_KILOBYTE)
 153
 154/* The buffer size should fit into the 24 bits for length in the
 155   6-byte SCSI read and write commands. */
 156#if ST_FIXED_BUFFER_SIZE >= (2 << 24 - 1)
 157#error "Buffer size should not exceed (2 << 24 - 1) bytes!"
 158#endif
 159
 160static int debugging = DEBUG;
 161
 162#define MAX_RETRIES 0
 163#define MAX_WRITE_RETRIES 0
 164#define MAX_READY_RETRIES 0
 165#define NO_TAPE  NOT_READY
 166
 167#define ST_TIMEOUT (900 * HZ)
 168#define ST_LONG_TIMEOUT (14000 * HZ)
 169
 170/* Remove mode bits and auto-rewind bit (7) */
 171#define TAPE_NR(x) ( ((iminor(x) & ~255) >> (ST_NBR_MODE_BITS + 1)) | \
 172    (iminor(x) & ~(-1 << ST_MODE_SHIFT)) )
 173#define TAPE_MODE(x) ((iminor(x) & ST_MODE_MASK) >> ST_MODE_SHIFT)
 174
 175/* Construct the minor number from the device (d), mode (m), and non-rewind (n) data */
 176#define TAPE_MINOR(d, m, n) (((d & ~(255 >> (ST_NBR_MODE_BITS + 1))) << (ST_NBR_MODE_BITS + 1)) | \
 177  (d & (255 >> (ST_NBR_MODE_BITS + 1))) | (m << ST_MODE_SHIFT) | ((n != 0) << 7) )
 178
 179/* Internal ioctl to set both density (uppermost 8 bits) and blocksize (lower
 180   24 bits) */
 181#define SET_DENS_AND_BLK 0x10001
 182
 183static int st_fixed_buffer_size = ST_FIXED_BUFFER_SIZE;
 184static int st_max_sg_segs = ST_MAX_SG;
 185
 186static int modes_defined;
 187
 188static int enlarge_buffer(struct st_buffer *, int, int);
 189static void clear_buffer(struct st_buffer *);
 190static void normalize_buffer(struct st_buffer *);
 191static int append_to_buffer(const char __user *, struct st_buffer *, int);
 192static int from_buffer(struct st_buffer *, char __user *, int);
 193static void move_buffer_data(struct st_buffer *, int);
 194
 195static int sgl_map_user_pages(struct st_buffer *, const unsigned int,
 196                              unsigned long, size_t, int);
 197static int sgl_unmap_user_pages(struct st_buffer *, const unsigned int, int);
 198
 199static int st_probe(struct device *);
 200static int st_remove(struct device *);
 201
 202static struct scsi_driver st_template = {
 203        .gendrv = {
 204                .name           = "st",
 205                .owner          = THIS_MODULE,
 206                .probe          = st_probe,
 207                .remove         = st_remove,
 208                .groups         = st_drv_groups,
 209        },
 210};
 211
 212static int st_compression(struct scsi_tape *, int);
 213
 214static int find_partition(struct scsi_tape *);
 215static int switch_partition(struct scsi_tape *);
 216
 217static int st_int_ioctl(struct scsi_tape *, unsigned int, unsigned long);
 218
 219static void scsi_tape_release(struct kref *);
 220
 221#define to_scsi_tape(obj) container_of(obj, struct scsi_tape, kref)
 222
 223static DEFINE_MUTEX(st_ref_mutex);
 224static DEFINE_SPINLOCK(st_index_lock);
 225static DEFINE_SPINLOCK(st_use_lock);
 226static DEFINE_IDR(st_index_idr);
 227
 228
 229
 230#include "osst_detect.h"
 231#ifndef SIGS_FROM_OSST
 232#define SIGS_FROM_OSST \
 233        {"OnStream", "SC-", "", "osst"}, \
 234        {"OnStream", "DI-", "", "osst"}, \
 235        {"OnStream", "DP-", "", "osst"}, \
 236        {"OnStream", "USB", "", "osst"}, \
 237        {"OnStream", "FW-", "", "osst"}
 238#endif
 239
 240static struct scsi_tape *scsi_tape_get(int dev)
 241{
 242        struct scsi_tape *STp = NULL;
 243
 244        mutex_lock(&st_ref_mutex);
 245        spin_lock(&st_index_lock);
 246
 247        STp = idr_find(&st_index_idr, dev);
 248        if (!STp) goto out;
 249
 250        kref_get(&STp->kref);
 251
 252        if (!STp->device)
 253                goto out_put;
 254
 255        if (scsi_device_get(STp->device))
 256                goto out_put;
 257
 258        goto out;
 259
 260out_put:
 261        kref_put(&STp->kref, scsi_tape_release);
 262        STp = NULL;
 263out:
 264        spin_unlock(&st_index_lock);
 265        mutex_unlock(&st_ref_mutex);
 266        return STp;
 267}
 268
 269static void scsi_tape_put(struct scsi_tape *STp)
 270{
 271        struct scsi_device *sdev = STp->device;
 272
 273        mutex_lock(&st_ref_mutex);
 274        kref_put(&STp->kref, scsi_tape_release);
 275        scsi_device_put(sdev);
 276        mutex_unlock(&st_ref_mutex);
 277}
 278
 279struct st_reject_data {
 280        char *vendor;
 281        char *model;
 282        char *rev;
 283        char *driver_hint; /* Name of the correct driver, NULL if unknown */
 284};
 285
 286static struct st_reject_data reject_list[] = {
 287        /* {"XXX", "Yy-", "", NULL},  example */
 288        SIGS_FROM_OSST,
 289        {NULL, }};
 290
 291/* If the device signature is on the list of incompatible drives, the
 292   function returns a pointer to the name of the correct driver (if known) */
 293static char * st_incompatible(struct scsi_device* SDp)
 294{
 295        struct st_reject_data *rp;
 296
 297        for (rp=&(reject_list[0]); rp->vendor != NULL; rp++)
 298                if (!strncmp(rp->vendor, SDp->vendor, strlen(rp->vendor)) &&
 299                    !strncmp(rp->model, SDp->model, strlen(rp->model)) &&
 300                    !strncmp(rp->rev, SDp->rev, strlen(rp->rev))) {
 301                        if (rp->driver_hint)
 302                                return rp->driver_hint;
 303                        else
 304                                return "unknown";
 305                }
 306        return NULL;
 307}
 308
 309
 310static inline char *tape_name(struct scsi_tape *tape)
 311{
 312        return tape->disk->disk_name;
 313}
 314
 315#define st_printk(prefix, t, fmt, a...) \
 316        sdev_prefix_printk(prefix, (t)->device, tape_name(t), fmt, ##a)
 317#ifdef DEBUG
 318#define DEBC_printk(t, fmt, a...) \
 319        if (debugging) { st_printk(ST_DEB_MSG, t, fmt, ##a ); }
 320#else
 321#define DEBC_printk(t, fmt, a...)
 322#endif
 323
 324static void st_analyze_sense(struct st_request *SRpnt, struct st_cmdstatus *s)
 325{
 326        const u8 *ucp;
 327        const u8 *sense = SRpnt->sense;
 328
 329        s->have_sense = scsi_normalize_sense(SRpnt->sense,
 330                                SCSI_SENSE_BUFFERSIZE, &s->sense_hdr);
 331        s->flags = 0;
 332
 333        if (s->have_sense) {
 334                s->deferred = 0;
 335                s->remainder_valid =
 336                        scsi_get_sense_info_fld(sense, SCSI_SENSE_BUFFERSIZE, &s->uremainder64);
 337                switch (sense[0] & 0x7f) {
 338                case 0x71:
 339                        s->deferred = 1;
 340                case 0x70:
 341                        s->fixed_format = 1;
 342                        s->flags = sense[2] & 0xe0;
 343                        break;
 344                case 0x73:
 345                        s->deferred = 1;
 346                case 0x72:
 347                        s->fixed_format = 0;
 348                        ucp = scsi_sense_desc_find(sense, SCSI_SENSE_BUFFERSIZE, 4);
 349                        s->flags = ucp ? (ucp[3] & 0xe0) : 0;
 350                        break;
 351                }
 352        }
 353}
 354
 355
 356/* Convert the result to success code */
 357static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
 358{
 359        int result = SRpnt->result;
 360        u8 scode;
 361        DEB(const char *stp;)
 362        char *name = tape_name(STp);
 363        struct st_cmdstatus *cmdstatp;
 364
 365        if (!result)
 366                return 0;
 367
 368        cmdstatp = &STp->buffer->cmdstat;
 369        st_analyze_sense(SRpnt, cmdstatp);
 370
 371        if (cmdstatp->have_sense)
 372                scode = STp->buffer->cmdstat.sense_hdr.sense_key;
 373        else
 374                scode = 0;
 375
 376        DEB(
 377        if (debugging) {
 378                st_printk(ST_DEB_MSG, STp,
 379                            "Error: %x, cmd: %x %x %x %x %x %x\n", result,
 380                            SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2],
 381                            SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]);
 382                if (cmdstatp->have_sense)
 383                        __scsi_print_sense(STp->device, name,
 384                                           SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
 385        } ) /* end DEB */
 386        if (!debugging) { /* Abnormal conditions for tape */
 387                if (!cmdstatp->have_sense)
 388                        st_printk(KERN_WARNING, STp,
 389                               "Error %x (driver bt 0x%x, host bt 0x%x).\n",
 390                               result, driver_byte(result), host_byte(result));
 391                else if (cmdstatp->have_sense &&
 392                         scode != NO_SENSE &&
 393                         scode != RECOVERED_ERROR &&
 394                         /* scode != UNIT_ATTENTION && */
 395                         scode != BLANK_CHECK &&
 396                         scode != VOLUME_OVERFLOW &&
 397                         SRpnt->cmd[0] != MODE_SENSE &&
 398                         SRpnt->cmd[0] != TEST_UNIT_READY) {
 399
 400                        __scsi_print_sense(STp->device, name,
 401                                           SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
 402                }
 403        }
 404
 405        if (cmdstatp->fixed_format &&
 406            STp->cln_mode >= EXTENDED_SENSE_START) {  /* Only fixed format sense */
 407                if (STp->cln_sense_value)
 408                        STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] &
 409                                               STp->cln_sense_mask) == STp->cln_sense_value);
 410                else
 411                        STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] &
 412                                               STp->cln_sense_mask) != 0);
 413        }
 414        if (cmdstatp->have_sense &&
 415            cmdstatp->sense_hdr.asc == 0 && cmdstatp->sense_hdr.ascq == 0x17)
 416                STp->cleaning_req = 1; /* ASC and ASCQ => cleaning requested */
 417
 418        STp->pos_unknown |= STp->device->was_reset;
 419
 420        if (cmdstatp->have_sense &&
 421            scode == RECOVERED_ERROR
 422#if ST_RECOVERED_WRITE_FATAL
 423            && SRpnt->cmd[0] != WRITE_6
 424            && SRpnt->cmd[0] != WRITE_FILEMARKS
 425#endif
 426            ) {
 427                STp->recover_count++;
 428                STp->recover_reg++;
 429
 430                DEB(
 431                if (debugging) {
 432                        if (SRpnt->cmd[0] == READ_6)
 433                                stp = "read";
 434                        else if (SRpnt->cmd[0] == WRITE_6)
 435                                stp = "write";
 436                        else
 437                                stp = "ioctl";
 438                        st_printk(ST_DEB_MSG, STp,
 439                                  "Recovered %s error (%d).\n",
 440                                  stp, STp->recover_count);
 441                } ) /* end DEB */
 442
 443                if (cmdstatp->flags == 0)
 444                        return 0;
 445        }
 446        return (-EIO);
 447}
 448
 449static struct st_request *st_allocate_request(struct scsi_tape *stp)
 450{
 451        struct st_request *streq;
 452
 453        streq = kzalloc(sizeof(*streq), GFP_KERNEL);
 454        if (streq)
 455                streq->stp = stp;
 456        else {
 457                st_printk(KERN_ERR, stp,
 458                          "Can't get SCSI request.\n");
 459                if (signal_pending(current))
 460                        stp->buffer->syscall_result = -EINTR;
 461                else
 462                        stp->buffer->syscall_result = -EBUSY;
 463        }
 464
 465        return streq;
 466}
 467
 468static void st_release_request(struct st_request *streq)
 469{
 470        kfree(streq);
 471}
 472
 473static void st_do_stats(struct scsi_tape *STp, struct request *req)
 474{
 475        ktime_t now;
 476
 477        now = ktime_get();
 478        if (scsi_req(req)->cmd[0] == WRITE_6) {
 479                now = ktime_sub(now, STp->stats->write_time);
 480                atomic64_add(ktime_to_ns(now), &STp->stats->tot_write_time);
 481                atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time);
 482                atomic64_inc(&STp->stats->write_cnt);
 483                if (scsi_req(req)->result) {
 484                        atomic64_add(atomic_read(&STp->stats->last_write_size)
 485                                - STp->buffer->cmdstat.residual,
 486                                &STp->stats->write_byte_cnt);
 487                        if (STp->buffer->cmdstat.residual > 0)
 488                                atomic64_inc(&STp->stats->resid_cnt);
 489                } else
 490                        atomic64_add(atomic_read(&STp->stats->last_write_size),
 491                                &STp->stats->write_byte_cnt);
 492        } else if (scsi_req(req)->cmd[0] == READ_6) {
 493                now = ktime_sub(now, STp->stats->read_time);
 494                atomic64_add(ktime_to_ns(now), &STp->stats->tot_read_time);
 495                atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time);
 496                atomic64_inc(&STp->stats->read_cnt);
 497                if (scsi_req(req)->result) {
 498                        atomic64_add(atomic_read(&STp->stats->last_read_size)
 499                                - STp->buffer->cmdstat.residual,
 500                                &STp->stats->read_byte_cnt);
 501                        if (STp->buffer->cmdstat.residual > 0)
 502                                atomic64_inc(&STp->stats->resid_cnt);
 503                } else
 504                        atomic64_add(atomic_read(&STp->stats->last_read_size),
 505                                &STp->stats->read_byte_cnt);
 506        } else {
 507                now = ktime_sub(now, STp->stats->other_time);
 508                atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time);
 509                atomic64_inc(&STp->stats->other_cnt);
 510        }
 511        atomic64_dec(&STp->stats->in_flight);
 512}
 513
 514static void st_scsi_execute_end(struct request *req, blk_status_t status)
 515{
 516        struct st_request *SRpnt = req->end_io_data;
 517        struct scsi_request *rq = scsi_req(req);
 518        struct scsi_tape *STp = SRpnt->stp;
 519        struct bio *tmp;
 520
 521        STp->buffer->cmdstat.midlevel_result = SRpnt->result = rq->result;
 522        STp->buffer->cmdstat.residual = rq->resid_len;
 523
 524        st_do_stats(STp, req);
 525
 526        tmp = SRpnt->bio;
 527        if (rq->sense_len)
 528                memcpy(SRpnt->sense, rq->sense, SCSI_SENSE_BUFFERSIZE);
 529        if (SRpnt->waiting)
 530                complete(SRpnt->waiting);
 531
 532        blk_rq_unmap_user(tmp);
 533        __blk_put_request(req->q, req);
 534}
 535
 536static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd,
 537                           int data_direction, void *buffer, unsigned bufflen,
 538                           int timeout, int retries)
 539{
 540        struct request *req;
 541        struct scsi_request *rq;
 542        struct rq_map_data *mdata = &SRpnt->stp->buffer->map_data;
 543        int err = 0;
 544        struct scsi_tape *STp = SRpnt->stp;
 545
 546        req = blk_get_request(SRpnt->stp->device->request_queue,
 547                        data_direction == DMA_TO_DEVICE ?
 548                        REQ_OP_SCSI_OUT : REQ_OP_SCSI_IN, GFP_KERNEL);
 549        if (IS_ERR(req))
 550                return DRIVER_ERROR << 24;
 551        rq = scsi_req(req);
 552        req->rq_flags |= RQF_QUIET;
 553
 554        mdata->null_mapped = 1;
 555
 556        if (bufflen) {
 557                err = blk_rq_map_user(req->q, req, mdata, NULL, bufflen,
 558                                      GFP_KERNEL);
 559                if (err) {
 560                        blk_put_request(req);
 561                        return DRIVER_ERROR << 24;
 562                }
 563        }
 564
 565        atomic64_inc(&STp->stats->in_flight);
 566        if (cmd[0] == WRITE_6) {
 567                atomic_set(&STp->stats->last_write_size, bufflen);
 568                STp->stats->write_time = ktime_get();
 569        } else if (cmd[0] == READ_6) {
 570                atomic_set(&STp->stats->last_read_size, bufflen);
 571                STp->stats->read_time = ktime_get();
 572        } else {
 573                STp->stats->other_time = ktime_get();
 574        }
 575
 576        SRpnt->bio = req->bio;
 577        rq->cmd_len = COMMAND_SIZE(cmd[0]);
 578        memset(rq->cmd, 0, BLK_MAX_CDB);
 579        memcpy(rq->cmd, cmd, rq->cmd_len);
 580        req->timeout = timeout;
 581        rq->retries = retries;
 582        req->end_io_data = SRpnt;
 583
 584        blk_execute_rq_nowait(req->q, NULL, req, 1, st_scsi_execute_end);
 585        return 0;
 586}
 587
 588/* Do the scsi command. Waits until command performed if do_wait is true.
 589   Otherwise write_behind_check() is used to check that the command
 590   has finished. */
 591static struct st_request *
 592st_do_scsi(struct st_request * SRpnt, struct scsi_tape * STp, unsigned char *cmd,
 593           int bytes, int direction, int timeout, int retries, int do_wait)
 594{
 595        struct completion *waiting;
 596        struct rq_map_data *mdata = &STp->buffer->map_data;
 597        int ret;
 598
 599        /* if async, make sure there's no command outstanding */
 600        if (!do_wait && ((STp->buffer)->last_SRpnt)) {
 601                st_printk(KERN_ERR, STp,
 602                          "Async command already active.\n");
 603                if (signal_pending(current))
 604                        (STp->buffer)->syscall_result = (-EINTR);
 605                else
 606                        (STp->buffer)->syscall_result = (-EBUSY);
 607                return NULL;
 608        }
 609
 610        if (!SRpnt) {
 611                SRpnt = st_allocate_request(STp);
 612                if (!SRpnt)
 613                        return NULL;
 614        }
 615
 616        /* If async IO, set last_SRpnt. This ptr tells write_behind_check
 617           which IO is outstanding. It's nulled out when the IO completes. */
 618        if (!do_wait)
 619                (STp->buffer)->last_SRpnt = SRpnt;
 620
 621        waiting = &STp->wait;
 622        init_completion(waiting);
 623        SRpnt->waiting = waiting;
 624
 625        if (STp->buffer->do_dio) {
 626                mdata->page_order = 0;
 627                mdata->nr_entries = STp->buffer->sg_segs;
 628                mdata->pages = STp->buffer->mapped_pages;
 629        } else {
 630                mdata->page_order = STp->buffer->reserved_page_order;
 631                mdata->nr_entries =
 632                        DIV_ROUND_UP(bytes, PAGE_SIZE << mdata->page_order);
 633                mdata->pages = STp->buffer->reserved_pages;
 634                mdata->offset = 0;
 635        }
 636
 637        memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd));
 638        STp->buffer->cmdstat.have_sense = 0;
 639        STp->buffer->syscall_result = 0;
 640
 641        ret = st_scsi_execute(SRpnt, cmd, direction, NULL, bytes, timeout,
 642                              retries);
 643        if (ret) {
 644                /* could not allocate the buffer or request was too large */
 645                (STp->buffer)->syscall_result = (-EBUSY);
 646                (STp->buffer)->last_SRpnt = NULL;
 647        } else if (do_wait) {
 648                wait_for_completion(waiting);
 649                SRpnt->waiting = NULL;
 650                (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt);
 651        }
 652
 653        return SRpnt;
 654}
 655
 656
 657/* Handle the write-behind checking (waits for completion). Returns -ENOSPC if
 658   write has been correct but EOM early warning reached, -EIO if write ended in
 659   error or zero if write successful. Asynchronous writes are used only in
 660   variable block mode. */
 661static int write_behind_check(struct scsi_tape * STp)
 662{
 663        int retval = 0;
 664        struct st_buffer *STbuffer;
 665        struct st_partstat *STps;
 666        struct st_cmdstatus *cmdstatp;
 667        struct st_request *SRpnt;
 668
 669        STbuffer = STp->buffer;
 670        if (!STbuffer->writing)
 671                return 0;
 672
 673        DEB(
 674        if (STp->write_pending)
 675                STp->nbr_waits++;
 676        else
 677                STp->nbr_finished++;
 678        ) /* end DEB */
 679
 680        wait_for_completion(&(STp->wait));
 681        SRpnt = STbuffer->last_SRpnt;
 682        STbuffer->last_SRpnt = NULL;
 683        SRpnt->waiting = NULL;
 684
 685        (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt);
 686        st_release_request(SRpnt);
 687
 688        STbuffer->buffer_bytes -= STbuffer->writing;
 689        STps = &(STp->ps[STp->partition]);
 690        if (STps->drv_block >= 0) {
 691                if (STp->block_size == 0)
 692                        STps->drv_block++;
 693                else
 694                        STps->drv_block += STbuffer->writing / STp->block_size;
 695        }
 696
 697        cmdstatp = &STbuffer->cmdstat;
 698        if (STbuffer->syscall_result) {
 699                retval = -EIO;
 700                if (cmdstatp->have_sense && !cmdstatp->deferred &&
 701                    (cmdstatp->flags & SENSE_EOM) &&
 702                    (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
 703                     cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR)) {
 704                        /* EOM at write-behind, has all data been written? */
 705                        if (!cmdstatp->remainder_valid ||
 706                            cmdstatp->uremainder64 == 0)
 707                                retval = -ENOSPC;
 708                }
 709                if (retval == -EIO)
 710                        STps->drv_block = -1;
 711        }
 712        STbuffer->writing = 0;
 713
 714        DEB(if (debugging && retval)
 715                    st_printk(ST_DEB_MSG, STp,
 716                                "Async write error %x, return value %d.\n",
 717                                STbuffer->cmdstat.midlevel_result, retval);) /* end DEB */
 718
 719        return retval;
 720}
 721
 722
 723/* Step over EOF if it has been inadvertently crossed (ioctl not used because
 724   it messes up the block number). */
 725static int cross_eof(struct scsi_tape * STp, int forward)
 726{
 727        struct st_request *SRpnt;
 728        unsigned char cmd[MAX_COMMAND_SIZE];
 729
 730        cmd[0] = SPACE;
 731        cmd[1] = 0x01;          /* Space FileMarks */
 732        if (forward) {
 733                cmd[2] = cmd[3] = 0;
 734                cmd[4] = 1;
 735        } else
 736                cmd[2] = cmd[3] = cmd[4] = 0xff;        /* -1 filemarks */
 737        cmd[5] = 0;
 738
 739        DEBC_printk(STp, "Stepping over filemark %s.\n",
 740                    forward ? "forward" : "backward");
 741
 742        SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
 743                           STp->device->request_queue->rq_timeout,
 744                           MAX_RETRIES, 1);
 745        if (!SRpnt)
 746                return (STp->buffer)->syscall_result;
 747
 748        st_release_request(SRpnt);
 749        SRpnt = NULL;
 750
 751        if ((STp->buffer)->cmdstat.midlevel_result != 0)
 752                st_printk(KERN_ERR, STp,
 753                          "Stepping over filemark %s failed.\n",
 754                          forward ? "forward" : "backward");
 755
 756        return (STp->buffer)->syscall_result;
 757}
 758
 759
 760/* Flush the write buffer (never need to write if variable blocksize). */
 761static int st_flush_write_buffer(struct scsi_tape * STp)
 762{
 763        int transfer, blks;
 764        int result;
 765        unsigned char cmd[MAX_COMMAND_SIZE];
 766        struct st_request *SRpnt;
 767        struct st_partstat *STps;
 768
 769        result = write_behind_check(STp);
 770        if (result)
 771                return result;
 772
 773        result = 0;
 774        if (STp->dirty == 1) {
 775
 776                transfer = STp->buffer->buffer_bytes;
 777                DEBC_printk(STp, "Flushing %d bytes.\n", transfer);
 778
 779                memset(cmd, 0, MAX_COMMAND_SIZE);
 780                cmd[0] = WRITE_6;
 781                cmd[1] = 1;
 782                blks = transfer / STp->block_size;
 783                cmd[2] = blks >> 16;
 784                cmd[3] = blks >> 8;
 785                cmd[4] = blks;
 786
 787                SRpnt = st_do_scsi(NULL, STp, cmd, transfer, DMA_TO_DEVICE,
 788                                   STp->device->request_queue->rq_timeout,
 789                                   MAX_WRITE_RETRIES, 1);
 790                if (!SRpnt)
 791                        return (STp->buffer)->syscall_result;
 792
 793                STps = &(STp->ps[STp->partition]);
 794                if ((STp->buffer)->syscall_result != 0) {
 795                        struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
 796
 797                        if (cmdstatp->have_sense && !cmdstatp->deferred &&
 798                            (cmdstatp->flags & SENSE_EOM) &&
 799                            (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
 800                             cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) &&
 801                            (!cmdstatp->remainder_valid ||
 802                             cmdstatp->uremainder64 == 0)) { /* All written at EOM early warning */
 803                                STp->dirty = 0;
 804                                (STp->buffer)->buffer_bytes = 0;
 805                                if (STps->drv_block >= 0)
 806                                        STps->drv_block += blks;
 807                                result = (-ENOSPC);
 808                        } else {
 809                                st_printk(KERN_ERR, STp, "Error on flush.\n");
 810                                STps->drv_block = (-1);
 811                                result = (-EIO);
 812                        }
 813                } else {
 814                        if (STps->drv_block >= 0)
 815                                STps->drv_block += blks;
 816                        STp->dirty = 0;
 817                        (STp->buffer)->buffer_bytes = 0;
 818                }
 819                st_release_request(SRpnt);
 820                SRpnt = NULL;
 821        }
 822        return result;
 823}
 824
 825
 826/* Flush the tape buffer. The tape will be positioned correctly unless
 827   seek_next is true. */
 828static int flush_buffer(struct scsi_tape *STp, int seek_next)
 829{
 830        int backspace, result;
 831        struct st_buffer *STbuffer;
 832        struct st_partstat *STps;
 833
 834        STbuffer = STp->buffer;
 835
 836        /*
 837         * If there was a bus reset, block further access
 838         * to this device.
 839         */
 840        if (STp->pos_unknown)
 841                return (-EIO);
 842
 843        if (STp->ready != ST_READY)
 844                return 0;
 845        STps = &(STp->ps[STp->partition]);
 846        if (STps->rw == ST_WRITING)     /* Writing */
 847                return st_flush_write_buffer(STp);
 848
 849        if (STp->block_size == 0)
 850                return 0;
 851
 852        backspace = ((STp->buffer)->buffer_bytes +
 853                     (STp->buffer)->read_pointer) / STp->block_size -
 854            ((STp->buffer)->read_pointer + STp->block_size - 1) /
 855            STp->block_size;
 856        (STp->buffer)->buffer_bytes = 0;
 857        (STp->buffer)->read_pointer = 0;
 858        result = 0;
 859        if (!seek_next) {
 860                if (STps->eof == ST_FM_HIT) {
 861                        result = cross_eof(STp, 0);     /* Back over the EOF hit */
 862                        if (!result)
 863                                STps->eof = ST_NOEOF;
 864                        else {
 865                                if (STps->drv_file >= 0)
 866                                        STps->drv_file++;
 867                                STps->drv_block = 0;
 868                        }
 869                }
 870                if (!result && backspace > 0)
 871                        result = st_int_ioctl(STp, MTBSR, backspace);
 872        } else if (STps->eof == ST_FM_HIT) {
 873                if (STps->drv_file >= 0)
 874                        STps->drv_file++;
 875                STps->drv_block = 0;
 876                STps->eof = ST_NOEOF;
 877        }
 878        return result;
 879
 880}
 881
 882/* Set the mode parameters */
 883static int set_mode_densblk(struct scsi_tape * STp, struct st_modedef * STm)
 884{
 885        int set_it = 0;
 886        unsigned long arg;
 887
 888        if (!STp->density_changed &&
 889            STm->default_density >= 0 &&
 890            STm->default_density != STp->density) {
 891                arg = STm->default_density;
 892                set_it = 1;
 893        } else
 894                arg = STp->density;
 895        arg <<= MT_ST_DENSITY_SHIFT;
 896        if (!STp->blksize_changed &&
 897            STm->default_blksize >= 0 &&
 898            STm->default_blksize != STp->block_size) {
 899                arg |= STm->default_blksize;
 900                set_it = 1;
 901        } else
 902                arg |= STp->block_size;
 903        if (set_it &&
 904            st_int_ioctl(STp, SET_DENS_AND_BLK, arg)) {
 905                st_printk(KERN_WARNING, STp,
 906                          "Can't set default block size to %d bytes "
 907                          "and density %x.\n",
 908                          STm->default_blksize, STm->default_density);
 909                if (modes_defined)
 910                        return (-EINVAL);
 911        }
 912        return 0;
 913}
 914
 915
 916/* Lock or unlock the drive door. Don't use when st_request allocated. */
 917static int do_door_lock(struct scsi_tape * STp, int do_lock)
 918{
 919        int retval;
 920
 921        DEBC_printk(STp, "%socking drive door.\n", do_lock ? "L" : "Unl");
 922
 923        retval = scsi_set_medium_removal(STp->device,
 924                        do_lock ? SCSI_REMOVAL_PREVENT : SCSI_REMOVAL_ALLOW);
 925        if (!retval)
 926                STp->door_locked = do_lock ? ST_LOCKED_EXPLICIT : ST_UNLOCKED;
 927        else
 928                STp->door_locked = ST_LOCK_FAILS;
 929        return retval;
 930}
 931
 932
 933/* Set the internal state after reset */
 934static void reset_state(struct scsi_tape *STp)
 935{
 936        int i;
 937        struct st_partstat *STps;
 938
 939        STp->pos_unknown = 0;
 940        for (i = 0; i < ST_NBR_PARTITIONS; i++) {
 941                STps = &(STp->ps[i]);
 942                STps->rw = ST_IDLE;
 943                STps->eof = ST_NOEOF;
 944                STps->at_sm = 0;
 945                STps->last_block_valid = 0;
 946                STps->drv_block = -1;
 947                STps->drv_file = -1;
 948        }
 949        if (STp->can_partitions) {
 950                STp->partition = find_partition(STp);
 951                if (STp->partition < 0)
 952                        STp->partition = 0;
 953                STp->new_partition = STp->partition;
 954        }
 955}
 956
 957/* Test if the drive is ready. Returns either one of the codes below or a negative system
 958   error code. */
 959#define CHKRES_READY       0
 960#define CHKRES_NEW_SESSION 1
 961#define CHKRES_NOT_READY   2
 962#define CHKRES_NO_TAPE     3
 963
 964#define MAX_ATTENTIONS    10
 965
 966static int test_ready(struct scsi_tape *STp, int do_wait)
 967{
 968        int attentions, waits, max_wait, scode;
 969        int retval = CHKRES_READY, new_session = 0;
 970        unsigned char cmd[MAX_COMMAND_SIZE];
 971        struct st_request *SRpnt = NULL;
 972        struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
 973
 974        max_wait = do_wait ? ST_BLOCK_SECONDS : 0;
 975
 976        for (attentions=waits=0; ; ) {
 977                memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
 978                cmd[0] = TEST_UNIT_READY;
 979                SRpnt = st_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE,
 980                                   STp->long_timeout, MAX_READY_RETRIES, 1);
 981
 982                if (!SRpnt) {
 983                        retval = (STp->buffer)->syscall_result;
 984                        break;
 985                }
 986
 987                if (cmdstatp->have_sense) {
 988
 989                        scode = cmdstatp->sense_hdr.sense_key;
 990
 991                        if (scode == UNIT_ATTENTION) { /* New media? */
 992                                new_session = 1;
 993                                if (attentions < MAX_ATTENTIONS) {
 994                                        attentions++;
 995                                        continue;
 996                                }
 997                                else {
 998                                        retval = (-EIO);
 999                                        break;
1000                                }
1001                        }
1002
1003                        if (scode == NOT_READY) {
1004                                if (waits < max_wait) {
1005                                        if (msleep_interruptible(1000)) {
1006                                                retval = (-EINTR);
1007                                                break;
1008                                        }
1009                                        waits++;
1010                                        continue;
1011                                }
1012                                else {
1013                                        if ((STp->device)->scsi_level >= SCSI_2 &&
1014                                            cmdstatp->sense_hdr.asc == 0x3a)    /* Check ASC */
1015                                                retval = CHKRES_NO_TAPE;
1016                                        else
1017                                                retval = CHKRES_NOT_READY;
1018                                        break;
1019                                }
1020                        }
1021                }
1022
1023                retval = (STp->buffer)->syscall_result;
1024                if (!retval)
1025                        retval = new_session ? CHKRES_NEW_SESSION : CHKRES_READY;
1026                break;
1027        }
1028
1029        if (SRpnt != NULL)
1030                st_release_request(SRpnt);
1031        return retval;
1032}
1033
1034
1035/* See if the drive is ready and gather information about the tape. Return values:
1036   < 0   negative error code from errno.h
1037   0     drive ready
1038   1     drive not ready (possibly no tape)
1039*/
1040static int check_tape(struct scsi_tape *STp, struct file *filp)
1041{
1042        int i, retval, new_session = 0, do_wait;
1043        unsigned char cmd[MAX_COMMAND_SIZE], saved_cleaning;
1044        unsigned short st_flags = filp->f_flags;
1045        struct st_request *SRpnt = NULL;
1046        struct st_modedef *STm;
1047        struct st_partstat *STps;
1048        struct inode *inode = file_inode(filp);
1049        int mode = TAPE_MODE(inode);
1050
1051        STp->ready = ST_READY;
1052
1053        if (mode != STp->current_mode) {
1054                DEBC_printk(STp, "Mode change from %d to %d.\n",
1055                            STp->current_mode, mode);
1056                new_session = 1;
1057                STp->current_mode = mode;
1058        }
1059        STm = &(STp->modes[STp->current_mode]);
1060
1061        saved_cleaning = STp->cleaning_req;
1062        STp->cleaning_req = 0;
1063
1064        do_wait = ((filp->f_flags & O_NONBLOCK) == 0);
1065        retval = test_ready(STp, do_wait);
1066
1067        if (retval < 0)
1068            goto err_out;
1069
1070        if (retval == CHKRES_NEW_SESSION) {
1071                STp->pos_unknown = 0;
1072                STp->partition = STp->new_partition = 0;
1073                if (STp->can_partitions)
1074                        STp->nbr_partitions = 1; /* This guess will be updated later
1075                                                    if necessary */
1076                for (i = 0; i < ST_NBR_PARTITIONS; i++) {
1077                        STps = &(STp->ps[i]);
1078                        STps->rw = ST_IDLE;
1079                        STps->eof = ST_NOEOF;
1080                        STps->at_sm = 0;
1081                        STps->last_block_valid = 0;
1082                        STps->drv_block = 0;
1083                        STps->drv_file = 0;
1084                }
1085                new_session = 1;
1086        }
1087        else {
1088                STp->cleaning_req |= saved_cleaning;
1089
1090                if (retval == CHKRES_NOT_READY || retval == CHKRES_NO_TAPE) {
1091                        if (retval == CHKRES_NO_TAPE)
1092                                STp->ready = ST_NO_TAPE;
1093                        else
1094                                STp->ready = ST_NOT_READY;
1095
1096                        STp->density = 0;       /* Clear the erroneous "residue" */
1097                        STp->write_prot = 0;
1098                        STp->block_size = 0;
1099                        STp->ps[0].drv_file = STp->ps[0].drv_block = (-1);
1100                        STp->partition = STp->new_partition = 0;
1101                        STp->door_locked = ST_UNLOCKED;
1102                        return CHKRES_NOT_READY;
1103                }
1104        }
1105
1106        if (STp->omit_blklims)
1107                STp->min_block = STp->max_block = (-1);
1108        else {
1109                memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
1110                cmd[0] = READ_BLOCK_LIMITS;
1111
1112                SRpnt = st_do_scsi(SRpnt, STp, cmd, 6, DMA_FROM_DEVICE,
1113                                   STp->device->request_queue->rq_timeout,
1114                                   MAX_READY_RETRIES, 1);
1115                if (!SRpnt) {
1116                        retval = (STp->buffer)->syscall_result;
1117                        goto err_out;
1118                }
1119
1120                if (!SRpnt->result && !STp->buffer->cmdstat.have_sense) {
1121                        STp->max_block = ((STp->buffer)->b_data[1] << 16) |
1122                            ((STp->buffer)->b_data[2] << 8) | (STp->buffer)->b_data[3];
1123                        STp->min_block = ((STp->buffer)->b_data[4] << 8) |
1124                            (STp->buffer)->b_data[5];
1125                        if ( DEB( debugging || ) !STp->inited)
1126                                st_printk(KERN_INFO, STp,
1127                                          "Block limits %d - %d bytes.\n",
1128                                          STp->min_block, STp->max_block);
1129                } else {
1130                        STp->min_block = STp->max_block = (-1);
1131                        DEBC_printk(STp, "Can't read block limits.\n");
1132                }
1133        }
1134
1135        memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
1136        cmd[0] = MODE_SENSE;
1137        cmd[4] = 12;
1138
1139        SRpnt = st_do_scsi(SRpnt, STp, cmd, 12, DMA_FROM_DEVICE,
1140                           STp->device->request_queue->rq_timeout,
1141                           MAX_READY_RETRIES, 1);
1142        if (!SRpnt) {
1143                retval = (STp->buffer)->syscall_result;
1144                goto err_out;
1145        }
1146
1147        if ((STp->buffer)->syscall_result != 0) {
1148                DEBC_printk(STp, "No Mode Sense.\n");
1149                STp->block_size = ST_DEFAULT_BLOCK;     /* Educated guess (?) */
1150                (STp->buffer)->syscall_result = 0;      /* Prevent error propagation */
1151                STp->drv_write_prot = 0;
1152        } else {
1153                DEBC_printk(STp,"Mode sense. Length %d, "
1154                            "medium %x, WBS %x, BLL %d\n",
1155                            (STp->buffer)->b_data[0],
1156                            (STp->buffer)->b_data[1],
1157                            (STp->buffer)->b_data[2],
1158                            (STp->buffer)->b_data[3]);
1159
1160                if ((STp->buffer)->b_data[3] >= 8) {
1161                        STp->drv_buffer = ((STp->buffer)->b_data[2] >> 4) & 7;
1162                        STp->density = (STp->buffer)->b_data[4];
1163                        STp->block_size = (STp->buffer)->b_data[9] * 65536 +
1164                            (STp->buffer)->b_data[10] * 256 + (STp->buffer)->b_data[11];
1165                        DEBC_printk(STp, "Density %x, tape length: %x, "
1166                                    "drv buffer: %d\n",
1167                                    STp->density,
1168                                    (STp->buffer)->b_data[5] * 65536 +
1169                                    (STp->buffer)->b_data[6] * 256 +
1170                                    (STp->buffer)->b_data[7],
1171                                    STp->drv_buffer);
1172                }
1173                STp->drv_write_prot = ((STp->buffer)->b_data[2] & 0x80) != 0;
1174                if (!STp->drv_buffer && STp->immediate_filemark) {
1175                        st_printk(KERN_WARNING, STp,
1176                                  "non-buffered tape: disabling "
1177                                  "writing immediate filemarks\n");
1178                        STp->immediate_filemark = 0;
1179                }
1180        }
1181        st_release_request(SRpnt);
1182        SRpnt = NULL;
1183        STp->inited = 1;
1184
1185        if (STp->block_size > 0)
1186                (STp->buffer)->buffer_blocks =
1187                        (STp->buffer)->buffer_size / STp->block_size;
1188        else
1189                (STp->buffer)->buffer_blocks = 1;
1190        (STp->buffer)->buffer_bytes = (STp->buffer)->read_pointer = 0;
1191
1192        DEBC_printk(STp, "Block size: %d, buffer size: %d (%d blocks).\n",
1193                    STp->block_size, (STp->buffer)->buffer_size,
1194                    (STp->buffer)->buffer_blocks);
1195
1196        if (STp->drv_write_prot) {
1197                STp->write_prot = 1;
1198
1199                DEBC_printk(STp, "Write protected\n");
1200
1201                if (do_wait &&
1202                    ((st_flags & O_ACCMODE) == O_WRONLY ||
1203                     (st_flags & O_ACCMODE) == O_RDWR)) {
1204                        retval = (-EROFS);
1205                        goto err_out;
1206                }
1207        }
1208
1209        if (STp->can_partitions && STp->nbr_partitions < 1) {
1210                /* This code is reached when the device is opened for the first time
1211                   after the driver has been initialized with tape in the drive and the
1212                   partition support has been enabled. */
1213                DEBC_printk(STp, "Updating partition number in status.\n");
1214                if ((STp->partition = find_partition(STp)) < 0) {
1215                        retval = STp->partition;
1216                        goto err_out;
1217                }
1218                STp->new_partition = STp->partition;
1219                STp->nbr_partitions = 1; /* This guess will be updated when necessary */
1220        }
1221
1222        if (new_session) {      /* Change the drive parameters for the new mode */
1223                STp->density_changed = STp->blksize_changed = 0;
1224                STp->compression_changed = 0;
1225                if (!(STm->defaults_for_writes) &&
1226                    (retval = set_mode_densblk(STp, STm)) < 0)
1227                    goto err_out;
1228
1229                if (STp->default_drvbuffer != 0xff) {
1230                        if (st_int_ioctl(STp, MTSETDRVBUFFER, STp->default_drvbuffer))
1231                                st_printk(KERN_WARNING, STp,
1232                                          "Can't set default drive "
1233                                          "buffering to %d.\n",
1234                                          STp->default_drvbuffer);
1235                }
1236        }
1237
1238        return CHKRES_READY;
1239
1240 err_out:
1241        return retval;
1242}
1243
1244
1245/* Open the device. Needs to take the BKL only because of incrementing the SCSI host
1246   module count. */
1247static int st_open(struct inode *inode, struct file *filp)
1248{
1249        int i, retval = (-EIO);
1250        int resumed = 0;
1251        struct scsi_tape *STp;
1252        struct st_partstat *STps;
1253        int dev = TAPE_NR(inode);
1254
1255        /*
1256         * We really want to do nonseekable_open(inode, filp); here, but some
1257         * versions of tar incorrectly call lseek on tapes and bail out if that
1258         * fails.  So we disallow pread() and pwrite(), but permit lseeks.
1259         */
1260        filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);
1261
1262        if (!(STp = scsi_tape_get(dev))) {
1263                return -ENXIO;
1264        }
1265
1266        filp->private_data = STp;
1267
1268        spin_lock(&st_use_lock);
1269        if (STp->in_use) {
1270                spin_unlock(&st_use_lock);
1271                scsi_tape_put(STp);
1272                DEBC_printk(STp, "Device already in use.\n");
1273                return (-EBUSY);
1274        }
1275
1276        STp->in_use = 1;
1277        spin_unlock(&st_use_lock);
1278        STp->rew_at_close = STp->autorew_dev = (iminor(inode) & 0x80) == 0;
1279
1280        if (scsi_autopm_get_device(STp->device) < 0) {
1281                retval = -EIO;
1282                goto err_out;
1283        }
1284        resumed = 1;
1285        if (!scsi_block_when_processing_errors(STp->device)) {
1286                retval = (-ENXIO);
1287                goto err_out;
1288        }
1289
1290        /* See that we have at least a one page buffer available */
1291        if (!enlarge_buffer(STp->buffer, PAGE_SIZE, STp->restr_dma)) {
1292                st_printk(KERN_WARNING, STp,
1293                          "Can't allocate one page tape buffer.\n");
1294                retval = (-EOVERFLOW);
1295                goto err_out;
1296        }
1297
1298        (STp->buffer)->cleared = 0;
1299        (STp->buffer)->writing = 0;
1300        (STp->buffer)->syscall_result = 0;
1301
1302        STp->write_prot = ((filp->f_flags & O_ACCMODE) == O_RDONLY);
1303
1304        STp->dirty = 0;
1305        for (i = 0; i < ST_NBR_PARTITIONS; i++) {
1306                STps = &(STp->ps[i]);
1307                STps->rw = ST_IDLE;
1308        }
1309        STp->try_dio_now = STp->try_dio;
1310        STp->recover_count = 0;
1311        DEB( STp->nbr_waits = STp->nbr_finished = 0;
1312             STp->nbr_requests = STp->nbr_dio = STp->nbr_pages = 0; )
1313
1314        retval = check_tape(STp, filp);
1315        if (retval < 0)
1316                goto err_out;
1317        if ((filp->f_flags & O_NONBLOCK) == 0 &&
1318            retval != CHKRES_READY) {
1319                if (STp->ready == NO_TAPE)
1320                        retval = (-ENOMEDIUM);
1321                else
1322                        retval = (-EIO);
1323                goto err_out;
1324        }
1325        return 0;
1326
1327 err_out:
1328        normalize_buffer(STp->buffer);
1329        spin_lock(&st_use_lock);
1330        STp->in_use = 0;
1331        spin_unlock(&st_use_lock);
1332        if (resumed)
1333                scsi_autopm_put_device(STp->device);
1334        scsi_tape_put(STp);
1335        return retval;
1336
1337}
1338
1339
1340/* Flush the tape buffer before close */
1341static int st_flush(struct file *filp, fl_owner_t id)
1342{
1343        int result = 0, result2;
1344        unsigned char cmd[MAX_COMMAND_SIZE];
1345        struct st_request *SRpnt;
1346        struct scsi_tape *STp = filp->private_data;
1347        struct st_modedef *STm = &(STp->modes[STp->current_mode]);
1348        struct st_partstat *STps = &(STp->ps[STp->partition]);
1349
1350        if (file_count(filp) > 1)
1351                return 0;
1352
1353        if (STps->rw == ST_WRITING && !STp->pos_unknown) {
1354                result = st_flush_write_buffer(STp);
1355                if (result != 0 && result != (-ENOSPC))
1356                        goto out;
1357        }
1358
1359        if (STp->can_partitions &&
1360            (result2 = switch_partition(STp)) < 0) {
1361                DEBC_printk(STp, "switch_partition at close failed.\n");
1362                if (result == 0)
1363                        result = result2;
1364                goto out;
1365        }
1366
1367        DEBC( if (STp->nbr_requests)
1368                st_printk(KERN_DEBUG, STp,
1369                          "Number of r/w requests %d, dio used in %d, "
1370                          "pages %d.\n", STp->nbr_requests, STp->nbr_dio,
1371                          STp->nbr_pages));
1372
1373        if (STps->rw == ST_WRITING && !STp->pos_unknown) {
1374                struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
1375
1376#if DEBUG
1377                DEBC_printk(STp, "Async write waits %d, finished %d.\n",
1378                            STp->nbr_waits, STp->nbr_finished);
1379#endif
1380                memset(cmd, 0, MAX_COMMAND_SIZE);
1381                cmd[0] = WRITE_FILEMARKS;
1382                if (STp->immediate_filemark)
1383                        cmd[1] = 1;
1384                cmd[4] = 1 + STp->two_fm;
1385
1386                SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
1387                                   STp->device->request_queue->rq_timeout,
1388                                   MAX_WRITE_RETRIES, 1);
1389                if (!SRpnt) {
1390                        result = (STp->buffer)->syscall_result;
1391                        goto out;
1392                }
1393
1394                if (STp->buffer->syscall_result == 0 ||
1395                    (cmdstatp->have_sense && !cmdstatp->deferred &&
1396                     (cmdstatp->flags & SENSE_EOM) &&
1397                     (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
1398                      cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) &&
1399                     (!cmdstatp->remainder_valid || cmdstatp->uremainder64 == 0))) {
1400                        /* Write successful at EOM */
1401                        st_release_request(SRpnt);
1402                        SRpnt = NULL;
1403                        if (STps->drv_file >= 0)
1404                                STps->drv_file++;
1405                        STps->drv_block = 0;
1406                        if (STp->two_fm)
1407                                cross_eof(STp, 0);
1408                        STps->eof = ST_FM;
1409                }
1410                else { /* Write error */
1411                        st_release_request(SRpnt);
1412                        SRpnt = NULL;
1413                        st_printk(KERN_ERR, STp,
1414                                  "Error on write filemark.\n");
1415                        if (result == 0)
1416                                result = (-EIO);
1417                }
1418
1419                DEBC_printk(STp, "Buffer flushed, %d EOF(s) written\n", cmd[4]);
1420        } else if (!STp->rew_at_close) {
1421                STps = &(STp->ps[STp->partition]);
1422                if (!STm->sysv || STps->rw != ST_READING) {
1423                        if (STp->can_bsr)
1424                                result = flush_buffer(STp, 0);
1425                        else if (STps->eof == ST_FM_HIT) {
1426                                result = cross_eof(STp, 0);
1427                                if (result) {
1428                                        if (STps->drv_file >= 0)
1429                                                STps->drv_file++;
1430                                        STps->drv_block = 0;
1431                                        STps->eof = ST_FM;
1432                                } else
1433                                        STps->eof = ST_NOEOF;
1434                        }
1435                } else if ((STps->eof == ST_NOEOF &&
1436                            !(result = cross_eof(STp, 1))) ||
1437                           STps->eof == ST_FM_HIT) {
1438                        if (STps->drv_file >= 0)
1439                                STps->drv_file++;
1440                        STps->drv_block = 0;
1441                        STps->eof = ST_FM;
1442                }
1443        }
1444
1445      out:
1446        if (STp->rew_at_close) {
1447                result2 = st_int_ioctl(STp, MTREW, 1);
1448                if (result == 0)
1449                        result = result2;
1450        }
1451        return result;
1452}
1453
1454
1455/* Close the device and release it. BKL is not needed: this is the only thread
1456   accessing this tape. */
1457static int st_release(struct inode *inode, struct file *filp)
1458{
1459        int result = 0;
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 result;
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 = cmd[2] & 0x80 ? 0xff000000 : 0;
2684        sc |= (cmd[2] << 16) | (cmd[3] << 8) | cmd[4];
2685        if (direction)
2686                sc = -sc;
2687        st_printk(ST_DEB_MSG, STp, "Spacing tape %s over %d %s.\n",
2688                  direction ? "backward" : "forward", sc, units);
2689}
2690#else
2691#define ST_DEB_FORWARD  0
2692#define ST_DEB_BACKWARD 1
2693static void deb_space_print(struct scsi_tape *STp, int direction, char *units, unsigned char *cmd) {}
2694#endif
2695
2696
2697/* Internal ioctl function */
2698static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned long arg)
2699{
2700        int timeout;
2701        long ltmp;
2702        int ioctl_result;
2703        int chg_eof = 1;
2704        unsigned char cmd[MAX_COMMAND_SIZE];
2705        struct st_request *SRpnt;
2706        struct st_partstat *STps;
2707        int fileno, blkno, at_sm, undone;
2708        int datalen = 0, direction = DMA_NONE;
2709
2710        WARN_ON(STp->buffer->do_dio != 0);
2711        if (STp->ready != ST_READY) {
2712                if (STp->ready == ST_NO_TAPE)
2713                        return (-ENOMEDIUM);
2714                else
2715                        return (-EIO);
2716        }
2717        timeout = STp->long_timeout;
2718        STps = &(STp->ps[STp->partition]);
2719        fileno = STps->drv_file;
2720        blkno = STps->drv_block;
2721        at_sm = STps->at_sm;
2722
2723        memset(cmd, 0, MAX_COMMAND_SIZE);
2724        switch (cmd_in) {
2725        case MTFSFM:
2726                chg_eof = 0;    /* Changed from the FSF after this */
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        case MTBSF:
2742                cmd[0] = SPACE;
2743                cmd[1] = 0x01;  /* Space FileMarks */
2744                ltmp = (-arg);
2745                cmd[2] = (ltmp >> 16);
2746                cmd[3] = (ltmp >> 8);
2747                cmd[4] = ltmp;
2748                deb_space_print(STp, ST_DEB_BACKWARD, "filemarks", cmd);
2749                if (fileno >= 0)
2750                        fileno -= arg;
2751                blkno = (-1);   /* We can't know the block number */
2752                at_sm &= (arg == 0);
2753                break;
2754        case MTFSR:
2755                cmd[0] = SPACE;
2756                cmd[1] = 0x00;  /* Space Blocks */
2757                cmd[2] = (arg >> 16);
2758                cmd[3] = (arg >> 8);
2759                cmd[4] = arg;
2760                deb_space_print(STp, ST_DEB_FORWARD, "blocks", cmd);
2761                if (blkno >= 0)
2762                        blkno += arg;
2763                at_sm &= (arg == 0);
2764                break;
2765        case MTBSR:
2766                cmd[0] = SPACE;
2767                cmd[1] = 0x00;  /* Space Blocks */
2768                ltmp = (-arg);
2769                cmd[2] = (ltmp >> 16);
2770                cmd[3] = (ltmp >> 8);
2771                cmd[4] = ltmp;
2772                deb_space_print(STp, ST_DEB_BACKWARD, "blocks", cmd);
2773                if (blkno >= 0)
2774                        blkno -= arg;
2775                at_sm &= (arg == 0);
2776                break;
2777        case MTFSS:
2778                cmd[0] = SPACE;
2779                cmd[1] = 0x04;  /* Space Setmarks */
2780                cmd[2] = (arg >> 16);
2781                cmd[3] = (arg >> 8);
2782                cmd[4] = arg;
2783                deb_space_print(STp, ST_DEB_FORWARD, "setmarks", cmd);
2784                if (arg != 0) {
2785                        blkno = fileno = (-1);
2786                        at_sm = 1;
2787                }
2788                break;
2789        case MTBSS:
2790                cmd[0] = SPACE;
2791                cmd[1] = 0x04;  /* Space Setmarks */
2792                ltmp = (-arg);
2793                cmd[2] = (ltmp >> 16);
2794                cmd[3] = (ltmp >> 8);
2795                cmd[4] = ltmp;
2796                deb_space_print(STp, ST_DEB_BACKWARD, "setmarks", cmd);
2797                if (arg != 0) {
2798                        blkno = fileno = (-1);
2799                        at_sm = 1;
2800                }
2801                break;
2802        case MTWEOF:
2803        case MTWEOFI:
2804        case MTWSM:
2805                if (STp->write_prot)
2806                        return (-EACCES);
2807                cmd[0] = WRITE_FILEMARKS;
2808                if (cmd_in == MTWSM)
2809                        cmd[1] = 2;
2810                if (cmd_in == MTWEOFI ||
2811                    (cmd_in == MTWEOF && STp->immediate_filemark))
2812                        cmd[1] |= 1;
2813                cmd[2] = (arg >> 16);
2814                cmd[3] = (arg >> 8);
2815                cmd[4] = arg;
2816                timeout = STp->device->request_queue->rq_timeout;
2817                DEBC(
2818                        if (cmd_in != MTWSM)
2819                                st_printk(ST_DEB_MSG, STp,
2820                                          "Writing %d filemarks.\n",
2821                                          cmd[2] * 65536 +
2822                                          cmd[3] * 256 +
2823                                          cmd[4]);
2824                        else
2825                                st_printk(ST_DEB_MSG, STp,
2826                                          "Writing %d setmarks.\n",
2827                                          cmd[2] * 65536 +
2828                                          cmd[3] * 256 +
2829                                          cmd[4]);
2830                )
2831                if (fileno >= 0)
2832                        fileno += arg;
2833                blkno = 0;
2834                at_sm = (cmd_in == MTWSM);
2835                break;
2836        case MTREW:
2837                cmd[0] = REZERO_UNIT;
2838                if (STp->immediate) {
2839                        cmd[1] = 1;     /* Don't wait for completion */
2840                        timeout = STp->device->request_queue->rq_timeout;
2841                }
2842                DEBC_printk(STp, "Rewinding tape.\n");
2843                fileno = blkno = at_sm = 0;
2844                break;
2845        case MTNOP:
2846                DEBC_printk(STp, "No op on tape.\n");
2847                return 0;       /* Should do something ? */
2848                break;
2849        case MTRETEN:
2850                cmd[0] = START_STOP;
2851                if (STp->immediate) {
2852                        cmd[1] = 1;     /* Don't wait for completion */
2853                        timeout = STp->device->request_queue->rq_timeout;
2854                }
2855                cmd[4] = 3;
2856                DEBC_printk(STp, "Retensioning tape.\n");
2857                fileno = blkno = at_sm = 0;
2858                break;
2859        case MTEOM:
2860                if (!STp->fast_mteom) {
2861                        /* space to the end of tape */
2862                        ioctl_result = st_int_ioctl(STp, MTFSF, 0x7fffff);
2863                        fileno = STps->drv_file;
2864                        if (STps->eof >= ST_EOD_1)
2865                                return 0;
2866                        /* The next lines would hide the number of spaced FileMarks
2867                           That's why I inserted the previous lines. I had no luck
2868                           with detecting EOM with FSF, so we go now to EOM.
2869                           Joerg Weule */
2870                } else
2871                        fileno = (-1);
2872                cmd[0] = SPACE;
2873                cmd[1] = 3;
2874                DEBC_printk(STp, "Spacing to end of recorded medium.\n");
2875                blkno = -1;
2876                at_sm = 0;
2877                break;
2878        case MTERASE:
2879                if (STp->write_prot)
2880                        return (-EACCES);
2881                cmd[0] = ERASE;
2882                cmd[1] = (arg ? 1 : 0); /* Long erase with non-zero argument */
2883                if (STp->immediate) {
2884                        cmd[1] |= 2;    /* Don't wait for completion */
2885                        timeout = STp->device->request_queue->rq_timeout;
2886                }
2887                else
2888                        timeout = STp->long_timeout * 8;
2889
2890                DEBC_printk(STp, "Erasing tape.\n");
2891                fileno = blkno = at_sm = 0;
2892                break;
2893        case MTSETBLK:          /* Set block length */
2894        case MTSETDENSITY:      /* Set tape density */
2895        case MTSETDRVBUFFER:    /* Set drive buffering */
2896        case SET_DENS_AND_BLK:  /* Set density and block size */
2897                chg_eof = 0;
2898                if (STp->dirty || (STp->buffer)->buffer_bytes != 0)
2899                        return (-EIO);  /* Not allowed if data in buffer */
2900                if ((cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) &&
2901                    (arg & MT_ST_BLKSIZE_MASK) != 0 &&
2902                    STp->max_block > 0 &&
2903                    ((arg & MT_ST_BLKSIZE_MASK) < STp->min_block ||
2904                     (arg & MT_ST_BLKSIZE_MASK) > STp->max_block)) {
2905                        st_printk(KERN_WARNING, STp, "Illegal block size.\n");
2906                        return (-EINVAL);
2907                }
2908                cmd[0] = MODE_SELECT;
2909                if ((STp->use_pf & USE_PF))
2910                        cmd[1] = MODE_SELECT_PAGE_FORMAT;
2911                cmd[4] = datalen = 12;
2912                direction = DMA_TO_DEVICE;
2913
2914                memset((STp->buffer)->b_data, 0, 12);
2915                if (cmd_in == MTSETDRVBUFFER)
2916                        (STp->buffer)->b_data[2] = (arg & 7) << 4;
2917                else
2918                        (STp->buffer)->b_data[2] =
2919                            STp->drv_buffer << 4;
2920                (STp->buffer)->b_data[3] = 8;   /* block descriptor length */
2921                if (cmd_in == MTSETDENSITY) {
2922                        (STp->buffer)->b_data[4] = arg;
2923                        STp->density_changed = 1;       /* At least we tried ;-) */
2924                } else if (cmd_in == SET_DENS_AND_BLK)
2925                        (STp->buffer)->b_data[4] = arg >> 24;
2926                else
2927                        (STp->buffer)->b_data[4] = STp->density;
2928                if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) {
2929                        ltmp = arg & MT_ST_BLKSIZE_MASK;
2930                        if (cmd_in == MTSETBLK)
2931                                STp->blksize_changed = 1; /* At least we tried ;-) */
2932                } else
2933                        ltmp = STp->block_size;
2934                (STp->buffer)->b_data[9] = (ltmp >> 16);
2935                (STp->buffer)->b_data[10] = (ltmp >> 8);
2936                (STp->buffer)->b_data[11] = ltmp;
2937                timeout = STp->device->request_queue->rq_timeout;
2938                DEBC(
2939                        if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK)
2940                                st_printk(ST_DEB_MSG, STp,
2941                                          "Setting block size to %d bytes.\n",
2942                                          (STp->buffer)->b_data[9] * 65536 +
2943                                          (STp->buffer)->b_data[10] * 256 +
2944                                          (STp->buffer)->b_data[11]);
2945                        if (cmd_in == MTSETDENSITY || cmd_in == SET_DENS_AND_BLK)
2946                                st_printk(ST_DEB_MSG, STp,
2947                                          "Setting density code to %x.\n",
2948                                          (STp->buffer)->b_data[4]);
2949                        if (cmd_in == MTSETDRVBUFFER)
2950                                st_printk(ST_DEB_MSG, STp,
2951                                          "Setting drive buffer code to %d.\n",
2952                                          ((STp->buffer)->b_data[2] >> 4) & 7);
2953                )
2954                break;
2955        default:
2956                return (-ENOSYS);
2957        }
2958
2959        SRpnt = st_do_scsi(NULL, STp, cmd, datalen, direction,
2960                           timeout, MAX_RETRIES, 1);
2961        if (!SRpnt)
2962                return (STp->buffer)->syscall_result;
2963
2964        ioctl_result = (STp->buffer)->syscall_result;
2965
2966        if (!ioctl_result) {    /* SCSI command successful */
2967                st_release_request(SRpnt);
2968                SRpnt = NULL;
2969                STps->drv_block = blkno;
2970                STps->drv_file = fileno;
2971                STps->at_sm = at_sm;
2972
2973                if (cmd_in == MTBSFM)
2974                        ioctl_result = st_int_ioctl(STp, MTFSF, 1);
2975                else if (cmd_in == MTFSFM)
2976                        ioctl_result = st_int_ioctl(STp, MTBSF, 1);
2977
2978                if (cmd_in == MTSETBLK || cmd_in == SET_DENS_AND_BLK) {
2979                        STp->block_size = arg & MT_ST_BLKSIZE_MASK;
2980                        if (STp->block_size != 0) {
2981                                (STp->buffer)->buffer_blocks =
2982                                    (STp->buffer)->buffer_size / STp->block_size;
2983                        }
2984                        (STp->buffer)->buffer_bytes = (STp->buffer)->read_pointer = 0;
2985                        if (cmd_in == SET_DENS_AND_BLK)
2986                                STp->density = arg >> MT_ST_DENSITY_SHIFT;
2987                } else if (cmd_in == MTSETDRVBUFFER)
2988                        STp->drv_buffer = (arg & 7);
2989                else if (cmd_in == MTSETDENSITY)
2990                        STp->density = arg;
2991
2992                if (cmd_in == MTEOM)
2993                        STps->eof = ST_EOD;
2994                else if (cmd_in == MTFSF)
2995                        STps->eof = ST_FM;
2996                else if (chg_eof)
2997                        STps->eof = ST_NOEOF;
2998
2999                if (cmd_in == MTWEOF || cmd_in == MTWEOFI)
3000                        STps->rw = ST_IDLE;  /* prevent automatic WEOF at close */
3001        } else { /* SCSI command was not completely successful. Don't return
3002                    from this block without releasing the SCSI command block! */
3003                struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;
3004
3005                if (cmdstatp->flags & SENSE_EOM) {
3006                        if (cmd_in != MTBSF && cmd_in != MTBSFM &&
3007                            cmd_in != MTBSR && cmd_in != MTBSS)
3008                                STps->eof = ST_EOM_OK;
3009                        STps->drv_block = 0;
3010                }
3011
3012                if (cmdstatp->remainder_valid)
3013                        undone = (int)cmdstatp->uremainder64;
3014                else
3015                        undone = 0;
3016
3017                if ((cmd_in == MTWEOF || cmd_in == MTWEOFI) &&
3018                    cmdstatp->have_sense &&
3019                    (cmdstatp->flags & SENSE_EOM)) {
3020                        if (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
3021                            cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) {
3022                                ioctl_result = 0;       /* EOF(s) written successfully at EOM */
3023                                STps->eof = ST_NOEOF;
3024                        } else {  /* Writing EOF(s) failed */
3025                                if (fileno >= 0)
3026                                        fileno -= undone;
3027                                if (undone < arg)
3028                                        STps->eof = ST_NOEOF;
3029                        }
3030                        STps->drv_file = fileno;
3031                } else if ((cmd_in == MTFSF) || (cmd_in == MTFSFM)) {
3032                        if (fileno >= 0)
3033                                STps->drv_file = fileno - undone;
3034                        else
3035                                STps->drv_file = fileno;
3036                        STps->drv_block = -1;
3037                        STps->eof = ST_NOEOF;
3038                } else if ((cmd_in == MTBSF) || (cmd_in == MTBSFM)) {
3039                        if (arg > 0 && undone < 0)  /* Some drives get this wrong */
3040                                undone = (-undone);
3041                        if (STps->drv_file >= 0)
3042                                STps->drv_file = fileno + undone;
3043                        STps->drv_block = 0;
3044                        STps->eof = ST_NOEOF;
3045                } else if (cmd_in == MTFSR) {
3046                        if (cmdstatp->flags & SENSE_FMK) {      /* Hit filemark */
3047                                if (STps->drv_file >= 0)
3048                                        STps->drv_file++;
3049                                STps->drv_block = 0;
3050                                STps->eof = ST_FM;
3051                        } else {
3052                                if (blkno >= undone)
3053                                        STps->drv_block = blkno - undone;
3054                                else
3055                                        STps->drv_block = (-1);
3056                                STps->eof = ST_NOEOF;
3057                        }
3058                } else if (cmd_in == MTBSR) {
3059                        if (cmdstatp->flags & SENSE_FMK) {      /* Hit filemark */
3060                                STps->drv_file--;
3061                                STps->drv_block = (-1);
3062                        } else {
3063                                if (arg > 0 && undone < 0)  /* Some drives get this wrong */
3064                                        undone = (-undone);
3065                                if (STps->drv_block >= 0)
3066                                        STps->drv_block = blkno + undone;
3067                        }
3068                        STps->eof = ST_NOEOF;
3069                } else if (cmd_in == MTEOM) {
3070                        STps->drv_file = (-1);
3071                        STps->drv_block = (-1);
3072                        STps->eof = ST_EOD;
3073                } else if (cmd_in == MTSETBLK ||
3074                           cmd_in == MTSETDENSITY ||
3075                           cmd_in == MTSETDRVBUFFER ||
3076                           cmd_in == SET_DENS_AND_BLK) {
3077                        if (cmdstatp->sense_hdr.sense_key == ILLEGAL_REQUEST &&
3078                            !(STp->use_pf & PF_TESTED)) {
3079                                /* Try the other possible state of Page Format if not
3080                                   already tried */
3081                                STp->use_pf = (STp->use_pf ^ USE_PF) | PF_TESTED;
3082                                st_release_request(SRpnt);
3083                                SRpnt = NULL;
3084                                return st_int_ioctl(STp, cmd_in, arg);
3085                        }
3086                } else if (chg_eof)
3087                        STps->eof = ST_NOEOF;
3088
3089                if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK)
3090                        STps->eof = ST_EOD;
3091
3092                st_release_request(SRpnt);
3093                SRpnt = NULL;
3094        }
3095
3096        return ioctl_result;
3097}
3098
3099
3100/* Get the tape position. If bt == 2, arg points into a kernel space mt_loc
3101   structure. */
3102
3103static int get_location(struct scsi_tape *STp, unsigned int *block, int *partition,
3104                        int logical)
3105{
3106        int result;
3107        unsigned char scmd[MAX_COMMAND_SIZE];
3108        struct st_request *SRpnt;
3109
3110        if (STp->ready != ST_READY)
3111                return (-EIO);
3112
3113        memset(scmd, 0, MAX_COMMAND_SIZE);
3114        if ((STp->device)->scsi_level < SCSI_2) {
3115                scmd[0] = QFA_REQUEST_BLOCK;
3116                scmd[4] = 3;
3117        } else {
3118                scmd[0] = READ_POSITION;
3119                if (!logical && !STp->scsi2_logical)
3120                        scmd[1] = 1;
3121        }
3122        SRpnt = st_do_scsi(NULL, STp, scmd, 20, DMA_FROM_DEVICE,
3123                           STp->device->request_queue->rq_timeout,
3124                           MAX_READY_RETRIES, 1);
3125        if (!SRpnt)
3126                return (STp->buffer)->syscall_result;
3127
3128        if ((STp->buffer)->syscall_result != 0 ||
3129            (STp->device->scsi_level >= SCSI_2 &&
3130             ((STp->buffer)->b_data[0] & 4) != 0)) {
3131                *block = *partition = 0;
3132                DEBC_printk(STp, " Can't read tape position.\n");
3133                result = (-EIO);
3134        } else {
3135                result = 0;
3136                if ((STp->device)->scsi_level < SCSI_2) {
3137                        *block = ((STp->buffer)->b_data[0] << 16)
3138                            + ((STp->buffer)->b_data[1] << 8)
3139                            + (STp->buffer)->b_data[2];
3140                        *partition = 0;
3141                } else {
3142                        *block = ((STp->buffer)->b_data[4] << 24)
3143                            + ((STp->buffer)->b_data[5] << 16)
3144                            + ((STp->buffer)->b_data[6] << 8)
3145                            + (STp->buffer)->b_data[7];
3146                        *partition = (STp->buffer)->b_data[1];
3147                        if (((STp->buffer)->b_data[0] & 0x80) &&
3148                            (STp->buffer)->b_data[1] == 0)      /* BOP of partition 0 */
3149                                STp->ps[0].drv_block = STp->ps[0].drv_file = 0;
3150                }
3151                DEBC_printk(STp, "Got tape pos. blk %d part %d.\n",
3152                            *block, *partition);
3153        }
3154        st_release_request(SRpnt);
3155        SRpnt = NULL;
3156
3157        return result;
3158}
3159
3160
3161/* Set the tape block and partition. Negative partition means that only the
3162   block should be set in vendor specific way. */
3163static int set_location(struct scsi_tape *STp, unsigned int block, int partition,
3164                        int logical)
3165{
3166        struct st_partstat *STps;
3167        int result, p;
3168        unsigned int blk;
3169        int timeout;
3170        unsigned char scmd[MAX_COMMAND_SIZE];
3171        struct st_request *SRpnt;
3172
3173        if (STp->ready != ST_READY)
3174                return (-EIO);
3175        timeout = STp->long_timeout;
3176        STps = &(STp->ps[STp->partition]);
3177
3178        DEBC_printk(STp, "Setting block to %d and partition to %d.\n",
3179                    block, partition);
3180        DEB(if (partition < 0)
3181                return (-EIO); )
3182
3183        /* Update the location at the partition we are leaving */
3184        if ((!STp->can_partitions && partition != 0) ||
3185            partition >= ST_NBR_PARTITIONS)
3186                return (-EINVAL);
3187        if (partition != STp->partition) {
3188                if (get_location(STp, &blk, &p, 1))
3189                        STps->last_block_valid = 0;
3190                else {
3191                        STps->last_block_valid = 1;
3192                        STps->last_block_visited = blk;
3193                        DEBC_printk(STp, "Visited block %d for "
3194                                    "partition %d saved.\n",
3195                                    blk, STp->partition);
3196                }
3197        }
3198
3199        memset(scmd, 0, MAX_COMMAND_SIZE);
3200        if ((STp->device)->scsi_level < SCSI_2) {
3201                scmd[0] = QFA_SEEK_BLOCK;
3202                scmd[2] = (block >> 16);
3203                scmd[3] = (block >> 8);
3204                scmd[4] = block;
3205                scmd[5] = 0;
3206        } else {
3207                scmd[0] = SEEK_10;
3208                scmd[3] = (block >> 24);
3209                scmd[4] = (block >> 16);
3210                scmd[5] = (block >> 8);
3211                scmd[6] = block;
3212                if (!logical && !STp->scsi2_logical)
3213                        scmd[1] = 4;
3214                if (STp->partition != partition) {
3215                        scmd[1] |= 2;
3216                        scmd[8] = partition;
3217                        DEBC_printk(STp, "Trying to change partition "
3218                                    "from %d to %d\n", STp->partition,
3219                                    partition);
3220                }
3221        }
3222        if (STp->immediate) {
3223                scmd[1] |= 1;           /* Don't wait for completion */
3224                timeout = STp->device->request_queue->rq_timeout;
3225        }
3226
3227        SRpnt = st_do_scsi(NULL, STp, scmd, 0, DMA_NONE,
3228                           timeout, MAX_READY_RETRIES, 1);
3229        if (!SRpnt)
3230                return (STp->buffer)->syscall_result;
3231
3232        STps->drv_block = STps->drv_file = (-1);
3233        STps->eof = ST_NOEOF;
3234        if ((STp->buffer)->syscall_result != 0) {
3235                result = (-EIO);
3236                if (STp->can_partitions &&
3237                    (STp->device)->scsi_level >= SCSI_2 &&
3238                    (p = find_partition(STp)) >= 0)
3239                        STp->partition = p;
3240        } else {
3241                if (STp->can_partitions) {
3242                        STp->partition = partition;
3243                        STps = &(STp->ps[partition]);
3244                        if (!STps->last_block_valid ||
3245                            STps->last_block_visited != block) {
3246                                STps->at_sm = 0;
3247                                STps->rw = ST_IDLE;
3248                        }
3249                } else
3250                        STps->at_sm = 0;
3251                if (block == 0)
3252                        STps->drv_block = STps->drv_file = 0;
3253                result = 0;
3254        }
3255
3256        st_release_request(SRpnt);
3257        SRpnt = NULL;
3258
3259        return result;
3260}
3261
3262
3263/* Find the current partition number for the drive status. Called from open and
3264   returns either partition number of negative error code. */
3265static int find_partition(struct scsi_tape *STp)
3266{
3267        int i, partition;
3268        unsigned int block;
3269
3270        if ((i = get_location(STp, &block, &partition, 1)) < 0)
3271                return i;
3272        if (partition >= ST_NBR_PARTITIONS)
3273                return (-EIO);
3274        return partition;
3275}
3276
3277
3278/* Change the partition if necessary */
3279static int switch_partition(struct scsi_tape *STp)
3280{
3281        struct st_partstat *STps;
3282
3283        if (STp->partition == STp->new_partition)
3284                return 0;
3285        STps = &(STp->ps[STp->new_partition]);
3286        if (!STps->last_block_valid)
3287                STps->last_block_visited = 0;
3288        return set_location(STp, STps->last_block_visited, STp->new_partition, 1);
3289}
3290
3291/* Functions for reading and writing the medium partition mode page. */
3292
3293#define PART_PAGE   0x11
3294#define PART_PAGE_FIXED_LENGTH 8
3295
3296#define PP_OFF_MAX_ADD_PARTS   2
3297#define PP_OFF_NBR_ADD_PARTS   3
3298#define PP_OFF_FLAGS           4
3299#define PP_OFF_PART_UNITS      6
3300#define PP_OFF_RESERVED        7
3301
3302#define PP_BIT_IDP             0x20
3303#define PP_BIT_FDP             0x80
3304#define PP_MSK_PSUM_MB         0x10
3305#define PP_MSK_PSUM_UNITS      0x18
3306#define PP_MSK_POFM            0x04
3307
3308/* Get the number of partitions on the tape. As a side effect reads the
3309   mode page into the tape buffer. */
3310static int nbr_partitions(struct scsi_tape *STp)
3311{
3312        int result;
3313
3314        if (STp->ready != ST_READY)
3315                return (-EIO);
3316
3317        result = read_mode_page(STp, PART_PAGE, 1);
3318
3319        if (result) {
3320                DEBC_printk(STp, "Can't read medium partition page.\n");
3321                result = (-EIO);
3322        } else {
3323                result = (STp->buffer)->b_data[MODE_HEADER_LENGTH +
3324                                              PP_OFF_NBR_ADD_PARTS] + 1;
3325                DEBC_printk(STp, "Number of partitions %d.\n", result);
3326        }
3327
3328        return result;
3329}
3330
3331
3332static int format_medium(struct scsi_tape *STp, int format)
3333{
3334        int result = 0;
3335        int timeout = STp->long_timeout;
3336        unsigned char scmd[MAX_COMMAND_SIZE];
3337        struct st_request *SRpnt;
3338
3339        memset(scmd, 0, MAX_COMMAND_SIZE);
3340        scmd[0] = FORMAT_UNIT;
3341        scmd[2] = format;
3342        if (STp->immediate) {
3343                scmd[1] |= 1;           /* Don't wait for completion */
3344                timeout = STp->device->request_queue->rq_timeout;
3345        }
3346        DEBC_printk(STp, "Sending FORMAT MEDIUM\n");
3347        SRpnt = st_do_scsi(NULL, STp, scmd, 0, DMA_NONE,
3348                           timeout, MAX_RETRIES, 1);
3349        if (!SRpnt)
3350                result = STp->buffer->syscall_result;
3351        return result;
3352}
3353
3354
3355/* Partition the tape into two partitions if size > 0 or one partition if
3356   size == 0.
3357
3358   The block descriptors are read and written because Sony SDT-7000 does not
3359   work without this (suggestion from Michael Schaefer <Michael.Schaefer@dlr.de>).
3360
3361   My HP C1533A drive returns only one partition size field. This is used to
3362   set the size of partition 1. There is no size field for the default partition.
3363   Michael Schaefer's Sony SDT-7000 returns two descriptors and the second is
3364   used to set the size of partition 1 (this is what the SCSI-3 standard specifies).
3365   The following algorithm is used to accommodate both drives: if the number of
3366   partition size fields is greater than the maximum number of additional partitions
3367   in the mode page, the second field is used. Otherwise the first field is used.
3368
3369   For Seagate DDS drives the page length must be 8 when no partitions is defined
3370   and 10 when 1 partition is defined (information from Eric Lee Green). This is
3371   is acceptable also to some other old drives and enforced if the first partition
3372   size field is used for the first additional partition size.
3373
3374   For drives that advertize SCSI-3 or newer, use the SSC-3 methods.
3375 */
3376static int partition_tape(struct scsi_tape *STp, int size)
3377{
3378        int result;
3379        int target_partition;
3380        bool scsi3 = STp->device->scsi_level >= SCSI_3, needs_format = false;
3381        int pgo, psd_cnt, psdo;
3382        int psum = PP_MSK_PSUM_MB, units = 0;
3383        unsigned char *bp;
3384
3385        result = read_mode_page(STp, PART_PAGE, 0);
3386        if (result) {
3387                DEBC_printk(STp, "Can't read partition mode page.\n");
3388                return result;
3389        }
3390        target_partition = 1;
3391        if (size < 0) {
3392                target_partition = 0;
3393                size = -size;
3394        }
3395
3396        /* The mode page is in the buffer. Let's modify it and write it. */
3397        bp = (STp->buffer)->b_data;
3398        pgo = MODE_HEADER_LENGTH + bp[MH_OFF_BDESCS_LENGTH];
3399        DEBC_printk(STp, "Partition page length is %d bytes.\n",
3400                    bp[pgo + MP_OFF_PAGE_LENGTH] + 2);
3401
3402        psd_cnt = (bp[pgo + MP_OFF_PAGE_LENGTH] + 2 - PART_PAGE_FIXED_LENGTH) / 2;
3403
3404        if (scsi3) {
3405                needs_format = (bp[pgo + PP_OFF_FLAGS] & PP_MSK_POFM) != 0;
3406                if (needs_format && size == 0) {
3407                        /* No need to write the mode page when clearing
3408                         *  partitioning
3409                         */
3410                        DEBC_printk(STp, "Formatting tape with one partition.\n");
3411                        result = format_medium(STp, 0);
3412                        goto out;
3413                }
3414                if (needs_format)  /* Leave the old value for HP DATs claiming SCSI_3 */
3415                        psd_cnt = 2;
3416                if ((bp[pgo + PP_OFF_FLAGS] & PP_MSK_PSUM_UNITS) == PP_MSK_PSUM_UNITS) {
3417                        /* Use units scaling for large partitions if the device
3418                         * suggests it and no precision lost. Required for IBM
3419                         * TS1140/50 drives that don't support MB units.
3420                         */
3421                        if (size >= 1000 && (size % 1000) == 0) {
3422                                size /= 1000;
3423                                psum = PP_MSK_PSUM_UNITS;
3424                                units = 9; /* GB */
3425                        }
3426                }
3427                /* Try it anyway if too large to specify in MB */
3428                if (psum == PP_MSK_PSUM_MB && size >= 65534) {
3429                        size /= 1000;
3430                        psum = PP_MSK_PSUM_UNITS;
3431                        units = 9;  /* GB */
3432                }
3433        }
3434
3435        if (size >= 65535 ||  /* Does not fit into two bytes */
3436            (target_partition == 0 && psd_cnt < 2)) {
3437                result = -EINVAL;
3438                goto out;
3439        }
3440
3441        psdo = pgo + PART_PAGE_FIXED_LENGTH;
3442        /* The second condition is for HP DDS which use only one partition size
3443         * descriptor
3444         */
3445        if (target_partition > 0 &&
3446            (psd_cnt > bp[pgo + PP_OFF_MAX_ADD_PARTS] ||
3447             bp[pgo + PP_OFF_MAX_ADD_PARTS] != 1)) {
3448                bp[psdo] = bp[psdo + 1] = 0xff;  /* Rest to partition 0 */
3449                psdo += 2;
3450        }
3451        memset(bp + psdo, 0, bp[pgo + PP_OFF_NBR_ADD_PARTS] * 2);
3452
3453        DEBC_printk(STp, "psd_cnt %d, max.parts %d, nbr_parts %d\n",
3454                    psd_cnt, bp[pgo + PP_OFF_MAX_ADD_PARTS],
3455                    bp[pgo + PP_OFF_NBR_ADD_PARTS]);
3456
3457        if (size == 0) {
3458                bp[pgo + PP_OFF_NBR_ADD_PARTS] = 0;
3459                if (psd_cnt <= bp[pgo + PP_OFF_MAX_ADD_PARTS])
3460                    bp[pgo + MP_OFF_PAGE_LENGTH] = 6;
3461                DEBC_printk(STp, "Formatting tape with one partition.\n");
3462        } else {
3463                bp[psdo] = (size >> 8) & 0xff;
3464                bp[psdo + 1] = size & 0xff;
3465                if (target_partition == 0)
3466                        bp[psdo + 2] = bp[psdo + 3] = 0xff;
3467                bp[pgo + 3] = 1;
3468                if (bp[pgo + MP_OFF_PAGE_LENGTH] < 8)
3469                    bp[pgo + MP_OFF_PAGE_LENGTH] = 8;
3470                DEBC_printk(STp,
3471                            "Formatting tape with two partitions (%i = %d MB).\n",
3472                            target_partition, units > 0 ? size * 1000 : size);
3473        }
3474        bp[pgo + PP_OFF_PART_UNITS] = 0;
3475        bp[pgo + PP_OFF_RESERVED] = 0;
3476        if (size != 1 || units != 0) {
3477                bp[pgo + PP_OFF_FLAGS] = PP_BIT_IDP | psum |
3478                        (bp[pgo + PP_OFF_FLAGS] & 0x07);
3479                bp[pgo + PP_OFF_PART_UNITS] = units;
3480        } else
3481                bp[pgo + PP_OFF_FLAGS] = PP_BIT_FDP |
3482                        (bp[pgo + PP_OFF_FLAGS] & 0x1f);
3483        bp[pgo + MP_OFF_PAGE_LENGTH] = 6 + psd_cnt * 2;
3484
3485        result = write_mode_page(STp, PART_PAGE, 1);
3486
3487        if (!result && needs_format)
3488                result = format_medium(STp, 1);
3489
3490        if (result) {
3491                st_printk(KERN_INFO, STp, "Partitioning of tape failed.\n");
3492                result = (-EIO);
3493        }
3494
3495out:
3496        return result;
3497}
3498
3499
3500
3501/* The ioctl command */
3502static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
3503{
3504        int i, cmd_nr, cmd_type, bt;
3505        int retval = 0;
3506        unsigned int blk;
3507        struct scsi_tape *STp = file->private_data;
3508        struct st_modedef *STm;
3509        struct st_partstat *STps;
3510        void __user *p = (void __user *)arg;
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                i = copy_to_user(p, &mt_status, sizeof(struct mtget));
3803                if (i) {
3804                        retval = (-EFAULT);
3805                        goto out;
3806                }
3807
3808                STp->recover_reg = 0;           /* Clear after read */
3809                retval = 0;
3810                goto out;
3811        }                       /* End of MTIOCGET */
3812        if (cmd_type == _IOC_TYPE(MTIOCPOS) && cmd_nr == _IOC_NR(MTIOCPOS)) {
3813                struct mtpos mt_pos;
3814                if (_IOC_SIZE(cmd_in) != sizeof(struct mtpos)) {
3815                         retval = (-EINVAL);
3816                         goto out;
3817                }
3818                if ((i = get_location(STp, &blk, &bt, 0)) < 0) {
3819                        retval = i;
3820                        goto out;
3821                }
3822                mt_pos.mt_blkno = blk;
3823                i = copy_to_user(p, &mt_pos, sizeof(struct mtpos));
3824                if (i)
3825                        retval = (-EFAULT);
3826                goto out;
3827        }
3828        mutex_unlock(&STp->lock);
3829        switch (cmd_in) {
3830                case SCSI_IOCTL_GET_IDLUN:
3831                case SCSI_IOCTL_GET_BUS_NUMBER:
3832                        break;
3833                default:
3834                        if ((cmd_in == SG_IO ||
3835                             cmd_in == SCSI_IOCTL_SEND_COMMAND ||
3836                             cmd_in == CDROM_SEND_PACKET) &&
3837                            !capable(CAP_SYS_RAWIO))
3838                                i = -EPERM;
3839                        else
3840                                i = scsi_cmd_ioctl(STp->disk->queue, STp->disk,
3841                                                   file->f_mode, cmd_in, p);
3842                        if (i != -ENOTTY)
3843                                return i;
3844                        break;
3845        }
3846        retval = scsi_ioctl(STp->device, cmd_in, p);
3847        if (!retval && cmd_in == SCSI_IOCTL_STOP_UNIT) { /* unload */
3848                STp->rew_at_close = 0;
3849                STp->ready = ST_NO_TAPE;
3850        }
3851        return retval;
3852
3853 out:
3854        mutex_unlock(&STp->lock);
3855        return retval;
3856}
3857
3858#ifdef CONFIG_COMPAT
3859static long st_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
3860{
3861        struct scsi_tape *STp = file->private_data;
3862        struct scsi_device *sdev = STp->device;
3863        int ret = -ENOIOCTLCMD;
3864        if (sdev->host->hostt->compat_ioctl) { 
3865
3866                ret = sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);
3867
3868        }
3869        return ret;
3870}
3871#endif
3872
3873
3874
3875/* Try to allocate a new tape buffer. Calling function must not hold
3876   dev_arr_lock. */
3877static struct st_buffer *new_tape_buffer(int need_dma, int max_sg)
3878{
3879        struct st_buffer *tb;
3880
3881        tb = kzalloc(sizeof(struct st_buffer), GFP_ATOMIC);
3882        if (!tb) {
3883                printk(KERN_NOTICE "st: Can't allocate new tape buffer.\n");
3884                return NULL;
3885        }
3886        tb->frp_segs = 0;
3887        tb->use_sg = max_sg;
3888        tb->dma = need_dma;
3889        tb->buffer_size = 0;
3890
3891        tb->reserved_pages = kzalloc(max_sg * sizeof(struct page *),
3892                                     GFP_ATOMIC);
3893        if (!tb->reserved_pages) {
3894                kfree(tb);
3895                return NULL;
3896        }
3897
3898        return tb;
3899}
3900
3901
3902/* Try to allocate enough space in the tape buffer */
3903#define ST_MAX_ORDER 6
3904
3905static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dma)
3906{
3907        int segs, max_segs, b_size, order, got;
3908        gfp_t priority;
3909
3910        if (new_size <= STbuffer->buffer_size)
3911                return 1;
3912
3913        if (STbuffer->buffer_size <= PAGE_SIZE)
3914                normalize_buffer(STbuffer);  /* Avoid extra segment */
3915
3916        max_segs = STbuffer->use_sg;
3917
3918        priority = GFP_KERNEL | __GFP_NOWARN;
3919        if (need_dma)
3920                priority |= GFP_DMA;
3921
3922        if (STbuffer->cleared)
3923                priority |= __GFP_ZERO;
3924
3925        if (STbuffer->frp_segs) {
3926                order = STbuffer->reserved_page_order;
3927                b_size = PAGE_SIZE << order;
3928        } else {
3929                for (b_size = PAGE_SIZE, order = 0;
3930                     order < ST_MAX_ORDER &&
3931                             max_segs * (PAGE_SIZE << order) < new_size;
3932                     order++, b_size *= 2)
3933                        ;  /* empty */
3934                STbuffer->reserved_page_order = order;
3935        }
3936        if (max_segs * (PAGE_SIZE << order) < new_size) {
3937                if (order == ST_MAX_ORDER)
3938                        return 0;
3939                normalize_buffer(STbuffer);
3940                return enlarge_buffer(STbuffer, new_size, need_dma);
3941        }
3942
3943        for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size;
3944             segs < max_segs && got < new_size;) {
3945                struct page *page;
3946
3947                page = alloc_pages(priority, order);
3948                if (!page) {
3949                        DEB(STbuffer->buffer_size = got);
3950                        normalize_buffer(STbuffer);
3951                        return 0;
3952                }
3953
3954                STbuffer->frp_segs += 1;
3955                got += b_size;
3956                STbuffer->buffer_size = got;
3957                STbuffer->reserved_pages[segs] = page;
3958                segs++;
3959        }
3960        STbuffer->b_data = page_address(STbuffer->reserved_pages[0]);
3961
3962        return 1;
3963}
3964
3965
3966/* Make sure that no data from previous user is in the internal buffer */
3967static void clear_buffer(struct st_buffer * st_bp)
3968{
3969        int i;
3970
3971        for (i=0; i < st_bp->frp_segs; i++)
3972                memset(page_address(st_bp->reserved_pages[i]), 0,
3973                       PAGE_SIZE << st_bp->reserved_page_order);
3974        st_bp->cleared = 1;
3975}
3976
3977
3978/* Release the extra buffer */
3979static void normalize_buffer(struct st_buffer * STbuffer)
3980{
3981        int i, order = STbuffer->reserved_page_order;
3982
3983        for (i = 0; i < STbuffer->frp_segs; i++) {
3984                __free_pages(STbuffer->reserved_pages[i], order);
3985                STbuffer->buffer_size -= (PAGE_SIZE << order);
3986        }
3987        STbuffer->frp_segs = 0;
3988        STbuffer->sg_segs = 0;
3989        STbuffer->reserved_page_order = 0;
3990        STbuffer->map_data.offset = 0;
3991}
3992
3993
3994/* Move data from the user buffer to the tape buffer. Returns zero (success) or
3995   negative error code. */
3996static int append_to_buffer(const char __user *ubp, struct st_buffer * st_bp, int do_count)
3997{
3998        int i, cnt, res, offset;
3999        int length = PAGE_SIZE << st_bp->reserved_page_order;
4000
4001        for (i = 0, offset = st_bp->buffer_bytes;
4002             i < st_bp->frp_segs && offset >= length; i++)
4003                offset -= length;
4004        if (i == st_bp->frp_segs) {     /* Should never happen */
4005                printk(KERN_WARNING "st: append_to_buffer offset overflow.\n");
4006                return (-EIO);
4007        }
4008        for (; i < st_bp->frp_segs && do_count > 0; i++) {
4009                struct page *page = st_bp->reserved_pages[i];
4010                cnt = length - offset < do_count ? length - offset : do_count;
4011                res = copy_from_user(page_address(page) + offset, ubp, cnt);
4012                if (res)
4013                        return (-EFAULT);
4014                do_count -= cnt;
4015                st_bp->buffer_bytes += cnt;
4016                ubp += cnt;
4017                offset = 0;
4018        }
4019        if (do_count) /* Should never happen */
4020                return (-EIO);
4021
4022        return 0;
4023}
4024
4025
4026/* Move data from the tape buffer to the user buffer. Returns zero (success) or
4027   negative error code. */
4028static int from_buffer(struct st_buffer * st_bp, char __user *ubp, int do_count)
4029{
4030        int i, cnt, res, offset;
4031        int length = PAGE_SIZE << st_bp->reserved_page_order;
4032
4033        for (i = 0, offset = st_bp->read_pointer;
4034             i < st_bp->frp_segs && offset >= length; i++)
4035                offset -= length;
4036        if (i == st_bp->frp_segs) {     /* Should never happen */
4037                printk(KERN_WARNING "st: from_buffer offset overflow.\n");
4038                return (-EIO);
4039        }
4040        for (; i < st_bp->frp_segs && do_count > 0; i++) {
4041                struct page *page = st_bp->reserved_pages[i];
4042                cnt = length - offset < do_count ? length - offset : do_count;
4043                res = copy_to_user(ubp, page_address(page) + offset, cnt);
4044                if (res)
4045                        return (-EFAULT);
4046                do_count -= cnt;
4047                st_bp->buffer_bytes -= cnt;
4048                st_bp->read_pointer += cnt;
4049                ubp += cnt;
4050                offset = 0;
4051        }
4052        if (do_count) /* Should never happen */
4053                return (-EIO);
4054
4055        return 0;
4056}
4057
4058
4059/* Move data towards start of buffer */
4060static void move_buffer_data(struct st_buffer * st_bp, int offset)
4061{
4062        int src_seg, dst_seg, src_offset = 0, dst_offset;
4063        int count, total;
4064        int length = PAGE_SIZE << st_bp->reserved_page_order;
4065
4066        if (offset == 0)
4067                return;
4068
4069        total=st_bp->buffer_bytes - offset;
4070        for (src_seg=0; src_seg < st_bp->frp_segs; src_seg++) {
4071                src_offset = offset;
4072                if (src_offset < length)
4073                        break;
4074                offset -= length;
4075        }
4076
4077        st_bp->buffer_bytes = st_bp->read_pointer = total;
4078        for (dst_seg=dst_offset=0; total > 0; ) {
4079                struct page *dpage = st_bp->reserved_pages[dst_seg];
4080                struct page *spage = st_bp->reserved_pages[src_seg];
4081
4082                count = min(length - dst_offset, length - src_offset);
4083                memmove(page_address(dpage) + dst_offset,
4084                        page_address(spage) + src_offset, count);
4085                src_offset += count;
4086                if (src_offset >= length) {
4087                        src_seg++;
4088                        src_offset = 0;
4089                }
4090                dst_offset += count;
4091                if (dst_offset >= length) {
4092                        dst_seg++;
4093                        dst_offset = 0;
4094                }
4095                total -= count;
4096        }
4097}
4098
4099/* Validate the options from command line or module parameters */
4100static void validate_options(void)
4101{
4102        if (buffer_kbs > 0)
4103                st_fixed_buffer_size = buffer_kbs * ST_KILOBYTE;
4104        if (max_sg_segs >= ST_FIRST_SG)
4105                st_max_sg_segs = max_sg_segs;
4106}
4107
4108#ifndef MODULE
4109/* Set the boot options. Syntax is defined in Documenation/scsi/st.txt.
4110 */
4111static int __init st_setup(char *str)
4112{
4113        int i, len, ints[5];
4114        char *stp;
4115
4116        stp = get_options(str, ARRAY_SIZE(ints), ints);
4117
4118        if (ints[0] > 0) {
4119                for (i = 0; i < ints[0] && i < ARRAY_SIZE(parms); i++)
4120                        if (parms[i].val)
4121                                *parms[i].val = ints[i + 1];
4122        } else {
4123                while (stp != NULL) {
4124                        for (i = 0; i < ARRAY_SIZE(parms); i++) {
4125                                len = strlen(parms[i].name);
4126                                if (!strncmp(stp, parms[i].name, len) &&
4127                                    (*(stp + len) == ':' || *(stp + len) == '=')) {
4128                                        if (parms[i].val)
4129                                                *parms[i].val =
4130                                                        simple_strtoul(stp + len + 1, NULL, 0);
4131                                        else
4132                                                printk(KERN_WARNING "st: Obsolete parameter %s\n",
4133                                                       parms[i].name);
4134                                        break;
4135                                }
4136                        }
4137                        if (i >= ARRAY_SIZE(parms))
4138                                 printk(KERN_WARNING "st: invalid parameter in '%s'\n",
4139                                        stp);
4140                        stp = strchr(stp, ',');
4141                        if (stp)
4142                                stp++;
4143                }
4144        }
4145
4146        validate_options();
4147
4148        return 1;
4149}
4150
4151__setup("st=", st_setup);
4152
4153#endif
4154
4155static const struct file_operations st_fops =
4156{
4157        .owner =        THIS_MODULE,
4158        .read =         st_read,
4159        .write =        st_write,
4160        .unlocked_ioctl = st_ioctl,
4161#ifdef CONFIG_COMPAT
4162        .compat_ioctl = st_compat_ioctl,
4163#endif
4164        .open =         st_open,
4165        .flush =        st_flush,
4166        .release =      st_release,
4167        .llseek =       noop_llseek,
4168};
4169
4170static int create_one_cdev(struct scsi_tape *tape, int mode, int rew)
4171{
4172        int i, error;
4173        dev_t cdev_devno;
4174        struct cdev *cdev;
4175        struct device *dev;
4176        struct st_modedef *STm = &(tape->modes[mode]);
4177        char name[10];
4178        int dev_num = tape->index;
4179
4180        cdev_devno = MKDEV(SCSI_TAPE_MAJOR, TAPE_MINOR(dev_num, mode, rew));
4181
4182        cdev = cdev_alloc();
4183        if (!cdev) {
4184                pr_err("st%d: out of memory. Device not attached.\n", dev_num);
4185                error = -ENOMEM;
4186                goto out;
4187        }
4188        cdev->owner = THIS_MODULE;
4189        cdev->ops = &st_fops;
4190        STm->cdevs[rew] = cdev;
4191
4192        error = cdev_add(cdev, cdev_devno, 1);
4193        if (error) {
4194                pr_err("st%d: Can't add %s-rewind mode %d\n", dev_num,
4195                       rew ? "non" : "auto", mode);
4196                pr_err("st%d: Device not attached.\n", dev_num);
4197                goto out_free;
4198        }
4199
4200        i = mode << (4 - ST_NBR_MODE_BITS);
4201        snprintf(name, 10, "%s%s%s", rew ? "n" : "",
4202                 tape->disk->disk_name, st_formats[i]);
4203
4204        dev = device_create(&st_sysfs_class, &tape->device->sdev_gendev,
4205                            cdev_devno, &tape->modes[mode], "%s", name);
4206        if (IS_ERR(dev)) {
4207                pr_err("st%d: device_create failed\n", dev_num);
4208                error = PTR_ERR(dev);
4209                goto out_free;
4210        }
4211
4212        STm->devs[rew] = dev;
4213
4214        return 0;
4215out_free:
4216        cdev_del(STm->cdevs[rew]);
4217out:
4218        STm->cdevs[rew] = NULL;
4219        STm->devs[rew] = NULL;
4220        return error;
4221}
4222
4223static int create_cdevs(struct scsi_tape *tape)
4224{
4225        int mode, error;
4226        for (mode = 0; mode < ST_NBR_MODES; ++mode) {
4227                error = create_one_cdev(tape, mode, 0);
4228                if (error)
4229                        return error;
4230                error = create_one_cdev(tape, mode, 1);
4231                if (error)
4232                        return error;
4233        }
4234
4235        return sysfs_create_link(&tape->device->sdev_gendev.kobj,
4236                                 &tape->modes[0].devs[0]->kobj, "tape");
4237}
4238
4239static void remove_cdevs(struct scsi_tape *tape)
4240{
4241        int mode, rew;
4242        sysfs_remove_link(&tape->device->sdev_gendev.kobj, "tape");
4243        for (mode = 0; mode < ST_NBR_MODES; mode++) {
4244                struct st_modedef *STm = &(tape->modes[mode]);
4245                for (rew = 0; rew < 2; rew++) {
4246                        if (STm->cdevs[rew])
4247                                cdev_del(STm->cdevs[rew]);
4248                        if (STm->devs[rew])
4249                                device_unregister(STm->devs[rew]);
4250                }
4251        }
4252}
4253
4254static int st_probe(struct device *dev)
4255{
4256        struct scsi_device *SDp = to_scsi_device(dev);
4257        struct gendisk *disk = NULL;
4258        struct scsi_tape *tpnt = NULL;
4259        struct st_modedef *STm;
4260        struct st_partstat *STps;
4261        struct st_buffer *buffer;
4262        int i, error;
4263        char *stp;
4264
4265        if (SDp->type != TYPE_TAPE)
4266                return -ENODEV;
4267        if ((stp = st_incompatible(SDp))) {
4268                sdev_printk(KERN_INFO, SDp, "Found incompatible tape\n");
4269                sdev_printk(KERN_INFO, SDp,
4270                            "st: The suggested driver is %s.\n", stp);
4271                return -ENODEV;
4272        }
4273
4274        scsi_autopm_get_device(SDp);
4275        i = queue_max_segments(SDp->request_queue);
4276        if (st_max_sg_segs < i)
4277                i = st_max_sg_segs;
4278        buffer = new_tape_buffer((SDp->host)->unchecked_isa_dma, i);
4279        if (buffer == NULL) {
4280                sdev_printk(KERN_ERR, SDp,
4281                            "st: Can't allocate new tape buffer. "
4282                            "Device not attached.\n");
4283                goto out;
4284        }
4285
4286        disk = alloc_disk(1);
4287        if (!disk) {
4288                sdev_printk(KERN_ERR, SDp,
4289                            "st: out of memory. Device not attached.\n");
4290                goto out_buffer_free;
4291        }
4292
4293        tpnt = kzalloc(sizeof(struct scsi_tape), GFP_ATOMIC);
4294        if (tpnt == NULL) {
4295                sdev_printk(KERN_ERR, SDp,
4296                            "st: Can't allocate device descriptor.\n");
4297                goto out_put_disk;
4298        }
4299        kref_init(&tpnt->kref);
4300        tpnt->disk = disk;
4301        disk->private_data = &tpnt->driver;
4302        /* SCSI tape doesn't register this gendisk via add_disk().  Manually
4303         * take queue reference that release_disk() expects. */
4304        if (!blk_get_queue(SDp->request_queue))
4305                goto out_put_disk;
4306        disk->queue = SDp->request_queue;
4307        tpnt->driver = &st_template;
4308
4309        tpnt->device = SDp;
4310        if (SDp->scsi_level <= 2)
4311                tpnt->tape_type = MT_ISSCSI1;
4312        else
4313                tpnt->tape_type = MT_ISSCSI2;
4314
4315        tpnt->buffer = buffer;
4316        tpnt->buffer->last_SRpnt = NULL;
4317
4318        tpnt->inited = 0;
4319        tpnt->dirty = 0;
4320        tpnt->in_use = 0;
4321        tpnt->drv_buffer = 1;   /* Try buffering if no mode sense */
4322        tpnt->restr_dma = (SDp->host)->unchecked_isa_dma;
4323        tpnt->use_pf = (SDp->scsi_level >= SCSI_2);
4324        tpnt->density = 0;
4325        tpnt->do_auto_lock = ST_AUTO_LOCK;
4326        tpnt->can_bsr = (SDp->scsi_level > 2 ? 1 : ST_IN_FILE_POS); /* BSR mandatory in SCSI3 */
4327        tpnt->can_partitions = 0;
4328        tpnt->two_fm = ST_TWO_FM;
4329        tpnt->fast_mteom = ST_FAST_MTEOM;
4330        tpnt->scsi2_logical = ST_SCSI2LOGICAL;
4331        tpnt->sili = ST_SILI;
4332        tpnt->immediate = ST_NOWAIT;
4333        tpnt->immediate_filemark = 0;
4334        tpnt->default_drvbuffer = 0xff;         /* No forced buffering */
4335        tpnt->partition = 0;
4336        tpnt->new_partition = 0;
4337        tpnt->nbr_partitions = 0;
4338        blk_queue_rq_timeout(tpnt->device->request_queue, ST_TIMEOUT);
4339        tpnt->long_timeout = ST_LONG_TIMEOUT;
4340        tpnt->try_dio = try_direct_io && !SDp->host->unchecked_isa_dma;
4341
4342        for (i = 0; i < ST_NBR_MODES; i++) {
4343                STm = &(tpnt->modes[i]);
4344                STm->defined = 0;
4345                STm->sysv = ST_SYSV;
4346                STm->defaults_for_writes = 0;
4347                STm->do_async_writes = ST_ASYNC_WRITES;
4348                STm->do_buffer_writes = ST_BUFFER_WRITES;
4349                STm->do_read_ahead = ST_READ_AHEAD;
4350                STm->default_compression = ST_DONT_TOUCH;
4351                STm->default_blksize = (-1);    /* No forced size */
4352                STm->default_density = (-1);    /* No forced density */
4353                STm->tape = tpnt;
4354        }
4355
4356        for (i = 0; i < ST_NBR_PARTITIONS; i++) {
4357                STps = &(tpnt->ps[i]);
4358                STps->rw = ST_IDLE;
4359                STps->eof = ST_NOEOF;
4360                STps->at_sm = 0;
4361                STps->last_block_valid = 0;
4362                STps->drv_block = (-1);
4363                STps->drv_file = (-1);
4364        }
4365
4366        tpnt->current_mode = 0;
4367        tpnt->modes[0].defined = 1;
4368
4369        tpnt->density_changed = tpnt->compression_changed =
4370            tpnt->blksize_changed = 0;
4371        mutex_init(&tpnt->lock);
4372
4373        idr_preload(GFP_KERNEL);
4374        spin_lock(&st_index_lock);
4375        error = idr_alloc(&st_index_idr, tpnt, 0, ST_MAX_TAPES + 1, GFP_NOWAIT);
4376        spin_unlock(&st_index_lock);
4377        idr_preload_end();
4378        if (error < 0) {
4379                pr_warn("st: idr allocation failed: %d\n", error);
4380                goto out_put_queue;
4381        }
4382        tpnt->index = error;
4383        sprintf(disk->disk_name, "st%d", tpnt->index);
4384        tpnt->stats = kzalloc(sizeof(struct scsi_tape_stats), GFP_KERNEL);
4385        if (tpnt->stats == NULL) {
4386                sdev_printk(KERN_ERR, SDp,
4387                            "st: Can't allocate statistics.\n");
4388                goto out_idr_remove;
4389        }
4390
4391        dev_set_drvdata(dev, tpnt);
4392
4393
4394        error = create_cdevs(tpnt);
4395        if (error)
4396                goto out_remove_devs;
4397        scsi_autopm_put_device(SDp);
4398
4399        sdev_printk(KERN_NOTICE, SDp,
4400                    "Attached scsi tape %s\n", tape_name(tpnt));
4401        sdev_printk(KERN_INFO, SDp, "%s: try direct i/o: %s (alignment %d B)\n",
4402                    tape_name(tpnt), tpnt->try_dio ? "yes" : "no",
4403                    queue_dma_alignment(SDp->request_queue) + 1);
4404
4405        return 0;
4406
4407out_remove_devs:
4408        remove_cdevs(tpnt);
4409        kfree(tpnt->stats);
4410out_idr_remove:
4411        spin_lock(&st_index_lock);
4412        idr_remove(&st_index_idr, tpnt->index);
4413        spin_unlock(&st_index_lock);
4414out_put_queue:
4415        blk_put_queue(disk->queue);
4416out_put_disk:
4417        put_disk(disk);
4418        kfree(tpnt);
4419out_buffer_free:
4420        kfree(buffer);
4421out:
4422        scsi_autopm_put_device(SDp);
4423        return -ENODEV;
4424};
4425
4426
4427static int st_remove(struct device *dev)
4428{
4429        struct scsi_tape *tpnt = dev_get_drvdata(dev);
4430        int index = tpnt->index;
4431
4432        scsi_autopm_get_device(to_scsi_device(dev));
4433        remove_cdevs(tpnt);
4434
4435        mutex_lock(&st_ref_mutex);
4436        kref_put(&tpnt->kref, scsi_tape_release);
4437        mutex_unlock(&st_ref_mutex);
4438        spin_lock(&st_index_lock);
4439        idr_remove(&st_index_idr, index);
4440        spin_unlock(&st_index_lock);
4441        return 0;
4442}
4443
4444/**
4445 *      scsi_tape_release - Called to free the Scsi_Tape structure
4446 *      @kref: pointer to embedded kref
4447 *
4448 *      st_ref_mutex must be held entering this routine.  Because it is
4449 *      called on last put, you should always use the scsi_tape_get()
4450 *      scsi_tape_put() helpers which manipulate the semaphore directly
4451 *      and never do a direct kref_put().
4452 **/
4453static void scsi_tape_release(struct kref *kref)
4454{
4455        struct scsi_tape *tpnt = to_scsi_tape(kref);
4456        struct gendisk *disk = tpnt->disk;
4457
4458        tpnt->device = NULL;
4459
4460        if (tpnt->buffer) {
4461                normalize_buffer(tpnt->buffer);
4462                kfree(tpnt->buffer->reserved_pages);
4463                kfree(tpnt->buffer);
4464        }
4465
4466        disk->private_data = NULL;
4467        put_disk(disk);
4468        kfree(tpnt->stats);
4469        kfree(tpnt);
4470        return;
4471}
4472
4473static struct class st_sysfs_class = {
4474        .name = "scsi_tape",
4475        .dev_groups = st_dev_groups,
4476};
4477
4478static int __init init_st(void)
4479{
4480        int err;
4481
4482        validate_options();
4483
4484        printk(KERN_INFO "st: Version %s, fixed bufsize %d, s/g segs %d\n",
4485                verstr, st_fixed_buffer_size, st_max_sg_segs);
4486
4487        debugging = (debug_flag > 0) ? debug_flag : NO_DEBUG;
4488        if (debugging) {
4489                printk(KERN_INFO "st: Debugging enabled debug_flag = %d\n",
4490                        debugging);
4491        }
4492
4493        err = class_register(&st_sysfs_class);
4494        if (err) {
4495                pr_err("Unable register sysfs class for SCSI tapes\n");
4496                return err;
4497        }
4498
4499        err = register_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
4500                                     ST_MAX_TAPE_ENTRIES, "st");
4501        if (err) {
4502                printk(KERN_ERR "Unable to get major %d for SCSI tapes\n",
4503                       SCSI_TAPE_MAJOR);
4504                goto err_class;
4505        }
4506
4507        err = scsi_register_driver(&st_template.gendrv);
4508        if (err)
4509                goto err_chrdev;
4510
4511        return 0;
4512
4513err_chrdev:
4514        unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
4515                                 ST_MAX_TAPE_ENTRIES);
4516err_class:
4517        class_unregister(&st_sysfs_class);
4518        return err;
4519}
4520
4521static void __exit exit_st(void)
4522{
4523        scsi_unregister_driver(&st_template.gendrv);
4524        unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0),
4525                                 ST_MAX_TAPE_ENTRIES);
4526        class_unregister(&st_sysfs_class);
4527        idr_destroy(&st_index_idr);
4528        printk(KERN_INFO "st: Unloaded.\n");
4529}
4530
4531module_init(init_st);
4532module_exit(exit_st);
4533
4534
4535/* The sysfs driver interface. Read-only at the moment */
4536static ssize_t try_direct_io_show(struct device_driver *ddp, char *buf)
4537{
4538        return scnprintf(buf, PAGE_SIZE, "%d\n", try_direct_io);
4539}
4540static DRIVER_ATTR_RO(try_direct_io);
4541
4542static ssize_t fixed_buffer_size_show(struct device_driver *ddp, char *buf)
4543{
4544        return scnprintf(buf, PAGE_SIZE, "%d\n", st_fixed_buffer_size);
4545}
4546static DRIVER_ATTR_RO(fixed_buffer_size);
4547
4548static ssize_t max_sg_segs_show(struct device_driver *ddp, char *buf)
4549{
4550        return scnprintf(buf, PAGE_SIZE, "%d\n", st_max_sg_segs);
4551}
4552static DRIVER_ATTR_RO(max_sg_segs);
4553
4554static ssize_t version_show(struct device_driver *ddd, char *buf)
4555{
4556        return scnprintf(buf, PAGE_SIZE, "[%s]\n", verstr);
4557}
4558static DRIVER_ATTR_RO(version);
4559
4560#if DEBUG
4561static ssize_t debug_flag_store(struct device_driver *ddp,
4562        const char *buf, size_t count)
4563{
4564/* We only care what the first byte of the data is the rest is unused.
4565 * if it's a '1' we turn on debug and if it's a '0' we disable it. All
4566 * other values have -EINVAL returned if they are passed in.
4567 */
4568        if (count > 0) {
4569                if (buf[0] == '0') {
4570                        debugging = NO_DEBUG;
4571                        return count;
4572                } else if (buf[0] == '1') {
4573                        debugging = 1;
4574                        return count;
4575                }
4576        }
4577        return -EINVAL;
4578}
4579
4580static ssize_t debug_flag_show(struct device_driver *ddp, char *buf)
4581{
4582        return scnprintf(buf, PAGE_SIZE, "%d\n", debugging);
4583}
4584static DRIVER_ATTR_RW(debug_flag);
4585#endif
4586
4587static struct attribute *st_drv_attrs[] = {
4588        &driver_attr_try_direct_io.attr,
4589        &driver_attr_fixed_buffer_size.attr,
4590        &driver_attr_max_sg_segs.attr,
4591        &driver_attr_version.attr,
4592#if DEBUG
4593        &driver_attr_debug_flag.attr,
4594#endif
4595        NULL,
4596};
4597ATTRIBUTE_GROUPS(st_drv);
4598
4599/* The sysfs simple class interface */
4600static ssize_t
4601defined_show(struct device *dev, struct device_attribute *attr, char *buf)
4602{
4603        struct st_modedef *STm = dev_get_drvdata(dev);
4604        ssize_t l = 0;
4605
4606        l = snprintf(buf, PAGE_SIZE, "%d\n", STm->defined);
4607        return l;
4608}
4609static DEVICE_ATTR_RO(defined);
4610
4611static ssize_t
4612default_blksize_show(struct device *dev, struct device_attribute *attr,
4613                     char *buf)
4614{
4615        struct st_modedef *STm = dev_get_drvdata(dev);
4616        ssize_t l = 0;
4617
4618        l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_blksize);
4619        return l;
4620}
4621static DEVICE_ATTR_RO(default_blksize);
4622
4623static ssize_t
4624default_density_show(struct device *dev, struct device_attribute *attr,
4625                     char *buf)
4626{
4627        struct st_modedef *STm = dev_get_drvdata(dev);
4628        ssize_t l = 0;
4629        char *fmt;
4630
4631        fmt = STm->default_density >= 0 ? "0x%02x\n" : "%d\n";
4632        l = snprintf(buf, PAGE_SIZE, fmt, STm->default_density);
4633        return l;
4634}
4635static DEVICE_ATTR_RO(default_density);
4636
4637static ssize_t
4638default_compression_show(struct device *dev, struct device_attribute *attr,
4639                         char *buf)
4640{
4641        struct st_modedef *STm = dev_get_drvdata(dev);
4642        ssize_t l = 0;
4643
4644        l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_compression - 1);
4645        return l;
4646}
4647static DEVICE_ATTR_RO(default_compression);
4648
4649static ssize_t
4650options_show(struct device *dev, struct device_attribute *attr, char *buf)
4651{
4652        struct st_modedef *STm = dev_get_drvdata(dev);
4653        struct scsi_tape *STp = STm->tape;
4654        int options;
4655        ssize_t l = 0;
4656
4657        options = STm->do_buffer_writes ? MT_ST_BUFFER_WRITES : 0;
4658        options |= STm->do_async_writes ? MT_ST_ASYNC_WRITES : 0;
4659        options |= STm->do_read_ahead ? MT_ST_READ_AHEAD : 0;
4660        DEB( options |= debugging ? MT_ST_DEBUGGING : 0 );
4661        options |= STp->two_fm ? MT_ST_TWO_FM : 0;
4662        options |= STp->fast_mteom ? MT_ST_FAST_MTEOM : 0;
4663        options |= STm->defaults_for_writes ? MT_ST_DEF_WRITES : 0;
4664        options |= STp->can_bsr ? MT_ST_CAN_BSR : 0;
4665        options |= STp->omit_blklims ? MT_ST_NO_BLKLIMS : 0;
4666        options |= STp->can_partitions ? MT_ST_CAN_PARTITIONS : 0;
4667        options |= STp->scsi2_logical ? MT_ST_SCSI2LOGICAL : 0;
4668        options |= STm->sysv ? MT_ST_SYSV : 0;
4669        options |= STp->immediate ? MT_ST_NOWAIT : 0;
4670        options |= STp->immediate_filemark ? MT_ST_NOWAIT_EOF : 0;
4671        options |= STp->sili ? MT_ST_SILI : 0;
4672
4673        l = snprintf(buf, PAGE_SIZE, "0x%08x\n", options);
4674        return l;
4675}
4676static DEVICE_ATTR_RO(options);
4677
4678/* Support for tape stats */
4679
4680/**
4681 * read_cnt_show - return read count - count of reads made from tape drive
4682 * @dev: struct device
4683 * @attr: attribute structure
4684 * @buf: buffer to return formatted data in
4685 */
4686static ssize_t read_cnt_show(struct device *dev,
4687        struct device_attribute *attr, char *buf)
4688{
4689        struct st_modedef *STm = dev_get_drvdata(dev);
4690
4691        return sprintf(buf, "%lld",
4692                       (long long)atomic64_read(&STm->tape->stats->read_cnt));
4693}
4694static DEVICE_ATTR_RO(read_cnt);
4695
4696/**
4697 * read_byte_cnt_show - return read byte count - tape drives
4698 * may use blocks less than 512 bytes this gives the raw byte count of
4699 * of data read from the tape drive.
4700 * @dev: struct device
4701 * @attr: attribute structure
4702 * @buf: buffer to return formatted data in
4703 */
4704static ssize_t read_byte_cnt_show(struct device *dev,
4705        struct device_attribute *attr, char *buf)
4706{
4707        struct st_modedef *STm = dev_get_drvdata(dev);
4708
4709        return sprintf(buf, "%lld",
4710                       (long long)atomic64_read(&STm->tape->stats->read_byte_cnt));
4711}
4712static DEVICE_ATTR_RO(read_byte_cnt);
4713
4714/**
4715 * read_ns_show - return read ns - overall time spent waiting on reads in ns.
4716 * @dev: struct device
4717 * @attr: attribute structure
4718 * @buf: buffer to return formatted data in
4719 */
4720static ssize_t read_ns_show(struct device *dev,
4721        struct device_attribute *attr, char *buf)
4722{
4723        struct st_modedef *STm = dev_get_drvdata(dev);
4724
4725        return sprintf(buf, "%lld",
4726                       (long long)atomic64_read(&STm->tape->stats->tot_read_time));
4727}
4728static DEVICE_ATTR_RO(read_ns);
4729
4730/**
4731 * write_cnt_show - write count - number of user calls
4732 * to write(2) that have written data to tape.
4733 * @dev: struct device
4734 * @attr: attribute structure
4735 * @buf: buffer to return formatted data in
4736 */
4737static ssize_t write_cnt_show(struct device *dev,
4738        struct device_attribute *attr, char *buf)
4739{
4740        struct st_modedef *STm = dev_get_drvdata(dev);
4741
4742        return sprintf(buf, "%lld",
4743                       (long long)atomic64_read(&STm->tape->stats->write_cnt));
4744}
4745static DEVICE_ATTR_RO(write_cnt);
4746
4747/**
4748 * write_byte_cnt_show - write byte count - raw count of
4749 * bytes written to tape.
4750 * @dev: struct device
4751 * @attr: attribute structure
4752 * @buf: buffer to return formatted data in
4753 */
4754static ssize_t write_byte_cnt_show(struct device *dev,
4755        struct device_attribute *attr, char *buf)
4756{
4757        struct st_modedef *STm = dev_get_drvdata(dev);
4758
4759        return sprintf(buf, "%lld",
4760                       (long long)atomic64_read(&STm->tape->stats->write_byte_cnt));
4761}
4762static DEVICE_ATTR_RO(write_byte_cnt);
4763
4764/**
4765 * write_ns_show - write ns - number of nanoseconds waiting on write
4766 * requests to complete.
4767 * @dev: struct device
4768 * @attr: attribute structure
4769 * @buf: buffer to return formatted data in
4770 */
4771static ssize_t write_ns_show(struct device *dev,
4772        struct device_attribute *attr, char *buf)
4773{
4774        struct st_modedef *STm = dev_get_drvdata(dev);
4775
4776        return sprintf(buf, "%lld",
4777                       (long long)atomic64_read(&STm->tape->stats->tot_write_time));
4778}
4779static DEVICE_ATTR_RO(write_ns);
4780
4781/**
4782 * in_flight_show - number of I/Os currently in flight -
4783 * in most cases this will be either 0 or 1. It may be higher if someone
4784 * has also issued other SCSI commands such as via an ioctl.
4785 * @dev: struct device
4786 * @attr: attribute structure
4787 * @buf: buffer to return formatted data in
4788 */
4789static ssize_t in_flight_show(struct device *dev,
4790        struct device_attribute *attr, char *buf)
4791{
4792        struct st_modedef *STm = dev_get_drvdata(dev);
4793
4794        return sprintf(buf, "%lld",
4795                       (long long)atomic64_read(&STm->tape->stats->in_flight));
4796}
4797static DEVICE_ATTR_RO(in_flight);
4798
4799/**
4800 * io_ns_show - io wait ns - this is the number of ns spent
4801 * waiting on all I/O to complete. This includes tape movement commands
4802 * such as rewinding, seeking to end of file or tape, it also includes
4803 * read and write. To determine the time spent on tape movement
4804 * subtract the read and write ns from this value.
4805 * @dev: struct device
4806 * @attr: attribute structure
4807 * @buf: buffer to return formatted data in
4808 */
4809static ssize_t io_ns_show(struct device *dev,
4810        struct device_attribute *attr, char *buf)
4811{
4812        struct st_modedef *STm = dev_get_drvdata(dev);
4813
4814        return sprintf(buf, "%lld",
4815                       (long long)atomic64_read(&STm->tape->stats->tot_io_time));
4816}
4817static DEVICE_ATTR_RO(io_ns);
4818
4819/**
4820 * other_cnt_show - other io count - this is the number of
4821 * I/O requests other than read and write requests.
4822 * Typically these are tape movement requests but will include driver
4823 * tape movement. This includes only requests issued by the st driver.
4824 * @dev: struct device
4825 * @attr: attribute structure
4826 * @buf: buffer to return formatted data in
4827 */
4828static ssize_t other_cnt_show(struct device *dev,
4829        struct device_attribute *attr, char *buf)
4830{
4831        struct st_modedef *STm = dev_get_drvdata(dev);
4832
4833        return sprintf(buf, "%lld",
4834                       (long long)atomic64_read(&STm->tape->stats->other_cnt));
4835}
4836static DEVICE_ATTR_RO(other_cnt);
4837
4838/**
4839 * resid_cnt_show - A count of the number of times we get a residual
4840 * count - this should indicate someone issuing reads larger than the
4841 * block size on tape.
4842 * @dev: struct device
4843 * @attr: attribute structure
4844 * @buf: buffer to return formatted data in
4845 */
4846static ssize_t resid_cnt_show(struct device *dev,
4847        struct device_attribute *attr, char *buf)
4848{
4849        struct st_modedef *STm = dev_get_drvdata(dev);
4850
4851        return sprintf(buf, "%lld",
4852                       (long long)atomic64_read(&STm->tape->stats->resid_cnt));
4853}
4854static DEVICE_ATTR_RO(resid_cnt);
4855
4856static struct attribute *st_dev_attrs[] = {
4857        &dev_attr_defined.attr,
4858        &dev_attr_default_blksize.attr,
4859        &dev_attr_default_density.attr,
4860        &dev_attr_default_compression.attr,
4861        &dev_attr_options.attr,
4862        NULL,
4863};
4864
4865static struct attribute *st_stats_attrs[] = {
4866        &dev_attr_read_cnt.attr,
4867        &dev_attr_read_byte_cnt.attr,
4868        &dev_attr_read_ns.attr,
4869        &dev_attr_write_cnt.attr,
4870        &dev_attr_write_byte_cnt.attr,
4871        &dev_attr_write_ns.attr,
4872        &dev_attr_in_flight.attr,
4873        &dev_attr_io_ns.attr,
4874        &dev_attr_other_cnt.attr,
4875        &dev_attr_resid_cnt.attr,
4876        NULL,
4877};
4878
4879static struct attribute_group stats_group = {
4880        .name = "stats",
4881        .attrs = st_stats_attrs,
4882};
4883
4884static struct attribute_group st_group = {
4885        .attrs = st_dev_attrs,
4886};
4887
4888static const struct attribute_group *st_dev_groups[] = {
4889        &st_group,
4890        &stats_group,
4891        NULL,
4892};
4893
4894/* The following functions may be useful for a larger audience. */
4895static int sgl_map_user_pages(struct st_buffer *STbp,
4896                              const unsigned int max_pages, unsigned long uaddr,
4897                              size_t count, int rw)
4898{
4899        unsigned long end = (uaddr + count + PAGE_SIZE - 1) >> PAGE_SHIFT;
4900        unsigned long start = uaddr >> PAGE_SHIFT;
4901        const int nr_pages = end - start;
4902        int res, i, j;
4903        struct page **pages;
4904        struct rq_map_data *mdata = &STbp->map_data;
4905
4906        /* User attempted Overflow! */
4907        if ((uaddr + count) < uaddr)
4908                return -EINVAL;
4909
4910        /* Too big */
4911        if (nr_pages > max_pages)
4912                return -ENOMEM;
4913
4914        /* Hmm? */
4915        if (count == 0)
4916                return 0;
4917
4918        if ((pages = kmalloc(max_pages * sizeof(*pages), GFP_KERNEL)) == NULL)
4919                return -ENOMEM;
4920
4921        /* Try to fault in all of the necessary pages */
4922        /* rw==READ means read from drive, write into memory area */
4923        res = get_user_pages_fast(uaddr, nr_pages, rw == READ, pages);
4924
4925        /* Errors and no page mapped should return here */
4926        if (res < nr_pages)
4927                goto out_unmap;
4928
4929        for (i=0; i < nr_pages; i++) {
4930                /* FIXME: flush superflous for rw==READ,
4931                 * probably wrong function for rw==WRITE
4932                 */
4933                flush_dcache_page(pages[i]);
4934        }
4935
4936        mdata->offset = uaddr & ~PAGE_MASK;
4937        STbp->mapped_pages = pages;
4938
4939        return nr_pages;
4940 out_unmap:
4941        if (res > 0) {
4942                for (j=0; j < res; j++)
4943                        put_page(pages[j]);
4944                res = 0;
4945        }
4946        kfree(pages);
4947        return res;
4948}
4949
4950
4951/* And unmap them... */
4952static int sgl_unmap_user_pages(struct st_buffer *STbp,
4953                                const unsigned int nr_pages, int dirtied)
4954{
4955        int i;
4956
4957        for (i=0; i < nr_pages; i++) {
4958                struct page *page = STbp->mapped_pages[i];
4959
4960                if (dirtied)
4961                        SetPageDirty(page);
4962                /* FIXME: cache flush missing for rw==READ
4963                 * FIXME: call the correct reference counting function
4964                 */
4965                put_page(page);
4966        }
4967        kfree(STbp->mapped_pages);
4968        STbp->mapped_pages = NULL;
4969
4970        return 0;
4971}
4972