Skip to content

Commit 1d02369

Browse files
committed
Merge branch 'for-linus' of git://git.kernel.dk/linux-block
Pull block fixes from Jens Axboe: "Final round of fixes for this merge window - some of this has come up after the initial pull request, and some of it was put in a post-merge branch before the merge window. This contains: - Fix for a bad check for an error on dma mapping in the mtip32xx driver, from Alexey Khoroshilov. - A set of fixes for lightnvm, from Javier, Matias, and Wenwei. - An NVMe completion record corruption fix from Marta, ensuring that we read things in the right order. - Two writeback fixes from Tejun, marked for stable@ as well. - A blk-mq sw queue iterator fix from Thomas, fixing an oops for sparse CPU maps. They hit this in the hot plug/unplug rework" * 'for-linus' of git://git.kernel.dk/linux-block: nvme: avoid cqe corruption when update at the same time as read writeback, cgroup: fix use of the wrong bdi_writeback which mismatches the inode writeback, cgroup: fix premature wb_put() in locked_inode_to_wb_and_lock_list() blk-mq: Use proper cpumask iterator mtip32xx: fix checks for dma mapping errors lightnvm: do not load L2P table if not supported lightnvm: do not reserve lun on l2p loading nvme: lightnvm: return ppa completion status lightnvm: add a bitmap of luns lightnvm: specify target's logical address area null_blk: add lightnvm null_blk device to the nullb_list
2 parents 8f40842 + d783e0b commit 1d02369

File tree

14 files changed

+251
-78
lines changed

14 files changed

+251
-78
lines changed

block/blk-mq-sysfs.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -416,12 +416,14 @@ void blk_mq_hctx_kobj_init(struct blk_mq_hw_ctx *hctx)
416416
static void blk_mq_sysfs_init(struct request_queue *q)
417417
{
418418
struct blk_mq_ctx *ctx;
419-
int i;
419+
int cpu;
420420

421421
kobject_init(&q->mq_kobj, &blk_mq_ktype);
422422

423-
queue_for_each_ctx(q, ctx, i)
423+
for_each_possible_cpu(cpu) {
424+
ctx = per_cpu_ptr(q->queue_ctx, cpu);
424425
kobject_init(&ctx->kobj, &blk_mq_ctx_ktype);
426+
}
425427
}
426428

427429
int blk_mq_register_disk(struct gendisk *disk)

block/blk-mq.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -1798,11 +1798,12 @@ static void blk_mq_map_swqueue(struct request_queue *q,
17981798
/*
17991799
* Map software to hardware queues
18001800
*/
1801-
queue_for_each_ctx(q, ctx, i) {
1801+
for_each_possible_cpu(i) {
18021802
/* If the cpu isn't online, the cpu is mapped to first hctx */
18031803
if (!cpumask_test_cpu(i, online_mask))
18041804
continue;
18051805

1806+
ctx = per_cpu_ptr(q->queue_ctx, i);
18061807
hctx = q->mq_ops->map_queue(q, i);
18071808

18081809
cpumask_set_cpu(i, hctx->cpumask);

drivers/block/mtip32xx/mtip32xx.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -2051,7 +2051,7 @@ static int exec_drive_taskfile(struct driver_data *dd,
20512051
outbuf,
20522052
taskout,
20532053
DMA_TO_DEVICE);
2054-
if (outbuf_dma == 0) {
2054+
if (pci_dma_mapping_error(dd->pdev, outbuf_dma)) {
20552055
err = -ENOMEM;
20562056
goto abort;
20572057
}
@@ -2068,7 +2068,7 @@ static int exec_drive_taskfile(struct driver_data *dd,
20682068
inbuf_dma = pci_map_single(dd->pdev,
20692069
inbuf,
20702070
taskin, DMA_FROM_DEVICE);
2071-
if (inbuf_dma == 0) {
2071+
if (pci_dma_mapping_error(dd->pdev, inbuf_dma)) {
20722072
err = -ENOMEM;
20732073
goto abort;
20742074
}

drivers/block/null_blk.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -742,10 +742,11 @@ static int null_add_dev(void)
742742

743743
add_disk(disk);
744744

745+
done:
745746
mutex_lock(&lock);
746747
list_add_tail(&nullb->list, &nullb_list);
747748
mutex_unlock(&lock);
748-
done:
749+
749750
return 0;
750751

751752
out_cleanup_lightnvm:

drivers/lightnvm/core.c

+7
Original file line numberDiff line numberDiff line change
@@ -464,8 +464,13 @@ static int nvm_core_init(struct nvm_dev *dev)
464464
dev->nr_luns = dev->luns_per_chnl * dev->nr_chnls;
465465

466466
dev->total_secs = dev->nr_luns * dev->sec_per_lun;
467+
dev->lun_map = kcalloc(BITS_TO_LONGS(dev->nr_luns),
468+
sizeof(unsigned long), GFP_KERNEL);
469+
if (!dev->lun_map)
470+
return -ENOMEM;
467471
INIT_LIST_HEAD(&dev->online_targets);
468472
mutex_init(&dev->mlock);
473+
spin_lock_init(&dev->lock);
469474

470475
return 0;
471476
}
@@ -585,6 +590,7 @@ int nvm_register(struct request_queue *q, char *disk_name,
585590

586591
return 0;
587592
err_init:
593+
kfree(dev->lun_map);
588594
kfree(dev);
589595
return ret;
590596
}
@@ -607,6 +613,7 @@ void nvm_unregister(char *disk_name)
607613
up_write(&nvm_lock);
608614

609615
nvm_exit(dev);
616+
kfree(dev->lun_map);
610617
kfree(dev);
611618
}
612619
EXPORT_SYMBOL(nvm_unregister);

drivers/lightnvm/gennvm.c

+83-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,68 @@
2020

2121
#include "gennvm.h"
2222

23+
static int gennvm_get_area(struct nvm_dev *dev, sector_t *lba, sector_t len)
24+
{
25+
struct gen_nvm *gn = dev->mp;
26+
struct gennvm_area *area, *prev, *next;
27+
sector_t begin = 0;
28+
sector_t max_sectors = (dev->sec_size * dev->total_secs) >> 9;
29+
30+
if (len > max_sectors)
31+
return -EINVAL;
32+
33+
area = kmalloc(sizeof(struct gennvm_area), GFP_KERNEL);
34+
if (!area)
35+
return -ENOMEM;
36+
37+
prev = NULL;
38+
39+
spin_lock(&dev->lock);
40+
list_for_each_entry(next, &gn->area_list, list) {
41+
if (begin + len > next->begin) {
42+
begin = next->end;
43+
prev = next;
44+
continue;
45+
}
46+
break;
47+
}
48+
49+
if ((begin + len) > max_sectors) {
50+
spin_unlock(&dev->lock);
51+
kfree(area);
52+
return -EINVAL;
53+
}
54+
55+
area->begin = *lba = begin;
56+
area->end = begin + len;
57+
58+
if (prev) /* insert into sorted order */
59+
list_add(&area->list, &prev->list);
60+
else
61+
list_add(&area->list, &gn->area_list);
62+
spin_unlock(&dev->lock);
63+
64+
return 0;
65+
}
66+
67+
static void gennvm_put_area(struct nvm_dev *dev, sector_t begin)
68+
{
69+
struct gen_nvm *gn = dev->mp;
70+
struct gennvm_area *area;
71+
72+
spin_lock(&dev->lock);
73+
list_for_each_entry(area, &gn->area_list, list) {
74+
if (area->begin != begin)
75+
continue;
76+
77+
list_del(&area->list);
78+
spin_unlock(&dev->lock);
79+
kfree(area);
80+
return;
81+
}
82+
spin_unlock(&dev->lock);
83+
}
84+
2385
static void gennvm_blocks_free(struct nvm_dev *dev)
2486
{
2587
struct gen_nvm *gn = dev->mp;
@@ -195,7 +257,7 @@ static int gennvm_blocks_init(struct nvm_dev *dev, struct gen_nvm *gn)
195257
}
196258
}
197259

198-
if (dev->ops->get_l2p_tbl) {
260+
if ((dev->identity.dom & NVM_RSP_L2P) && dev->ops->get_l2p_tbl) {
199261
ret = dev->ops->get_l2p_tbl(dev, 0, dev->total_secs,
200262
gennvm_block_map, dev);
201263
if (ret) {
@@ -229,6 +291,7 @@ static int gennvm_register(struct nvm_dev *dev)
229291

230292
gn->dev = dev;
231293
gn->nr_luns = dev->nr_luns;
294+
INIT_LIST_HEAD(&gn->area_list);
232295
dev->mp = gn;
233296

234297
ret = gennvm_luns_init(dev, gn);
@@ -419,10 +482,23 @@ static int gennvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk,
419482
return nvm_erase_ppa(dev, &addr, 1);
420483
}
421484

485+
static int gennvm_reserve_lun(struct nvm_dev *dev, int lunid)
486+
{
487+
return test_and_set_bit(lunid, dev->lun_map);
488+
}
489+
490+
static void gennvm_release_lun(struct nvm_dev *dev, int lunid)
491+
{
492+
WARN_ON(!test_and_clear_bit(lunid, dev->lun_map));
493+
}
494+
422495
static struct nvm_lun *gennvm_get_lun(struct nvm_dev *dev, int lunid)
423496
{
424497
struct gen_nvm *gn = dev->mp;
425498

499+
if (unlikely(lunid >= dev->nr_luns))
500+
return NULL;
501+
426502
return &gn->luns[lunid].vlun;
427503
}
428504

@@ -464,7 +540,13 @@ static struct nvmm_type gennvm = {
464540
.erase_blk = gennvm_erase_blk,
465541

466542
.get_lun = gennvm_get_lun,
543+
.reserve_lun = gennvm_reserve_lun,
544+
.release_lun = gennvm_release_lun,
467545
.lun_info_print = gennvm_lun_info_print,
546+
547+
.get_area = gennvm_get_area,
548+
.put_area = gennvm_put_area,
549+
468550
};
469551

470552
static int __init gennvm_module_init(void)

drivers/lightnvm/gennvm.h

+6
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,14 @@ struct gen_nvm {
3939

4040
int nr_luns;
4141
struct gen_lun *luns;
42+
struct list_head area_list;
4243
};
4344

45+
struct gennvm_area {
46+
struct list_head list;
47+
sector_t begin;
48+
sector_t end; /* end is excluded */
49+
};
4450
#define gennvm_for_each_lun(bm, lun, i) \
4551
for ((i) = 0, lun = &(bm)->luns[0]; \
4652
(i) < (bm)->nr_luns; (i)++, lun = &(bm)->luns[(i)])

0 commit comments

Comments
 (0)