lkml.org 
[lkml]   [2012]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] xen-blkfront: properly name all devices
    - devices beyond xvdzz didn't get proper names assigned at all
    - extended devices with minors not representable within the kernel's
    major/minor bit split spilled into foreign majors

    Signed-off-by: Jan Beulich <jbeulich@suse.com>

    ---
    drivers/block/xen-blkfront.c | 40 ++++++++++++++++++++++------------------
    1 file changed, 22 insertions(+), 18 deletions(-)

    --- 3.4-rc1/drivers/block/xen-blkfront.c
    +++ 3.4-rc1-xen-blkfront-all-devices/drivers/block/xen-blkfront.c
    @@ -528,6 +528,14 @@ static int xen_translate_vdev(int vdevic
    return 0;
    }

    +static char *encode_disk_name(char *ptr, unsigned int n)
    +{
    + if (n >= 26)
    + ptr = encode_disk_name(ptr, n / 26 - 1);
    + *ptr = 'a' + n % 26;
    + return ptr + 1;
    +}
    +
    static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
    struct blkfront_info *info,
    u16 vdisk_info, u16 sector_size)
    @@ -538,6 +546,7 @@ static int xlvbd_alloc_gendisk(blkif_sec
    unsigned int offset;
    int minor;
    int nr_parts;
    + char *ptr;

    BUG_ON(info->gd != NULL);
    BUG_ON(info->rq != NULL);
    @@ -562,7 +571,11 @@ static int xlvbd_alloc_gendisk(blkif_sec
    "emulated IDE disks,\n\t choose an xvd device name"
    "from xvde on\n", info->vdevice);
    }
    - err = -ENODEV;
    + if (minor >> MINORBITS) {
    + pr_warn("blkfront: %#x's minor (%#x) out of range; ignoring\n",
    + info->vdevice, minor);
    + return -ENODEV;
    + }

    if ((minor % nr_parts) == 0)
    nr_minors = nr_parts;
    @@ -576,23 +589,14 @@ static int xlvbd_alloc_gendisk(blkif_sec
    if (gd == NULL)
    goto release;

    - if (nr_minors > 1) {
    - if (offset < 26)
    - sprintf(gd->disk_name, "%s%c", DEV_NAME, 'a' + offset);
    - else
    - sprintf(gd->disk_name, "%s%c%c", DEV_NAME,
    - 'a' + ((offset / 26)-1), 'a' + (offset % 26));
    - } else {
    - if (offset < 26)
    - sprintf(gd->disk_name, "%s%c%d", DEV_NAME,
    - 'a' + offset,
    - minor & (nr_parts - 1));
    - else
    - sprintf(gd->disk_name, "%s%c%c%d", DEV_NAME,
    - 'a' + ((offset / 26) - 1),
    - 'a' + (offset % 26),
    - minor & (nr_parts - 1));
    - }
    + strcpy(gd->disk_name, DEV_NAME);
    + ptr = encode_disk_name(gd->disk_name + sizeof(DEV_NAME) - 1, offset);
    + BUG_ON(ptr >= gd->disk_name + DISK_NAME_LEN);
    + if (nr_minors > 1)
    + *ptr = 0;
    + else
    + snprintf(ptr, gd->disk_name + DISK_NAME_LEN - ptr,
    + "%d", minor & (nr_parts - 1));

    gd->major = XENVBD_MAJOR;
    gd->first_minor = minor;




    \
     
     \ /
      Last update: 2012-04-05 17:39    [W:0.021 / U:1.084 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site