lkml.org 
[lkml]   [2011]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/3] xen/blk[front|back]: Enhance discard support with secure erasing support.
    Date
    Part of the blkdev_issue_discard(xx) operation is that it can also
    issue a secure discard operation that will permanantly remove the
    sectors in question. We advertise that we can support that via the
    'discard-secure' attribute and on the request, if the 'secure' bit
    is set, we will attempt to pass in REQ_DISCARD | REQ_SECURE.
    CC: Li Dongyang <lidongyang@novell.com>
    Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    ---
    drivers/block/xen-blkback/blkback.c | 4 +++-
    drivers/block/xen-blkback/common.h | 5 +++++
    drivers/block/xen-blkback/xenbus.c | 12 ++++++++++++
    drivers/block/xen-blkfront.c | 19 +++++++++++++++++--
    include/xen/interface/io/blkif.h | 5 +++++
    5 files changed, 42 insertions(+), 3 deletions(-)
    diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
    index 3da9a40..0bd7143 100644
    --- a/drivers/block/xen-blkback/blkback.c
    +++ b/drivers/block/xen-blkback/blkback.c
    @@ -427,7 +427,9 @@ static void xen_blk_discard(struct xen_blkif *blkif, struct blkif_request *req)
    err = blkdev_issue_discard(bdev,
    req->u.discard.sector_number,
    req->u.discard.nr_sectors,
    - GFP_KERNEL, 0);
    + GFP_KERNEL,
    + blkif->vbd.discard_secure ?
    + req->u.discard.secure : 0);
    else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
    /* punch a hole in the backing file */
    struct loop_device *lo = bdev->bd_disk->private_data;
    diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
    index e638457..ed64ba8 100644
    --- a/drivers/block/xen-blkback/common.h
    +++ b/drivers/block/xen-blkback/common.h
    @@ -72,6 +72,7 @@ struct blkif_x86_32_request_rw {
    struct blkif_x86_32_request_discard {
    blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */
    uint64_t nr_sectors;
    + uint8_t secure:1;
    };

    struct blkif_x86_32_request {
    @@ -101,6 +102,7 @@ struct blkif_x86_64_request_rw {
    struct blkif_x86_64_request_discard {
    blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */
    uint64_t nr_sectors;
    + uint8_t secure:1;
    };

    struct blkif_x86_64_request {
    @@ -157,6 +159,7 @@ struct xen_vbd {
    /* Cached size parameter. */
    sector_t size;
    bool flush_support;
    + bool discard_secure;
    };

    struct backend_info;
    @@ -259,6 +262,7 @@ static inline void blkif_get_x86_32_req(struct blkif_request *dst,
    case BLKIF_OP_DISCARD:
    dst->u.discard.sector_number = src->u.discard.sector_number;
    dst->u.discard.nr_sectors = src->u.discard.nr_sectors;
    + dst->u.discard.secure = src->u.discard.secure;
    break;
    default:
    break;
    @@ -288,6 +292,7 @@ static inline void blkif_get_x86_64_req(struct blkif_request *dst,
    case BLKIF_OP_DISCARD:
    dst->u.discard.sector_number = src->u.discard.sector_number;
    dst->u.discard.nr_sectors = src->u.discard.nr_sectors;
    + dst->u.discard.secure = src->u.discard.secure;
    break;
    default:
    break;
    diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
    index a6d4303..0c0ce39 100644
    --- a/drivers/block/xen-blkback/xenbus.c
    +++ b/drivers/block/xen-blkback/xenbus.c
    @@ -378,6 +378,9 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
    if (q && q->flush_flags)
    vbd->flush_support = true;

    + if (q && blk_queue_secdiscard(q))
    + vbd->discard_secure = true;
    +
    DPRINTK("Successful creation of handle=%04x (dom=%u)\n",
    handle, blkif->domid);
    return 0;
    @@ -460,6 +463,15 @@ int xen_blkbk_discard(struct xenbus_transaction xbt, struct backend_info *be)
    state = 1;
    blkif->blk_backend_type = BLKIF_BACKEND_PHY;
    }
    + /* Optional. */
    + err = xenbus_printf(xbt, dev->nodename,
    + "discard-secure", "%d",
    + blkif->vbd.discard_secure);
    + if (err) {
    + xenbus_dev_fatal(dev, err,
    + "writting discard-secure");
    + goto kfree;
    + }
    }
    } else {
    err = PTR_ERR(type);
    diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
    index e9d301c..bc39b5e 100644
    --- a/drivers/block/xen-blkfront.c
    +++ b/drivers/block/xen-blkfront.c
    @@ -98,7 +98,8 @@ struct blkfront_info
    unsigned long shadow_free;
    unsigned int feature_flush;
    unsigned int flush_op;
    - unsigned int feature_discard;
    + unsigned int feature_discard:1;
    + unsigned int feature_secdiscard:1;
    unsigned int discard_granularity;
    unsigned int discard_alignment;
    int is_ready;
    @@ -305,11 +306,13 @@ static int blkif_queue_request(struct request *req)
    ring_req->operation = info->flush_op;
    }

    - if (unlikely(req->cmd_flags & REQ_DISCARD)) {
    + if (unlikely(req->cmd_flags & (REQ_DISCARD | REQ_SECURE))) {
    /* id, sector_number and handle are set above. */
    ring_req->operation = BLKIF_OP_DISCARD;
    ring_req->nr_segments = 0;
    ring_req->u.discard.nr_sectors = blk_rq_sectors(req);
    + if ((req->cmd_flags & REQ_SECURE) && info->feature_secdiscard)
    + ring_req->u.discard.secure = 1;
    } else {
    ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg);
    BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST);
    @@ -424,6 +427,8 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
    blk_queue_max_discard_sectors(rq, get_capacity(gd));
    rq->limits.discard_granularity = info->discard_granularity;
    rq->limits.discard_alignment = info->discard_alignment;
    + if (info->feature_secdiscard)
    + queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD, rq);
    }

    /* Hard sector size and max sectors impersonate the equiv. hardware. */
    @@ -749,7 +754,9 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
    info->gd->disk_name);
    error = -EOPNOTSUPP;
    info->feature_discard = 0;
    + info->feature_secdiscard = 0;
    queue_flag_clear(QUEUE_FLAG_DISCARD, rq);
    + queue_flag_clear(QUEUE_FLAG_SECDISCARD, rq);
    }
    __blk_end_request_all(req, error);
    break;
    @@ -1135,11 +1142,13 @@ static void blkfront_setup_discard(struct blkfront_info *info)
    char *type;
    unsigned int discard_granularity;
    unsigned int discard_alignment;
    + unsigned int discard_secure;

    type = xenbus_read(XBT_NIL, info->xbdev->otherend, "type", NULL);
    if (IS_ERR(type))
    return;

    + info->feature_secdiscard = 0;
    if (strncmp(type, "phy", 3) == 0) {
    err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
    "discard-granularity", "%u", &discard_granularity,
    @@ -1150,6 +1159,12 @@ static void blkfront_setup_discard(struct blkfront_info *info)
    info->discard_granularity = discard_granularity;
    info->discard_alignment = discard_alignment;
    }
    + err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
    + "discard-secure", "%d", &discard_secure,
    + NULL);
    + if (!err)
    + info->feature_secdiscard = discard_secure;
    +
    } else if (strncmp(type, "file", 4) == 0)
    info->feature_discard = 1;

    diff --git a/include/xen/interface/io/blkif.h b/include/xen/interface/io/blkif.h
    index 9324488..04f60b0 100644
    --- a/include/xen/interface/io/blkif.h
    +++ b/include/xen/interface/io/blkif.h
    @@ -84,6 +84,10 @@ typedef uint64_t blkif_sector_t;
    * e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
    * http://www.seagate.com/staticfiles/support/disc/manuals/
    * Interface%20manuals/100293068c.pdf
    + * We also provide three extra XenBus options to the discard operation:
    + * 'discard-granularity' - Max amount of sectors that can be discarded.
    + * 'discard-alignment' - 4K, 128K, etc aligment on sectors to erased.
    + * 'discard-secure' - whether the discard can also securely erase data.
    */
    #define BLKIF_OP_DISCARD 5

    @@ -107,6 +111,7 @@ struct blkif_request_rw {
    struct blkif_request_discard {
    blkif_sector_t sector_number;
    uint64_t nr_sectors;
    + uint8_t secure:1;
    };

    struct blkif_request {
    --
    1.7.5.4


    \
     
     \ /
      Last update: 2011-10-10 17:31    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean