Skip to content

Commit 1718de7

Browse files
committed
Merge tag 'for-5.2/block-post-20190516' of git://git.kernel.dk/linux-block
Pull more block updates from Jens Axboe: "This is mainly some late lightnvm changes that came in just before the merge window, as well as fixes that have been queued up since the initial pull request was frozen. This contains: - lightnvm changes, fixing race conditions, improving memory utilization, and improving pblk compatability (Chansol, Igor, Marcin) - NVMe pull request with minor fixes all over the map (via Christoph) - remove redundant error print in sata_rcar (Geert) - struct_size() cleanup (Jackie) - dasd CONFIG_LBADF warning fix (Ming) - brd cond_resched() improvement (Mikulas)" * tag 'for-5.2/block-post-20190516' of git://git.kernel.dk/linux-block: (41 commits) block/bio-integrity: use struct_size() in kmalloc() nvme: validate cntlid during controller initialisation nvme: change locking for the per-subsystem controller list nvme: trace all async notice events nvme: fix typos in nvme status code values nvme-fabrics: remove unused argument nvme-multipath: avoid crash on invalid subsystem cntlid enumeration nvme-fc: use separate work queue to avoid warning nvme-rdma: remove redundant reference between ib_device and tagset nvme-pci: mark expected switch fall-through nvme-pci: add known admin effects to augument admin effects log page nvme-pci: init shadow doorbell after each reset brd: add cond_resched to brd_free_pages sata_rcar: Remove ata_host_alloc() error printing s390/dasd: fix build warning in dasd_eckd_build_cp_raw lightnvm: pblk: use nvm_rq_to_ppa_list() lightnvm: pblk: simplify partial read path lightnvm: do not remove instance under global lock lightnvm: track inflight target creations lightnvm: pblk: recover only written metadata ...
2 parents 815d469 + 7a102d9 commit 1718de7

File tree

25 files changed

+398
-542
lines changed

25 files changed

+398
-542
lines changed

block/bio-integrity.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio,
4343
unsigned inline_vecs;
4444

4545
if (!bs || !mempool_initialized(&bs->bio_integrity_pool)) {
46-
bip = kmalloc(sizeof(struct bio_integrity_payload) +
47-
sizeof(struct bio_vec) * nr_vecs, gfp_mask);
46+
bip = kmalloc(struct_size(bip, bip_inline_vecs, nr_vecs), gfp_mask);
4847
inline_vecs = nr_vecs;
4948
} else {
5049
bip = mempool_alloc(&bs->bio_integrity_pool, gfp_mask);

drivers/ata/sata_rcar.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,6 @@ static int sata_rcar_probe(struct platform_device *pdev)
909909

910910
host = ata_host_alloc(dev, 1);
911911
if (!host) {
912-
dev_err(dev, "ata_host_alloc failed\n");
913912
ret = -ENOMEM;
914913
goto err_pm_put;
915914
}

drivers/block/brd.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,12 @@ static void brd_free_pages(struct brd_device *brd)
152152

153153
pos++;
154154

155+
/*
156+
* It takes 3.4 seconds to remove 80GiB ramdisk.
157+
* So, we need cond_resched to avoid stalling the CPU.
158+
*/
159+
cond_resched();
160+
155161
/*
156162
* This assumes radix_tree_gang_lookup always returns as
157163
* many pages as possible. If the radix-tree code changes,

drivers/lightnvm/core.c

Lines changed: 54 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ struct nvm_dev_map {
4545
int num_ch;
4646
};
4747

48+
static void nvm_free(struct kref *ref);
49+
4850
static struct nvm_target *nvm_find_target(struct nvm_dev *dev, const char *name)
4951
{
5052
struct nvm_target *tgt;
@@ -325,6 +327,7 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
325327
struct nvm_target *t;
326328
struct nvm_tgt_dev *tgt_dev;
327329
void *targetdata;
330+
unsigned int mdts;
328331
int ret;
329332

330333
switch (create->conf.type) {
@@ -412,8 +415,12 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
412415
tdisk->private_data = targetdata;
413416
tqueue->queuedata = targetdata;
414417

415-
blk_queue_max_hw_sectors(tqueue,
416-
(dev->geo.csecs >> 9) * NVM_MAX_VLBA);
418+
mdts = (dev->geo.csecs >> 9) * NVM_MAX_VLBA;
419+
if (dev->geo.mdts) {
420+
mdts = min_t(u32, dev->geo.mdts,
421+
(dev->geo.csecs >> 9) * NVM_MAX_VLBA);
422+
}
423+
blk_queue_max_hw_sectors(tqueue, mdts);
417424

418425
set_capacity(tdisk, tt->capacity(targetdata));
419426
add_disk(tdisk);
@@ -476,26 +483,35 @@ static void __nvm_remove_target(struct nvm_target *t, bool graceful)
476483

477484
/**
478485
* nvm_remove_tgt - Removes a target from the media manager
479-
* @dev: device
480486
* @remove: ioctl structure with target name to remove.
481487
*
482488
* Returns:
483489
* 0: on success
484490
* 1: on not found
485491
* <0: on error
486492
*/
487-
static int nvm_remove_tgt(struct nvm_dev *dev, struct nvm_ioctl_remove *remove)
493+
static int nvm_remove_tgt(struct nvm_ioctl_remove *remove)
488494
{
489495
struct nvm_target *t;
496+
struct nvm_dev *dev;
490497

491-
mutex_lock(&dev->mlock);
492-
t = nvm_find_target(dev, remove->tgtname);
493-
if (!t) {
498+
down_read(&nvm_lock);
499+
list_for_each_entry(dev, &nvm_devices, devices) {
500+
mutex_lock(&dev->mlock);
501+
t = nvm_find_target(dev, remove->tgtname);
502+
if (t) {
503+
mutex_unlock(&dev->mlock);
504+
break;
505+
}
494506
mutex_unlock(&dev->mlock);
495-
return 1;
496507
}
508+
up_read(&nvm_lock);
509+
510+
if (!t)
511+
return 1;
512+
497513
__nvm_remove_target(t, true);
498-
mutex_unlock(&dev->mlock);
514+
kref_put(&dev->ref, nvm_free);
499515

500516
return 0;
501517
}
@@ -1089,15 +1105,16 @@ static int nvm_core_init(struct nvm_dev *dev)
10891105
return ret;
10901106
}
10911107

1092-
static void nvm_free(struct nvm_dev *dev)
1108+
static void nvm_free(struct kref *ref)
10931109
{
1094-
if (!dev)
1095-
return;
1110+
struct nvm_dev *dev = container_of(ref, struct nvm_dev, ref);
10961111

10971112
if (dev->dma_pool)
10981113
dev->ops->destroy_dma_pool(dev->dma_pool);
10991114

1100-
nvm_unregister_map(dev);
1115+
if (dev->rmap)
1116+
nvm_unregister_map(dev);
1117+
11011118
kfree(dev->lun_map);
11021119
kfree(dev);
11031120
}
@@ -1134,20 +1151,30 @@ static int nvm_init(struct nvm_dev *dev)
11341151

11351152
struct nvm_dev *nvm_alloc_dev(int node)
11361153
{
1137-
return kzalloc_node(sizeof(struct nvm_dev), GFP_KERNEL, node);
1154+
struct nvm_dev *dev;
1155+
1156+
dev = kzalloc_node(sizeof(struct nvm_dev), GFP_KERNEL, node);
1157+
if (dev)
1158+
kref_init(&dev->ref);
1159+
1160+
return dev;
11381161
}
11391162
EXPORT_SYMBOL(nvm_alloc_dev);
11401163

11411164
int nvm_register(struct nvm_dev *dev)
11421165
{
11431166
int ret, exp_pool_size;
11441167

1145-
if (!dev->q || !dev->ops)
1168+
if (!dev->q || !dev->ops) {
1169+
kref_put(&dev->ref, nvm_free);
11461170
return -EINVAL;
1171+
}
11471172

11481173
ret = nvm_init(dev);
1149-
if (ret)
1174+
if (ret) {
1175+
kref_put(&dev->ref, nvm_free);
11501176
return ret;
1177+
}
11511178

11521179
exp_pool_size = max_t(int, PAGE_SIZE,
11531180
(NVM_MAX_VLBA * (sizeof(u64) + dev->geo.sos)));
@@ -1157,7 +1184,7 @@ int nvm_register(struct nvm_dev *dev)
11571184
exp_pool_size);
11581185
if (!dev->dma_pool) {
11591186
pr_err("nvm: could not create dma pool\n");
1160-
nvm_free(dev);
1187+
kref_put(&dev->ref, nvm_free);
11611188
return -ENOMEM;
11621189
}
11631190

@@ -1179,20 +1206,22 @@ void nvm_unregister(struct nvm_dev *dev)
11791206
if (t->dev->parent != dev)
11801207
continue;
11811208
__nvm_remove_target(t, false);
1209+
kref_put(&dev->ref, nvm_free);
11821210
}
11831211
mutex_unlock(&dev->mlock);
11841212

11851213
down_write(&nvm_lock);
11861214
list_del(&dev->devices);
11871215
up_write(&nvm_lock);
11881216

1189-
nvm_free(dev);
1217+
kref_put(&dev->ref, nvm_free);
11901218
}
11911219
EXPORT_SYMBOL(nvm_unregister);
11921220

11931221
static int __nvm_configure_create(struct nvm_ioctl_create *create)
11941222
{
11951223
struct nvm_dev *dev;
1224+
int ret;
11961225

11971226
down_write(&nvm_lock);
11981227
dev = nvm_find_nvm_dev(create->dev);
@@ -1203,7 +1232,12 @@ static int __nvm_configure_create(struct nvm_ioctl_create *create)
12031232
return -EINVAL;
12041233
}
12051234

1206-
return nvm_create_tgt(dev, create);
1235+
kref_get(&dev->ref);
1236+
ret = nvm_create_tgt(dev, create);
1237+
if (ret)
1238+
kref_put(&dev->ref, nvm_free);
1239+
1240+
return ret;
12071241
}
12081242

12091243
static long nvm_ioctl_info(struct file *file, void __user *arg)
@@ -1322,8 +1356,6 @@ static long nvm_ioctl_dev_create(struct file *file, void __user *arg)
13221356
static long nvm_ioctl_dev_remove(struct file *file, void __user *arg)
13231357
{
13241358
struct nvm_ioctl_remove remove;
1325-
struct nvm_dev *dev;
1326-
int ret = 0;
13271359

13281360
if (copy_from_user(&remove, arg, sizeof(struct nvm_ioctl_remove)))
13291361
return -EFAULT;
@@ -1335,13 +1367,7 @@ static long nvm_ioctl_dev_remove(struct file *file, void __user *arg)
13351367
return -EINVAL;
13361368
}
13371369

1338-
list_for_each_entry(dev, &nvm_devices, devices) {
1339-
ret = nvm_remove_tgt(dev, &remove);
1340-
if (!ret)
1341-
break;
1342-
}
1343-
1344-
return ret;
1370+
return nvm_remove_tgt(&remove);
13451371
}
13461372

13471373
/* kept for compatibility reasons */

drivers/lightnvm/pblk-cache.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818

1919
#include "pblk.h"
2020

21-
int pblk_write_to_cache(struct pblk *pblk, struct bio *bio, unsigned long flags)
21+
void pblk_write_to_cache(struct pblk *pblk, struct bio *bio,
22+
unsigned long flags)
2223
{
2324
struct request_queue *q = pblk->dev->q;
2425
struct pblk_w_ctx w_ctx;
@@ -43,6 +44,7 @@ int pblk_write_to_cache(struct pblk *pblk, struct bio *bio, unsigned long flags)
4344
goto retry;
4445
case NVM_IO_ERR:
4546
pblk_pipeline_stop(pblk);
47+
bio_io_error(bio);
4648
goto out;
4749
}
4850

@@ -79,7 +81,9 @@ int pblk_write_to_cache(struct pblk *pblk, struct bio *bio, unsigned long flags)
7981
out:
8082
generic_end_io_acct(q, REQ_OP_WRITE, &pblk->disk->part0, start_time);
8183
pblk_write_should_kick(pblk);
82-
return ret;
84+
85+
if (ret == NVM_IO_DONE)
86+
bio_endio(bio);
8387
}
8488

8589
/*

0 commit comments

Comments
 (0)