All queue_flag manipulations are performed under queue_lock (or eg. during
allocation-time where parallelism isn't a problem). So we can use non-atomic
bitops for these.

Index: linux-2.6/block/elevator.c
===================================================================
--- linux-2.6.orig/block/elevator.c
+++ linux-2.6/block/elevator.c
@@ -1032,7 +1032,7 @@ static int elevator_switch(struct reques
         */
        spin_lock_irq(q->queue_lock);
 
-       set_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
+       __set_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
 
        elv_drain_elevator(q);
 
@@ -1067,7 +1067,7 @@ static int elevator_switch(struct reques
         */
        elevator_exit(old_elevator);
        spin_lock_irq(q->queue_lock);
-       clear_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
+       __clear_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
        spin_unlock_irq(q->queue_lock);
 
        return 1;
@@ -1082,7 +1082,7 @@ fail_register:
        elv_register_queue(q);
 
        spin_lock_irq(q->queue_lock);
-       clear_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
+       __clear_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags);
        spin_unlock_irq(q->queue_lock);
 
        return 0;
Index: linux-2.6/block/ll_rw_blk.c
===================================================================
--- linux-2.6.orig/block/ll_rw_blk.c
+++ linux-2.6/block/ll_rw_blk.c
@@ -720,7 +720,7 @@ void blk_queue_stack_limits(struct reque
        t->max_segment_size = min(t->max_segment_size,b->max_segment_size);
        t->hardsect_size = max(t->hardsect_size,b->hardsect_size);
        if (!test_bit(QUEUE_FLAG_CLUSTER, &b->queue_flags))
-               clear_bit(QUEUE_FLAG_CLUSTER, &t->queue_flags);
+               __clear_bit(QUEUE_FLAG_CLUSTER, &t->queue_flags);
 }
 
 EXPORT_SYMBOL(blk_queue_stack_limits);
@@ -823,7 +823,7 @@ static void __blk_queue_free_tags(struct
        __blk_free_tags(bqt);
 
        q->queue_tags = NULL;
-       q->queue_flags &= ~(1 << QUEUE_FLAG_QUEUED);
+       __clear_bit(QUEUE_FLAG_QUEUED, &q->queue_flags);
 }
 
 
@@ -852,7 +852,7 @@ EXPORT_SYMBOL(blk_free_tags);
  **/
 void blk_queue_free_tags(struct request_queue *q)
 {
-       clear_bit(QUEUE_FLAG_QUEUED, &q->queue_flags);
+       __clear_bit(QUEUE_FLAG_QUEUED, &q->queue_flags);
 }
 
 EXPORT_SYMBOL(blk_queue_free_tags);
@@ -942,7 +942,7 @@ int blk_queue_init_tags(struct request_q
        } else if (q->queue_tags) {
                if ((rc = blk_queue_resize_tags(q, depth)))
                        return rc;
-               set_bit(QUEUE_FLAG_QUEUED, &q->queue_flags);
+               __set_bit(QUEUE_FLAG_QUEUED, &q->queue_flags);
                return 0;
        } else
                atomic_inc(&tags->refcnt);
@@ -951,7 +951,7 @@ int blk_queue_init_tags(struct request_q
         * assign it, all done
         */
        q->queue_tags = tags;
-       q->queue_flags |= (1 << QUEUE_FLAG_QUEUED);
+       __set_bit(QUEUE_FLAG_QUEUED, &q->queue_flags);
        INIT_LIST_HEAD(&q->tag_busy_list);
        return 0;
 fail:
@@ -1205,7 +1205,7 @@ static void blk_recalc_rq_segments(struc
        if (!rq->bio)
                return;
 
-       cluster = q->queue_flags & (1 << QUEUE_FLAG_CLUSTER);
+       cluster = test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
        hw_seg_size = seg_size = 0;
        phys_size = hw_size = nr_phys_segs = nr_hw_segs = 0;
        rq_for_each_segment(bv, rq, iter) {
@@ -1263,7 +1263,7 @@ new_hw_segment:
 static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio,
                                   struct bio *nxt)
 {
-       if (!(q->queue_flags & (1 << QUEUE_FLAG_CLUSTER)))
+       if (!test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags))
                return 0;
 
        if (!BIOVEC_PHYS_MERGEABLE(__BVEC_END(bio), __BVEC_START(nxt)))
@@ -1310,7 +1310,7 @@ int blk_rq_map_sg(struct request_queue *
        int nsegs, cluster;
 
        nsegs = 0;
-       cluster = q->queue_flags & (1 << QUEUE_FLAG_CLUSTER);
+       cluster = test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
 
        /*
         * for each bio in rq
@@ -1557,7 +1557,8 @@ void blk_plug_device(struct request_queu
        if (blk_queue_stopped(q))
                return;
 
-       if (!test_and_set_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags)) {
+       if (!test_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags)) {
+               __set_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags);
                mod_timer(&q->unplug_timer, jiffies + q->unplug_delay);
                blk_add_trace_generic(q, NULL, 0, BLK_TA_PLUG);
        }
@@ -1573,8 +1574,9 @@ int blk_remove_plug(struct request_queue
 {
        WARN_ON(!irqs_disabled());
 
-       if (!test_and_clear_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags))
+       if (!test_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags))
                return 0;
+       __clear_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags);
 
        del_timer(&q->unplug_timer);
        return 1;
@@ -1672,15 +1674,16 @@ void blk_start_queue(struct request_queu
 {
        WARN_ON(!irqs_disabled());
 
-       clear_bit(QUEUE_FLAG_STOPPED, &q->queue_flags);
+       __clear_bit(QUEUE_FLAG_STOPPED, &q->queue_flags);
 
        /*
         * one level of recursion is ok and is much faster than kicking
         * the unplug handling
         */
-       if (!test_and_set_bit(QUEUE_FLAG_REENTER, &q->queue_flags)) {
+       if (!test_bit(QUEUE_FLAG_REENTER, &q->queue_flags)) {
+               __set_bit(QUEUE_FLAG_REENTER, &q->queue_flags);
                q->request_fn(q);
-               clear_bit(QUEUE_FLAG_REENTER, &q->queue_flags);
+               __clear_bit(QUEUE_FLAG_REENTER, &q->queue_flags);
        } else {
                blk_plug_device(q);
                kblockd_schedule_work(&q->unplug_work);
@@ -1706,7 +1709,7 @@ EXPORT_SYMBOL(blk_start_queue);
 void blk_stop_queue(struct request_queue *q)
 {
        blk_remove_plug(q);
-       set_bit(QUEUE_FLAG_STOPPED, &q->queue_flags);
+       __set_bit(QUEUE_FLAG_STOPPED, &q->queue_flags);
 }
 EXPORT_SYMBOL(blk_stop_queue);
 
@@ -1744,9 +1747,10 @@ void __blk_run_queue(struct request_queu
         * handling reinvoke the handler shortly if we already got there.
         */
        if (!elv_queue_empty(q)) {
-               if (!test_and_set_bit(QUEUE_FLAG_REENTER, &q->queue_flags)) {
+               if (!test_bit(QUEUE_FLAG_REENTER, &q->queue_flags)) {
+                       __set_bit(QUEUE_FLAG_REENTER, &q->queue_flags);
                        q->request_fn(q);
-                       clear_bit(QUEUE_FLAG_REENTER, &q->queue_flags);
+                       __clear_bit(QUEUE_FLAG_REENTER, &q->queue_flags);
                } else {
                        blk_plug_device(q);
                        kblockd_schedule_work(&q->unplug_work);
@@ -1814,7 +1818,7 @@ void blk_cleanup_queue(struct request_qu
 {
        mutex_lock(&q->sysfs_lock);
        spin_lock_irq(q->queue_lock);
-       set_bit(QUEUE_FLAG_DEAD, &q->queue_flags);
+       __set_bit(QUEUE_FLAG_DEAD, &q->queue_flags);
        spin_unlock_irq(q->queue_lock);
        mutex_unlock(&q->sysfs_lock);
 
Index: linux-2.6/drivers/block/loop.c
===================================================================
--- linux-2.6.orig/drivers/block/loop.c
+++ linux-2.6/drivers/block/loop.c
@@ -545,7 +545,7 @@ static void loop_unplug(struct request_q
        struct loop_device *lo = q->queuedata;
 
        spin_lock_irqsave(q->queue_lock, flags);
-       clear_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags);
+       __clear_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags);
        spin_unlock_irqrestore(q->queue_lock, flags);
        blk_run_address_space(lo->lo_backing_file->f_mapping);
 }
Index: linux-2.6/drivers/block/ub.c
===================================================================
--- linux-2.6.orig/drivers/block/ub.c
+++ linux-2.6/drivers/block/ub.c
@@ -2402,7 +2402,7 @@ static void ub_disconnect(struct usb_int
                del_gendisk(lun->disk);
                /*
                 * I wish I could do:
-                *    set_bit(QUEUE_FLAG_DEAD, &q->queue_flags);
+                *    __set_bit(QUEUE_FLAG_DEAD, &q->queue_flags);
                 * As it is, we rely on our internal poisoning and let
                 * the upper levels to spin furiously failing all the I/O.
                 */
Index: linux-2.6/drivers/md/dm-table.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-table.c
+++ linux-2.6/drivers/md/dm-table.c
@@ -899,9 +899,9 @@ void dm_table_set_restrictions(struct dm
        q->seg_boundary_mask = t->limits.seg_boundary_mask;
        q->bounce_pfn = t->limits.bounce_pfn;
        if (t->limits.no_cluster)
-               q->queue_flags &= ~(1 << QUEUE_FLAG_CLUSTER);
+               __clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
        else
-               q->queue_flags |= (1 << QUEUE_FLAG_CLUSTER);
+               __set_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
 
 }
 
Index: linux-2.6/drivers/md/md.c
===================================================================
--- linux-2.6.orig/drivers/md/md.c
+++ linux-2.6/drivers/md/md.c
@@ -281,7 +281,7 @@ static mddev_t * mddev_find(dev_t unit)
                kfree(new);
                return NULL;
        }
-       set_bit(QUEUE_FLAG_CLUSTER, &new->queue->queue_flags);
+       __set_bit(QUEUE_FLAG_CLUSTER, &new->queue->queue_flags);
 
        blk_queue_make_request(new->queue, md_fail_request);
 
Index: linux-2.6/drivers/scsi/scsi_lib.c
===================================================================
--- linux-2.6.orig/drivers/scsi/scsi_lib.c
+++ linux-2.6/drivers/scsi/scsi_lib.c
@@ -552,11 +552,14 @@ static void scsi_run_queue(struct reques
 
                spin_lock(sdev->request_queue->queue_lock);
                flagset = test_bit(QUEUE_FLAG_REENTER, &q->queue_flags) &&
-                               !test_and_set_bit(QUEUE_FLAG_REENTER,
+                               !test_bit(QUEUE_FLAG_REENTER,
+                                       &sdev->request_queue->queue_flags);
+               if (flagset)
+                       __set_bit(QUEUE_FLAG_REENTER,
                                        &sdev->request_queue->queue_flags);
                __blk_run_queue(sdev->request_queue);
                if (flagset)
-                       clear_bit(QUEUE_FLAG_REENTER,
+                       __clear_bit(QUEUE_FLAG_REENTER,
                                        &sdev->request_queue->queue_flags);
                spin_unlock(sdev->request_queue->queue_lock);
 
@@ -1677,7 +1680,7 @@ struct request_queue *__scsi_alloc_queue
        blk_queue_segment_boundary(q, shost->dma_boundary);
 
        if (!shost->use_clustering)
-               clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
+               __clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
        return q;
 }
 EXPORT_SYMBOL(__scsi_alloc_queue);
Index: linux-2.6/drivers/scsi/scsi_transport_sas.c
===================================================================
--- linux-2.6.orig/drivers/scsi/scsi_transport_sas.c
+++ linux-2.6/drivers/scsi/scsi_transport_sas.c
@@ -234,7 +234,7 @@ static int sas_bsg_initialize(struct Scs
        else
                q->queuedata = shost;
 
-       set_bit(QUEUE_FLAG_BIDI, &q->queue_flags);
+       __set_bit(QUEUE_FLAG_BIDI, &q->queue_flags);
 
        return 0;
 }
Index: linux-2.6/include/linux/blkdev.h
===================================================================
--- linux-2.6.orig/include/linux/blkdev.h
+++ linux-2.6/include/linux/blkdev.h
@@ -560,17 +560,17 @@ static inline int blk_queue_full(struct 
 static inline void blk_set_queue_full(struct request_queue *q, int rw)
 {
        if (rw == READ)
-               set_bit(QUEUE_FLAG_READFULL, &q->queue_flags);
+               __set_bit(QUEUE_FLAG_READFULL, &q->queue_flags);
        else
-               set_bit(QUEUE_FLAG_WRITEFULL, &q->queue_flags);
+               __set_bit(QUEUE_FLAG_WRITEFULL, &q->queue_flags);
 }
 
 static inline void blk_clear_queue_full(struct request_queue *q, int rw)
 {
        if (rw == READ)
-               clear_bit(QUEUE_FLAG_READFULL, &q->queue_flags);
+               __clear_bit(QUEUE_FLAG_READFULL, &q->queue_flags);
        else
-               clear_bit(QUEUE_FLAG_WRITEFULL, &q->queue_flags);
+               __clear_bit(QUEUE_FLAG_WRITEFULL, &q->queue_flags);
 }
 
 
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to