Skip to content

Commit 8aa6382

Browse files
committed
Merge branch 'nvme-4.12' of git://git.infradead.org/nvme into for-linus
Christoph writes: "A couple of fixes for the next rc on the nvme front. Various FC fixes from James, controller removal fixes from Ming (including a block layer patch), a APST related device quirk from Andy, a RDMA fix for small queue depth device from Marta, as well as fixes for the lack of metadata support in non-PCIe drivers and the printk logging format from me."
2 parents a8ecdd7 + 50af47d commit 8aa6382

File tree

8 files changed

+130
-143
lines changed

8 files changed

+130
-143
lines changed

block/blk-mq.c

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -628,25 +628,6 @@ void blk_mq_delay_kick_requeue_list(struct request_queue *q,
628628
}
629629
EXPORT_SYMBOL(blk_mq_delay_kick_requeue_list);
630630

631-
void blk_mq_abort_requeue_list(struct request_queue *q)
632-
{
633-
unsigned long flags;
634-
LIST_HEAD(rq_list);
635-
636-
spin_lock_irqsave(&q->requeue_lock, flags);
637-
list_splice_init(&q->requeue_list, &rq_list);
638-
spin_unlock_irqrestore(&q->requeue_lock, flags);
639-
640-
while (!list_empty(&rq_list)) {
641-
struct request *rq;
642-
643-
rq = list_first_entry(&rq_list, struct request, queuelist);
644-
list_del_init(&rq->queuelist);
645-
blk_mq_end_request(rq, -EIO);
646-
}
647-
}
648-
EXPORT_SYMBOL(blk_mq_abort_requeue_list);
649-
650631
struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag)
651632
{
652633
if (tag < tags->nr_tags) {

drivers/nvme/host/core.c

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -925,6 +925,29 @@ static int nvme_getgeo(struct block_device *bdev, struct hd_geometry *geo)
925925
}
926926

927927
#ifdef CONFIG_BLK_DEV_INTEGRITY
928+
static void nvme_prep_integrity(struct gendisk *disk, struct nvme_id_ns *id,
929+
u16 bs)
930+
{
931+
struct nvme_ns *ns = disk->private_data;
932+
u16 old_ms = ns->ms;
933+
u8 pi_type = 0;
934+
935+
ns->ms = le16_to_cpu(id->lbaf[id->flbas & NVME_NS_FLBAS_LBA_MASK].ms);
936+
ns->ext = ns->ms && (id->flbas & NVME_NS_FLBAS_META_EXT);
937+
938+
/* PI implementation requires metadata equal t10 pi tuple size */
939+
if (ns->ms == sizeof(struct t10_pi_tuple))
940+
pi_type = id->dps & NVME_NS_DPS_PI_MASK;
941+
942+
if (blk_get_integrity(disk) &&
943+
(ns->pi_type != pi_type || ns->ms != old_ms ||
944+
bs != queue_logical_block_size(disk->queue) ||
945+
(ns->ms && ns->ext)))
946+
blk_integrity_unregister(disk);
947+
948+
ns->pi_type = pi_type;
949+
}
950+
928951
static void nvme_init_integrity(struct nvme_ns *ns)
929952
{
930953
struct blk_integrity integrity;
@@ -951,6 +974,10 @@ static void nvme_init_integrity(struct nvme_ns *ns)
951974
blk_queue_max_integrity_segments(ns->queue, 1);
952975
}
953976
#else
977+
static void nvme_prep_integrity(struct gendisk *disk, struct nvme_id_ns *id,
978+
u16 bs)
979+
{
980+
}
954981
static void nvme_init_integrity(struct nvme_ns *ns)
955982
{
956983
}
@@ -997,37 +1024,22 @@ static int nvme_revalidate_ns(struct nvme_ns *ns, struct nvme_id_ns **id)
9971024
static void __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id)
9981025
{
9991026
struct nvme_ns *ns = disk->private_data;
1000-
u8 lbaf, pi_type;
1001-
u16 old_ms;
1002-
unsigned short bs;
1003-
1004-
old_ms = ns->ms;
1005-
lbaf = id->flbas & NVME_NS_FLBAS_LBA_MASK;
1006-
ns->lba_shift = id->lbaf[lbaf].ds;
1007-
ns->ms = le16_to_cpu(id->lbaf[lbaf].ms);
1008-
ns->ext = ns->ms && (id->flbas & NVME_NS_FLBAS_META_EXT);
1027+
u16 bs;
10091028

10101029
/*
10111030
* If identify namespace failed, use default 512 byte block size so
10121031
* block layer can use before failing read/write for 0 capacity.
10131032
*/
1033+
ns->lba_shift = id->lbaf[id->flbas & NVME_NS_FLBAS_LBA_MASK].ds;
10141034
if (ns->lba_shift == 0)
10151035
ns->lba_shift = 9;
10161036
bs = 1 << ns->lba_shift;
1017-
/* XXX: PI implementation requires metadata equal t10 pi tuple size */
1018-
pi_type = ns->ms == sizeof(struct t10_pi_tuple) ?
1019-
id->dps & NVME_NS_DPS_PI_MASK : 0;
10201037

10211038
blk_mq_freeze_queue(disk->queue);
1022-
if (blk_get_integrity(disk) && (ns->pi_type != pi_type ||
1023-
ns->ms != old_ms ||
1024-
bs != queue_logical_block_size(disk->queue) ||
1025-
(ns->ms && ns->ext)))
1026-
blk_integrity_unregister(disk);
10271039

1028-
ns->pi_type = pi_type;
1040+
if (ns->ctrl->ops->flags & NVME_F_METADATA_SUPPORTED)
1041+
nvme_prep_integrity(disk, id, bs);
10291042
blk_queue_logical_block_size(ns->queue, bs);
1030-
10311043
if (ns->ms && !blk_get_integrity(disk) && !ns->ext)
10321044
nvme_init_integrity(ns);
10331045
if (ns->ms && !(ns->ms == 8 && ns->pi_type) && !blk_get_integrity(disk))
@@ -1605,7 +1617,7 @@ int nvme_init_identify(struct nvme_ctrl *ctrl)
16051617
}
16061618
memcpy(ctrl->psd, id->psd, sizeof(ctrl->psd));
16071619

1608-
if (ctrl->ops->is_fabrics) {
1620+
if (ctrl->ops->flags & NVME_F_FABRICS) {
16091621
ctrl->icdoff = le16_to_cpu(id->icdoff);
16101622
ctrl->ioccsz = le32_to_cpu(id->ioccsz);
16111623
ctrl->iorcsz = le32_to_cpu(id->iorcsz);
@@ -2098,7 +2110,6 @@ static void nvme_ns_remove(struct nvme_ns *ns)
20982110
if (ns->ndev)
20992111
nvme_nvm_unregister_sysfs(ns);
21002112
del_gendisk(ns->disk);
2101-
blk_mq_abort_requeue_list(ns->queue);
21022113
blk_cleanup_queue(ns->queue);
21032114
}
21042115

@@ -2436,8 +2447,16 @@ void nvme_kill_queues(struct nvme_ctrl *ctrl)
24362447
continue;
24372448
revalidate_disk(ns->disk);
24382449
blk_set_queue_dying(ns->queue);
2439-
blk_mq_abort_requeue_list(ns->queue);
2440-
blk_mq_start_stopped_hw_queues(ns->queue, true);
2450+
2451+
/*
2452+
* Forcibly start all queues to avoid having stuck requests.
2453+
* Note that we must ensure the queues are not stopped
2454+
* when the final removal happens.
2455+
*/
2456+
blk_mq_start_hw_queues(ns->queue);
2457+
2458+
/* draining requests in requeue list */
2459+
blk_mq_kick_requeue_list(ns->queue);
24412460
}
24422461
mutex_unlock(&ctrl->namespaces_mutex);
24432462
}

0 commit comments

Comments
 (0)