Skip to content

Commit 8d77bb8

Browse files
rakeshpanditaxboe
authored andcommitted
lightnvm: propagate pblk_init return to userspace
From userspace calling ioctl(NVM_DEV_CREATE) was returning ENOMEM for invalid arguments even though pblk (pblk_init) was returning correctly -EINVAL to nvm_create_tgt inside core. This patch propagates the correct return value to userspace. Because pblk was introduced recently this only needs to go in 4.12. Fixes: a4bd217 ("lightnvm: physical block device (pblk) target") Signed-off-by: Rakesh Pandit <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent abc25a6 commit 8d77bb8

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

drivers/lightnvm/core.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
235235
struct nvm_target *t;
236236
struct nvm_tgt_dev *tgt_dev;
237237
void *targetdata;
238+
int ret;
238239

239240
tt = nvm_find_target_type(create->tgttype, 1);
240241
if (!tt) {
@@ -255,22 +256,29 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
255256
return -ENOMEM;
256257

257258
t = kmalloc(sizeof(struct nvm_target), GFP_KERNEL);
258-
if (!t)
259+
if (!t) {
260+
ret = -ENOMEM;
259261
goto err_reserve;
262+
}
260263

261264
tgt_dev = nvm_create_tgt_dev(dev, s->lun_begin, s->lun_end);
262265
if (!tgt_dev) {
263266
pr_err("nvm: could not create target device\n");
267+
ret = -ENOMEM;
264268
goto err_t;
265269
}
266270

267271
tdisk = alloc_disk(0);
268-
if (!tdisk)
272+
if (!tdisk) {
273+
ret = -ENOMEM;
269274
goto err_dev;
275+
}
270276

271277
tqueue = blk_alloc_queue_node(GFP_KERNEL, dev->q->node);
272-
if (!tqueue)
278+
if (!tqueue) {
279+
ret = -ENOMEM;
273280
goto err_disk;
281+
}
274282
blk_queue_make_request(tqueue, tt->make_rq);
275283

276284
strlcpy(tdisk->disk_name, create->tgtname, sizeof(tdisk->disk_name));
@@ -281,8 +289,10 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
281289
tdisk->queue = tqueue;
282290

283291
targetdata = tt->init(tgt_dev, tdisk, create->flags);
284-
if (IS_ERR(targetdata))
292+
if (IS_ERR(targetdata)) {
293+
ret = PTR_ERR(targetdata);
285294
goto err_init;
295+
}
286296

287297
tdisk->private_data = targetdata;
288298
tqueue->queuedata = targetdata;
@@ -292,8 +302,10 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
292302
set_capacity(tdisk, tt->capacity(targetdata));
293303
add_disk(tdisk);
294304

295-
if (tt->sysfs_init && tt->sysfs_init(tdisk))
305+
if (tt->sysfs_init && tt->sysfs_init(tdisk)) {
306+
ret = -ENOMEM;
296307
goto err_sysfs;
308+
}
297309

298310
t->type = tt;
299311
t->disk = tdisk;
@@ -318,7 +330,7 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
318330
kfree(t);
319331
err_reserve:
320332
nvm_release_luns_err(dev, s->lun_begin, s->lun_end);
321-
return -ENOMEM;
333+
return ret;
322334
}
323335

324336
static void __nvm_remove_target(struct nvm_target *t)

0 commit comments

Comments
 (0)