Skip to content

Commit

Permalink
null_blk: refactor to support non-gendisk devices
Browse files Browse the repository at this point in the history
With LightNVM enabled devices, the gendisk structure is not exposed
to the user. This hides the device driver specific sysfs entries, and
prevents binding of LightNVM geometry information to the device.

Refactor the device registration process, so that gendisk and
non-gendisk devices are easily managed.

Signed-off-by: Matias Bjørling <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
MatiasBjorling authored and axboe committed Sep 21, 2016
1 parent ac81bfa commit 9ae2d0a
Showing 1 changed file with 61 additions and 49 deletions.
110 changes: 61 additions & 49 deletions drivers/block/null_blk.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,23 +414,6 @@ static void cleanup_queues(struct nullb *nullb)
kfree(nullb->queues);
}

static void null_del_dev(struct nullb *nullb)
{
list_del_init(&nullb->list);

if (use_lightnvm)
nvm_unregister(nullb->disk_name);
else
del_gendisk(nullb->disk);
blk_cleanup_queue(nullb->q);
if (queue_mode == NULL_Q_MQ)
blk_mq_free_tag_set(&nullb->tag_set);
if (!use_lightnvm)
put_disk(nullb->disk);
cleanup_queues(nullb);
kfree(nullb);
}

#ifdef CONFIG_NVM

static void null_lnvm_end_io(struct request *rq, int error)
Expand Down Expand Up @@ -564,10 +547,41 @@ static struct nvm_dev_ops null_lnvm_dev_ops = {
/* Simulate nvme protocol restriction */
.max_phys_sect = 64,
};

static int null_nvm_register(struct nullb *nullb)
{
return nvm_register(nullb->q, nullb->disk_name, &null_lnvm_dev_ops);
}

static void null_nvm_unregister(struct nullb *nullb)
{
nvm_unregister(nullb->disk_name);
}
#else
static struct nvm_dev_ops null_lnvm_dev_ops;
static int null_nvm_register(struct nullb *nullb)
{
return -EINVAL;
}
static void null_nvm_unregister(struct nullb *nullb) {}
#endif /* CONFIG_NVM */

static void null_del_dev(struct nullb *nullb)
{
list_del_init(&nullb->list);

if (use_lightnvm)
null_nvm_unregister(nullb);
else
del_gendisk(nullb->disk);
blk_cleanup_queue(nullb->q);
if (queue_mode == NULL_Q_MQ)
blk_mq_free_tag_set(&nullb->tag_set);
if (!use_lightnvm)
put_disk(nullb->disk);
cleanup_queues(nullb);
kfree(nullb);
}

static int null_open(struct block_device *bdev, fmode_t mode)
{
return 0;
Expand Down Expand Up @@ -640,11 +654,32 @@ static int init_driver_queues(struct nullb *nullb)
return 0;
}

static int null_add_dev(void)
static int null_gendisk_register(struct nullb *nullb)
{
struct gendisk *disk;
struct nullb *nullb;
sector_t size;

disk = nullb->disk = alloc_disk_node(1, home_node);
if (!disk)
return -ENOMEM;
size = gb * 1024 * 1024 * 1024ULL;
set_capacity(disk, size >> 9);

disk->flags |= GENHD_FL_EXT_DEVT | GENHD_FL_SUPPRESS_PARTITION_INFO;
disk->major = null_major;
disk->first_minor = nullb->index;
disk->fops = &null_fops;
disk->private_data = nullb;
disk->queue = nullb->q;
strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);

add_disk(disk);
return 0;
}

static int null_add_dev(void)
{
struct nullb *nullb;
int rv;

nullb = kzalloc_node(sizeof(*nullb), GFP_KERNEL, home_node);
Expand Down Expand Up @@ -716,42 +751,19 @@ static int null_add_dev(void)

sprintf(nullb->disk_name, "nullb%d", nullb->index);

if (use_lightnvm) {
rv = nvm_register(nullb->q, nullb->disk_name,
&null_lnvm_dev_ops);
if (rv)
goto out_cleanup_blk_queue;
goto done;
}

disk = nullb->disk = alloc_disk_node(1, home_node);
if (!disk) {
rv = -ENOMEM;
goto out_cleanup_lightnvm;
}
size = gb * 1024 * 1024 * 1024ULL;
set_capacity(disk, size >> 9);

disk->flags |= GENHD_FL_EXT_DEVT | GENHD_FL_SUPPRESS_PARTITION_INFO;
disk->major = null_major;
disk->first_minor = nullb->index;
disk->fops = &null_fops;
disk->private_data = nullb;
disk->queue = nullb->q;
strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
if (use_lightnvm)
rv = null_nvm_register(nullb);
else
rv = null_gendisk_register(nullb);

add_disk(disk);
if (rv)
goto out_cleanup_blk_queue;

done:
mutex_lock(&lock);
list_add_tail(&nullb->list, &nullb_list);
mutex_unlock(&lock);

return 0;

out_cleanup_lightnvm:
if (use_lightnvm)
nvm_unregister(nullb->disk_name);
out_cleanup_blk_queue:
blk_cleanup_queue(nullb->q);
out_cleanup_tags:
Expand Down

0 comments on commit 9ae2d0a

Please sign in to comment.