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