lkml.org 
[lkml]   [2015]   [Dec]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC 4/5] lightnvm: introduce nvm_submit_ppa
    Date
    Internal logic for both core and media managers, does not have a
    backing bio for issuing I/Os. Introduce nvm_submit_ppa to allow raw
    I/Os to be submitted to the underlying device driver.

    The function request the device, ppa, data buffer and its length and
    will submit the I/O synchronously to the device. The return value may
    therefore be used to detect any errors regarding the issued I/O.

    Signed-off-by: Matias Bjørling <m@bjorling.me>
    ---
    drivers/lightnvm/core.c | 31 +++++++++++++++++++++++++++++++
    include/linux/lightnvm.h | 1 +
    2 files changed, 32 insertions(+)

    diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
    index 081b0f5..77a9907 100644
    --- a/drivers/lightnvm/core.c
    +++ b/drivers/lightnvm/core.c
    @@ -288,6 +288,37 @@ int nvm_erase_ppa(struct nvm_dev *dev, struct ppa_addr ppa)
    }
    EXPORT_SYMBOL(nvm_erase_ppa);

    +int nvm_submit_ppa(struct nvm_dev *dev, struct ppa_addr ppa, int opcode,
    + void *buf, int len)
    +{
    + struct nvm_rq rqd;
    + struct bio *bio;
    + int ret;
    +
    + bio = bio_map_kern(dev->q, buf, len, GFP_KERNEL);
    + if (IS_ERR_OR_NULL(bio))
    + return -ENOMEM;
    +
    + memset(&rqd, 0, sizeof(struct nvm_rq));
    + ret = nvm_set_rqd_ppalist(dev, &rqd, &ppa, 1);
    + if (ret) {
    + bio_put(bio);
    + return ret;
    + }
    +
    + rqd.opcode = opcode;
    + rqd.flags = NVM_IO_F_SYNC;
    + rqd.bio = bio;
    + nvm_generic_to_addr_mode(dev, &rqd);
    +
    + ret = dev->ops->submit_io(dev, &rqd);
    +
    + nvm_free_rqd_ppalist(dev, &rqd);
    +
    + return ret;
    +}
    +EXPORT_SYMBOL(nvm_submit_ppa);
    +
    static int nvm_core_init(struct nvm_dev *dev)
    {
    struct nvm_id *id = &dev->identity;
    diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
    index 770278a..0017d55 100644
    --- a/include/linux/lightnvm.h
    +++ b/include/linux/lightnvm.h
    @@ -437,6 +437,7 @@ extern int nvm_set_rqd_ppalist(struct nvm_dev *, struct nvm_rq *,
    extern void nvm_free_rqd_ppalist(struct nvm_dev *, struct nvm_rq *);
    extern int nvm_erase_ppa(struct nvm_dev *, struct ppa_addr);
    extern int nvm_erase_blk(struct nvm_dev *, struct nvm_block *);
    +extern int nvm_submit_ppa(struct nvm_dev *, struct ppa_addr, int, void *, int);
    #else /* CONFIG_NVM */
    struct nvm_dev_ops;

    --
    2.1.4


    \
     
     \ /
      Last update: 2015-12-14 14:41    [W:5.582 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site