*/
        blk_queue_bounce(q, &bio);
 
+       if (bio_integrity_enabled(bio) && bio_integrity_prep(bio)) {
+               bio_endio(bio, -EIO);
+               return;
+       }
+
        if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) {
                spin_lock_irq(q->queue_lock);
                where = ELEVATOR_INSERT_FLUSH;
         */
        blk_partition_remap(bio);
 
-       if (bio_integrity_enabled(bio) && bio_integrity_prep(bio))
-               goto end_io;
-
        if (bio_check_eod(bio, nr_sectors))
                goto end_io;
 
 
        def_bool y
        depends on BLOCK && MMU && (ZONE_DMA || HIGHMEM)
 
+# On the 'tile' arch, USB OHCI needs the bounce pool since tilegx will often
+# have more than 4GB of memory, but we don't currently use the IOTLB to present
+# a 32-bit address to OHCI.  So we need to use a bounce pool instead.
+#
+# We also use the bounce pool to provide stable page writes for jbd.  jbd
+# initiates buffer writeback without locking the page or setting PG_writeback,
+# and fixing that behavior (a second time; jbd2 doesn't have this problem) is
+# a major rework effort.  Instead, use the bounce buffer to snapshot pages
+# (until jbd goes away).  The only jbd user is ext3.
+config NEED_BOUNCE_POOL
+       bool
+       default y if (TILE && USB_OHCI_HCD) || (BLK_DEV_INTEGRITY && JBD)
+
 config NR_QUICK
        int
        depends on QUICKLIST
 
        __bounce_end_io_read(bio, isa_page_pool, err);
 }
 
+#ifdef CONFIG_NEED_BOUNCE_POOL
+static int must_snapshot_stable_pages(struct request_queue *q, struct bio *bio)
+{
+       struct page *page;
+       struct backing_dev_info *bdi;
+       struct address_space *mapping;
+       struct bio_vec *from;
+       int i;
+
+       if (bio_data_dir(bio) != WRITE)
+               return 0;
+
+       if (!bdi_cap_stable_pages_required(&q->backing_dev_info))
+               return 0;
+
+       /*
+        * Based on the first page that has a valid mapping, decide whether or
+        * not we have to employ bounce buffering to guarantee stable pages.
+        */
+       bio_for_each_segment(from, bio, i) {
+               page = from->bv_page;
+               mapping = page_mapping(page);
+               if (!mapping)
+                       continue;
+               bdi = mapping->backing_dev_info;
+               return mapping->host->i_sb->s_flags & MS_SNAP_STABLE;
+       }
+
+       return 0;
+}
+#else
+static int must_snapshot_stable_pages(struct request_queue *q, struct bio *bio)
+{
+       return 0;
+}
+#endif /* CONFIG_NEED_BOUNCE_POOL */
+
 static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
-                              mempool_t *pool)
+                              mempool_t *pool, int force)
 {
        struct page *page;
        struct bio *bio = NULL;
                /*
                 * is destination page below bounce pfn?
                 */
-               if (page_to_pfn(page) <= queue_bounce_pfn(q))
+               if (page_to_pfn(page) <= queue_bounce_pfn(q) && !force)
                        continue;
 
                /*
 
 void blk_queue_bounce(struct request_queue *q, struct bio **bio_orig)
 {
+       int must_bounce;
        mempool_t *pool;
 
        /*
        if (!bio_has_data(*bio_orig))
                return;
 
+       must_bounce = must_snapshot_stable_pages(q, *bio_orig);
+
        /*
         * for non-isa bounce case, just check if the bounce pfn is equal
         * to or bigger than the highest pfn in the system -- in that case,
         * don't waste time iterating over bio segments
         */
        if (!(q->bounce_gfp & GFP_DMA)) {
-               if (queue_bounce_pfn(q) >= blk_max_pfn)
+               if (queue_bounce_pfn(q) >= blk_max_pfn && !must_bounce)
                        return;
                pool = page_pool;
        } else {
        /*
         * slow path
         */
-       __blk_queue_bounce(q, bio_orig, pool);
+       __blk_queue_bounce(q, bio_orig, pool, must_bounce);
 }
 
 EXPORT_SYMBOL(blk_queue_bounce);