Merge branch 'for-2.6.31' of git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Jun 2009 17:00:03 +0000 (10:00 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Jun 2009 17:00:03 +0000 (10:00 -0700)
* 'for-2.6.31' of git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6: (28 commits)
  ide-tape: fix debug call
  alim15x3: Remove historical hacks, re-enable init_hwif for PowerPC
  ide-dma: don't reset request fields on dma_timeout_retry()
  ide: drop rq->data handling from ide_map_sg()
  ide-atapi: kill unused fields and callbacks
  ide-tape: simplify read/write functions
  ide-tape: use byte size instead of sectors on rw issue functions
  ide-tape: unify r/w init paths
  ide-tape: kill idetape_bh
  ide-tape: use standard data transfer mechanism
  ide-tape: use single continuous buffer
  ide-atapi,tape,floppy: allow ->pc_callback() to change rq->data_len
  ide-tape,floppy: fix failed command completion after request sense
  ide-pm: don't abuse rq->data
  ide-cd,atapi: use bio for internal commands
  ide-atapi: convert ide-{floppy,tape} to using preallocated sense buffer
  ide-cd: convert to using generic sense request
  ide: add helpers for preparing sense requests
  ide-cd: don't abuse rq->buffer
  ide-atapi: don't abuse rq->buffer
  ...

1  2 
block/blk-core.c
drivers/ide/ide-io.c
include/linux/ide.h

diff --combined block/blk-core.c
  #include <linux/task_io_accounting_ops.h>
  #include <linux/blktrace_api.h>
  #include <linux/fault-inject.h>
 -#include <trace/block.h>
 +
 +#define CREATE_TRACE_POINTS
 +#include <trace/events/block.h>
  
  #include "blk.h"
  
 -DEFINE_TRACE(block_plug);
 -DEFINE_TRACE(block_unplug_io);
 -DEFINE_TRACE(block_unplug_timer);
 -DEFINE_TRACE(block_getrq);
 -DEFINE_TRACE(block_sleeprq);
 -DEFINE_TRACE(block_rq_requeue);
 -DEFINE_TRACE(block_bio_backmerge);
 -DEFINE_TRACE(block_bio_frontmerge);
 -DEFINE_TRACE(block_bio_queue);
 -DEFINE_TRACE(block_rq_complete);
 -DEFINE_TRACE(block_remap);    /* Also used in drivers/md/dm.c */
  EXPORT_TRACEPOINT_SYMBOL_GPL(block_remap);
 +EXPORT_TRACEPOINT_SYMBOL_GPL(block_bio_complete);
  
  static int __make_request(struct request_queue *q, struct bio *bio);
  
@@@ -635,7 -643,7 +635,7 @@@ static inline void blk_free_request(str
  }
  
  static struct request *
 -blk_alloc_request(struct request_queue *q, int rw, int priv, gfp_t gfp_mask)
 +blk_alloc_request(struct request_queue *q, int flags, int priv, gfp_t gfp_mask)
  {
        struct request *rq = mempool_alloc(q->rq.rq_pool, gfp_mask);
  
  
        blk_rq_init(q, rq);
  
 -      rq->cmd_flags = rw | REQ_ALLOCED;
 +      rq->cmd_flags = flags | REQ_ALLOCED;
  
        if (priv) {
                if (unlikely(elv_set_request(q, rq, gfp_mask))) {
@@@ -784,8 -792,6 +784,8 @@@ static struct request *get_request(stru
        if (priv)
                rl->elvpriv++;
  
 +      if (blk_queue_io_stat(q))
 +              rw_flags |= REQ_IO_STAT;
        spin_unlock_irq(q->queue_lock);
  
        rq = blk_alloc_request(q, rw_flags, priv, gfp_mask);
@@@ -1269,7 -1275,7 +1269,7 @@@ static inline void blk_partition_remap(
                bio->bi_bdev = bdev->bd_contains;
  
                trace_block_remap(bdev_get_queue(bio->bi_bdev), bio,
 -                                  bdev->bd_dev, bio->bi_sector,
 +                                  bdev->bd_dev,
                                    bio->bi_sector - p->start_sect);
        }
  }
@@@ -1438,7 -1444,8 +1438,7 @@@ static inline void __generic_make_reque
                        goto end_io;
  
                if (old_sector != -1)
 -                      trace_block_remap(q, bio, old_dev, bio->bi_sector,
 -                                          old_sector);
 +                      trace_block_remap(q, bio, old_dev, old_sector);
  
                trace_block_bio_queue(q, bio);
  
@@@ -1732,10 -1739,14 +1732,14 @@@ static int __end_that_request_first(str
        trace_block_rq_complete(req->q, req);
  
        /*
-        * for a REQ_TYPE_BLOCK_PC request, we want to carry any eventual
-        * sense key with us all the way through
+        * For fs requests, rq is just carrier of independent bio's
+        * and each partial completion should be handled separately.
+        * Reset per-request error on each partial completion.
+        *
+        * TODO: tj: This is too subtle.  It would be better to let
+        * low level drivers do what they see fit.
         */
-       if (!blk_pc_request(req))
+       if (blk_fs_request(req))
                req->errors = 0;
  
        if (error && (blk_fs_request(req) && !(req->cmd_flags & REQ_QUIET))) {
                } else {
                        int idx = bio->bi_idx + next_idx;
  
 -                      if (unlikely(bio->bi_idx >= bio->bi_vcnt)) {
 +                      if (unlikely(idx >= bio->bi_vcnt)) {
                                blk_dump_rq_flags(req, "__end_that");
                                printk(KERN_ERR "%s: bio idx %d >= vcnt %d\n",
 -                                     __func__, bio->bi_idx, bio->bi_vcnt);
 +                                     __func__, idx, bio->bi_vcnt);
                                break;
                        }
  
diff --combined drivers/ide/ide-io.c
@@@ -248,14 -248,7 +248,7 @@@ void ide_map_sg(ide_drive_t *drive, str
        struct scatterlist *sg = hwif->sg_table;
        struct request *rq = cmd->rq;
  
-       if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
-               sg_init_one(sg, rq->buffer, rq->nr_sectors * SECTOR_SIZE);
-               cmd->sg_nents = 1;
-       } else if (!rq->bio) {
-               sg_init_one(sg, rq->data, rq->data_len);
-               cmd->sg_nents = 1;
-       } else
-               cmd->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
+       cmd->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
  }
  EXPORT_SYMBOL_GPL(ide_map_sg);
  
@@@ -371,7 -364,7 +364,7 @@@ static ide_startstop_t start_request (i
                if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE)
                        return execute_drive_cmd(drive, rq);
                else if (blk_pm_request(rq)) {
-                       struct request_pm_state *pm = rq->data;
+                       struct request_pm_state *pm = rq->special;
  #ifdef DEBUG_PM
                        printk("%s: start_power_step(step: %d)\n",
                                drive->name, pm->pm_step);
@@@ -484,6 -477,9 +477,9 @@@ void do_ide_request(struct request_queu
  
        spin_unlock_irq(q->queue_lock);
  
+       /* HLD do_request() callback might sleep, make sure it's okay */
+       might_sleep();
        if (ide_lock_host(host, hwif))
                goto plug_device_2;
  
@@@ -696,7 -692,7 +692,7 @@@ void ide_timer_expiry (unsigned long da
                }
                spin_lock_irq(&hwif->lock);
                enable_irq(hwif->irq);
 -              if (startstop == ide_stopped) {
 +              if (startstop == ide_stopped && hwif->polling == 0) {
                        ide_unlock_port(hwif);
                        plug_device = 1;
                }
@@@ -868,7 -864,7 +864,7 @@@ irqreturn_t ide_intr (int irq, void *de
         * same irq as is currently being serviced here, and Linux
         * won't allow another of the same (on any CPU) until we return.
         */
 -      if (startstop == ide_stopped) {
 +      if (startstop == ide_stopped && hwif->polling == 0) {
                BUG_ON(hwif->handler);
                ide_unlock_port(hwif);
                plug_device = 1;
diff --combined include/linux/ide.h
@@@ -26,6 -26,9 +26,9 @@@
  #include <asm/io.h>
  #include <asm/mutex.h>
  
+ /* for request_sense */
+ #include <linux/cdrom.h>
  #if defined(CONFIG_CRIS) || defined(CONFIG_FRV) || defined(CONFIG_MN10300)
  # define SUPPORT_VLB_SYNC 0
  #else
@@@ -324,7 -327,6 +327,6 @@@ struct ide_cmd 
        unsigned int            cursg_ofs;
  
        struct request          *rq;            /* copy of request */
-       void                    *special;       /* valid_t generally */
  };
  
  /* ATAPI packet command flags */
@@@ -360,11 -362,7 +362,7 @@@ struct ide_atapi_pc 
  
        /* data buffer */
        u8 *buf;
-       /* current buffer position */
-       u8 *cur_pos;
        int buf_size;
-       /* missing/available data on the current buffer */
-       int b_count;
  
        /* the corresponding request */
        struct request *rq;
         */
        u8 pc_buf[IDE_PC_BUFFER_SIZE];
  
-       /* idetape only */
-       struct idetape_bh *bh;
-       char *b_data;
        unsigned long timeout;
  };
  
@@@ -593,16 -587,16 +587,16 @@@ struct ide_drive_s 
        /* callback for packet commands */
        int  (*pc_callback)(struct ide_drive_s *, int);
  
-       void (*pc_update_buffers)(struct ide_drive_s *, struct ide_atapi_pc *);
-       int  (*pc_io_buffers)(struct ide_drive_s *, struct ide_atapi_pc *,
-                             unsigned int, int);
        ide_startstop_t (*irq_handler)(struct ide_drive_s *);
  
        unsigned long atapi_flags;
  
        struct ide_atapi_pc request_sense_pc;
-       struct request request_sense_rq;
+       /* current sense rq and buffer */
+       bool sense_rq_armed;
+       struct request sense_rq;
+       struct request_sense sense_data;
  };
  
  typedef struct ide_drive_s ide_drive_t;
@@@ -1109,7 -1103,7 +1103,7 @@@ void ide_fix_driveid(u16 *)
  
  extern void ide_fixstring(u8 *, const int, const int);
  
 -int ide_busy_sleep(ide_hwif_t *, unsigned long, int);
 +int ide_busy_sleep(ide_drive_t *, unsigned long, int);
  
  int ide_wait_stat(ide_startstop_t *, ide_drive_t *, u8, u8, unsigned long);
  
@@@ -1174,7 -1168,10 +1168,10 @@@ int ide_do_test_unit_ready(ide_drive_t 
  int ide_do_start_stop(ide_drive_t *, struct gendisk *, int);
  int ide_set_media_lock(ide_drive_t *, struct gendisk *, int);
  void ide_create_request_sense_cmd(ide_drive_t *, struct ide_atapi_pc *);
- void ide_retry_pc(ide_drive_t *, struct gendisk *);
+ void ide_retry_pc(ide_drive_t *drive);
+ void ide_prep_sense(ide_drive_t *drive, struct request *rq);
+ int ide_queue_sense_rq(ide_drive_t *drive, void *special);
  
  int ide_cd_expiry(ide_drive_t *);