Reworked the patch using scanf/printf - Thanks Nicholas for the pointer. I knew there had to be a simpler method, it just wasn't coming to me at the time. I've attached patch as an attachment to prevent white-space corruption. Also included inline for easier reading / review. >From 1215fae094812201ea563cbd45c6a90b4ef1f38f Mon Sep 17 00:00:00 2001 From: Mark Harvey <markh794@xxxxxxxxx> Date: Sat, 21 Aug 2010 15:22:48 +1000 Subject: Check bsg major number from /sys/class/bsg/<c:t:l>/dev Signed-off-by: Mark Harvey <markh794@xxxxxxxxx> --- usr/bs_sg.c | 27 ++++++++++++++++++++++++--- 1 files changed, 24 insertions(+), 3 deletions(-) diff --git a/usr/bs_sg.c b/usr/bs_sg.c index dfd49c3..c8559fc 100644 --- a/usr/bs_sg.c +++ b/usr/bs_sg.c @@ -269,6 +269,26 @@ static void bs_sg_cmd_complete(int fd, int events, void *data) cmd->scsi_cmd_done(cmd, io_hdr.status); } +static int get_bsg_major(char *path) +{ + FILE *devfd; + char majorno[8]; + char dev[64]; + char tmp[16]; + int ch; + int i; + + sscanf(path, "/dev/bsg/%s", tmp); + sprintf(dev, "/sys/class/bsg/%s/dev", tmp); + devfd = fopen(dev, "r"); + if (!devfd) + return -1; + fscanf(devfd, "%s:", majorno); + fclose(devfd); + + return atoi(majorno); +} + static int chk_sg_device(char *path) { struct stat st; @@ -287,9 +307,10 @@ static int chk_sg_device(char *path) if (major(st.st_rdev) == SCSI_GENERIC_MAJOR) return 0; - /* This is not yet defined in include/linux/major.h.. */ - if (major(st.st_rdev) == 254) - return 1; + if (!strncmp("/dev/bsg", path, 8)) { + if (major(st.st_rdev) == get_bsg_major(path)) + return 1; + } return -1; } -- 1.6.3.3 On Sun, Aug 22, 2010 at 9:53 AM, Mark Harvey <markh794@xxxxxxxxx> wrote: > Cheers > > I'll look tomorrow when time permits :) > > Sent from my iPhone > > On 22/08/2010, at 9:02, "Nicholas A. Bellinger" <nab@xxxxxxxxxxxxxxx> wrote: > >> On Sat, 2010-08-21 at 16:07 +1000, Mark Harvey wrote: >>> Apologies for including this patch as an attachment.. >>> I haven't figured out how to successfully do it from the office. >>> >>> Included inline for easier reading / review. >>> >>> On Fri, Aug 20, 2010 at 7:29 PM, Nicholas A. Bellinger >>> <nab@xxxxxxxxxxxxxxx> wrote: >>>> On Fri, 2010-08-20 at 11:22 +0900, FUJITA Tomonori wrote: >>>>> On Thu, 19 Aug 2010 12:51:54 -0700 >>>>> "Nicholas A. Bellinger" <nab@xxxxxxxxxxxxxxx> wrote: >>>>>> So it looks like the failure is attributed to my hardcoding of major 254 >>>>>> in the original STGT/BSG patch (note the comment above the conditional >>>>>> check). Here is a quick fix: >>>>>> >>>>>> diff --git a/usr/bs_sg.c b/usr/bs_sg.c >>>>>> index cda5cd2..a369570 100644 >>>>>> --- a/usr/bs_sg.c >>>>>> +++ b/usr/bs_sg.c >>>>>> @@ -289,7 +289,7 @@ static int chk_sg_device(char *path) >>>>>> return 0; >>>>>> >>>>>> /* This is not yet defined in include/linux/major.h.. */ >>>>>> - if (major(st.st_rdev) == 254) >>>>>> + if ((major(st.st_rdev) == 254) || (major(st.st_rdev) == 253)) >>>>>> return 1; >>>>>> >>>>>> return -1; >>>>> >>>>> Well, seems that nobody uses the bsg support except for you. :) >>>>> >>>>> The above patch is still wrong. >>>>> >>>>> bsg major number can be anything. So you need to get it from >>>>> /proc/devices. >>>>> >>>>> Or you can also get it from /sys/class/bsg/, which is created by >>>>> kernel so available on any distributions. >>>>> >>>>> You can steal the bsg device handling code from sg3-utils. Maybe >>>>> someone could create something like libbsg.so >>>> >>>> Hmmm indeed, thanks for point this one out. I will have look at >>>> adressing for this the BSG efforts with STGT and QEMU-KVM using the >>>> recommended major:minor output from /sys/class/bsg/$HCTL/dev. >>>> >>>> Best, >>>> >>>> --nab >>>> >>>> >>> >>>> From a90611630879205ef497821552474e894d463c94 Mon Sep 17 00:00:00 2001 >>> From: Mark Harvey <markh794@xxxxxxxxx> >>> Date: Sat, 21 Aug 2010 15:22:48 +1000 >>> Subject: Check bsg major number from /sys/class/bsg/<c:t:l>/dev >>> >>> Signed-off-by: Mark Harvey <markh794@xxxxxxxxx> >>> --- >>> usr/bs_sg.c | 35 ++++++++++++++++++++++++++++++++--- >>> 1 files changed, 32 insertions(+), 3 deletions(-) >>> >>> diff --git a/usr/bs_sg.c b/usr/bs_sg.c >>> index dfd49c3..7fc9787 100644 >>> --- a/usr/bs_sg.c >>> +++ b/usr/bs_sg.c >>> @@ -269,6 +269,34 @@ static void bs_sg_cmd_complete(int fd, int >>> events, void *data) >>> cmd->scsi_cmd_done(cmd, io_hdr.status); >>> } >>> >>> +static int get_bsg_major(char *path) >>> +{ >>> + FILE *devfd; >>> + char majorno[8]; >>> + char dev[128]; >>> + int ch; >>> + int i; >>> + >>> + dev[0] = '\0'; >>> + strncat(dev, "/sys/class/bsg/", 16); >>> + strncat(dev, &path[9], 64); >>> + strncat(dev, "/dev", 5); >>> + devfd = fopen(dev, "r"); >>> + if (!devfd) >>> + return -1; >>> + ch = fgetc(devfd); >>> + for (i = 0; i < 7; i++) { >>> + if (ch == ':') { >>> + majorno[i] = '\0'; >>> + break; >>> + } >>> + majorno[i] = ch; >>> + ch = fgetc(devfd); >>> + } >>> + fclose(devfd); >>> + return atoi(majorno); >>> +} >>> + >>> static int chk_sg_device(char *path) >>> { >>> struct stat st; >>> @@ -287,9 +315,10 @@ static int chk_sg_device(char *path) >>> if (major(st.st_rdev) == SCSI_GENERIC_MAJOR) >>> return 0; >>> >>> - /* This is not yet defined in include/linux/major.h.. */ >>> - if (major(st.st_rdev) == 254) >>> - return 1; >>> + if (!strncmp("/dev/bsg", path, 8)) { >>> + if (major(st.st_rdev) == get_bsg_major(path)) >>> + return 0; >>> + } >>> >>> return -1; >>> } >> >> Hi Mark, >> >> Here is my updated version of your initial code for the megasas >> 8708EM2 / SGL passthrough friendly qemu-kvm.git/scsi-bsg: >> >> http://git.kernel.org/?p=virt/kvm/nab/qemu-kvm.git;a=commitdiff;h=075901d9bc1fea670bef84f55806f1bc8b2a5e9e >> >> Please feel free to improve your patch using this code and respin >> another patch for tomo-san to review. >> >> Thanks! >> >> --nab >> >> >
Attachment:
0001-Check-bsg-major-number-from-sys-class-bsg-c-t-l-dev.patch
Description: Binary data