Merge branch 'linus'
authorJames Bottomley <jejb@mulgrave.il.steeleye.com>
Sat, 10 Feb 2007 19:45:43 +0000 (13:45 -0600)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Sat, 10 Feb 2007 19:45:43 +0000 (13:45 -0600)
Conflicts:

drivers/scsi/ipr.c

Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
1  2 
drivers/s390/scsi/zfcp_erp.c
drivers/s390/scsi/zfcp_ext.h
drivers/s390/scsi/zfcp_fsf.c
drivers/scsi/scsi_scan.c
drivers/scsi/st.c

@@@ -200,7 -200,7 +200,7 @@@ void zfcp_fsf_start_timer(struct zfcp_f
   * returns:   0       - initiated action successfully
   *            <0      - failed to initiate action
   */
- int
static int
  zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, int clear_mask)
  {
        int retval;
@@@ -295,7 -295,7 +295,7 @@@ zfcp_erp_unit_shutdown(struct zfcp_uni
   * zfcp_erp_adisc - send ADISC ELS command
   * @port: port structure
   */
- int
static int
  zfcp_erp_adisc(struct zfcp_port *port)
  {
        struct zfcp_adapter *adapter = port->adapter;
   *
   * If ADISC failed (LS_RJT or timed out) forced reopen of the port is triggered.
   */
- void
static void
  zfcp_erp_adisc_handler(unsigned long data)
  {
        struct zfcp_send_els *send_els;
@@@ -838,28 -838,32 +838,28 @@@ zfcp_erp_action_exists(struct zfcp_erp_
   *            and does appropriate preparations (dismiss fsf request, ...)
   *
   * locks:     called under erp_lock (disabled interrupts)
 - *
 - * returns:   0
   */
 -static int
 +static void
  zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action)
  {
 -      int retval = 0;
 -      struct zfcp_fsf_req *fsf_req = NULL;
        struct zfcp_adapter *adapter = erp_action->adapter;
  
        if (erp_action->fsf_req) {
                /* take lock to ensure that request is not deleted meanwhile */
                spin_lock(&adapter->req_list_lock);
 -              if ((!zfcp_reqlist_ismember(adapter,
 -                                          erp_action->fsf_req->req_id)) &&
 -                  (fsf_req->erp_action == erp_action)) {
 +              if (zfcp_reqlist_ismember(adapter,
 +                                          erp_action->fsf_req->req_id)) {
                        /* fsf_req still exists */
                        debug_text_event(adapter->erp_dbf, 3, "a_ca_req");
 -                      debug_event(adapter->erp_dbf, 3, &fsf_req,
 +                      debug_event(adapter->erp_dbf, 3, &erp_action->fsf_req,
                                    sizeof (unsigned long));
                        /* dismiss fsf_req of timed out/dismissed erp_action */
                        if (erp_action->status & (ZFCP_STATUS_ERP_DISMISSED |
                                                  ZFCP_STATUS_ERP_TIMEDOUT)) {
                                debug_text_event(adapter->erp_dbf, 3,
                                                 "a_ca_disreq");
 -                              fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED;
 +                              erp_action->fsf_req->status |=
 +                                      ZFCP_STATUS_FSFREQ_DISMISSED;
                        }
                        if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) {
                                ZFCP_LOG_NORMAL("error: erp step timed out "
                         * then keep it running asynchronously and don't mess
                         * with the association of erp_action and fsf_req.
                         */
 -                      if (fsf_req->status & (ZFCP_STATUS_FSFREQ_COMPLETED |
 +                      if (erp_action->fsf_req->status &
 +                                      (ZFCP_STATUS_FSFREQ_COMPLETED |
                                               ZFCP_STATUS_FSFREQ_DISMISSED)) {
                                /* forget about association between fsf_req
                                   and erp_action */
 -                              fsf_req->erp_action = NULL;
                                erp_action->fsf_req = NULL;
                        }
                } else {
                spin_unlock(&adapter->req_list_lock);
        } else
                debug_text_event(adapter->erp_dbf, 3, "a_ca_noreq");
 -
 -      return retval;
  }
  
  /**
@@@ -3135,7 -3141,6 +3135,6 @@@ zfcp_erp_action_cleanup(int action, str
                break;
        case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
                if (result != ZFCP_ERP_SUCCEEDED) {
-                       struct zfcp_port *port;
                        list_for_each_entry(port, &adapter->port_list_head, list)
                                if (port->rport &&
                                    !atomic_test_mask(ZFCP_STATUS_PORT_WKA,
@@@ -89,7 -89,7 +89,7 @@@ extern int  zfcp_fsf_control_file(struc
                                  u32, u32, struct zfcp_sg_list *);
  extern void zfcp_fsf_start_timer(struct zfcp_fsf_req *, unsigned long);
  extern void zfcp_erp_start_timer(struct zfcp_fsf_req *);
 -extern int  zfcp_fsf_req_dismiss_all(struct zfcp_adapter *);
 +extern void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *);
  extern int  zfcp_fsf_status_read(struct zfcp_adapter *, int);
  extern int zfcp_fsf_req_create(struct zfcp_adapter *, u32, int, mempool_t *,
                               unsigned long *, struct zfcp_fsf_req **);
@@@ -119,8 -119,8 +119,8 @@@ extern int  zfcp_adapter_scsi_register(
  extern void zfcp_adapter_scsi_unregister(struct zfcp_adapter *);
  extern void zfcp_set_fcp_dl(struct fcp_cmnd_iu *, fcp_dl_t);
  extern char *zfcp_get_fcp_rsp_info_ptr(struct fcp_rsp_iu *);
- extern void set_host_byte(u32 *, char);
- extern void set_driver_byte(u32 *, char);
+ extern void set_host_byte(int *, char);
+ extern void set_driver_byte(int *, char);
  extern char *zfcp_get_fcp_sns_info_ptr(struct fcp_rsp_iu *);
  extern fcp_dl_t zfcp_get_fcp_dl(struct fcp_cmnd_iu *);
  
@@@ -176,25 -176,28 +176,25 @@@ static void zfcp_fsf_req_dismiss(struc
  /**
   * zfcp_fsf_req_dismiss_all - dismiss all remaining fsf requests
   */
 -int zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter)
 +void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter)
  {
        struct zfcp_fsf_req *request, *tmp;
        unsigned long flags;
 +      LIST_HEAD(remove_queue);
        unsigned int i, counter;
  
        spin_lock_irqsave(&adapter->req_list_lock, flags);
        atomic_set(&adapter->reqs_active, 0);
 -      for (i=0; i<REQUEST_LIST_SIZE; i++) {
 -              if (list_empty(&adapter->req_list[i]))
 -                      continue;
 -
 -              counter = 0;
 -              list_for_each_entry_safe(request, tmp,
 -                                       &adapter->req_list[i], list) {
 -                      zfcp_fsf_req_dismiss(adapter, request, counter);
 -                      counter++;
 -              }
 -      }
 +      for (i=0; i<REQUEST_LIST_SIZE; i++)
 +              list_splice_init(&adapter->req_list[i], &remove_queue);
 +
        spin_unlock_irqrestore(&adapter->req_list_lock, flags);
  
 -      return 0;
 +      counter = 0;
 +      list_for_each_entry_safe(request, tmp, &remove_queue, list) {
 +              zfcp_fsf_req_dismiss(adapter, request, counter);
 +              counter++;
 +      }
  }
  
  /*
@@@ -4560,7 -4563,7 +4560,7 @@@ zfcp_fsf_req_sbal_check(unsigned long *
  /*
   * set qtcb pointer in fsf_req and initialize QTCB
   */
- static inline void
+ static void
  zfcp_fsf_req_qtcb_init(struct zfcp_fsf_req *fsf_req)
  {
        if (likely(fsf_req->qtcb != NULL)) {
diff --combined drivers/scsi/scsi_scan.c
@@@ -1029,7 -1029,7 +1029,7 @@@ static int scsi_probe_and_add_lun(struc
  
                                sdev_printk(KERN_INFO, sdev,
                                        "scsi scan: consider passing scsi_mod."
 -                                      "dev_flags=%s:%s:0x240 or 0x800240\n",
 +                                      "dev_flags=%s:%s:0x240 or 0x1000240\n",
                                        scsi_inq_str(vend, result, 8, 16),
                                        scsi_inq_str(mod, result, 16, 32));
                        });
@@@ -1453,6 -1453,12 +1453,12 @@@ struct scsi_device *__scsi_add_device(s
        struct device *parent = &shost->shost_gendev;
        struct scsi_target *starget;
  
+       if (strncmp(scsi_scan_type, "none", 4) == 0)
+               return ERR_PTR(-ENODEV);
+       if (!shost->async_scan)
+               scsi_complete_async_scans();
        starget = scsi_alloc_target(parent, channel, id);
        if (!starget)
                return ERR_PTR(-ENOMEM);
diff --combined drivers/scsi/st.c
@@@ -9,7 -9,7 +9,7 @@@
     Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky,
     Michael Schaefer, J"org Weule, and Eric Youngdale.
  
 -   Copyright 1992 - 2006 Kai Makisara
 +   Copyright 1992 - 2007 Kai Makisara
     email Kai.Makisara@kolumbus.fi
  
     Some small formal changes - aeb, 950809
@@@ -17,7 -17,7 +17,7 @@@
     Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
   */
  
 -static const char *verstr = "20061107";
 +static const char *verstr = "20070203";
  
  #include <linux/module.h>
  
@@@ -1168,7 -1168,6 +1168,7 @@@ static int st_open(struct inode *inode
                STps = &(STp->ps[i]);
                STps->rw = ST_IDLE;
        }
 +      STp->try_dio_now = STp->try_dio;
        STp->recover_count = 0;
        DEB( STp->nbr_waits = STp->nbr_finished = 0;
             STp->nbr_requests = STp->nbr_dio = STp->nbr_pages = STp->nbr_combinable = 0; )
@@@ -1401,9 -1400,9 +1401,9 @@@ static int setup_buffering(struct scsi_
        struct st_buffer *STbp = STp->buffer;
  
        if (is_read)
 -              i = STp->try_dio && try_rdio;
 +              i = STp->try_dio_now && try_rdio;
        else
 -              i = STp->try_dio && try_wdio;
 +              i = STp->try_dio_now && try_wdio;
  
        if (i && ((unsigned long)buf & queue_dma_alignment(
                                        STp->device->request_queue)) == 0) {
@@@ -1600,7 -1599,7 +1600,7 @@@ st_write(struct file *filp, const char 
                        STm->do_async_writes && STps->eof < ST_EOM_OK;
  
                if (STp->block_size != 0 && STm->do_buffer_writes &&
 -                  !(STp->try_dio && try_wdio) && STps->eof < ST_EOM_OK &&
 +                  !(STp->try_dio_now && try_wdio) && STps->eof < ST_EOM_OK &&
                    STbp->buffer_bytes < STbp->buffer_size) {
                        STp->dirty = 1;
                        /* Don't write a buffer that is not full enough. */
@@@ -1770,7 -1769,7 +1770,7 @@@ static long read_tape(struct scsi_tape 
        if (STp->block_size == 0)
                blks = bytes = count;
        else {
 -              if (!(STp->try_dio && try_rdio) && STm->do_read_ahead) {
 +              if (!(STp->try_dio_now && try_rdio) && STm->do_read_ahead) {
                        blks = (STp->buffer)->buffer_blocks;
                        bytes = blks * STp->block_size;
                } else {
@@@ -1949,12 -1948,10 +1949,12 @@@ st_read(struct file *filp, char __user 
                goto out;
  
        STm = &(STp->modes[STp->current_mode]);
 -      if (!(STm->do_read_ahead) && STp->block_size != 0 &&
 -          (count % STp->block_size) != 0) {
 -              retval = (-EINVAL);     /* Read must be integral number of blocks */
 -              goto out;
 +      if (STp->block_size != 0 && (count % STp->block_size) != 0) {
 +              if (!STm->do_read_ahead) {
 +                      retval = (-EINVAL);     /* Read must be integral number of blocks */
 +                      goto out;
 +              }
 +              STp->try_dio_now = 0;  /* Direct i/o can't handle split blocks */
        }
  
        STps = &(STp->ps[STp->partition]);
@@@ -2819,15 -2816,18 +2819,18 @@@ static int st_int_ioctl(struct scsi_tap
  
                if (cmd_in == MTWEOF &&
                    cmdstatp->have_sense &&
-                   (cmdstatp->flags & SENSE_EOM) &&
-                   (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
-                    cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) &&
-                   undone == 0) {
-                       ioctl_result = 0;       /* EOF written successfully at EOM */
-                       if (fileno >= 0)
-                               fileno++;
+                   (cmdstatp->flags & SENSE_EOM)) {
+                       if (cmdstatp->sense_hdr.sense_key == NO_SENSE ||
+                           cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) {
+                               ioctl_result = 0;       /* EOF(s) written successfully at EOM */
+                               STps->eof = ST_NOEOF;
+                       } else {  /* Writing EOF(s) failed */
+                               if (fileno >= 0)
+                                       fileno -= undone;
+                               if (undone < arg)
+                                       STps->eof = ST_NOEOF;
+                       }
                        STps->drv_file = fileno;
-                       STps->eof = ST_NOEOF;
                } else if ((cmd_in == MTFSF) || (cmd_in == MTFSFM)) {
                        if (fileno >= 0)
                                STps->drv_file = fileno - undone;