Author: Jaret Cantu <jaret.cantu@timesys.com>
Date:   Wed Aug 12 09:22:23 EDT 2015

    The bsg header has only been available since 2.6.29. Hide the
    v4 SG structures and constants from older kernels.

--- eudev-1.6/src/ata_id/ata_id.c.orig	2015-08-12 06:20:36.596932600 -0400
+++ eudev-1.6/src/ata_id/ata_id.c	2015-08-12 06:21:25.035936054 -0400
@@ -42,7 +42,13 @@
 #include <linux/hdreg.h>
 #include <linux/fs.h>
 #include <linux/cdrom.h>
+#include <linux/version.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)
+#define USE_SG_IO_V4
+#endif
+#ifdef USE_SG_IO_V4
 #include <linux/bsg.h>
+#endif
 #include <arpa/inet.h>
 
 #include "libudev.h"
@@ -64,6 +70,8 @@ static int disk_scsi_inquiry_command(int
                 [4] = (buf_len & 0xff),
         };
         uint8_t sense[32] = {};
+        int ret;
+#ifdef USE_SG_IO_V4
         struct sg_io_v4 io_v4 = {
                 .guard = 'Q',
                 .protocol = BSG_PROTOCOL_SCSI,
@@ -76,10 +84,10 @@ static int disk_scsi_inquiry_command(int
                 .din_xferp = (uintptr_t) buf,
                 .timeout = COMMAND_TIMEOUT_MSEC,
         };
-        int ret;
 
         ret = ioctl(fd, SG_IO, &io_v4);
         if (ret != 0) {
+#endif
                 /* could be that the driver doesn't do version 4, try version 3 */
                 if (errno == EINVAL) {
                         struct sg_io_hdr io_hdr = {
@@ -107,6 +115,7 @@ static int disk_scsi_inquiry_command(int
                         }
                 } else
                         return ret;
+#ifdef USE_SG_IO_V4
         }
 
         /* even if the ioctl succeeds, we need to check the return value */
@@ -118,6 +127,7 @@ static int disk_scsi_inquiry_command(int
         }
 
         return 0;
+#endif
 }
 
 static int disk_identify_command(int          fd,
@@ -144,6 +154,8 @@ static int disk_identify_command(int
                 [9] = 0xEC,     /* Command: ATA IDENTIFY DEVICE */
         };
         uint8_t sense[32] = {};
+        int ret;
+#ifdef USE_SG_IO_V4
         uint8_t *desc = sense + 8;
         struct sg_io_v4 io_v4 = {
                 .guard = 'Q',
@@ -157,10 +169,10 @@ static int disk_identify_command(int
                 .din_xferp = (uintptr_t) buf,
                 .timeout = COMMAND_TIMEOUT_MSEC,
         };
-        int ret;
 
         ret = ioctl(fd, SG_IO, &io_v4);
         if (ret != 0) {
+#endif
                 /* could be that the driver doesn't do version 4, try version 3 */
                 if (errno == EINVAL) {
                         struct sg_io_hdr io_hdr = {
@@ -180,6 +192,7 @@ static int disk_identify_command(int
                                 return ret;
                 } else
                         return ret;
+#ifdef USE_SG_IO_V4
         }
 
         if (!(sense[0] == 0x72 && desc[0] == 0x9 && desc[1] == 0x0c)) {
@@ -188,6 +201,7 @@ static int disk_identify_command(int
         }
 
         return 0;
+#endif
 }
 
 static int disk_identify_packet_device_command(int          fd,
@@ -220,6 +234,8 @@ static int disk_identify_packet_device_c
                 [15] = 0,     /* CONTROL */
         };
         uint8_t sense[32] = {};
+        int ret;
+#ifdef USE_SG_IO_V4
         uint8_t *desc = sense + 8;
         struct sg_io_v4 io_v4 = {
                 .guard = 'Q',
@@ -233,10 +249,10 @@ static int disk_identify_packet_device_c
                 .din_xferp = (uintptr_t) buf,
                 .timeout = COMMAND_TIMEOUT_MSEC,
         };
-        int ret;
 
         ret = ioctl(fd, SG_IO, &io_v4);
         if (ret != 0) {
+#endif
                 /* could be that the driver doesn't do version 4, try version 3 */
                 if (errno == EINVAL) {
                         struct sg_io_hdr io_hdr = {
@@ -256,6 +272,7 @@ static int disk_identify_packet_device_c
                                 return ret;
                 } else
                         return ret;
+#ifdef USE_SG_IO_V4
         }
 
         if (!(sense[0] == 0x72 && desc[0] == 0x9 && desc[1] == 0x0c)) {
@@ -264,6 +281,7 @@ static int disk_identify_packet_device_c
         }
 
         return 0;
+#endif
 }
 
 /**
--- eudev-1.6/src/scsi_id/scsi_serial.c.orig	2015-08-12 08:04:31.943377308 -0400
+++ eudev-1.6/src/scsi_id/scsi_serial.c	2015-08-12 08:03:49.306374267 -0400
@@ -36,7 +36,13 @@
 #include <scsi/scsi.h>
 #include <scsi/sg.h>
 #include <linux/types.h>
+#include <linux/version.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)
+#define USE_SG_IO_V4
+#endif
+#ifdef USE_SG_IO_V4
 #include <linux/bsg.h>
+#endif
 
 #include "libudev.h"
 #include "libudev-private.h"
@@ -166,6 +172,7 @@ static int sg_err_category3(struct udev
                                    hp->sbp, hp->sb_len_wr);
 }
 
+#ifdef USE_SG_IO_V4
 static int sg_err_category4(struct udev *udev, struct sg_io_v4 *hp)
 {
         return sg_err_category_new(udev, hp->device_status, 0,
@@ -173,6 +180,7 @@ static int sg_err_category4(struct udev
                                    (unsigned char *)(uintptr_t)hp->response,
                                    hp->response_len);
 }
+#endif
 
 static int scsi_dump_sense(struct udev *udev,
                            struct scsi_id_device *dev_scsi,
@@ -292,6 +300,7 @@ static int scsi_dump(struct udev *udev,
                 return -1;
 }
 
+#ifdef USE_SG_IO_V4
 static int scsi_dump_v4(struct udev *udev,
                         struct scsi_id_device *dev_scsi, struct sg_io_v4 *io)
 {
@@ -313,6 +322,7 @@ static int scsi_dump_v4(struct udev *ude
         else
                 return -1;
 }
+#endif
 
 static int scsi_inquiry(struct udev *udev,
                         struct scsi_id_device *dev_scsi, int fd,
@@ -323,7 +333,9 @@ static int scsi_inquiry(struct udev *ude
                 { INQUIRY_CMD, evpd, page, 0, buflen, 0 };
         unsigned char sense[SENSE_BUFF_LEN];
         void *io_buf;
+#ifdef USE_SG_IO_V4
         struct sg_io_v4 io_v4;
+#endif
         struct sg_io_hdr io_hdr;
         int retry = 3; /* rather random */
         int retval;
@@ -335,6 +347,7 @@ static int scsi_inquiry(struct udev *ude
 
 resend:
         if (dev_scsi->use_sg == 4) {
+#ifdef USE_SG_IO_V4
                 memzero(&io_v4, sizeof(struct sg_io_v4));
                 io_v4.guard = 'Q';
                 io_v4.protocol = BSG_PROTOCOL_SCSI;
@@ -346,6 +359,11 @@ resend:
                 io_v4.din_xfer_len = buflen;
                 io_v4.din_xferp = (uintptr_t)buf;
                 io_buf = (void *)&io_v4;
+#else
+		/* Unsupported */
+		retval = -1;
+		goto error;
+#endif
         } else {
                 memzero(&io_hdr, sizeof(struct sg_io_hdr));
                 io_hdr.interface_id = 'S';
@@ -370,9 +388,11 @@ resend:
                 goto error;
         }
 
+#ifdef USE_SG_IO_V4
         if (dev_scsi->use_sg == 4)
                 retval = sg_err_category4(udev, io_buf);
         else
+#endif
                 retval = sg_err_category3(udev, io_buf);
 
         switch (retval) {
@@ -385,9 +405,11 @@ resend:
                         break;
 
                 default:
+#ifdef USE_SG_IO_V4
                         if (dev_scsi->use_sg == 4)
                                 retval = scsi_dump_v4(udev, dev_scsi, io_buf);
                         else
+#endif
                                 retval = scsi_dump(udev, dev_scsi, io_buf);
         }
 

