block: expose init_request_from_bio

When doing internal commands within the a device driver, we like to form
it as a bio, and use the existing infrastructure for handling bio's.
Exposing init_request_from_bio as blk_init_request_from_bio, it allows
us to initialized the request with a bio that we have initialized.
lightnvm: An open FTL for open firmware SSDs

LightNVM implements the internal logic an SSD within the host system.
This includes logic such as translation tables for logical to physical
address translation, garbage collection and wear-leveling.

It is designed to be used either standalone or with a LightNVM
compatible firmware. If used standalone, NVM memory can be simulated
by passing timings to the dm target table. If used with a LightNVM
compatible device, the device will be queued upon initialized for the
relevant values.

The last part is still in progress and a fully working prototype will be
presented in upcoming patches.
null_blk: add support for vsl

Now that we implement a shim layer between the device drivers and the
blk-mq layer. Let the null_blk driver initialize this part to allow for
testing and evaluation.
Create readme.md

Description of the lightnvm project
null_blk: rename queue_mode description of lightnvm

Let's call the third mode lightnvm, instead of passing on the previous
nvd naming.
null_blk: fix for detection of VSL

The queue_mode is a bit array. Make sure that VSL is detected
appropriately.
null_blk: fix detection of vsl mode

The comparisons for queue_mode only made a strict equal comparison.
Which didn't use the queue mask appropriately.
lightnvm: fix queue_mode description

As we're using a bitmask for identification. The next available is the
third. We should properly move this into a bitshift parameter instead.
null_blk: rename dev to vsl_dev

Only having dev in the name was confusing. Also, fix improper checks for
successfully created vsl.
vsl: null pointer exception in endio

Deferencing vsl_dev when there isn't a vsl_dev is a bad idea.
vsl: fix null access on blk_mq_complete_request

Request got passed as a NULL pointer when blk_mq_complete_request() was
used instead of blk_mq_end_io(). Additionally, clean up the deferencing
of the flow to get to struct vsl_dev.
vsl: pass identification structs as points

Use the return value of the identification function to return
error, and instead populate the identity data using the given parameter
struct.
null_blk: set 128 pages per block

Configure the block size to keep 128 pages within a block.
vsl: configure flash limits

Use constants for configuration of flash parameters.
vsl: make use of driver identification functions
vsl: change allocation to virtual memory

Allocate hundreds of megabytes isn't well-received by kmalloc. Use
vmalloc instead.
vsl: remember to complete IO in vsl end io