···23992399 del_gendisk(lun->disk);24002400 /*24012401 * I wish I could do:24022402- * set_bit(QUEUE_FLAG_DEAD, &q->queue_flags);24022402+ * queue_flag_set(QUEUE_FLAG_DEAD, q);24032403 * As it is, we rely on our internal poisoning and let24042404 * the upper levels to spin furiously failing all the I/O.24052405 */
+5-2
drivers/md/dm-table.c
···873873 q->max_hw_sectors = t->limits.max_hw_sectors;874874 q->seg_boundary_mask = t->limits.seg_boundary_mask;875875 q->bounce_pfn = t->limits.bounce_pfn;876876+ /* XXX: the below will probably go bug. must ensure there can be no877877+ * concurrency on queue_flags, and use the unlocked versions...878878+ */876879 if (t->limits.no_cluster)877877- q->queue_flags &= ~(1 << QUEUE_FLAG_CLUSTER);880880+ queue_flag_clear(QUEUE_FLAG_CLUSTER, q);878881 else879879- q->queue_flags |= (1 << QUEUE_FLAG_CLUSTER);882882+ queue_flag_set(QUEUE_FLAG_CLUSTER, q);880883881884}882885
+2-1
drivers/md/md.c
···282282 kfree(new);283283 return NULL;284284 }285285- set_bit(QUEUE_FLAG_CLUSTER, &new->queue->queue_flags);285285+ /* Can be unlocked because the queue is new: no concurrency */286286+ queue_flag_set_unlocked(QUEUE_FLAG_CLUSTER, new->queue);286287287288 blk_queue_make_request(new->queue, md_fail_request);288289
···536536 !shost->host_blocked && !shost->host_self_blocked &&537537 !((shost->can_queue > 0) &&538538 (shost->host_busy >= shost->can_queue))) {539539+540540+ int flagset;541541+539542 /*540543 * As long as shost is accepting commands and we have541544 * starved queues, call blk_run_queue. scsi_request_fn···552549 sdev = list_entry(shost->starved_list.next,553550 struct scsi_device, starved_entry);554551 list_del_init(&sdev->starved_entry);555555- spin_unlock_irqrestore(shost->host_lock, flags);552552+ spin_unlock(shost->host_lock);556553554554+ spin_lock(sdev->request_queue->queue_lock);555555+ flagset = test_bit(QUEUE_FLAG_REENTER, &q->queue_flags) &&556556+ !test_bit(QUEUE_FLAG_REENTER,557557+ &sdev->request_queue->queue_flags);558558+ if (flagset)559559+ queue_flag_set(QUEUE_FLAG_REENTER, sdev->request_queue);560560+ __blk_run_queue(sdev->request_queue);561561+ if (flagset)562562+ queue_flag_clear(QUEUE_FLAG_REENTER, sdev->request_queue);563563+ spin_unlock(sdev->request_queue->queue_lock);557564558558- if (test_bit(QUEUE_FLAG_REENTER, &q->queue_flags) &&559559- !test_and_set_bit(QUEUE_FLAG_REENTER,560560- &sdev->request_queue->queue_flags)) {561561- blk_run_queue(sdev->request_queue);562562- clear_bit(QUEUE_FLAG_REENTER,563563- &sdev->request_queue->queue_flags);564564- } else565565- blk_run_queue(sdev->request_queue);566566-567567- spin_lock_irqsave(shost->host_lock, flags);565565+ spin_lock(shost->host_lock);568566 if (unlikely(!list_empty(&sdev->starved_entry)))569567 /*570568 * sdev lost a race, and was put back on the···1589158515901586 blk_queue_max_segment_size(q, dma_get_max_seg_size(dev));1591158715881588+ /* New queue, no concurrency on queue_flags */15921589 if (!shost->use_clustering)15931593- clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);15901590+ queue_flag_clear_unlocked(QUEUE_FLAG_CLUSTER, q);1594159115951592 /*15961593 * set a reasonable default alignment on word boundaries: the